面试程序员,“白板测试”还有用吗?
编者按:白板测试是招聘程序员时经常采用的一种评估方式,但是它被人诟病颇多。本文中作者结合自身的经历,提出了白板测试的缺陷,和几种更好的可替代方案,你的观点如何呢?本文作者 Anna Carey,原标题为“It’s Time to End Whiteboard Interviews for Software Engineers”。
Photo: Kaleidico/Unsplash
2017年的时候,有几位著名的软件工程师在Twitter上坦言,他们自己都可能通不过白板测试。
“白板测试”是评估程序员的一种常用方法,它的形式是让候选人在白板上实时编码解决一个编程问题。但是多年来工程师们对白板面试颇有微词。
David Heinemeier Hansson,Ruby on Rails(有史以来最成功的web框架之一)的创始人,就曾带头反对白板测试。很多来自Google、微软和《纽约时报》的顶级开发者也纷纷响应他的观点。
然而在很多科技公司里,尤其是FAANG(Facebook、苹果、亚马逊、Netflix和Google)和一些独角兽公司,白板测试仍然是面试过程的核心环节。
但在冠状病毒大流行期间,远程招聘成为了新常态,这为招聘人员、技术负责人以及整个软件行业提供了一个重新审视白板测试初衷的机会。
我们需要更加有效、更加包容的替代方案,以便能够在视频和电话面试中恰当地衡量候选人的技术才能、团队配合度和发展潜力。这是提升行业的多元化和包容度的最重要的改革方向。
高级算法/数据结构问题。图片由作者提供
进Google比上哈佛还难(前者的录取率为0.2%,而常春藤校的录取率为4.9%)。众所周知,顶级科技公司的面试非常严格,尤其是在招聘软件工程师的时候。
面对数以千计的应聘者,公司应该如何进行选拔才能保证筛选出最优秀的人并录用他们呢?不管是什么行业、什么角色的招聘,都是很难的。企业难免偶尔会雇佣一个表现不佳的人,有时也会错过优秀的候选人。
在没有实际合作过的情况下,评估候选人的技术能力并不容易。
招聘软件工程师特别困难。尤其是顶尖人才的招聘,竞争一直很激烈。LinkedIn上的超过15万个空缺职位中,“软件工程师”一直是需求量最大的职位,即使在新冠流行期间也是如此。招聘的主要痛点是:在没有实际合作过的情况下,评估候选人的技术能力并不容易。
企业技术评估的常见方式包括:
给候选人几天时间构建一个简单的网络应用,可以在家完成。
对现有项目中的代码做审查
关于编码和网络基础知识的测验
一对一白板测试,解决算法和数据结构的问题
既然有那么多的反对声音和充足的替代方案,为什么公司还在进行白板测试呢?
计算机刚发明的时候,机时是很昂贵的。一般都必须先在纸上写好代码才能输入电脑。不过现在与当年相比,计算机编程方式已经发生了很大的变化。虽然草绘一个系统或手写代码可以帮助人们合理规划,更深入地理解一个软件,但今天的编程工作实际在很大程度上依赖于不同的框架、库和Google搜索。开发功能强大而优雅的软件需要深刻理解所有工具是如何相互构建的,至少要对它们的内部原理具备基本的了解。
在过去几年里NPM包的下载量急剧增加。来源:seldo
为什么面试中不能用程序员现在拥有的正常工具,连电脑都不行?为什么要问算法和数据结构问题?
有人说这是一个重要的“仪式”,是成为软件工程师都要突破的一道坎。但是面试不应成为一种侮辱性质的仪式。
有一些人发帖,认为学习算法可以证明候选人的学习热情。成功的应聘者,无论是初级程序员还是有经验的程序员,都会花费数小时来准备这类面试。
帮助候选人准备技术面试已经是一个完整的行业了——既有LeetCode和InterviewCake这样基于订阅的练习网站,也有Pramp这样的模拟面试平台,以及专门研究算法和数据结构的新手训练营。即使是有经验的开发者也需要使用这些面试培训资源(往往还很贵),这一事实恰好说明:通常开发人员日常实际的工作与白板测试中的问题并没有什么关联。(还有很多其他的方法可以衡量好奇心和拼搏精神)。
我发现,之所以要在面试时进行技术筛选的最有说服力的原因,是为了判断应聘者是否在技术能力上说谎,以及更好地了解应聘者的思维过程和协作风格。
既然有了这些目标,技术面试就应该围绕这些问题来进行:
你会编码吗?
你善于合作吗?
而无论是在白板上编码,还是在新冠流行期间的远程面试中,受试者被要求在Zoom上的非编译文本编辑器或Google Doc上编码(我被要求过用这两种方式做测试),都不是评估以上技能的最佳方法。
最近我分享了我是如何成为一名软件工程师的经历。我当年没能完成加州大学伯克利分校的计算机科学入门课程,所以在最终找到自己的归宿之前,我从事的工作性质是偏重沟通协调的。
我的主要体会是,虽然公司很少要求计算机科学学位(招聘信息中往往会写上“CS学位或同等学历优先”之类的字样),但具有计算机科学的正规教育背景的候选人在面试过程中会非常受青睐。作为一个具备大学计算机教育背景以及IT训练营经验的人(今年早些时候我制定了Flatiron的全栈项目),经常有人问我这两种教育的区别。
大学课程主要教授计算机科学的概念和原理,包括算法和数据结构,这些对于成功通过白板测试是必不可少的。而大多数训练营在这方面几乎就没有涉猎了。Flatiron专注于Web开发的学习,你可以在程序中构建多个全栈应用。可是我在大学学计算机的时候从来没有开发过一个Web应用,也没有用过框架。
虽然这两种类型的教育都很有价值,但训练营为一些弱势群体提供了进入软件行业的重要通道。训练营的毕业生来自不同的背景。许多人是没上过大学的,或者工作了很多年才开始从事编程。
顶级科技公司员工中黑人、拉丁裔和女性开发者的占比情况。资料来源:Vox
白板测试也是令人生畏的,特别是对于那些患有冒充者综合症(Impostor syndrome,又称自我能力否定倾向,对女性和有色人种影响更大)的人来说,会给他们带来很大的心理压力。远程面试更加剧了他们的恐惧。起码对我来说是会这样的。
我们现在都有这样的体会,在Zoom上要与别人建立良好的沟通很困难,尤其是与陌生人。当你在舒适区之外工作的时候,就会感到困难很多。
因为我找工作的时候正好是由于新冠流行而实施封锁隔离的前几个月,所以那时我参加的所有的面试都是远程的。白板测试几乎不能真实地反映我与他人有效合作的能力。即使是写一条清晰的提交信息这么简单的操作,在实际软件开发中也需要有效的协作和沟通。而在白板测试中,我无法展现我在这些方面的优点,甚至无法很自如地表现自己。我知道我并不孤独,很多人也是这样。
有一个更好的方法
很多公司招聘程序员时都不需要白板测试。我之前的公司Artsy面试的时候就从来不考察任何技术的。很早的时候他们就能招到一些行业内最优秀的工程师。确实有很多更好的方法,能够更有效地帮助评估候选人的能力:他们会编码吗?他们善于合作吗?
三个我认为最好的可替代白板测试的方法:
1.结对编程
结对编程(在一台机器上与另一个开发人员一起合作编程)日益风靡,它能够提高代码质量,帮助工程师成长。我在现在任职的公司VTS面试的时候,三场面试中的第二场就是“结对编程”,我需要和面试官合作用JavaScript实现几个简单的方法。虽然只是把面试设置为项目合作,但这的确令我减轻了很多焦虑。我觉得我可以问问题,还可以从我的伙伴那里得到启发。远程结对编程现在已经成为许多开发人员日常工作的一部分,所以,它本身就是一项很值得评估的技能。
2.参考以往的项目经验
最好是候选人过去做过的项目或接到的需求的陈述,这部分他们也可以在家里完成。以候选人之前的项目代码为切入点,来判断他们如何理解代码、如何取舍、如何沟通决策。有的公司担心候选人会作弊,他们可能会询问朋友或在Fiverr上付钱请别人来完成这项任务。与其训练面试官出一些深奥的白板测试题,不如培训他们多问一些面试者以往工作中发生过的需要深入思考的问题。
但是对于选择这种面试方式的公司,请注意要尊重候选人的时间。比如像我的很多同龄人同时在兼顾其他工作,或者要照顾家里的孩子。我就在家里做过几次这种类型的面试任务,但是那些公司要么是并没有认真考虑我,要么就没有反馈,直接进入下一步。如果这种在家里进行的面试项目是有时间限制的,旨在帮助工程师学习新的知识,并在完成之后来一次全面的讨论,那么为之努力是非常值得的。
3.以往的经历可以作为参考,但要全面
过往取得的业绩是未来业绩的最好证明。找曾经与你的候选人合作过的人交谈,他们提供的信息可以为候选人在新环境中可能的表现提供有价值的参考。很多人认为推荐只是个形式,但大多数公司的推荐确实做得很差。你可以提出一系列具体的问题,深挖答案背后的实质,往往会发现比你预期更多的信息。以下是Artsy用过的一些例子,Artsy在面试过程中非常重视推荐:
你曾经与多少担任过候选人所在职位的人合作过?
仅从工作表现来看,在那么多人中,你觉得候选人可以排到第几位?
候选人(如果你没把他排第一)和你认为的第一名有哪些不同?候选人需要怎样才能达到最佳(你认为的)?
白板测试对我来说很难,不是因为问题本身太有挑战性,也不是因为我不想努力。因为我害怕求助。知道何时以及如何提问,不管是向同事还是向Google提问,都是软件工程师最重要的技能之一。虚拟的白板测试无法让候选人和面试官之间有充分的沟通交流。在远程环境中,要想充分交流就更困难了。
当我看到那条资深软件工程师Estelle Weyl在2017年热搜中发布的推特时,我深深地认同她,承认自己一无所知是一件非常令人恐惧的事情。她发现她的大部分男性同事均透露自己无法对二叉树进行排序,她说:
在2017年白板测试还没有消失,但也许在2020年可以(好像还是没有)。
译者:张茉茉
举报/反馈