宠文网

奔跑吧,程序员

宠文网 > 科普学习 > 奔跑吧,程序员

11.4面试

书籍名:《奔跑吧,程序员》    作者:叶夫根尼.布里克曼
    《奔跑吧,程序员》章节:11.4面试,宠文网网友提供全文无弹窗免费在线阅读。!



我们在多年前做过一项研究,想确定Google的人是否都特别擅长招聘。我们研究了1万次面试以及进行面试的所有人,还有他们对应聘者的评分,以及这些人最终在工作中的表现,后来发现其实一点关系都没有。这完全就是一件随机的事情。

——Laszlo  Bock,Google人事高级副总裁

面试并不是完美的。面试官通常只有一个小时的时间去决定他们是否要在接下来的几年和这个人一起工作。在这样短暂和人为的过程中,几乎不可能获得足够的信号。理想的面试也许根本就不是面试:你只需要聘请这个人工作几个星期,看看他表现如何再做决定即可。但这通常是不切实际的,所以面试过程就是一种妥协,最多也只能被看作是一个压缩和失真的过程。

面试官甚至更不完美。一个著名的例子来自于管弦乐团的试奏面试。在19世纪70年代,只有不到5%的乐团成员是女性,人们一般认为女人的表现不如男人。在19世纪80年代早期,管弦乐团开始采用拉帘试奏,演奏者在幕布后面表演,评委只能听到音乐而无法看到是谁在演奏。因此,到了90年代末期,女性成员的数量增长到了35%,上涨了7倍。另一个例子来自2010年对假释法官的研究。研究表明,犯人被同意假释的概率明显受到他们的假释聆讯发生在一天中的什么时候的影响:早晨大概是65%,在正午之前会渐渐下降到接近0%,午饭之后会跳回到65%。可以说在假释决定中,法官的胃比呈现的任何证据都要重要得多。

从中我们可以引申出两个含义。第一,也许要避免在午饭之前面试应聘者;第二,更为重要的是,我们必须认识到面试过程有时会导致不正确的决定。我们偶尔会拒绝一个出色的应聘者或者接受一个糟糕的应聘者。一些好的公司已经认识到面试的缺点而慎之又慎——如果我们招聘到错误的人,还要花时间去培养他们,弄清楚他们为什么不能努力把工作做好,出了问题还要帮他们救场,把他们列入绩效考核计划中,最终将他们扫地出门。经过这一切之后,我们又得花更多的时间去招聘他们的代替者。解决因招聘到糟糕的应聘者而带来的问题,比偶尔错失一个出色的应聘者要痛苦得多。所以,除非你绝对有把握,否则在招聘的时候请说“不”。

记着上面我说的,再来看看面试的基本构成。



11.4.1  面试过程


1.  第一步:联系

在本章之前的内容中,我讨论了如何找到出色的候选人,而下一步就是和他们取得联系。我们可以通过email、LinkedIn消息甚至发送Twitter等方式,亲自和他们联系。当然很多都不会有回应,而有回应的人中大部分也都不感兴趣,只有少数人仍有希望。我们的目标就是让他们对在你的公司工作感兴趣,然后安排他们进行电话面试。

2.  第二步:电话面试

我不喜欢讲电话,但是电话面试又是一种必要之恶。现场面试成本高昂,在金钱(飞机、酒店、汽车、饮食)和时间(每次现场面试,你的公司至少有一至两个人无法工作)上都是如此。因此,电话面试的目标就是把可能会通过现场面试的候选人给过滤出来,这意味着电话面试在问题和难度上应该和现场面试几乎是一样的,但是应该更简短一些。

在大多数公司,两到三次电话面试是标准的做法。第一通电话通常是由招聘人员或者招聘经理描述公司的情况、职位角色,大概了解应聘者想要的是什么。假设应聘者的关注点和公司的关注点是一致的,我们就可以安排第二次和第三次电话,这就是正式的技术面试,可以由创始人、招聘经理或同事进行。为了能够在电话面试中用上代码,我们可以使用一些在线协同编辑器,比如Google  Docs、CollabEdit或者Stypi。

3.  第三步:现场面试

如果应聘者在电话面试中表现出色,下一步就是让他们来到现场。他们应该与公司的4~8个人会面,这样通常可以降低偏见的影响,但又不会让应聘者负担过重并使面试时间过长。每一名面试官都可以在以下方面各有侧重:沟通技巧、文化契合、编码、系统设计和亲切感。

在创业初期,创始人应该对每一名应聘者进行面试,因为早期员工对公司的成功与否有着巨大的影响。此后,随着公司规模的扩大,面试官应该主要从应聘者面试的团队中选择。

每一名面试官从面试出来时要么得说“可以”,要么得说“不可以”,不允许说“也许吧”。只有一个“可以”而没有其他团队成员的同意,照样不行。只有获得所有面试官的“可以”的应聘者才会被录用。录用一个有问题的应聘者比错过一个出色的应聘者更糟糕,所以即便只有一个“不可以”通常也足以拒绝一个人。唯一的例外是如果有人过去曾经和那位应聘者亲密共事过,并强烈为他打包票。现实的工作经历当然比在人为的面试中得到的一个“不可以”更有说服力。



11.4.2  面试问题


面试更多的是艺术而不是科学,但是在电话面试和现场面试中,可以遵循一些基本的原则,让面试官和应聘者的时间得到最好的利用。好的面试可以让应聘者有机会去教、去学、去展示他们的技术能力。

1.  让应聘者教你一些东西

不要把面试等同于质问。许多面试官会直接跳入到技术问题中,直接用智力题和编程难题去狂轰滥炸,甚至连招呼也不打。你在那儿不是要拷问应聘者知道多少,也不是要让应聘者承认自己是个糟糕的码农。他们不是你的敌人,面试本身就是有压力的,所以请善待他们。

我们要把面试当作两个人之间有礼貌的交谈,介绍你自己,简短地谈谈你是做什么的以及想要填补的职位类型。询问应聘者他们是做什么的,是否需要水或者休息一下。之后,和任何愉快的对话一样,把话题转移到应聘者身上,尝试去了解他们。让他们告诉你一些与自己有关的事情,谈谈他们过去从事过的项目,描述他们希望在以后能从事的项目,了解他们为什么对你的公司感兴趣。

大多数人喜欢讨论自己,所以这也是让应聘者轻松进入面试的好方法,更是了解他们的经历、激情以及目标的好方法。面试官(是招聘经理则更好)至少应该把大部分时间花在讨论这些话题上,在结束面试时,应该能很好地感觉应聘者是否适合该职位。

面试也能够很好地了解应聘者的知识深度、对之前工作的热情以及沟通能力。深入下去,多问问题。是不是弄清楚了他们过去完成的工作?他们所做的东西、所用的技术、现实的方式是否已经清楚了?理想的情况下,你应该让应聘者教你一些新的东西。这就是Sergey  Brin在Google面试中采用的策略。

“我打算给你五分钟,”他(Sergey)告诉我,“当我回来时,我想让你向我解释一些我还不曾了解的复杂的东西。”然后他就离开房间朝着点心区走去。我看着Cindy,她告诉我说:“他对所有东西都很好奇。你可以谈谈爱好,谈一些技术的东西,什么都可以。只要确保那是你真正深入理解的就行。”

——Douglas  Edwards,Google

你甚至可以让这一过程变得更加真实,让应聘者做一个汇报展示。你还可以让他们教整个团队,而不是只教面试官一个人。

我们所从事的业务更多是社会化的,而不是技术上的,它需要更多地依赖员工之间的沟通,而不是他们和机器的沟通能力。所以招聘的过程至少需要关注一些社会化和人际沟通的品质。我们发现最好的方法其实是让应聘者去试一试。

这一想法再简单不过,就是让一个应聘者准备10或15分钟的个人展示,介绍过去工作中让你们团队感兴趣的一些东西。可以是新的技术、是第一次体验这种技术的经历、是一门历经艰难学到的管理课程,或者是某个特别有趣的项目。应聘者选择了主题,可能要经过你的认可。日期确定之后,你可以聚集起一小群听众,由那些即将成为新员工同事的人组成。

当然,应聘者会紧张,甚至可能不情愿经历这样一个过程。你必须解释清楚所有应聘者都会对这样的试讲感到紧张,给出你的理由,只要坚持一点:为了了解每个应聘者的沟通技能,让未来的同事参与到招聘过程中。

——Tom  Demarco、Timothy  Lister,《人件》

2.  让应聘者有机会去学东西

虽然你是在面试应聘者,但他们其实也是在面试你。他们也希望了解公司是干什么的,他们会扮演什么样的角色,你们使用什么技术,他们将和谁一起工作。每一位面试官都应该为应聘者留出一些提问的时间,让他们可以了解你的公司。另外,至少有一位面试官,最好是招聘经理,应该带应聘者参观一下办公室,并大概介绍一下你们在公司的工作。让他们了解你们使用的技术、你们做的产品、谁是你们的用户、公司的目标。无论是现场演示、代码详解、架构图、幻灯片和视频都是可以的,也可以谈谈你们的文化和使命(阅读第9章了解更多信息)。传递出你们的激情,看看是否能够感染他们。

我是做编译器的,我注意到我许多搞编译器的朋友都去了Google工作。我不知道为什么弄编译器的人要去这样傻傻的小搜索引擎公司,但我发了简历参加了面试之后,才感到这是我参加过最好的面试,感觉真是太棒了,就像跟一群疯狂且聪明的人在一起做技术即兴表演一样。这是我在参加资格考试之后经历过最激励人心的事情。我是一个古怪的人,会被资格考试弄得激动不已,但是这种精神上的挑战真的很有趣。

Google对面试的人超级体贴。他们从简历中看出我是做编译器的,所以安排在面试桌前面试我的六个人全都是做编译器的,全部都是。所以我立刻就和他们有了专业的沟通,我可以讨论我的研究,我们可以讨论共同了解的东西,气氛也得到一点缓解,等到进入某个问题时,我已经完全放松了。我们都是搞系统的人,想东西的方式大致是一样的。面试的体贴实际上就体现在此。

——Kevin  Scott,LinkedIn高级副总裁,Admob副总裁,Google主管

每一名面试官都是公司的大使,所以我们要选择聪明的人。在创业早期,我们没有足够的人可以挑选,所以每个人都必须参与所有的面试。但是随着公司的成长,招聘岗位可能要更加专业化。一些开发人员擅长进行技术面试并找出厉害的程序员;一些则是出色的“偷心者”,能够说服正在考虑多个职位的应聘者挑选你提供的职位;还有一些则更擅长通过博客、会议演讲和开源项目的品牌宣传方法,让应聘者申请你的职位。这一切和招聘同样重要,而且需要的是不同的技能,得花时间去培养。

如果我们不能专门为招聘留出时间并给从事招聘工作的员工以报酬,招聘就永远都是二等工作,员工永远不会花时间去写博客或者做开源项目,应聘者面对的也只是丝毫不能鼓舞人心的面试,这样得历尽艰辛才能打造出一支强大的团队。我们不应该把招聘当作是一项会剥夺“真正工作”时间、让人分散注意力的事,而是要把它列入工作日程中,和其他工作任务没什么两样。每一名开发人员都应该有具体的目标(例如挑选三位候选人或者每月写两篇博客),我们在进行项目计划的时候要为这些目标估算出时间并纳入员工考核。

为了避免招聘任务对工作造成过大的影响,我们不妨让每一名开发人员一次只关注一点。例如可以设立技术面试专家团队,让他们每个星期奉献五个小时进行编程面试;设立说服专家团队,每星期投入五个小时说服候选人加入到公司中来;而品牌宣传专家团队则每个星期要投入五个小时去写博客、维护开源项目和做演讲。我们可以定期让这些招聘团队的工程师进行轮转,帮助他们培养新的技能(阅读第12章,更详细地了解如何投入时间学习)。

3.  让应聘者展示他们的技术能力

技术面试的行业标准就是让应聘者解决计算机科学基本的数据结构和算法问题,预先想出整个解决方案(而不是迭代式的),并把思考的过程说出来,然后再写到白板上,没有任何语法高亮、没有自动完成、没有Google、没有Stack  Overflow、没有编译器、没有开源库、没有文档、没有测试、没有简单的重构方法。过早优化是所有罪恶的根源,而不只是在面试中。我们要求面试者去优化个别该死的代码路径,没有任何分析工具,而且通常都是以代码的清晰和简单为代价的。如果有人在现实中像这样去写代码,你可能已经把他炒掉了,所以为什么要用这样的方式去面试?

智力题就更糟糕了。咨询公司和一些软件公司,最著名的是Google,已经使用了好多年,但是没有证据表明,这些题和实际的工作表现有任何相关性。

站在招聘方的角度,我们发现智力题完全就是浪费时间。一架飞机可以装入多少高尔夫球?曼哈顿有多少煤气站?完全就是浪费时间。这些题无法预测什么,他们主要就是为了让面试官看起来聪明而已。

——Laszlo  Bock,Google人事高级副总裁

有一些更高效的方式可以了解应聘者的技术能力,并能让应聘者和面试官有更好的体验。下面是一些现实中的例子。

带上自己的笔记本电脑(bring  your  own  laptop,BYOL)

可以让应聘者带上自己的笔记本电脑,配置好他们喜欢的编程环境。另一种替代的方法是问他们用什么OS和编程工具,提前为他们准备好笔记本。如果你想了解他们实际的编码水平如何,可以让他们使用Google、Stack  Overflow和其他一些他们在日常编程中经常使用的技术。

在Coursera,我们会进行现场的编码操练:你把自己的电脑带来并用它解决一个问题——我想这样比在白板上编程好很多。我们会有分级规则,精确记录他们的表现,所以我们知道哪些应聘者是不同寻常的。

——Nick  Dellamaggiore,LinkedIn、Coursera软件工程师

带回家去挑战

给应聘者提供一些问题,让他们回到自己舒适的家中去解决问题。当他们到现场面试的时候,和他们一起对代码进行评审。带回家去挑战不应该成为面试的必备环节,也不是所有应聘者都有时间这样做,它不应该是你进行的唯一的技术面试,因为一些应聘者会作弊,找他们的朋友来帮忙。但是对于那些面试时会紧张的应聘者来说,这也是个很好的选择,因为这样有机会让他们在一种更加自然的编程环境中展示自己的技能。

我们在Pinterest尝试过在面试之前先举办一场编程挑战赛,主要是在早期没有足够的技术人员去开展面试的时候。我们让他们去参加编程挑战,既可以很好地检验他们对公司是否有兴趣——如果他们不乐意花三个小时去进行编程挑战,他们可能对此并不感兴趣,对我们的团队来说也是了解他们技术能力的一种高效方式——可以在方便的时候异步评审代码。如果代码看起来很糟糕,我们可以马上发送一封拒绝邮件,不会在这名应聘者身上花更多时间。

——Tracy  Chou,Quora和Pinterest软件工程师

现实问题

我们可以不在面试中用一些设计好的计算机科学的基本问题,而是让应聘者解决一些你公司实际在做的东西。这样会让你更好地知道应聘者在现实中会有怎样的表现,也让应聘者更好地知道你们在公司中做的东西。

在Jawbone,数据副总裁Monica  Rogati会交给应聘者一份数据资料,给他们三个小时的时间浏览,然后让他们说出他们的发现。“这种方法能测试我希望在数据科学家身上看到的四种关键品质:技术水平、数据创造力、沟通技能以及是否是结果驱动型的人”,她说。同时这也能让应聘者一睹公司的工作日常。

——Samantha  Cole,Fast  Company

如果我正在面试你,差不多就会这样说:“这是我们这个星期一直在处理的问题,接下来我会把它交给你,我真的还不知道要怎么解决,你看看你会怎么做?”然后就站到一边。如果是进行技术招聘,我们会找一个以后将和你在一个团队的人,一起在GitHub上结对编程。

——Zach  Holman,GitHub软件工程师

结对编程

结对编程的方法就是假装你已经录用了应聘者,现在是和他们工作的第一个星期,你正在帮助他们提高能力。和他们一起坐在电脑前,对一个真正的项目进行结对编程,权衡一下谁负责编写代码,谁负责操纵、观察。你能够了解他们可以多快地学习,如果你录用了他们,他们能够写出什么样的代码。应聘者则能够近距离了解产品、所涉及的技术,以及工作的日子通常是怎么样的。

我招聘了一个年轻人,他早上就过来面试,那时公司只有我一个人,于是我就说:“你好,很高兴见面,请坐,我们今天来结对编程吧。”在他那天离开之前,我告诉他被录用了。这是我做过的最好的招聘,我想这是一个很好的过程。

——Dean  Thompson,NOWAIT公司CTO

让应聘者上一天班

你可以把结对编程的概念进一步引申,让应聘者正常地上一天班来代替面试。给应聘者一台电脑和一位导师,让他们检查代码,让代码跑起来,做些修改,和团队一起,参加会议。虽然需要做一些后勤保障工作,但对你来说也许是了解应聘者在工作中会有怎样表现的最好方法;对应聘者来说,这也是了解在你公司工作感觉如何的最好方法。

我们通常会让这些人进来,有时候要待几天,和他们一起工作。实际上,我们是要让他们坐下来去真正处理几个问题、参加会议和头脑风暴会,这样可以了解他们能够在多大程度上参与进来。第一天有时可能很吓人,但是几天之后,他们就开始放松了,你可以看到他们是什么样的人,他们是否参与进去了,他们是否充满热情。

我其实不相信测验,但我相信和应聘者一起编程。我不使用修饰过的编码练习——通常都太虚假了。我们使用真正的代码,通常来自项目的核心代码库。

——Jonas  Bonér,Triental  Ab和Typesafe联合创始人