如何招聘程序员,四步法则助你成功

jopen 10年前

英文原文: How to Hire Programmers

        怎样招聘程序员

        本文记录了本人招聘程序员的方法,希望能帮助你建立一个出色的团队。

        一般来说招聘程序员不算难。但要总结出如何招聘程序员,特别是招聘优秀程序员还是比想象中要困难的。尤其是你要招聘一个全职的员工(无论是否远 程工作)。这里面涉及到很多东西,比如文化背景,职业素养还有最重要的方面-技术领域(程序员是否知道如何实现他们口中宣称的技术)。我们假设你只是在招 聘一个外包人员来做一个小项目,如果要招优秀程序员仍然是不容易的。你如何考评应聘人员?你如何知道怎样可行怎样不行?你如何发现自己是在拿钱打水漂?答 案是你根本就不知道。

        你竭尽全力的面试候选人然后挑选最合格人的加入团队。如果这个人不行你就换一个,直到找到那个能呆下来的。问题是没人说非得要走这个流程。我下 面将分享我在招聘程序员时采用的方法,通过这种方式在过去几年里我招到了最优质的远程工作者,外包人员和全职员工。我招聘远程程序员和现场程序员时也采用 了同样的方式。

        在我找到了候选人后,我会让他们经历四轮面试:

        四轮面试流程:

  1. 非正式 HR 电话沟通(电话/Skype/Google Hangout)
  2. 技术电话沟通 (电话/Skype/Google Hangout)
  3. 编程测试筛选
  4. 文化融合评估如果候选人通过了所有的四轮测试,那很可能你找对人了。上述流程找到的人具有下面的特点:
  •  技术上能够完成工作任务
  • 能够融入公司文化
  • 善于有效沟通和发散思维

        四轮流程的目标

        可能你也注意到前两轮筛选都是采用电话/Skype/Google Hangout 作为沟通工具。为啥哩?答案非常简单:时间宝贵啊。时间一去不复返…如果我能为团队节省会议室,出差等我会很乐意去做。这就是电话面试的目的。通常候选人也会倾向于这种方式,毕竟这节省的是大家的时间啊。所以前几步的目的就是为了节省公司和员工的时间。

        我们的目标是:节约时间!

        每一轮都是在不同时间完成的。一般来说最少也得间隔 4 到 6 个小时吧。留出时间间隔的目的是让团队有时间决定是否让候选人进入下一个流程。例如:第一轮面试后团队决定放弃后续的面试,那就可以通过电子(邮件或电 话)方式通知候选人然后继续自己愉快的一天。第二步第三步是一样的道理。第四步就是要上手的了,后面会细说。这也可以说是“敏捷”式招聘。每一步都是迭代 式的循环并建立于上一步的成功。也可以看着是一种测试驱动(TDD)式招聘流程。 第一步测试通过了吗?通过了就进入第二步。第二步通过了吗?通过了,太好了。进入第三步吧, 第三步通过了吗?没有。 好吧,GameOver 了, 不用浪费后面的时间了。

        步骤细说

        下面就细说一下各个步骤,并提供了参考提问,外部资源的链接以及优化流程的建议。

        第一轮:非正式 HR 筛选(10 到 30 分钟)

        终极目标:基于基本对话和 HR 的经典必杀问题判断候选人是否适合目标岗位

        第一轮其实是很短的。 又想到了节约时间的问题—这是第一道关卡。你也可以把它变得更短。你需要确认这个人能有效的沟通,思路清晰没有社交恐惧症啥的。比如有人满嘴的”Cao” (原文是F开头的四字单词),那这种人就很可能不太适合团队。

        这一轮一般交给招聘经理(有时候就是你(HR), 有时候是别人)。这一轮经理应该描述工作性质并与候选人对话。下面是一些参考问题:

  • 为什么申请这个职位?
  • 在X方面你有多少经验?(X就是你们正在干的事儿,或者是新技术等等)
  • 谈谈你的上一份工作?

        接下来还可以采用传统的面试问题。例如下面这些:

  • 你会如何处理X情况?(X就是 HR 的经典问题)
  • 讲讲你遇到无法解决的问题时,后来是怎样解决的?
  • 跟同事有不同意见,你是如何处理的?
  • 你对我们公司有了解吗?
  • 你对我们有问题要问吗?

        此时此刻,你就可也判断候选人是不是思路清晰,或者是跟你在扯八卦。也就可以判断是否进入下一步:技术筛选

        第二轮: 技术筛选(10 到 30 分钟)

        终极目标:采用问答形式判断候选人是否具有所需的技术(Skype/Hangout/电话形式)

        技术筛选是第二道关卡。这一轮应该持续 10 到 30 分钟取决于问题的难度。如果候选人答不上的问题太多,可以随意缩短时间。所提的问题根据招聘的程序员类型有所区别。但应该覆盖正在使用的一些编程语言基 础,框架基础,服务器。可以提一些开放式的问题让候选人自己解释。尽量避免问一些是/非问题。下面是一些参考问题:

        NodeJS 参考提问:

  • 请解释 NodeJS 里 ExpressJS 的作用以及你为什么会使用它
  • Sync 和 Async call 的区别以及你更倾向于采用哪种方式,为什么?
  • 你使用哪个测试框架?
  • 知道 V8 是什么吗?

        Android 参考提问:

  • 什么是 AsyncTask,什么时候你会使用它?
  • 什么是 ActionBar
  • 什么是 Gradle 以及使用场景
  • 如何在 Android 上做单元测试

        Rails 参考提问:

  • 什么是 asset 管道
  • 什么是控制器(controller)?
  • 什么是 RSpec 以及使用场景?
  • 什么是路由?

        通常这类面试由团队成员进行。有时候是两个程序员。如果是两个面试官,相互间要有个暗号告诉对方候选人不合适以节省时间。我之前就采用了下面的方式:

        “提醒我跟你讲早上我在加油站的遭遇”

        “面试结束后提醒我给我表弟打电话”

        道理你应该已经懂了。自己编一个吧。至少有 50% 的时间你希望尽快结束面试因为候选人不靠谱。记住,目标是:节约时间。

        第三轮: 编程测试(2-4 个小时/夜间)

        终极目标:判断候选人拥有通过代码解决问题的能力。了解代码质量。

        面试过程中,要求候选人采用指定的语言解决实际问题。一个有经验的程序员应该在一个小时之内解决问题。我会给出2-4 小时的范围以便候选人有足够的时间完成任务。为了公平公正我一般会允许候选人在家里舒适的环境下接受面试,以排除压力并了解他们实际如何解决问题。有些公 司更喜欢在现场给候选人提供电脑和网络。不管哪种方式,目标很简单:了解候选人能否写出正确的代码。

        编程测试是很好的调节阀。不是说问题有多难(恰恰相反,问题很简单),而是因为你可以了解对方的代码质量,同时也能找到以下问题的答案:

  • 候选人的沟通能力
  • 候选人是否知道服从指示?
  • 候选人知道如何使用 gitGitHub 吗(后面会细说)
  • 候选人知道最佳代码实践吗?
  • 候选人知道如何写代码吗?
  • 候选人能通过测试吗?

        如果我让候选人在空闲时间里在家面试,我一般会告诉他们我会在下午 5 点通过邮件告诉他们题目以及解决问题的提示。我告诉他们最迟在明天中午 12 点前得完成。问题会发布到 GitHub/BitBucket 的 repo 里,这个 repo 会为每个候选人创建一个。repo 包含了所有关于问题的描述。候选人需要做的就是跟随指示并将结果发给我。下面是一些我创建的例子:

        NodeJS 例子

        Android 例子

        Rails 例子

        你可以 fork 这些例子并保存。如果你访问过这些网站中的任何一个你就会发现这里面的每一个例子都要求候选人经历一系列步骤。如果候选人不清楚干什么,他们可以跟我确认 或者直接在 Goolge 上找答案。候选人完成后需要提交一个 pull 请求给我,然后我可以进行评审。我知道不是所有人都用 Git 来管理源代码,所以你可以进行修改,以便采用 mercurial 或者 SVN 来管理。

        这种方式可以说是神来之笔,因为它能全方面了解候选人。比如候选人是否能按时写出代码完成工作。同时也能让我审查代码来判断到底是好还是坏。基 于我的经验,平均 60% 的候选人不能完成任务,因为他们不知道如何解决问题。这也是我让他们在家面试的原因。从第一步到第三步都可以远程进行。这为公司节约了时间。在这完成了任 务的 40% 的人中,只有 20% 的人做对了,并且到这个时候基本上只剩下一两个候选人看起来不错。如果你有更多的选择当然更好。

        对于这种方式有一个很正常的顾虑:万一他们作弊怎么办?如果他们叫朋友或者其他人当枪手怎么办?是有这种可能,但我认为现实中也存在这个问题。 有时候程序员不知道如何解决问题就会寻求帮助。他们通过 QQ 向朋友求助,或者是在网上搜或者是找一些满足要求的开源项目来修改。这就是程序员的作风,管你是在家还是在公司谁关心。如果对方真是在欺骗,我想很快我也 能发现。就算是对方被招进来了,团队也能很快发现问题。这时候你就需要需要决定是否要留下这个人了。

        如果候选人没能完成测试,这就直接是红牌了。当然出的问题也应该足够简单让有经验的程序员能在一个小时内完成。如果不能完成,要么是题目太难了 要么是候选人不合适。如果你用的是我上面提到的链接(或者类似的),那就不存在这个问题。对于那些没通过测试的,我建议放弃后面的面试直接换下一个人。

        对那些完成题目的我会审查代码。如果没问题我会继续面试。这种情况其实很少。一般我会问候选人为什么会用他的方式去写代码。比如我会问一个做 Android 题目的人为什么会用 HttpGet 而不是类似 OkHttp 或 http-request 的库。对于做 NodeJS 题目的人我会问为什么会采用原生的 http 请求而不是 restler 或 rest。问这些问题的目的是考察候选人的思维方式,也能更多的了解他们的性格。有时你也能从他们身上学到一些东西。

        如果没人解决问题,那就继续发布职位需求。有时候我要发好几遍才能找到合适的人。

        第四轮:文化融合评估(2-4 小时)

        目标:考察候选人是否能融入公司文化

        到这一步,候选人通过了 HR 和技术的电话面试,以及编程测试。或许你认为应该聘用这个人了。但注意不要被激动冲昏头脑—你需要了解这个人是不是能够和你以及团队一起和谐共事。这时候 我会把候选人带到办公室和团队见面并共用午餐。我一般叫他们在指定的时间来公司(上午 11 点到 12 点)并安排团队午饭。我们会去一个常去的地方吃饭。不要去一个高档的或者团队不熟悉的地方吃饭。否则团队不会全部参加或则气氛变味。我们需要的是平常和正 常,就是一个每天工作状态的展示。这样我们能评估他的个性并试图发现一些影响团队和谐的因素。如果我们发现有人感觉不对,我们就不会聘用候选人。因为以后 的路还长,如果一见不能钟情,日久就要生恨,工作也不会出色。

        情景再现: 有个人前几轮结果都恨优秀。我有点小激动。我带他们出去吃午饭才发现他们非常没素质,极端的具有消极进攻性(passive aggressive)而且有时非常计较。我们都应该有过这种感受:不要惹桌子对面的那个人。后来我就认为这人不适合团队也没有发 offer。

        你还应该带新人在办公室/园区等转一转。跟他们讲讲职位以了解他们的兴趣。问他们一些针对公司的宽泛问题,看他们是否对公司进行过了解。总之就 是要了解这个人。你要问自己这样一个问题:要是这个人在下班后跟你一起吃饭喝东西你愿意吗?如果你的回答是不,那又是红牌需要商榷了。

        候选人走后,和团队的人聊一聊他们的看法(如果这个人是招进来的第一个人,只有靠直觉)。如果候选人还靠谱那就发 offer,否则—下一位。

        总结:

        好马不好找,找好马还要省钱就更难。上面的四轮法则将帮你节省时间并找到最佳人选。不要怕尝试下一个人选。与其招庸人不如耐心等。记住,第三轮是调节阀。这里是“行”与“不行”的分水岭。如此多的人卡在这一关让我有点惊讶。祝大家找马顺利。

        翻译: 伯乐在线 - 梧桐

        译文链接: http://blog.jobbole.com/58114/