聊聊ThoughtWorks面试
英文版
http://www.businessinsider.com/hardest-tech-company-job-interviews-2012-8
中文版
http://www.cnbeta.com/articles/203954.htm
最近有几篇关于科技公司面试的新闻,这篇格外受瞩目,因为竟然有公司力压Google,成了面试最难的公司,而这个公司居然是ThoughtWorks。
这个结果真的让我有些惊讶,作为一个面试过许多人的ThoughtWorker,我之前还真没想过我们的面试到底有多难。既然有人关心ThoughtWorks面试,我就不妨在此分享一下我的“面经”。
先来说说,我们的招聘流程。ThoughtWorks的招聘流程大抵分成如下几个部分,以社招开发人员为例:
- 电话面试,称为Phone Screen,由负责招聘的同事了解候选人基本情况
- 技术电话面试,称为Techinial Phone Interview,TPI,这个环节通常是针对远在外地的候选人
- 代码作业,称为Homework,动手写代码对程序员的考核而言是不可或缺的。
通过上面流程,候选人就可以进入到我们的办公室。一般说来,候选人要来办公室两次,第一次会做一些测试题:
- 逻辑和英语测试
通过之后,才是真正的重头戏,也是称为“面试”的部分。一般说来,这些环节会在一个下午的时间完成:
- 结对编程面试,称为Pair Programming
- 面谈,称为Office Interview,在我们招聘同事的口中,它有一个更复杂的名字:Overall Technical Interview and Culture Interview
这是主要的流程,有些情况会因人而异稍做调整。一般情况下,整个流程需要3周左右时间。我个人参与较多的主要是后两个环节,我的“面经”也主要在这里。
结对编程面试,是候选人和面试官一起写代码。所用的代码就是候选人之前在代码作业环节所写的代码。这是个真刀实枪的环节,想作弊是不可能的。之前曾经发生过这样的事情,候选人找人代写代码,结果,一到这个环节就完全暴露。
在这个近距离一起工作的面试中,候选者对代码的理解、开发习惯和与人交流的方式等等就全部展现在面试官面前。有些人之前习惯于窝在一个角落里写代码,像这样,写程序时身边还有人交流,对他们来说是一个巨大的挑战。我曾经看到很多面试者在这个环节紧张得不能正常思考,导致实力打了折扣。
之所以采用这样的方式进行面试,因为这就是我们日常的工作方式。我们希望了解候选人的情况,同样,也希望他们能够最真实地体验我们的工作方式、交流方式和思考方式。我们不仅仅要写程序,还要彼此交流,降低项目中出现“关键人物”的风险。以我之前的一个项目为例,这是一个总规模在十人左右的项目,一年半的时间里,这个项目先后下了四个团队lead,离开项目的开发主力也有五六个,但项目一直顺利进行,未受太大影响,就是因为通过交流,知识得到了充分地分享,避免了“关键人物”带来的风险,也让更多的同事得到了充分地锻炼。
不可否认的是,不是所有人都喜欢这种工作方式。有了这样的环节,候选人在体验之后也会有个新的评估:ThoughtWorks是不是他在找的工作,这样的工作是不是他喜欢的。
透露一个秘密,如果在结对过程中,候选人能够展现出他对快捷键和命令行的熟练,会在面试官心目中有加分的。
接下来是面谈环节,面试官和候选人坐下来,聊聊候选人的一些经历。以我个人的面试风格而言,了解了候选人过往的经历之后,我会让他挑一个自己最想讲的项目,做一个介绍。听起来很容易,但接下来,根据他介绍的内容,我会做进一步挖掘。比如,候选人说自己做过某个设计,我会问他为什么这么做,而不是那么做,对比不同方案之间的差异。这是一个说难不难的环节,如果在做设计决策的过程中,候选人经过了深入思考,回答出这些问题简直易如反掌,但对于那种直奔结果而去的候选人而言,这个问题却并不容易,当初决定的草率会在这个环节暴露无疑。这是整个面试的重头戏,候选人完全可以在这个环节将自己对技术的深入理解体现出来。
所有的问题都是开放的,没有正确答案可言,通过这样的交流过程,我们可以看到候选人更多方面的能力:思考方式、分析能力、表达方式等等。当然,也有一些人让人遗憾,他们应该是做了很多出色的工作,但完全没有办法清晰地表述出来。我喜欢听到的介绍方式是,层次清晰的讲述,当然,如果有激情就更好了。如果你看到过对技术真的有热情的人讲技术,你会知道,与那样的人交流简直是就是一种享受。
之后,我们还会了解候选人的本职工作之外的努力,因为我们相信,所谓的工作,并不能阻止一个真正热爱写程序的人求知的心:即便他只是Java程序员,并不妨碍他了解Ruby;即便工作再忙,他也会抽空学点东西。如果候选人曾经利用时间做过一些东西,那是我们乐于见到的,如果再能涉猎更多的东西,那简直太好了,当然,我们会问一些问题,了解他是“听说、了解、用过,还是深入研究过”。
单就面试过程而言,ThoughtWorks的面试并没有特别的。但为什么还有很多人会觉得这个过程很难。或许,这就是他们习惯的工作方式与我们工作方式的差异所在。
众所周知,ThoughtWorks在“如何做软件”方面是走得很靠前的。当我们的客户还在考虑ClearCase是否要切换成SVN时,我们已经抛弃了SVN,拥抱了git;当很多公司开始做持续集成时,我们已经开始了持续交付;当许多人开始拥抱敏捷时,我们正逐步地“去敏捷”。
在ThoughtWorks工作,我们要找的是真正热爱技术的人,喜欢刨根问底的人,那种为了完成而完成的人不是我们想要的。在公司里,我们经常会听到这样的话:我们不只要实现功能,更要以正确的方式来做。追求是无止境的,所以,我们要找的就是具备深入思考的能力/潜力的人,这样,我们才能不断向前。
在很多的人印象中,ThoughtWorks有一群特别能说的人,没错,在我们的工作里,沟通占了很大的比例,无论是我们在交付项目中,还是咨询项目里;无论是与自己人,还是与客户。所以,在面试中,我们也特别重视一个人的表达能力,肚子有货的人是否能够清晰地表达出来,而表达能力往往是一面反映多方面能力的镜子:分析能力、组织话题的能力、对技术的理解等等。
以个人观察而言,在程序员这个闷骚遍地的行业里,所谓不擅与人沟通的程序员只是没有找到合适的环境。其实,表达能力完全是可以锻炼出来的。还记得我第一次在东软给别人讲东西的时候,紧张得手心里全是汗。在公司内部主动讲讲东西,在社区活动做一些分享,多讲几次,什么问题就都没有了。
其实,所谓ThoughtWorks面试难,在我看来,只不过与其他公司只重视技术能力而言,我们更注重全方位的工作能力而已。因为在ThoughtWorks,我们是程序员,但我们不只是程序员。