我的公司,一个C ++的房子,总是希望雇用最近的毕业生。然而,由于Java Schools现象,我们通常最终会采访可能只有一点点C ++的强大的Java程序员。通常,C ++课程并不能让学生真正为使用C ++工作做好准备。然而,通常这些都是聪明的孩子,渴望学习并尽力而为。
每次采访,我都在努力解决这个基本问题:
将“Java School”程序员变成C或C ++程序员有多难?贵公司是否有过将陈规定型的“Java Schools”程序员转变为强大的C ++程序员的经验?值得努力吗?
我遇到这种情况的原因之一不仅仅是由于C或C ++与Java语言的差异,而是学习C或C ++所带来的基本技能,我认为这些技能经常在Java学校迷失。这些包括数据结构,计算复杂性,手动内存管理,Joel Spolsky所说的所有内容here。
通常情况下,据我所知,学生将掌握一些基本技能(能够回答几个问题),但我仍然会考虑到这个问题的一大部分内容。可以学习这些技能,而不必在某些C或C ++中弄脏。也许我需要消除这种刻板印象。我只是不公平吗?
无论如何,您将“Java School”程序员变成C或C ++程序员的经验是什么?
答案 0 :(得分:41)
好吧,如果他们不了解数据结构和算法的复杂性,他们就不会在严肃的Java编程方面做得好,所以我不认为这里的语言是个问题。
他们不会理解指针,但优秀的C ++编程通常不会以复杂的方式使用指针。 (也有例外,但由于我不知道你的公司做了什么,我无法判断它们是否适用。)毕竟,你可能不希望你的开发人员编写他们自己的链表而不是使用std ::列表。
他们不会理解手动内存管理,但在C ++中这比以前容易多了。在现代C ++中,由于异常的可能性,做自己的内存管理变得更加困难,所以你想要用几乎所有的东西来练习RAII(使用auto_ptr,boost :: shared_ptr,等等)。
如果我在经营东西,如果他们看起来不错,我会雇用他们。我知道可能存在问题(毕竟C ++是比Java更苛刻的语言),并且有一些想法如何处理它们。
没有理由避免因为没有你想要的确切技能而雇用大学毕业的人。聪明的人会学习,你可能不想聘请那些不聪明的人。
答案 1 :(得分:19)
纯粹从C ++程序员的角度讲,我认为想要学习C ++的Java开发人员将面临相当陡峭的学习曲线。是的,在某种程度上,开发代码在所有语言中都是类似的。我曾被要求用Excel的宏语言(VBA之前)编写代码。我设法但是就像试着用五年级的词汇来写“战争与和平”。
C ++存在其他问题(指针,内存管理,运算符重载),据我所知,这些问题在Java中并不存在,它们也不是小问题。特别是如果你正在寻找某人来帮助处理遗留的C ++代码,这些可能会带来很大障碍。而且我想我最初会开始任何新员工至少进行一些维护工作。
答案 2 :(得分:17)
程序员计划。实际上知道如何编程的人可以学习任何语言。当然,有一个学习曲线,但一个好的编码器可以相对快速地加速。如果你期待有高级知识的人,你不会想要雇用新鲜的毕业生,对吧?所以无论如何都会有学习曲线。
答案 3 :(得分:17)
与其他语言(如Java,C,Python,Fortan,Javascript,ASP和Perl)相比,我使用多种语言进行编程,发现C ++很难找到并且很有效率。我几乎会说它属于自己的一类。我不相信我刚刚列出的一种语言(包括Java)的能力是一个人可能有多好的C ++程序员的一个很好的预测器。我认为C ++几乎需要一种不同的思维方式,当然还有在编码时能够掌握大量信息的能力,而不是主要关注业务需求。
我多年来一直在努力精通C ++,尽管从不需要在工作中使用它(即在我自己的时间学习)。这是非常艰难的,毕竟这一次我不确定我作为一名C ++程序员是否会成功和富有成效。我认为我在其他语言方面总体上相当称职。
所以,基于我一个人的小而明显偏见的样本(我!),我建议倾向于那些已经展示了大量过去C ++经验的开发人员,如果这是他们将要在工作中做的事情,那一天到了一天。你需要花更多的时间找到那些候选人,但我认为从长远来看你将有更大的成功机会。
答案 4 :(得分:10)
我的经验法则是,我宁愿让一个C / C ++程序员编写Java而不是Java程序员来编写C / C ++。我不知道哪些Java程序员可以处理内存管理和指针,直到他们尝试它。
如果我只能选择Java学校的孩子,我会告诉他们一些关于汇编和C的恐怖故事,然后尝试将它们分为三类。
我是从第3组雇用的。
答案 5 :(得分:6)
“你不能教高。” - 一些着名的篮球教练。
招聘时,您正在寻找能够快速学习新概念并快速忘掉习惯的人。后者可以偷偷摸摸你。在Java-> C ++转换的情况下,您可能面临“忘记”这样的事情,例如重度IDE依赖,“一切都是对象”,对象和程序的心理模型太高级等等。
我建议您寻找灵活性的东西 - 让他们在IDE和纯文本编辑器中编写一个小程序,向他们展示一个简单的C ++函数,它传递指针并修改底层值并查看如果他们绊倒等等。
答案 6 :(得分:4)
作为一名主要是“Java小学生”的人,以及最近毕业的人,我绝对认为我可以在没有太多痛苦的情况下学习C或C ++ ......
然而,我真的不想。我只能为自己说话,但如果你是用Java长大的话,C语言可能是一种非常难看的语言。我认为动机将成为更大的障碍。关于“在 Java 中的动机和一些抱怨这太容易了,为什么不是C Java ?” :)
如果你能找到一个有正确动机的人,剩下的就可以了。 :)
答案 7 :(得分:3)
要弄清楚毕业生是否对基础知识有了深刻的理解而不管他们的“语言”群体,这是相对简单的。这些基础包括1)数据结构2)操作系统和3)算法及其复杂性。这些本质上是概念领域,讨论设计或针对特定问题的方法,可以揭示它们的强弱程度。你不必让他们写代码。
我想说,如果有人在这些基本面上有强大的基础,同样重要的是有积极的态度,他可以学习任何其他语言。
我总是选择这些基础知识和他们的评价 - 新毕业或有经验。这些是雇用某人的主要标准。
答案 8 :(得分:2)
来自Java学校的人应该仍然掌握数据结构和计算复杂性。他们应该缺乏的唯一区域是手动内存管理。如果他们了解垃圾收集器为他们做了什么,他们看起来很聪明,你可以教他们内存管理,那么我会说给他们一个机会。由于他们没有花时间在Java学校学习内存管理,所以试着找出他们在你需要的其他领域是否特别强大。
答案 9 :(得分:2)
我自己就是一名学生,早期的大部分课程都是用Java编写的,但我总是试图用C ++来做一些事情,只是为了它的乐趣。 本学期开设了一门新课程,要求每个人都使用C ++ + OpenGL + Qt进行编程,而其他许多从未使用过C ++的学生都很难适应并经常花费数小时来解决简单的编译时错误。 这可能有很多原因(包括愚蠢),但我认为对于仅使用Java(以及许多学生只是使用他们被告知的东西)来改变为C ++的人来说可能会非常困难。 不幸的是,我想不出任何方式来缓解过渡的痛苦,只能想到Dijkstra说:
几乎不可能向曾经接触过BASIC的学生传授优秀的程序设计:作为潜在的程序员,他们在精神上被肢解,超出了再生的希望。
答案 10 :(得分:2)
我认为Joel Spolsky在他的文章中提到的问题是“获得”指针和递归需要一定的心理能力,并且基于C的课程将对那些没有它的人进行除草,以及Java学校不一定会这样做。
那么招聘经理是做什么的,因为人们不会把他们的简历写下来,“我没有得到指示,我永远也不会。”
因此,如果你购买Joel的假设,即“获得”指针和递归的能力是人们拥有或不拥有的天生个人特质,我会看到以下选项:
答案 11 :(得分:1)
一个好的计算机科学课程应该向学生讲授基础知识,无论你使用哪种编程语言都是如此。你提到的东西,内存管理,数据结构等都是这些基本技能的一部分。根据我的经验,熟悉这些概念的程序员将比不理解这些概念的解决方案设计得更好(更高效,更快速,更简单),特别是对于非标准问题。
至于语言选择,一个优秀的程序员应该能够在几周内选择一种新的编程语言,并在1-2个月内熟练掌握。对于具有如此多共享功能的C ++和Java来说尤其如此。
答案 12 :(得分:1)
我自己是一名java开发人员,但在大学里有一个C / C ++基础。我是GLAD我开始使用内存管理,列表,队列,堆栈和最重要的:指针。虽然我没有明确使用指针,但我知道应用程序背面发生了什么,发现内存泄漏,性能问题等。
我认为最好的解决方案不是要求Java / C#开发人员在上班时学习C / C ++(以及这些语言带来的所有问题),但是在大学里教他们这些科目。这将是最好的解决方案。
就像现在一样,它就像修复效果/症状,而不是实际原因。
答案 13 :(得分:1)
我从C / C ++开始,转而使用Java。
我不确定新毕业生真的知道什么 - 认为他们是干净的培训。对于没有受过教育的黑客,你甚至可能会更好。
也就是说,一个优秀的工程师在指针,内存分配等之间来回切换相当容易 - 但我认为从垃圾收集的OO转换回非OO是非常困难的。
当您使用GC系统时,您可以更好地考虑高级别的设计。实际上,您可以通过更易理解的方式进行编码。你开始真正拥有专注于单一责任的课程(大多数课程将是几个屏幕 - 大多数方法都是微不足道的。)
我从来没有见过优秀的OO C ++代码,这可能是好的,因为OO代码并不是那么高效,只是有太多的小分配/解除分配,简短的方法调用和其他一些性能障碍来制作一个C ++程序员开心。
这有点像你的赛车,并在它上面放置AC,动力转向和电动车窗。更有用,但却首先打败了它被选中的原因。
顺便说一下,如果有人有参考,我真的很想看到一些优秀的OO c ++代码......
答案 14 :(得分:1)
我认为这个“Java学校”的想法主要是制造的。我所在的大学使用java来教它主序CS课程(数据结构,算法等)但是,它们是许多其他使用其他语言的课程,如C / C ++ / Scheme,在更高级别的课程中,工作可以在任何语言。
你真的认为教授语言基本编程概念很重要吗?
答案 15 :(得分:0)
我的帖子here几乎可以回答您的问题。 就像乔尔悲伤的链接你提供的非常糟糕,今天他们没有在学校学习基础知识。但好的人还在学习,他们在操作系统上学习并破解linux内核调度程序,他们在组装中进行项目等... 我公司的大多数雇员都刚刚毕业,如果不了解基础考试就不可能通过我们的考试,所以在你周围仍然有好的候选人需要了解how to find them。
答案 16 :(得分:0)
将好的C / C ++程序员变成一个优秀的Java程序员比这更难。这里的重点是“好”。任何人都可以用任何语言进行编程。优秀的C ++程序员必须很好地理解指针。 C ++中最重要的概念之一是iterator,它是通过运算符重载来推广C指针,这使得许多算法在C ++中真正通用。
NCG是否能够获得它的一个重要指标是它们在操作系统课程中的表现。如果他们通过一个具有繁重项目工作量的OS类(比如用任何语言实现任何操作系统组件),并且他们喜欢它,那么他们很可能是你能得到的最好的学生。
答案 17 :(得分:0)
取决于程序员的智商。真正的问题是:这个程序员是否足够聪明,可以投入学习时间?越聪明,他需要学习的时间越少。
答案 18 :(得分:0)
Java programmwer适合C#house,以及C ++开发人员。
C / C ++的交叉将取决于程序员,但除了一般的编程经验之外,我不会将他们的Java技能用于其他任何事情。如果你吸引了很多这样的申请人,我也会感到惊讶。
答案 19 :(得分:-1)
如果你刚从校外招聘年轻人,你应该雇用智商,而不是任何特殊技能。你想要的是Smart and Get Things Done的人,而不是那些知道如何以一种特别令你满意的方式来指责指针的人。
答案 20 :(得分:-3)
这只是另一种语言。
如果您坚持使用相对较小的纯OOP功能子集,那么从Java开发人员的角度来看,实际上并没有太多东西需要学习。为了使它们成为通用的OOP程序员,你唯一应该教给他们的是他们必须实现一个析构函数来处理他们的记忆。
但是,如果他们应该使用STL,模板,例外等,他们可能需要更多的指导。
答案 21 :(得分:-3)
我不买“你要么得到指针/递归,要么你没有。”头脑是一个清白的板岩。任何人都可以在有足够时间和兴趣的情问题是 - 这些孩子是否感兴趣。
我们一直在寻找我工作的实习生,而且我已经完成了今年作物的30多份简历。让我感到震惊的主要原因是,他们中很少有人做了一件该死的事,这是他们的一个班级或工作所不需要的。找一个自己做某事并享受它的人,你会感到满意。
那就是说,我个人不会浪费时间与不懂C和集会的人在一起。调试核心转储与Cdb崩溃中的gdb和查看Java堆栈跟踪之间存在很大差异。 C ++实际上是一种非常糟糕的语言,但有很多原因,它与C有共同之处。它是一种强有力的方式来告诉计算机完全按照自己的意愿行事,而不必担心关于某些运行时正在做的其他废话。
此外,如果您想节省时间,请不要打扰前10名工程师学校的任何人。并不是说二级学校没有优秀学生,但从实际角度来看,你不需要雇佣他们就是其中之一。
MIT,Stanford,UC Berkeley,Georgia Tech,Illinois Urbana Champaigne,CMU,Caltech,USC,Michigan Ann Arbor,U。Texas Austin。
我也不会雇用任何人编写使用Microsoft Windows的软件。作为一名计算机科学专业的学生,你根本无法对软件或计算机如何工作而不成为Linux用户(如果你使用FreeBSD或其他东西,那就更好了)