评估新程序员的最佳方法是什么?[关闭]


51

评估最佳人选以获得新工作的最佳方法是什么(仅就编程技能而言)?在我的公司中,我们与成绩不错但没有实际编程技能的人有很多不良经历。他们的技能就像是代码猴子,没有能力分析问题和找到解决方案。

我还要注意的更多事情:

  • 我国的教育体系很糟糕-确实很糟糕。从事这类工作的人之所以出色,是因为他们有才干或真正尝试自己学习。

  • 大学/研究生/研究生学位不一定意味着您确切地知道该怎么做。

  • 认证在这里也没有任何意义,因为负责认证课程的人员也没有技能(或从事低薪工作)。

我们确实需要获得灵活且没有机械思考的优秀候选人(因为这类人凭经验表现不佳)。

我们在政府机构中,应聘者不一定来自外部,但只有找到合适的人选,我们才有可能接受或不接受任何候选人。

我希望我的提问听起来不要太激进;顺便说一句,我本人是一名程序员。

编辑:我发现这里的问题确实很复杂。我将取消“正确答案”的切换,只是为了使讨论顺利进行而没有任何偏见。


正如您所说的那样,我非常重视创造力。我不喜欢蛮力的方法,如果几代过去的程序员使用一种给定的方法,那可能意味着它很棒,或者只是长期存在。同样,教育不应该专注于贸易技能,我想说这是非常重要的,但是将获得的实际成绩超越基本能力水平并不那么重要。我很乐意看到Khan Academy风格的系统,其中包含许多小型通过/失败模块,以及其他模块通过依赖关系,以及允许重新使用模块之前的冷却时间。
alan2here

Answers:


52

关于候选人的选择,我通常会采用三击方案:

  • 使用类似FizzBu​​zz的编码问题和许多知识问题进行常规测试,必须提供编码示例。根据职位的不同,可以是OO原则,SQL设计原则等。我在测试中增加了问题的难度,以查看问题可以走多远。这个想法并不是要回答所有问题(如果回答的话,更好),而是要看他们是否不知道时是否能认出他们。信任是必不可少的,我不想在团队中有人骗我。

  • 返回与考生的测试,并讨论答案。可能扩展问题以达到候选人的极限。这可以是广泛的,并且范围越广越好。

  • 最后但并非最不重要的部分,The Code Review。我要求应试者带上一段代码(我通常将之前的测试/讨论和这次复审间隔几天,以使他们编写和完善一段代码)。然后,我们由两个人对其进行常规代码审查:一个将直接与应聘者合作的人,以及一个先前与应聘者一起审查测试的人。关于代码审查,您可以从JohnFX阅读本文

最后,您应该能够决定是否希望该候选人成为您团队的一部分。


4
我同意编码问题和知识问题,但从未同意要求考生携带一段代码。在我看来,要找到大量的代码是不容易的:显示不平凡的东西,不需要对更大的系统有太多了解,并且可以向其他人展示。
Andrea Zilio'1

我会说代码审查。FizzBu​​zz过度使用了。您可能会吓跑人。我曾经是医疗保健和金融服务的程序员,fizzbuzz之类的东西是没有用的。您将能够理解更复杂的交互。向他们询问代码示例,即使它是pygame中的FPS。如果他们没有代码样本,那么他们不是编码员。
Christopher Mahan 2012年

1
@ChristopherMahan FizzBu​​zz的价值(和类似的琐碎编码)是一个简单的看门人。如果他们不能以他们选择的语言实现FizzBu​​zz,他们可以编写任何代码吗?
Vatine 2012年

@Vatine FizzBu​​zz测试逻辑推理能力,而不是编程能力。当然,一个人应该能够做到。一个简单的编程问题将是:以有趣的方式在屏幕上显示排序的项目列表。他们将不得不编写代码,但是他们将能够借鉴经验来编写一些东西,而不必试图弄清楚脑筋急转弯。我曾经一次面试失败了,因为他们希望我使用正则表达式,而我回答说,对于这个问题,正则表达式是一种过大的功能,而python具有内置功能可以做到这一点。我想我不想在那里工作。
Christopher Mahan 2012年

代码审查是一个糟糕的主意,JohnFX的反驳还不够。我知道很多优秀的开发人员,但是除了其雇主专有代码库之外,不会从事任何其他工作。这些是有家庭的人,工作以外要做的事情。但是,当他们工作时,他们的工作效率很高。
MrFox 2013年

20

首先给他们FizzBu​​zz解决。那应该清除他们中最糟糕的一个。

然后,事情就有点困难了-例如,如何在没有内置库函数的情况下反转字符串。让他们在解决问题时说话,以了解他们的思维过程。

如果他们发现这些问题很容易,您可以继续提出更棘手的问题,直到您确信他们可以走路,而不仅仅是讲话。


1
我想这可能取决于您所面试的程序员的水平。尽管可以使用初级职位的能力,但我会在面试中认为这样的问题可以清楚地表明这不是我想工作的公司。
jfrankcarr 2011年

3
我不同意说话的部分。在解决问题时,您是否经常与自己或他人交谈?给一个人一些空间并让他思考一下怎么样?因此,除非完全无关紧要,否则我认为这不是一个好习惯。
Andrey Rubshtein 2011年

1
@Andrey-谈话的部分是深入了解他们的思维过程。您想看看他们如何看待问题并解决问题。您有更好的选择吗?
奥德

5
@Oded,是的,事实上我知道。让他们独自思考一会,就像他们在现实生活中那样,尤其是在这是一个难题的时候,然后随心所欲地问他们。就像在任何口试中一样。
Andrey Rubshtein 2011年

4
即使是在拥有几名最近被认可的CS专业人士的学校的服务生的陪伴下,我也发现琐碎的Fizzbuzz是一个很好的过滤器。我毕业的大多数人可能在合理的时间内无法解决它。那些人为找到工作而苦苦挣扎。我认为遵循joelonsoftware.com/articles/GuerrillaInterviewing3.html很好。
钻机

14

只是对工作充满热情。

用乔尔的话来说,就是寻找“ 聪明,干完事 ”的人。

剩下的没关系


7
问题在于您无法判断它们是否聪明。

4
@乍得:对学习的热情不会“把事情做好”。要确定某人是否可以完成任务,您必须要求他们做某事。
凯文·克莱恩

2
@kevin cline,调整了我的帖子。他们需要对工作充满热情,通常通过学习来体现。是的,这需要一些问题,对话应该畅通无阻,而不仅仅是一系列问题。但是要弄清楚他们是否能完成任务,请举例说明他们在哪里遇到障碍,以及如何克服障碍。每个人都在工作中遇到障碍,无论是来自技术,人员,流程,还是一个聪明的人,把事情做好了,就会找到克服它的方法,并且能够详细地解释它,足以卖给您他们的能力。
CaffGeek

3
@mouviciel不是我的经验。我认识的一些最聪明的程序员都很外向。

4
如果您不能和开发人员候选人坐在一起的房间里,想一想他们是否聪明,那就找一个可以的人。
JeffO 2012年

13

根据我25年的编程经验(诚然,其中仅包括5或6个雇用其他程序员的实例):

积极指标:

  • 对技术充满热情

  • 业余爱好节目

  • 如果鼓励的话,会在技术主题上大声疾呼

  • 多年来重要的(常常是众多的)个人附带项目

  • 自己学习新技术

  • 对哪种技术更适合各种用途提出了自己的看法

  • 对于使用他不认为“正确”的技术工作的想法感到非常不舒服

  • 显然很聪明,可以在各种主题上进行精彩的对话

  • 在大学/工作之前很久就开始编程

  • 在CV雷达下有一些隐藏的“冰山”,大型个人项目

  • 各种无关技术的知识(可能不在简历中)

负面指标:

  • 编程是一项日常工作

  • 即使鼓励,也不要真的想“谈论商店”

  • 在公司赞助的课程中学习新技术

  • 很高兴与您选择的任何技术一起工作,“所有技术都是好的”

  • 看起来不太聪明

  • 在大学开始编程

  • 所有编程经验都在简历上

  • 主要专注于一两个技术堆栈(例如,与开发Java应用程序有关的一切),没有其他经验

另外,我建议:

  • FizzBu​​zz测试(或类似的东西来测试写一个算法的基本能力。
  • 较硬的FizzBu​​zz测试版本(使它们达到故障或接近故障点)。
  • 讨论他们的代码,看看他们是否愿意自我批评,并寻求改进(他们可能没有时间在现场测试中做得很短),例如:
    • 好的变量名(我有经验丰富的熟练编码人员在生产中使用变量,例如“ flag”(WTF ??)
    • 模块化。
    • 预测问题并进行“防御性编码”
  • 愿意将“缺陷”视为改进的机会。我认为最好的编码人员总是毫不动摇地寻找以前的代码中的缺陷。他们并不那么自我中心,以为发现自己的缺陷是个人的侮辱。他们认为这是做得更好的机会。(那些无法坚定地看待缺陷的人要么被看到的缺陷所淹没(并且变得超级自信,或者为了避免这种情况,他们忽略了这些缺陷。
  • 他们可以调试吗?
  • 他们可以单元测试吗?(我与很多程序员说“ QC做到这一点”。我不是在谈论测试,而是在谈论测试:您编写了一个函数,它起作用了吗?在处理问题时是否做出了合理的努力?可能的问题(如NULL输入等)?如果您无法做到这一点,怎么知道什么时候完成?
  • 他们有良好的沟通能力吗?(至少:对他们什么时候会理解和不理解的理解和自我知识,以及愿意说“我不理解,请再解释一次”)。

上面的大部分摘要来自“ 如何找到一个好的程序员”,这是一篇很棒的文章,更多地关注了较长的指标。它肯定证实了我的直觉和经验。在“什么是优秀的程序员”清单中通常没有提到很多东西(例如“激情”)。


10

评估编程智能是Turing测试的一种形式。因此,(当前)没有任何保证有效的封闭式评估程序。聪明的程序员需要识别其他聪明的程序员,但只有一定的概率。

如果您的团队中有面试官,他们会闻到下雪的工作气味,并且本能地不喜欢与愚蠢的人一起工作(即使是那些相貌好,履历出色的人,并且可以从记忆中喷出所有通常的罐装解决方案),那么您的机会会更好。 。

(一种可能有助于提高堆栈溢出质量的副作用的可能方法是,挖掘一些旧的堆栈溢出问题,这些问题在某种程度上与您的工作要求相关,但您认为答案较差;请问受访者他们将如何回答,以及让他们张贴它(如果是一个很好的答案)。类似于针对基于人群的OCR的摘要。)


7

给他们一个问题,最好是与他们将要解决的问题领域相关的问题,并请他们讨论如何解决。您可以让他们只是讨论,伪代码或写一些实际代码,具体取决于您对他们的技能水平的信心如何

例如,如果您的组织举行了会议,请他们概述如何编码安全的在线注册系统。他们应该能够涵盖一些基础知识,并对确切需要实施的内容提出很好的问题。在进行交互时,您应该能够确定它们是否适合您的组织以及需要他们担任的角色。

我不是编程琐事测试和脑筋急转弯的忠实拥护者。尽管它们对某些人可能很有趣,但它们也可能使其他人感到烦恼和/或压力大,包括可能最适合您的团队的人。另外,许多此类测试的信息可在网上轻松获得,并且会鼓励对测试和其他策略进行塞满,从而削弱其衡量程序员能力的能力。


我同意您的琐事/大脑测试对候选人甄选的不利影响。问题在于,与每个候选人一起审查/讨论代码将花费大量时间。也许结果会更加主观。不完全是我要寻找的东西,我宁愿需要较少的个人监督的东西。后来当我有更合适的候选人时,他们进行交谈/讨论/面谈
Rafael

3
太费时间了吗?有人将不得不与候选人交谈。没有笔试。考试的内容将迅速成为公众的知识,考生将获得记忆深刻的答案。
凯文·克莱恩

10
@kevincline:确实,您必须与他们交谈。我在施乐公司(70年代)接受采访时,被问到如何处理哈希算法中的冲突。我在编程方面没有太多的正规教育,但是那时我已经从事了大约5年,所以我说我不知道​​哈希是什么。我的面试官向我解释了这个问题,然后再次提出了问题。当我发现并解决了几种类型的碰撞问题时,我们进行了一个多小时。他告诉我,如果我能在一个小时内做到这一点,那么我就可以处理他们扔给我的一切。我得到了这份工作。因为他我说话。
彼得·罗威尔

@PeterRowell这就是需要的方式。+1
凯龙(Chiron)2012年

3

阅读此问题及其收到的一些答案后,我写了一篇我认为可能有兴趣的文章:

雇用软件开发人员时的奇怪的招聘做法

好的,所以文章标题很垃圾,但文章已成为问题的核心。您选择面试他们不是候选人的问题,无论他们对您所考虑的角色有多么不适当。如果您没有设法定义合理的招聘程序来让您找到毛坯宝石,那么您将不得不承受后果,是的,这意味着要找到一些可以永远无法满足您的期望。根据候选人的信和简历筛选候选人需要您首先,要求您的求职者写一封关于他们自己以及他们希望从职位中获得什么的信,然后再看简历的写作方式。如果只有一个或两个潜在的候选人要面试,那么您可能已经正确进行了预筛选。

当您最终找到您认为真正值得您花时间的1或2个候选人时,不要简单地问一些无用的测试人员问题,而要花时间去认识这些人,并就软件进行公开讨论一般的工程。与传统的(有些是对抗性的)面试情况相比,您将通过随意的方式对候选人进行了解,这比以往任何时候都多。另外,不要简单地接受一次面试,而应将您的主要应聘者参加几次使用公开讨论的会议,并且应聘者可以与他们的准同事见面。时间永远不会浪费,因为不适当的候选人不会在高度技术性的讨论中蓬勃发展,并且会在戒备森严时迅速显示出自己的缺点。


好点。但是,我对太多的采访要小心。候选人的时间和您的时间都是宝贵的(特别是如果候选人目前在其他地方受雇)。根据我的经验,越来越多的采访的收益递减,所以我只限于一两次采访。(其他)电话采访也可能是一个折衷方案。
sleske 2012年

1
@sleske,我原则上同意,尤其是如果同一个人参加所有采访时。因此,最好分担负担以找到最适合公司和团队的重担,并给您一个学习其他人的经验的机会。糟糕的面试不会走得更远,但是对候选人感兴趣的利益相关者越多,您可能需要的面试就越多,因此在非常广泛的团队中进行3或4次面试并不罕见。太多的话会给人以混乱的印象。还可以提前告知候选人面试的次数。
S.Robins,2012年

@ s-robins有趣的观点,只想对我的问题的某些方面打个比方。由于我们无法控制的原因,我们无法根据正常的招聘流程来选择候选人,而是只邀请候选人来,我们需要说出他/她是否具有正确的技能/知识来接受这份工作。也许在正常的招聘过程中,这些事情不会经常发生。但是我们需要处理这种情况。
拉斐尔2012年

@Rafael,如果我理解您的评论正确,那么您是说您从“其他地方”获得了应聘者来进行评估,而您的困难在于对候选人进行客观评估,而无需事先了解该候选人。这听起来更像是您所在组织中的系统性问题。我建议与派候选人的人会面,并与他们合作设计一个系统,以便在面试候选人之前过滤掉明显不合适的候选人。甚至可能要求实施更正式的申请流程。
S.Robins,2012年

@ s-robins您理解得很好...
拉斐尔

1

您没有说过哪种语言,但是测试某人的知识相当容易。这也取决于您所寻求的水平,但是有关面试问题的问题池很大

但是,您决定进行面试,不要问那些“侧面思考的难题”面试问题


2
可能我还没有指定要用来开发的语言,因为我们相信一个好的程序员(带有他/她的专业能力课程)可以学会使用任何语言编写程序,而不必担心它的罪过。
拉斐尔

2
@Rafael norvig.com/21-days.html。正如我所说,这取决于您是否正在寻找初级或高级程序员。
2011年

因为我说的是大多数候选人都是新毕业生。我指的是初级程序员,但是我的问题是在更广泛的背景下进行的,即我的特定个人招聘流程
Rafael

@Rafael在这种情况下,您对初中生的期望很高。阅读我在上面的评论中发布的文章,其中介绍了掌握一种编程语言所花费的时间。
2011年

我不是在谈论掌握一种特定的编程语言,而是在寻求拥有最好的通用编程技能的最佳人才,(这就是为什么我不指定语言),我不能期望所有人作为候选人掌握的语言,这就是我们正在编程的语言,这就是为什么如果人们不懂该语言的话,我们有能力开设一门专业课程。
拉斐尔

1

我建议您提出一个FizzBu​​zz问题,并雇用第一个通过的问题。进一步的测试往往有缺陷,因为并非每个优秀的程序员都不会像您那样处理问题,或者在面试时不会口吃,也不知道您想要或所关心的语言,或者像在没有第三个变量的情况下交换整数一样愚蠢(无论如何,谁需要?是因为RAM超过了128个字节?)。

想一想。如果FizzBu​​zz问题在200个问题中消除了199个,那么它就消除了数百个访谈。您真的要去采访数百个潜在客户吗?

FizzBu​​zz之后,收益似乎正在减少。假设199/200甚至接近。我想您的时间也很宝贵...


2
令人恐惧的是FizzBu​​zz是评估程序员能力的标准测试。但是,这是一个经过检验的真实测试-我无法告诉您有多少位具有CS学历的程序员不能做到这一点(在他们的“选择语言”中)
Nodey The Node Guy

0

我不确定这是评论还是答案,但基本上不确定Matthieu所说的。您想要花一两分钟(但不超过5分钟)来完成的愚蠢简单问题,这些问题应该针对不同的领域。

此类愚蠢的简单问题示例就是有关递归的问题,例如您有一个列表,必须以相反的顺序打印它而不使用循环。一个简单的正则表达式问题,正则表达式是否通常在您的开发中完成。有关使用C ++的位和字节的问题(编写一个接受char作为long并打印出二进制表示形式的模板。不需要专门化,只需使用sizeof()即可确定位长)

每个问题大约需要<= 3分钟


0

向他们询问他们曾经尝试解决但无法解决的最有趣的编程挑战,他们在解决问题时使用了什么方法,为什么他们无法解决以及他们认为可以解决什么其他方法。

这足以让我判断程序员作为程序员的能力。


0
  1. 他们可以捍卫自己声称的知识吗?他们将其作为技能或在其他项目中所做的事情放在简历上。看看他们在这个问题上能做多深入。
  2. 他们可以学习新东西吗?谈论您正在使用的技术的高级方面或您所从事的业务领域的某些方面,看看他们是否可以掌握主题。他们会问聪明的问题吗?他们能提出一个比喻吗?这与他们在其他行业或技术中所做的事情是否相似?

  3. 他们宁愿在编程吗?它不必在他们的清单上排第一,但是他们必须表现出对编写代码的偏爱。我的意思是说实际上是在编写代码并制作东西,而不是整日围坐在一起谈论它或在板上画图。不是为了最小化计划或促进牛仔编码,而是最终要有代码。避免那些避免使用键盘的人。这不是管理职位。

您可以在1到10分的范围内进行评分,或者仅仅依靠能够闻到自己的气味。


0

如果让您感觉更好,那么几乎每个国家都存在不良的程序员。问题是如何清除它们。

首先除草是简历。我要寻找的一件事是拥有很多声称的语言经验,而没有什么可以描述他们在该语言中所做的事情。我见过简历,几乎可以断言他们知道曾经发明的每种语言,但是他们的经验表明,他们实际上只在Access和Visual Basic中工作。那些就直接扔进垃圾桶了。10页的简历正好丢进了垃圾桶(尤其是我经验不足2年的人的10页的简历)。对于刚毕业的大学毕业生来说,经验很少,您必须对他们的表现非常挑剔。最好的候选人在履历上要小心,他们没有错误。您是否真的在寻找一个人,那么在乎他一点也不在乎校对自己的简历呢?

专业准备的简历也丢进了垃圾箱。阅读数百份简历后,您可以选择它们,因为它们使用完全相同的措词。您无法信任专业准备的简历中的内容,并且您知道此人没有自己准备。这种人将依靠他人为他解决问题,您真的希望在编程岗位上这样吗?

寻找能让人在您选择的人中脱颖而出的东西。对于那些刚刚离开学校的人来说,这当然更难,但是要寻找成就,对开源的贡献等等。

下一个杂草是电话采访。询问与您的实际工作相关的基本概念。如果人们不具备您需要的基本概念知识,那么就不值得去参加个人面试。年轻人经常认为这是不公平的,因为他们可以在Internet上查找所有内容,但事实是我从未遇到过一个优秀的程序员,他不得不在Internet上查找所有内容。您应该对自己的专业有所了解,不必每次都查找。

电话面试后,您应该选择4-5位最佳候选人并进行面试。当然,如果您只有1-2个好的候选人,那么就不要打扰已经被淘汰的人。现在,您将要问一些棘手的问题,并了解它们如何解决问题。我永远不会使用fizzbuzz测试,因为它太出名了,所以答案什么也没有告诉您。而是从您自己的代码库中解决一些问题。我可能会给他们一个要求和一段代码,然后问他们代码是否满足要求,如果不满足,为什么要满足要求。我想请他们描述他们必须解决的最困难的编程问题,以及他们为寻求答案所采取的步骤。我会问一些更深入的技术问题。记住,您正在尝试了解他们的技术能力,他们的问题解决和调试能力以及与现有团队的适应能力。我还问一些问题,他们可能不知道如何判断他们如何处理压力,这是一项压力很大的工作,我不希望有人在面试中折腰,因为工作压力大于面试压力。我希望在我们目前薄弱的领域中发挥优势,并具有团队合作并向客户展示自己的能力(我们的开发人员广泛与用户打交道),您的列表可能会有所不同。不想因为面试的压力大于面试的压力而参加面试的人。我希望在我们目前薄弱的领域中发挥优势,并具有团队合作并向客户展示自己的能力(我们的开发人员广泛与用户打交道),您的列表可能会有所不同。不想因为面试的压力大于面试的压力而参加面试的人。我希望在我们目前薄弱的领域中发挥优势,并具有团队合作并向客户展示自己的能力(我们的开发人员广泛与用户打交道),您的列表可能会有所不同。


-1

必须给候选人一个现实的问题,以便可以自由使用任何技术来解决。

如果她以飞扬的色彩出现,那么她就在!

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.