敲代码的速度跟不上思考的节奏,这就是最有才的程序员。

神译局是旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。

编者按:1024程序员节快乐!今天提出一个话题:如何在面试中判断一个程序员是否足够优秀?关于面试和接受面试的教程太多了,但是有很多都是装腔作势、形式主义,并不能帮助你找到真正出色的人才。如果你想找到真正出色的工程师,就得听听真正有经验的人的经验之谈。Slava Akhmechet总结认为:要想找到真正出色的工程师,你需要确定三件事:能力、判断力以及性格。原文发表在Substack上,标题是:How to interview engineers

划重点:

大公司的面试流程充斥着装腔作势和“政治正确”

出色的工程师要从三方面考察:才能,判断力以及性格

最有才的工程师敲代码的速度跟不上思考的节奏

与其让应聘者解决编程问题,不如让他们把API整合到一起

才能是速度、工作记忆、品味、工具链知识,对计算机工作机制的了解,以及编程能力的综合体

你要的人是既非常喜欢建造鲁布·戈德堡机器,又知道如何让机器不要偏离目标的人

人才是综合能力和编程策略的结合。

表示战术性工程才能的媒介是代码。表示战略判断的媒介是备忘录(或备忘录的公开对等物,论文)

性格方面主要关注责任心、亲和性以及神经质。

这篇是我关于如何面试工程师的超级秘密指南。是的,因为面试充斥着装腔作势、政治正确以及出于社交的方便而讲的谎言,这些东西主要是因为受到大公司招聘的约束,其实跟你没什么关系。这股风气是微软发动的,然后被FAANG克隆了,再然后其他所有人又克隆了FAANG。如果要根据行业标准惯例来进行面试的话,那你的货物崇拜已经达到了三级的造诣。

这份指南是用来面试非常有才华的人的。如果你要在硬技术初创企业组建一支杰出的团队的话,那这份指南正好合适适用。如果你的创业公司是技术使能的,或者你是给一家大型公司设计面试流程,或者要聘请经验丰富的角色来执行专门任务的话,那本指南不合适你。在这里没有“初级vs高级”或“前端vs后端”之分。从我们要完成的工作的角度来看,昆虫才要专业化分工。

关于应聘者,你需要确定三件事:才能,判断力以及性格。可以把招工程师看作买赛车一样。买赛车的第一要务是看马力,马力不够,赛车就毫无用武之地。工程师的马力就是才能。没有才能,工程师对开发产品就没有用,所以这是你要从应聘者身上找的第一件东西。那个人有多好或者工作又多努力都没有关系。没有马力,就没法比赛。

但光有才能是不够的。这个世界到处都是因为种种原因成就不了事业的人才。懒惰、焦虑、脆弱、冲动、自私、牺牲品等等,原因无法一一列举。所以,在发现了才智之后,接下来就必须确定形状和质量。这个人都把自己的才华用到了什么地方?他们能不能很好地适应外部世界的需求?

才能

才能是速度、工作记忆、品味、工具链知识,对计算机工作机制的了解,以及编程能力的综合体。这属于IQ,但这是专门针对工程师的IQ。智商50-80%是遗传的,没法提高,呈正态分布,并且跟科学和工程等领域的成功密切相关。

这对应聘者的选择很重要,因为虽说人是可以改进的,但这种改进只能在其才能范围内,但改进没法超出那个范围。智商145(σ= 3)的人比智商115(σ= 1)的人要好太多。如果你同时看着两个人工作,感觉就仿佛是来自来自不同的星系一样。因此,作为面试官,你的工作是找出应聘者的能力范围。

怎么找呢?提前告诉应聘者准备一台适合自己喜欢的开发环境的笔记本电脑。他们可以用任何操作系统,任何编辑器,任何编程语言——自己觉得怎么合适就用什么。

面试开始时,让他们共享自己的屏幕。你会看着对方敲键盘。然后,给他们一个问题让对方解决。这么多年来我都是让他们编个井字棋的程序,让程序穷尽所有的走法,再打印出有效游戏的数量。当然,你应该自己设计问题,但要争取问题的难度大致就是这样。应聘者的目标是写出程序、编译、运行程序,然后得到正确答案。

记一下时间,让他们自己做。回答他们可能遇到的任何问题。程序输出正确答案的那一刻,再次记录一下时间。评估应聘者的才华的全部工作就是这些。面试技术方面的工作已经结束。(是的,你没有看错!)

以下是接下来会发生的事情。最有才的应聘者会考虑几秒钟,然后用自己最快地速度敲程序(他们会敲得很快)。快到你几乎可以感觉到他们的沮丧,他们跟计算机的接口跟不上他们的思考节奏。敲键盘的速度是他们的瓶颈。敲完程序之后,他们可能会遇到一些编译错误和运行时错误,然后会立马修复。让他们把自己的结果跟Google到的答案进行比较。如果答案不匹配,他们会检查自己的程序,几秒钟之后他们会大叫一声“我知道了!”,然后修复错误,重新运行程序并得到正确的答案。从开始到结束,整个过程大概需要10分钟

没那么有才的应聘者会做同样的事情,但速度会稍慢一些。你会感觉到他们的思维速度跟打字速度是均衡的——谁都不是瓶颈。如果程序第一次运行的时候没有给出正确的答案的话,可能要多花些时间找出错误并排除掉。他们会在15分钟内搞定。如果他们运气不好的话,也许要20分钟。

剩下的应聘者打字速度会比平时慢得多。其实他们的打字速度可以更快,但是思考速度是瓶颈。就我们的目的而言,我们是不会雇用这些人的。你觉得是这种情况时,可以让他们再干15分钟,给他们留点面子,然后礼貌地打断他们,感谢他们接受面试,然后就此结束。如果说这次疫情给我们带来了一线光明的话,那就是你不再需要面试了五分钟之后才发现应聘者不行,然后再浪费大家几个小时的时间了,因为马上把对方打发走的话会让对方太尴尬,在网上面试就省事多了。

请注意,这个面试问题涵盖了我们对人才定义的所有要素——速度、工作记忆、工具链知识、了解计算机的工作机制以及编程能力。要想评估他们的品味,得在他们编写程序的时候注意他们的代码,选择的工具以及思考的过程。但是你可能会忽略所有这一切。我是从来都没见过能在不到15分钟的时间内解决这个问题但却没有品味的应聘者的。就像智商一样,才能的各个方面往往是紧密相关的。当他们具备若干你所期望的品质时,剩下的品质往往也会具备

旁白

我们暂停片刻,让我先来回答一些常见问题。

首先,我自己没法通过这次面试。上一次试的时候,我大概花了四十分钟才得到正确答案。通过练习我可以把时间稍微缩短一些,但这已经没有关系了——我认为仍然会比我的输入速度要慢。也就是说我属于那种没法用的。我们面试的目的是找非常有才华的工程师,而不是像我这种才能的工程师。

其次,现在已经不流行问算法问题了,浪费应聘者的时间是彻头彻尾的亵渎神灵,而且不计时的工作相关问题一般都很含糊。与其让应聘者解决前面的编程问题,不如让他们把API整合到一起,而且随便他们用多少时间都行。为什么要这么做?我们可以摆出各种各样非常好的理由,所有这些让我想起了Deirdre McCloskey在《The Natural》这篇论文(顺便说一句,非常棒的一篇文章,你应该看看)里面的这段引文:

Richard Bower是一位彻头彻尾的经济学家。他很了解索福克勒斯和莎士比亚,但是他相信经济学。[…] 从内幕交易到十几岁的捣蛋鬼,只要你为他提供任何的社会情况,他都希望借助经济学来寻找答案,或者至少用来破局。

经济学的答案是,当科技繁荣时期,软件工程师供不应求时,大家就会改变面试的方式,然后编造新的面试方式要比旧的好的一大堆理由。FAANG公司每年都要雇用一整支的工程师队伍。不降低门槛招聘团队就没法找到那么多的人。但是,跟FAANG的那些招聘经理不一样,你的报酬并不是取决于团队的规模,你也不是为了填补职位空缺而去招人的。当你需要非常有才华的人加盟时,就必须进行艰巨且没法规模化的工作才能找到这样的人并招募进来

第三,系统设计和架构问题对那些思考速度比不上敲字速度的应聘者比较有用。对于异常出色的人来说,这种类型的问题纯属浪费时间。能用最快的速度编写复杂程序,但却搞不清楚自己需不需要负载均衡器或者怎么在AWS上设置负载均衡器的人我是从来都没见过的。

判断力

判断力跟才能之间的关系往往很弱,这可以归结为:修补匠跟工程师之间有差别。这两种人很接近,但是不是一回事。修补匠造的是鲁布·戈德堡(Rube Goldberg,比喻小题大做、简单事情复杂化)机器,那纯粹是为了乐趣。工程师是要发现(往往是不直观的)约束并满足那些约束。修补匠替机器工作。工程师让机器替自己工作

大多数工程师都不是修补匠,他们做事是为了钱。不要雇这些人,因为他们没有灵魂,围着这帮人转,你会被潜移默化,灵魂会受到毒害。反过来,很多的修补匠都不是工程师。这样的人也不要雇,因为他们会建造出精美而复杂的结构,但那些结构除了自身的存在外没有任何其他用途。你要的人是既非常喜欢建造鲁布·戈德堡机器,又知道如何让机器不要偏离目标的人

或者我们还可以这么看,人才是综合能力和编程策略的结合。判断属于编程策略。

不是非得团队的每一位工程师都必须是孙子,但是你的确需要他们具有以下两种特质之一。应聘者要么应该具有良好的策略直觉,要么至少必须意识到策略的存在,并且愿意听从具有更好判断力的人的意见。最糟糕的情况是有着可怕的策略直觉但又自我感觉良好的应聘者。这种最终会浪费大家的时间,进行毫无意义的讨论,最后还会因为不满而退出。

如何去测试判断力呢?一种思路是向应聘者提出一系列揭示性问题。这是“你的弱点是什么”这个问题的2.0版。你应该问应聘者类似这样的问题,比方说“你觉得自己有多幸运?” 或者“说说看,你有没有哪一次是出乎意料地采取主动的?”他们的回答可以揭示出藏在内心深处的心理结构的重要信息。

有一个很好的经验法则,如果一个问题HR的实习生也可以提出来的话,那就是一个无特异性的信号问题。好的信号问题是有特异性的。比方说,聪明人发出智慧的信号要愚蠢的容易得多。但是,任何人编造个自己采取主动的例子也同样容易。他们的回答传递出来的唯一一个信息是看对方是否愿意遵守这种面试仪式。这个问题的字面解释是“你会不会成为公司一架很好的无人机?”应聘者的回答可以浓缩成 “是”或者“否”。即便如此,对自己的意图撒谎是很简单的事。需要一份工作的人一直都这么干。

就像面试的才能部分一样,判断部分也必须有所区别。表示战术性工程人才的媒介是代码。表示战略判断的媒介是备忘录(或备忘录的公开对等物,论文)。就像对于有才华的程序员来说写代码要容易得多那样,对有着良好的策略直觉的人来说,写技术论文也要容易得多。

战略性技术写作的经典作品有很多例子:1 2 3 4 5 6 7 8。每一个有生命力的项目和公司都至少会有那么一个经典,但这是颠倒了因果关系。要想提高开发出有生命力的软件的可能性,你得有具备出色判断力的人,并且用书面的形式把它表达出来。你想让这样的人加入你的团队。

你得这么面试。选出一个具有战略意义的技术决策。作为提示交给应聘者。他们现在要替公司做决定,并以书面的形式向工程组织传达自己的决定。你得回答他们所有的问题。对于很多人来说,往往在洗澡的时候才会灵光闪现想明白事情,但是鉴于面试的时候让对方去洗澡显然不合适,所以这部分请给他们足够的时间。一个小时,或90分钟左右的时间,你自己确定多长合适。对方在写的时候,你必须随时都在,通过私信回答问题。

看过他们写的东西之后,你会发现应聘者之间的作品质量差别很大。你要找的是清晰明了、引人入胜能打动人的作品。如果备忘录能说服你遵循应聘者概述的行动方针的话,他们就算合格了。如果你强烈不认同,但很难反驳对方的论点,也算通过。如果你认为他们的判断比你的判断更好,通过。如果他们写的东西让你看了想扔进垃圾桶,但是应聘者发出信号说这超出了自己的能力圈,也过。

否则的话,别招进来。

性格

现在,你知道应聘者是出色的程序员,并且还有着良好的判断力。接下来你得验证最后一件事,那就是跟他们合作不会带来太大的麻烦。

怎么评估呢?最简单方法是从五型人格入手。着有点像MBTI测试(迈尔斯-布里格斯性格分类法MBTI)。你特别关心的三种特质是责任心、亲和性以及神经质。心理学家对这些术语有精确的技术定义,但是用通俗易懂的话来说,你要找出(a)应聘者喜欢偷懒还是努力工作?(b)他们是令人讨厌的人吗?(c)他们会被分析瘫痪和生活的紧急情况所困扰吗?这里说的不仅仅是工作

好消息是,就面试而言,人格的心理框架很简单。坏消息是,只用在聘用了那个人之后,你才能找到所有这些信息。不过你可以设置一个低通滤波器来捕捉到一些坏苹果,但是在面试的时候几乎每个人都会拿出最佳表现。很少会表现出个人缺陷,除非工作量很长一段时间才会露出马脚。

如果应聘者在面试过程表现得很好斗的话,显然不能雇用他们。如果你找推荐人了解发现这个人几乎没干过什么,或者如果推荐人根本就不认识这个人的话,也不能雇用他们。如果对方的反应很怪异或者多少让人感觉不舒服,请不要雇用他们。但是除此之外,面试过程你能做的事情寥寥。

我面试过好几百人,也招过好几十人。我识别才能和判断力的第六感非常好。但是性格嘛,就只能比随机好一点了。因此,除非你这这方面有魔力,否则请设置一个低通滤波器,然后在应聘者暴露出不好的个性时再炒掉对方。

最后的考验

如果你决定要雇用这名应聘者了,面试必须至少持续六个小时(中间留有一个小时午餐时间)。让你的工程师每个人都面试一下这个人,每人的面试时间大概45分钟到一个小时。不管体什么问题,每个人都应该逐步升级所提出的技术问题的难度。你的目标是针对每一位应聘者调整流程,直到对方最终无法解决提出的问题。这个问题应该让他们觉得是在自己的能力范围之内,但是又要足够难,难到对方用光耗时。然后在剩下的时间里,再将难度降低一个档次,给出一个应聘者花点功夫就能解决的问题——到头来,你不希望将那个家伙的精力和锐气都耗光。

既然你已经确定要雇对方了,为什么还要花六个小时折腾应聘者呢?有两个原因。

首先,应聘者需要觉得自己已经获得了在贵公司工作的特权。如果你仅仅面试三个小时就给offer对方的话,他们反而会花1、2个星期再慎重考虑一下,最后选择去Facebook工作,因为你的公司可能有一堆的笨蛋。毕竟,你只用了三个小时来面试。这也是为什么你要给他们一个及时他们觉得自己应该能够解决但其实无法解决的问题的原因。这一点我已经进行过广泛的测试。事实证明,如果候选人在面试过程中未能解决问题,并且到最后感到精疲力尽的话,反而更有可能接受offer。经历过痛苦之后才会对能加入到一家公司感到高兴。不要夺走他们的这点乐趣。

其次,你的工程师需要知道跟自己共事的是个什么样的人。大公司最糟糕的事情之一是某个人可能突然就出现在你的团队里,而现在你必须跟对方合作。工程师需要跟潜在的未来同事解决问题,打打招呼,找出他们的不足之处。他们需要彼此之间讨论一下应聘者,并对有新成员加入团队建立期望。

面试结束后,要感谢应聘者的宝贵时间,愿意回答对方的任何问题,告诉他们你会保持联系,并祝对方晚安。第二天下午给出offer。候选人需要花点时间消化一下对自己的表现的忐忑,然后让他们心里的一块石头落地。

译者:boxi。