代码之家  ›  专栏  ›  技术社区  ›  Doug T.

把“Java学校”程序员变成C或C++程序员有多难?[关闭]

  •  28
  • Doug T.  · 技术社区  · 16 年前

    我的公司,一个C++的房子,一直在寻找新的毕业生。然而,由于Java学派的现象,我们通常会以一分钟的C++来采访强大的Java程序员。通常C++类没有真正准备学生在C++中工作。然而,这些人往往是聪明的孩子,渴望学习并尽其所能。

    每次面试,我都在努力回答这个基本问题:

    把“Java学校”程序员变成C或C++程序员有多难?你的公司有没有把老一套的“Java学校”程序员变成一个强大的C++程序员的经历?值得付出努力吗?

    我与此斗争的原因之一不仅仅是因为C或C++与Java语言的差异,它是学习C语言或C++的基本技能,我认为经常会在Java学校迷路。这些包括数据结构、计算复杂性、手动内存管理,以及乔尔·斯波斯基所说的一切。 here .

    通常,据我所知,一个学生将具备一些基本技能(能够回答几个问题),但我仍然有很大的一部分,我的大脑,这是非常怀疑的人如何能够学习这些技能,而不必在一些C或C++的手弄脏。也许我需要消除这种刻板印象。我只是不公平吗?

    不管怎样,你把“Java学校”程序员变成C或C++程序员有什么经验?

    22 回复  |  直到 12 年前
        1
  •  41
  •   David Thornley    16 年前

    如果他们不理解数据结构和算法复杂度,那么他们就不太擅长认真的Java编程,所以我不认为这里的语言是一个问题。

    他们不会理解指针,但是好的C++编程通常不使用复杂的指针。(也有例外,但是我不知道你的公司在做什么,我不知道他们是否会申请。)毕竟,你可能不希望你的开发人员编写他们自己的链接列表,而不是使用std::list。

    他们不会理解手动内存管理,但在C++中比以前容易得多。在现代C++中,由于异常的可能性,您自己的内存管理变得越来越困难,因此您想用几乎所有的东西来运行RAII(使用AutoMyPTR、Booo::SyrdypTr,不管怎样)。

    如果我在经营东西,如果它们看起来不错,我会雇用它们。我会意识到可能存在问题(C++是一种比Java更苛刻的语言),并且有一些想法来处理它们。

    没有理由仅仅因为他们没有你想要的准确技能就不雇佣他们。聪明的人会学习,你可能不想雇佣那些不聪明的人。

        2
  •  19
  •   Onorio Catenacci    16 年前

    纯粹从C++程序员的角度讲,我认为一个想学习C++的Java开发人员将面临一个相当陡峭的学习曲线。是的,在某种程度上,开发代码在所有语言中都是相似的。我曾经被要求用Excel的宏语言(pre-vba)编写代码。我成功了,但这就像是在写 战争与和平 用五年级的词汇。

    关于C++(指针、内存管理、运算符重载)还有其他问题,据我所知,它们在Java中并不存在,它们也不是小问题。特别是如果你看到有人来帮助传统的C++代码,这些可能会带来很大的障碍。我想我会开始任何新的雇用,至少开始一些维护工作。

        3
  •  17
  •   coder1    16 年前

    程序员程序。真正懂得编程的人可以学习任何语言。当然,有一个学习曲线,但一个好的编码员可以相对快速地达到速度。如果你在期待一个有着先进知识的人,你也不会想聘用新的毕业生,对吧?所以不管怎样都会有一个学习曲线。

        4
  •  17
  •   unintentionally left blank    16 年前

    我用很多语言编写程序,发现C++与其他语言相比,很难计算出来,而且有效率,与Java、C、Python、Fortan、JavaScript、ASP和Perl等语言相比。我几乎可以说它属于自己的一类。我不相信我刚刚列出的一种语言(包括Java)的能力是一个优秀的C++程序员的良好预测因子。我认为C++几乎需要一种不同类型的思维,当然也有能力在编码时保持大量的信息,而主要集中在业务需求上。

    多年来,我一直在努力精通C++,尽管在工作中从来不需要使用它(即在我自己的时间里学习)。这是非常艰难的,毕竟这段时间我不确定我会成功和生产力作为一个C++程序员。我认为我在其他语言方面有相当的能力。

    所以,基于我对一个人(我)的小而明显有偏见的样本我倾向于倾向于开发出大量过去的C++经验的开发者,如果这就是他们在工作中所做的事情,一天又一天。你需要花更多的时间寻找那些候选人,但我认为从长远来看,你会有更好的成功机会。

        5
  •  10
  •   Nosredna    15 年前

    我的经验是,比起Java程序员编写C/C++,我更希望得到一个C/C++程序员来编写Java。我不知道哪些Java程序员可以在处理内存管理和指针之前处理它们。

    如果我要选择的是JAVA学校的孩子,我会告诉他们一些关于汇编和C的恐怖故事,然后试着把它们分成三类。

    1. 无所畏惧的他们没有注意。
    2. 恐惧和恐慌,因为他们知道自己无法应付这种复杂性。
    3. 恐惧和渴望,因为他们明白,即使比他们聪明的人也能被怪异的屁股内存和硬件问题打到肠子里,但见鬼,这听起来确实是一个很好的挑战。

    我从第三组雇来。

        6
  •  6
  •   Larry OBrien    16 年前

    “你不能教高个子。”——某位著名的篮球教练。

    在招聘时,你在寻找一个既能快速学习新概念又能快速 忘却 习惯。是后者能偷袭你。在Java+Gt;C++过渡的情况下,你可能会面临“不学习”这样的事情:重IDE依赖,“一切都是一个对象”,对象模型和程序太高级,等等。

    我建议你寻找一些建议灵活性的东西,让他们在IDE和纯文本编辑器中编写一个小程序,向他们展示一个简单的C++函数,它传递一个指针,修改底层值,看看它们是否会绊倒等等。

        7
  •  4
  •   Ace    16 年前

    作为一个主要是“JavaChanor”的人,和一个刚刚毕业的毕业生,我绝对认为我可以在没有太多痛苦的情况下学习C或C++。

    不过,我真的不想。我只能为自己说话,但是如果你已经用Java长大了,C可能是一个非常丑陋的语言。我认为动机将是更大的障碍。动机,也许还有一些抱怨 爪哇 这样容易多了,为什么C不呢? 爪哇 “:)

    如果你能找到一个有适当动机的人,其余的都会好起来的。:)

        8
  •  3
  •   Ather    16 年前

    要想知道一个毕业生是否对基础知识有扎实的理解,而不管他们的“语言”群体是什么,都是相对简单的。这些基础知识包括1)数据结构2)操作系统和3)算法及其复杂性。这些基本上是概念性的领域,讨论设计或解决特定问题的方法可以揭示它们的强弱。你不必让他们写代码。

    我想说,如果任何人在这些基础上有一个坚实的基础,同样重要的是有一个积极的态度,他可以学习任何其他语言。

    我总是追求这些基本原则和他们的评价-新鲜的毕业生或经验丰富的。这些是雇用某人的主要标准。

        9
  •  2
  •   Bill the Lizard Drew    16 年前

    来自Java学校的人仍然应该掌握数据结构和计算复杂性。它们唯一应该不足的地方是手动内存管理。如果他们知道垃圾收集器为他们做了什么,并且他们看起来足够聪明,你可以教他们内存管理,那么我会说给他们一个机会。因为他们没有花时间学习Java学校的内存管理,试着找出他们在你所需要的其他领域是否特别强大。

        10
  •  2
  •   JohnMcG    16 年前

    我认为Joel Spolsky在文章中提到的问题是,“获得”指针和递归需要一定的心智能力,而基于C的课程会淘汰那些没有掌握它的人,而Java学校也不一定能做到。

    所以,招聘经理该怎么做,因为人们不会在简历上写上“我没有得到指针,我永远不会。”

    因此,如果你相信乔尔的假设,即“获取”指针和递归的能力是一种天生的个人特质,人们要么有要么没有,我看到以下选项:

    1. 只从C/C++学校而不是Java学校租用。
    2. 如果没有C/C++学校,那么聘请有经验的C/C++程序员而不是大学。
    3. 如果你致力于从大学招聘,那么接受比你将有一个不可忽视的失败率转换他们。
        11
  •  2
  •   pmr    15 年前

    我自己是一个学生,我在早期的大部分课程工作都是用Java编写的,但我总是试着用C++来做,只是为了好玩而已。 这学期开始了一门新课程,要求每个人都用C++ + OpenGL+QT编程,而其他从未使用过C++的学生,很难适应和经常花费时间来对付简单的编译时错误。 这可能有很多原因(包括愚蠢),但我认为对于那些 只有 使用Java(很多学生只是使用他们告诉的东西)变成C++。 不幸的是,我想不出任何方法来减轻过渡时期的痛苦,只能想到迪jkstra说:

    事实上,要教那些曾经接触过基础知识的学生好的编程是不可能的:作为潜在的程序员,他们在精神上被破坏了,不可能再生。

        12
  •  1
  •   Alexandru Luchian    16 年前

    我自己是Java开发人员,但在大学里有C/C++基础。我很高兴从内存管理、列表、队列、堆栈和最重要的指针开始。虽然我没有明确使用指针,但我知道我的应用程序后面发生了什么,发现内存泄漏、性能问题等。

    我认为最好的解决办法不是要求Java/C开发人员在工作时学习C/C++(以及所有这些语言的内容),而是在大学教他们这些课程。这是最好的解决方案。

    就像现在一样,这就像是修复效果/症状,而不是实际原因。

        13
  •  1
  •   Bill K    16 年前

    我从C/C++开始,移动到Java。

    我不确定新毕业生是否真的知道任何事情——把他们视为培训的白板。你甚至可以和一个没有受过教育的黑客相处得更好。

    也就是说,对于一个好的工程师来说,在指针、内存分配等之间来回切换是相当容易的——但是我认为从垃圾收集的OO切换回非OO是非常困难的。

    当您使用一个带有GC的系统时,您在高层次上更好地思考您的设计。实际上,您可以用更易于理解的方式编写代码。您开始真正拥有专注于单一职责的类(大多数类将是几个屏幕——大多数方法将是琐碎的)。

    我从来没有见过好的OO C++代码,这可能是好的,因为OO代码不是所有的性能,只是有太多的小分配/分配,短的方法调用和其他小的性能障碍,使一个C++程序员高兴。

    这有点像开着赛车,在上面放上交流电、动力转向和电动车窗。更有用的,但失败的原因,它被选择在第一位。

    顺便说一下,如果有人引用的话,我很想看到一些好的OO C++代码…

        14
  •  1
  •   None    16 年前

    我认为这种“Java学校”的想法很大程度上是制造出来的。我所在的大学使用Java来教授它的主要序列CS课程(数据结构、算法等),然而,它是许多其他课程,使用其他语言如C/C++/PLANT,而在更高级别的课程中,工作可以用任何语言来完成。

    你真的认为教授什么语言基本编程概念很重要吗?

        15
  •  1
  •   slicezero    13 年前

    一个好的计算机科学课程应该教给学生基础知识,不管你使用哪种编程语言,基础知识都是一样的。你提到的东西,内存管理,数据结构等等,都是这些基本技能的一部分。根据我的经验,熟悉这些概念的程序员将比不理解这些概念的程序员(尤其是对于非标准问题)设计出更好(更高效、更快、更简单)的解决方案。

    至于语言选择,一个好的程序员应该能够在几周内学会一种新的编程语言,并在1-2个月内精通。这对于C++和Java来说尤其如此,它们具有许多共享的特性。

        16
  •  0
  •   dove    16 年前

    JavaDeaveWER将适合C语言的房子,以及C++开发人员。

    C/C++的交叉依赖于程序员,但除了一般编程经验之外,我不会把他们的Java技能计算在内。如果你能吸引许多这样的申请人,我也会感到惊讶。

        17
  •  0
  •   Ovidiu Pacurar    16 年前

    取决于程序员的智商。真正的问题是:这个程序员是否足够聪明,以便我们投入学习时间?他越聪明,需要学习的时间就越少。

        18
  •  0
  •   Community Egal    7 年前

    我的帖子 here 几乎可以回答你的问题。 就像乔尔·萨德在你提供的链接中所说的那样,今天他们不在学校学习基础知识真的很糟糕。但好的人仍然会学到,他们在操作系统上上课,黑客Linux内核调度器,他们在汇编等方面做项目…
    我公司的大多数员工都刚刚毕业,如果不了解基本情况,就不可能通过我们的考试,所以振作起来,你身边还有很多优秀的应聘者需要知道。 how to find them .

        19
  •  0
  •   ididak    16 年前

    这比把一个优秀的C/C++程序员变成一个优秀的Java程序员更困难。这里的重点是“好”。任何人都能用任何一种语言编写糟糕的程序。优秀的C++程序员必须很好地理解指针。C++中最重要的概念之一是迭代器,它是通过操作符重载的C指针的泛化,这使得许多算法在C++中是真正通用的。

    一个伟大的指标是否NCG得到它,是他们在操作系统课程的表现。如果他们通过了一个项目工作量很重的操作系统课程(比如用任何语言实现任何操作系统组件),而且他们喜欢这个课程,那么他们很有可能是你能得到的最好的学生之一。

        20
  •  -1
  •   user128807    15 年前

    如果你只是在学校外雇佣年轻人,你应该雇佣的是智商,而不是任何特殊技能。你想要的人是 Smart and Get Things Done 不是一个知道如何用一种特别让你高兴的方式来吹嘘指针的人。

        21
  •  -3
  •   Jasper Bekkers    16 年前

    这只是另一种语言。

    如果您坚持纯OOP特征相对较小的子集,那么从Java开发人员的角度来看,没有太多的东西可以学习。为了让它们成为通用的OOP程序员,您唯一应该教它们的是,它们必须实现一个析构函数来处理它们的内存。

    但是,如果他们应该使用STL、模板、异常等,他们可能需要更多的指导。

        22
  •  -3
  •   nosatalian    15 年前

    我不相信“你要么得到指针/递归,要么你没有”。这是一个干净的板岩。只要有足够的时间和兴趣,任何人都可以学到任何东西。问题是-这些孩子有兴趣吗?

    我们一直在找我的实习生,我已经看了30多份今年的简历。最让我震惊的是,他们中很少有人做过他们某个班级或某项工作不需要他们做的该死的事情。找一个自己做过一些事情并且喜欢的人,你会满意的。

    也就是说,我个人不会浪费时间和不懂C和汇编的人在一起。从GDB调试核心转储与C++崩溃、查看Java堆栈跟踪有很大区别。C++是一个非常可怕的语言,有很多原因,但它的优点是它与C有共同之处。它是一种强大的方式来告诉计算机去做你想做的事情,而不必担心在某个运行时会做什么其他的胡说八道。

    此外,如果你想节省时间,不要打扰任何人,不是从十大工程师学校。不是说没有来自二级学校的优秀学生,而是从实践的角度来看,你不需要你的雇佣来成为他们中的一员。

    麻省理工学院、斯坦福大学、加州大学伯克利分校、佐治亚理工学院、伊利诺伊州香槟分校、芝加哥大学、加州理工学院、南加州大学、密歇根州安阿伯分校、德克萨斯州奥斯汀分校。

    我也不会雇用任何人来编写使用Microsoft Windows的软件。作为一名计算机科学专业的学生,如果你不成为一个Linux用户,你就不会对软件或者计算机如何工作那么感兴趣(如果你使用FreeBSD或者其他东西,情况会更好)