1. 关注

  2. 订阅

    订阅到:

聊聊面试时让候选人写代码

高温俊   发布在 2017-01-07   

在 DigitalOcean,我们正在对后端开发人员招聘流程做出一些改变,简化了岗位描述与面试流程,但是额外增加了一个环节:请候选人写点代码。 这是基于我对招聘流程的经验和他们对代码评审的使用来考虑的。

大概在2005年,我为拉丁美洲最大的媒体集团的互联网部门Globo.com面试管理岗候选人,那时候,我刚刚做完几年咨询工作,重新回到产品开发岗位,这个机会让我感到格外兴奋。

开始工作前一周,我的新老板给我发了封邮件,安排了我的第一份工作——为我的团队再招募4名成员。当时的情形略显尴尬,我完全不知道我需要什么样的人,因为我还没有开始干活呢。

我开始思考,在我认识的人中,哪些人会是几乎所有工程岗位的完美人选,哪些是我会去挖的。然后又思考这些人都共同具有哪些别具一格的特征或习惯。很快,我发现了一个共同的模式:那些我认为适合几乎所有工程岗位的人,都经常读书。不仅仅是他们日常工作中的参考书,他们还阅读关于软件架构,关于面向对象设计,关于晦涩的编程语言以及能够指点他们在专业上更加优秀的书籍。

在巴西,我有个稍微有点人气的编程博客,所以就在上面发了篇招聘博文,我尽我所能描述了这个岗位,邀请候选人把他们的简历和最近阅读的三本书名发送给我。

回应非常热烈,我新申请的临时邮箱里塞满了简历,并且证实了我的假设:最有趣的的简历,总是与来自前面提到类别中的书籍列表关连在一起。

在Globo,我们使用这个流程已经招募了一只庞大的队伍,我们的一些校友在新的组织中也在使用类似的方法。

几年后,我到ThoughtWorks公司求职。过去几年我已经历了几个国际性公司,在这些公司和其他办事处交流时我不得不使用英语,但这次我连续一个多小时都在说英语。嗯,ThoughtWorks的面试官通过Skype,评估我的编程能力!!!当时我的内心是崩溃的。

幸运的是,ThoughtWorks后续还有一套与一般公司有点不一样的面试流程。对候选人快速初步筛选后,他们发给我三个题目,让我选择其一进行挑战,我可以使用任何一种我喜欢的语言解决的小问题。我提交的代码将会在后续的面试过程中使用,包括一次结对编程体验——我将会和一个ThoughtWorker一起扩展我的代码,添加新的特性。

我在ThoughtWorks工作了四年,见证这个招聘流程一次又一次获得了持续性的好结果。不指定候选人使用哪一种语言或哪一种工具是很重要的。我在ThoughtWorks的经历是这样的:要么选择感兴趣的项目,要么选择感兴趣的语言(我使用Drupal语言写了互联网级别的网页爬虫,使用F#写了日程表软件),所以我们真正实践了因态度而聘用,而不是技能。

这几年之后,是时候换个环境了。在ThoughtWorks就职期间所有经历近乎满意,除了最后一个项目,可能是我最差的一个。当我四处寻求新职位的时候,我害怕不得不经历互联网大公司让我的朋友经历的那类事情——在白板编程环节与用的智力题较劲。

最终,幸运再一次降临到我的头上,我向SoundCloud公司申请了工作岗位。当时只有几个工程师申请,SoundCloud公司的招聘流程与ThoughtWorks相似,先是候选人初步筛选,然后编码挑战。与ThoughtWorks不同的是,SoundCloud公司的编码挑战不再是智力题,而是接近公司实际工作中可能会遇到的问题。SoundCloud让我从用户接口层到所有我能想到的后端层构建一个上传工具。

有一部分比较具有挑战性: 怎样实现一个实时更新的进度条。在这个项目上工作了八个小时之后,脑袋就像宕机了一样,但是我发现自己在从东克里登返回伦敦的火车上依然在思考着可能的解决方案,一下车我马上走进七宝老街上那个我最喜欢的咖啡店里继续工作。解决这个问题非常有意思,如果你想知道2011年Clojure语言最流行什么,一个人如何利用带着波形括号的Scheme假装知道JavaScript,你可以看看这里的代码。

几个星期之后,我获得了这份工作并前往柏林。和其他小公司一样,我的试用期还没结束就已经开始评审新的候选者的代码了。不幸的是,那里的经历十分令我失望。

事实证明,大部分人的Rails应用的Gemfile里的代码行比他们真正编写的代码行还要多,更糟糕的是,更多人只是随机从一个Flash组件网站找了个Adobe Flash上传工具,一行代码也没写。简化到就是一个插件加上最少的胶代码,对候选人或我的时间来讲,这都不是有效的利用方式——在邀请他们进行后续的面试环节之前,我需要他们写点我们可以阅读的代码呀。

然后,我们想出另一个挑战。这一次,我们更严格一点。仍然不限制候选人使用的语言(就像ThoughtWorks一样,像SoundCloud一样从一个小任务开始,当时我们需要T型人,而不是其他的),但要求只能使用候选者选择的语言的标准库,不能使用第三方库或框架。为了更具有可行性,我们不要求做成一个web应用,而是每个平台都能提供的——一个套接字服务器接口和一个简单的文本协议。为了让这个挑战更接近一个公司一年内用户量从1000万增长到1亿的需求,我们还包含了客户端能够同时处理数百个用户的需求。

但是我们还做了些其他的。这些事情能够确保候选者的代码呈现给我们之前就确保满足功能性需求,避免明显不能运行的代码进入评审阶段,这不仅提升了候选者的体验,也为为我们节省了大把时间。

和问题描述一起,我们还给候选人发送了一个测试套件:一个运行起来就会尝试连接到候选人开发的服务器上的二进制文件。当套件运行起来的时候,它会打开很多套接字,发送大量的消息,然后与问题描述提供的测试样例进行对比验证。候选人只有在他们自己的机器上通过了功能测试才能提交他们的代码。

最好的提交非 Flávio Brasil莫属——他现在在Twitter工作—— Flávio Brasil不仅发现了那个测试套件里的一个bug,还对套件进行了反编译,在他的代码挑战提交里附上了一份补丁。我们收到了来自世界各地的代码。我们拥有如此多的量化数据,我甚至针对在使用Node.js编写的代码中发现的某些问题发表了演讲。

DigitalOcean新一轮招聘中,我试着尽量综合使用以往的经验。总体上,代码挑战题目与在SoundCloud开发的类似,但也有些明显不同的地方。

第一个主要的变化是我们尝试使用一个简化的更接近ThoughtWorks的面试过程,之前我们会有专门的白板编程环节或者是结对编程环节。但是这一次,我们将会给候选人一个机会,让他们聊聊他们写的代码,而不是问些已经在畅销书里分门别类列出来的大众化的问题。

另一个变化是我们更加注重开发产品的流程,或者怎样测试、构建、运行应用。不管我们多么以产品为中心,DigitalOcean都是一家基础平台公司,我们总是在开发过程中打破第四堵墙。对构建和运行时工具表现出兴趣很好地暗示了我们文化上的契合。

但是最重要的变化是候选者提交代码给我们评审的方式。在之前的工作中,作为评审者,我会收到候选人的代码和简历。过去几年里,工业界和学界已经强有力地证明了,当我们判断一段代码是好是坏时,偏见会影响我们的结论。为了尽量减小主观偏差,我们要求候选人不得在提交的代码添加任何标识候选人身份的信息。我们让评审者大概知道候选人平属于那个级别,拥有几年工作经验,但不会暴露候选人的性别,名字,国籍,地理位置或者经历过哪些学校或公司。这些会让我们超赞的招聘团队付出很多很多,要求代码评审人极具耐心,但是最终结果非常棒。

新一轮的招聘流程让我超级兴奋,不仅仅是因为它能找到正确的人壮大我们的团队,我还希望在将来的某个时间点,我们拥有足够多的数据能够与业界分享

1 收藏 评论

(有话说)我的个性宣言

  礼,所以正身也;师,所以正礼也。

社交评论

您好,请登录后进行评论。点击 登录注册新账号
您好!
    五色云科技