研究生/初级工程师可以期望什么标准?[关闭]


38

毕业生开发人员可以接受缓冲区溢出吗?我们将标准设置得太高吗?研究生/初级工程师的预期能力是什么?

内容:

我们目前正在招聘主要在Linux上的C语言中工作的初级开发人员职位。

作为该过程的一部分,我们要求应聘者在闲暇时完成C语言的代码测试。

到目前为止,我们已经拒绝了两个候选对象,因为它们的代码虽然可读且在某些情况下是惯用的,但是由于无限制的缓冲区写操作而遭受了缓冲区溢出错误。

[编辑]:

  • 我们明确要求提供经过错误检查的生产质量代码。
  • 我们为候选人提供测试和构建框架

[更新]:

由于这一线索,以及我们与其他开发人员的亲身交谈,我们正在改变执行代码测试的方式以及招聘人员的目标。

我们认为,候选人无法解决或无法理解缓冲区溢出问题,意味着他不适合我们进行的工作,尤其是他所接受的指导比我们所能接受的还要多。因此,我们仍然会拒绝最终无法提交可靠代码示例的候选人。

但是,我们已经采取了一些措施来使招聘过程对我们和候选人都更有效率。

尤其是:

  • 我们使期望更加明确,对生产质量的含义进行了清晰的解释,并警告该代码在输入和错误方面应该是可靠的。
  • 现在,在代码测试的描述中,我们将候选人链接到防御性编程和C标准库的资源。
  • 我们将目标受众从初级开发人员和毕业生转变为具有相关经验的目标人群。
  • 如果提交的代码以某种方式失败但被接受,我们现在提供一个导致错误情况的最小测试用例,并为考生提供改正错误的机会(除非由于其他原因而被拒绝)。如果合适,我们还将指出有问题的行/功能。
  • 现在,测试的目的已经从前端过滤器稍有改变,从而有机会建立更好的候选图片,特别是它将为我们的电话讨论提供信息。也就是说,我们仍然愿意仅基于代码拒绝。

[更新2015-07-09]: Nujob的Andy Davis从应聘者的角度撰写了一篇有趣的相关文章,介绍了如何使用代码测试,并且值得一读。在这里找到它。


29
也许...?考虑到现在在学校中似乎有很多人比Java拥有更多的Java经验。如果应聘者刚从学校毕业,并且他们的代码暴露中有2/3是Java,那么他们的C可能不足以通过您的C测试。但是...如果他们开放并且愿意学习,那么您会说什么?毕竟,这是一个初级职位...
FrustratedWithFormsDesigner 2013年

4
它也是在采访中编写的代码,在给定时间限制的情况下也许可以原谅。我至少要确保向他们提及他们的代码不必遭受缓冲区溢出的困扰。
曼斯菲尔德

4
我第二个@FrustratedWithFormsDesigner。我是一名初级开发人员,唯一需要处理C的地方是在CPU体系结构的一个类中分配了两个作业。同时,我认为自己在C#,Java和Ruby上还可以。
凯文-恢复莫妮卡

4
测试框架是否包括导致缓冲区溢出的测试?
FrustratedWithFormsDesigner 2013年

44
我不能说你做错了什么,但是在过去几年里采访了几十位CS的主要大学毕业生之后,我发现大多数人对“生产质量代码”没有什么概念。我认为大多数CS讲师都不关心编写供他人使用的代码。
吉姆在得克萨斯州2013年

Answers:


109

我认为您没有将标准设置得太高,我认为您可能需要其他标准。

我认为代码测试对于确定候选人的能力很有用,但不应通过/未通过。您应该使用代码测试的结果来启动与候选者的对话。

如果您发现他们犯了错误(特别是如果他们是初级开发人员),请指出这些错误并询问他们将采取哪些不同的措施,或者他们是否理解为什么会出现问题。


1
+1是正确的,这是一个很好的建议。实际上,我们确实要求考生检查他们的代码是否有错误,使他们有足够的时间这样做,但是他们回来时有错误的更正,在某些情况下使代码更糟,而没有解决导致溢出的错误。首先。
2013年

15
@brice几乎可以证明他们实际上是初级开发人员。实践和经验是避免看似明显的错误的地方。
Tombatron

34
@brice:他是说要与他们讨论具体的错误;不要说有错误,请他们回复您。实时讨论错误-给他们一个提示(行号或描述和功能,并让他们给您行号),然后询问如何预防。目标不是获得无错误的测试代码,而是对申请人的优缺点有一个很好的了解。
jmoreno 2013年

6
如果初级开发人员能够看到该问题,则他们将解决该问题。如果是我,我会测试他们与您合作的能力。告诉他们问题出在哪里以及在哪里可以找到,对他们给予与实际同事相同的待遇,并查看他们的反应。如果和他们一起工作很麻烦,那么他们就不适合这个职位。如果很高兴与他们合作,请雇用他们。
zzzzBov

67

我认为,初级预选赛是所有与众不同的原因。青少年不应该接受能力方面的测试,应该对他们的学习能力,好奇心,热情,道德和谦卑进行测试。大三学生的假设应该是他们没有能力,让他们这样做是您作为大人的工作。

显然,他们应该能够编写诸如fizzbuzz之类的基本代码,并具有概念的常识。如果您向他们指出了这一点,而他们甚至不知道缓冲区溢出是什么,那么我会说这是不可行的,但是我不希望初级人员编写超过5行的代码而没有bug。

您信任大三学生的能力的那一天就是您应该受到质疑的那一天,应该给大三学生提供大量的指导和健康的“信任但要验证”。我曾经是一个初中生,对当时在场的所有人来说,都是初中生:对不起。还记得初中时所做的可怕事情吗?(请不要告诉我这就是我;您会给我一个复杂的表。)


1
我正式仍然是具有2年经验的“初级软件工程师”!我的背景既不是CS工程也不是SW工程学(物理学专业)。现在或当我被录用时,我都不愿意交出任何错误的代码。
2013年

31
更正后,您将不会有意识地交出任何输入中存在段错误的代码。如果您只是声称自己从未编写过错误,那么不便打扰您,约翰·卡马克(John Carmack)。
吉米·霍法2013年

死了!脚踏!那当然不是我的主张。我发布了错误的代码,有些比其他代码差。但是没有一个看起来像第一个示例,说明当您使用Google搜索“缓冲区溢出”时该怎么
Brice

我们甚至为代码提供了一个测试框架,包括触发溢出的测试!
2013年

@brice当您说您提供了测试框架时,是否提供了类似valgrind的工具来测试内存问题?
2013年

15

我在这里看到一些问题。

首先是假设普通计算机科学专业的毕业生知道任何事情。他们没有。坦率地说,当我看到一位计算机科学专业的毕业生知道如何安装和设置Visual Studio时,我感到非常惊喜。哎呀,我最近和一个人合作,声称自己在Microsoft堆栈上有超过五年的编写.NET代码的经验,但无法弄清楚TFS是什么或如何连接。

第二个是您非常有限的游泳池。我们也有应聘者进行编程测试。他们必须编写五个独立的“程序”。他们在家中完成并将代码寄出。测试非常简单(没有数据库,没有外部依赖项),并且可以使用Visual Studio 的Express版本轻松完成。测试本身很容易由高级人员在大约30分钟内完成。请注意,我们通常仅对具有三年以上可验证工作经验的应届毕业生提供这些服务。

我们已经量化的是,大约有70%接受测试的人永远不会回到我们身边。通常由于公然的语法错误(例如,失踪;),导致大约15%的内容无法编译。另外10%会编译,但无法执行所需的操作。

这留下了高达5%。在这一点上,我们甚至没有考虑诸如在需要数字字符时输入字母字符作为输入的条件。仅在给定非常有限的X集作为输入的情况下,应用程序才执行适当的输出。此外,这些数字来自过去四年中约500名候选人:我们保留统计信息是因为我们想知道。

如果我们要更多地关注代码结构和防御性编码技术,例如正确处理非托管资源或try .. catch语句的使用,那么几乎没有人会通过。

问题当然是为什么?

从四年制大学获得该领域学位的孩子为什么不能完成简单的编程任务?答案是,大学与业务需求完全脱节,比我们认为先进的技术落后了很多年。10年前,编码标准是如此之大,以至于安全性事后才做。甚至还没有进行单元测试。如今,通过每个功能或增强功能,安全性最好摆在您的首位。请记住:大多数教授要么从未真正从事过该领域的工作,要么就已经从事了很长时间。一旦知道了这些,那么您就可以开始理解它们为何如此落后。更糟糕的是,其中一些教授在特定技术(JavaPHP等等),并且没有讨论严重的基础性问题,例如代码结构或可接受的方法(以及为什么!)。

只是一个例子。一位应届毕业生告诉我他为某门课程编写移动操作系统的一些经验,但是即使从基本的角度来讲,他也无法解释Web服务器的工作原理。他只是不知道。15或20年前可能是了解如何制作操作系统的正确时机。今天...没那么多。但是,这是必修课,因为防御性编程课程对他们和外界更加有用。

那么我们该怎么办?

在这5%的人群中,我们将进行进一步的采访,以了解他们的个性和健康状况。然后,我们会充分了解“最佳”的人选,他们将花大约六个月的时间对他们进行“重新编程”,以摆脱他们的教授充斥的胡扯。


2
在这里完全同意,我在该行业的2.5年中学到的东西比我上大学时学到的都要多。在上学的第一年担任网络开发人员实习后,我痛苦地学会了这一点。
瑞安

5
现在我想试试你的编程测试..
阿卡什

1
真?您是否正在寻找安装特定软件的经验,并且能够提供网络服务器功能的过于简化的版本?如果有人可以编写移动操作系统,那么他们可以学习网络服务器的工作方式。
萧伯纳

@MichaelShaw:如果有人正在编写操作系统,但尚未学习最常见的服务器类型的基本操作,那么这表明他的学校正在跳过学习的大范围(且高度相关)的课程。那么问题就变成了还有什么被跳过?
NotMe 2013年

2
@ChrisLively:我不认为这些东西是什么大问题。并不是说我们有一个微小的领域在缓慢移动。在工作中学习将发生。我认为您在这里可能有一个本质上的好处,但是这些示例并不令人信服。如果CS课程存在问题,则添加“如何安装Visual Studio 101”和“ Web服务器101基础”将无法解决该问题。(我确实喜欢“防御性编程”课程的想法。)
Michael Shaw

5

我认为您在错误地看待问题。您应该问自己:这是候选人对我们的要求,以便他们能够胜任这项工作?您应该正确评估位置及其含义。以下是有关何时以及何时不聘请初级开发人员的一些建议。

何时雇用初级开发人员:-如果容易完成的工作繁多,那么对于高级开发人员而言,这将浪费时间。-如果您愿意在接下来的几年中指导和培训此人。-如果您想发展公司并想要长期留任的人。一个只待了一年的初级开发人员会浪费公司的资源,他们几乎不会做任何事情,大多数结果都来自于自己的成长。-当您想花钱在某人的成长上。再次,大多数的好处将是他们学到的东西。

什么时候不雇用初级开发人员。-工作太复杂时。在这种情况下,这只是他们的联盟之外。-当您想省钱时。高级开发人员应在短时间内完成相同的任务,并获得更好的质量结果,因此应该总是更便宜。-当工作可以外包或不足以使员工忙碌时。在这种情况下,最好将一些工作转移给私人承包商。

最后一个重点。不要雇用初级开发人员,因为在他们不适合工作时,他们会“买得起”,或者“我们愿意花掉”。最后,您最终要做的就是从马桶上冲钱。此外,一旦他们掌握了这些技能,无论如何他们都会要求巨额资金。

关于我:

  • 几乎没有经过正规培训的物理学学位。
  • 两年的工作经验。所以我知道学习过程的全部内容。
  • 启动软件开发人员。我完成了非常艰巨的工作,并且看到了各个人的所有不同技能水平。他们中的许多人无法应付我的很多工作。

4

正如其他人提到的那样,初级职位可能没有C的经验。我个人只是简短地了解了C中的缓冲区溢出问题,即使我能当心他们,我仍可能会介绍一些内容(尤其是如果有一个分配给他的任务可以借的话)本身会造成缓冲区溢出)。可能,许多初级开发人员也会遇到类似的情况,他们可能知道缓冲区溢出,但是他们还没有准备好以任何广泛的方式来识别和处理它们。

鉴于此,我认为适当的响应是在下一次可能的交互中提出问题,并询问他们对缓冲区溢出了解多少,以测试其总体知识。之后,告诉他们您在他们的假定生产就绪代码中找到了一个。这将为您提供一个很好的窗口来判断他们对纠正和指导的反应。

人们是否普遍认为,知识较少但愿意并且能够学习和改进的初级开发人员比知识渊博但不能或不会改进的初级开发人员更有价值?

话虽如此,在您提到的其中一项评论中,您给了他们测试,如果他们使用了它们,它们会指出代码中的缓冲区溢出。因此,也许更大的问题是为什么他们不运行测试(关于测试,为什么要输入错误的代码)?


3

缓冲区溢出是绝对不行的。您可能有一个相应的代码问题。如果这段代码有什么不对(可能会出错),则应试者应该能够找出问题所在。问题是,问题是否无关紧要,因为无论如何您都在运行clint。

但是,在人造的自由格式代码测试中,我对sprintf之类的违规行为会感到温和。时间太短(假设),思维活跃,对提出一些可行的想法的渴望太大。


10
我几乎写出了完全相同的答案,直到我注意到他指的是“初级”,记住这一点。根据经验
Jimmy Hoffa

@JimmyHoffa是的,只是读了你的第一行,更正了我的“绝对不行”。您的观点值得考虑。到现在为止,我可以使用和估计每个程序员,但只有一个心理案例和一个“骗子”。
Joop Eggen

@JoopEggen:我敢肯定,“心理”不是您要找的单词。否则,他们应该已经能够读懂您的想法……;)
NotMe,2013年

2

我认为您是在问错问题。成为专业程序员并没有客观的条件。如果有,那就有标准的编程考试,但没有。您只需要根据您可以承受的挑剔程度,可以支付多少费用,您的软件可以承受多少错误,以及您可以花费多少时间来设定自己的门槛即可。

在这种情况下,我猜测缓冲区溢出可能意味着该应聘者作为示例性工作的示例显示的代码由于分段错误而崩溃,而不是按照您的要求执行。因此,您是否应该接受编写因分段错误而崩溃的代码的编码器,而不是按照您的要求进行操作?问:

  • 您的组织有能力吸引任何可以编写工作代码的人吗?

  • 您的开发过程是否足够健壮,以至于几乎可以编写代码的人可以在同行评审和测试支持的帮助下编写工作代码?

  • 您是否有能力教一些程序员如何成为一名程序员,您是否愿意为此付出更多的努力并等待数年,并希望候选人的内在才能成才?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.