10年技术招聘经验的面试官,教你如何选技术人才
2021.03.02

前言:又到了金三银四的黄金招聘季,“面试造火箭,入职拧螺丝”的情况经常发生,不仅企业会浪费大量的筛选时间,而且也会让来面试的技术牛人苦不堪言。那到底如何面试技术人员呢?相信这篇文章能帮到你,不仅说出了绝大多数技术人员的心声,也给企业和面试官提供了切实可行的方法。

Follow Your Dreams Cancelled — Chris Devers (CC BY-NC-ND 2.0)

最近,一位雅虎工程师在网上怒斥:糟糕的技术招聘让他一步步放弃代码面试。

他说出了我对招聘双方的挫败感,但更重要的是,他揭露了一个事实:不良的招聘行为不仅不利于公司招聘,而且还会败坏整个行业。

招聘怎么糟糕了?

  • 面试过于随机和随意,无法透露给你关于候选人的必要信息。
  • 公司期望聘请的优秀候选人是符合公司发展的。这可能会使HR将搜索时间延长数月,并花费数万美元。
  • 初级开发人员通常很难在该行业立足。
  • 你的公司可能为太多的高级开发人员支付了过多的费用,而没有雇用足够的初级开发人员。
  • 候选人感到沮丧,离开了这个行业。
  • 公司很少有好的候选人可供选择。

在传统的白板面试中,这些问题只会更加恶化。

白板用于绘图,不用于编码

技术招聘存在几个问题。讽刺的是,面试过程中最大的问题之一,就是面试被一种非常低技术的代码面试工具占据多年,这种工具就是:白板。

我之前已经写过有关此问题的文章,但是值得对这些问题做一个简短的回顾:

人们不会从上到下以整齐的线条线性思考或编码。他们将块放在一起,经常剪切和粘贴,等等……在白板上,这个过程需要涂改,而且看起来像是写错了。当然,这会使面试者感到紧张,也会误导面试官的判断。

人们对视觉提示有强烈的偏见。候选人的笔迹绝对不会告诉你关于他们是否会编码这一信息,但面试官会从中看出书写是否整洁、线条是否倾斜以及内容是否在限定空间范围内作答这种细节产生很多误解--哪怕面试官会有意识的避免这样做。而且还有面试相关的文章和手册,专门训练候选人做这些没实质用的“面子工程”。

在正常情况下表现良好的很多人在白板面试的压力下会爆炸。通常,你可以使用Google和键盘。没有人会对你在写算法的时候进行计时和观察你行为动态进行性格分析。在白板面试中,你处在一个陌生的环境,并且失去了日常工作中的可用的资源和协助,这让你感觉失去了左膀右臂。

观察错误反馈并进行纠正是一项关键技能。白板不会警告你语法错误(每个人都会犯错),但是面试官在寻找导致候选人不及格的原因时,往往会忘记这一点。通过运行代码,开发人员可以快速发现并纠正此类问题。每个人都会犯错误,我们应该给应聘者一个发现和解决错误的机会。

了解候选人在压力下的表现会很有用,但是工作面试的情境已经很有压力。你在白板上所做的所有事情,都使自己对应聘者做自己想聘用的真实工作的能力视而不见。

简而言之,除非你要雇用某个人来解决白板上的算法问题,否则请不要使用白板来做面试。你正在做的就是引入很多不公平的偏见和任意的限制,而候选人在实际工作中将永远不会遇到这些限制。

Using a whiteboard to interview coders is like rolling a pair of dice and passing or failing the candidate based on the number it lands on.

使用白板面试程序员就像掷一对骰子,根据它们落下的数字来录取或淘汰候选人。

如何招聘

寻找候选人可能是一个挑战。如果你正在招聘高级开发人员,我建议你联系猎头,而不是与招聘人员联系。猎头:

  • 更善于倾听你的需求。
  • 推荐更好的候选人。所有信誉良好的猎头都会与最优秀的人才合作,并与业内最优秀的技术顾问一起对候选人进行预筛选
  • 始终推荐有前景的潜在候选人,而不是随意推荐对某份工作真正感兴趣的人。
  • 不会向招聘公司收费。

如果你正在招聘初级开发人员,请考虑编程培训学校和训练营。他们目标就是帮助学生找到合适的工作。

接下来我们聊聊如何帮助公司更好地招聘候选人。我自己犯了所有的错误:我一直在进行白板面试。

多年来,我已经调整了聘用方式,今天我得到了更好的成绩。我现在正在寻找不同的东西。

在我职业生涯的早期,我在白板上做了CS问题。那时,每个人似乎都认为语言理解不是重要的部分。如果考生对抽象和算法有很好的掌握,并且可以用伪代码将其写出,那么我们可以在几天内教会他语言语法。

当我任职不同公司,并开始聘请更高级的职位(例如团队负责人,初创的CTO和架构师)时,这种策略就瓦解了。这种想法是正确的,但仅适用于初级开发人员

高级职位需要一定的专业知识和精通能力。你可以是一名资深的多语言人,但是你最有价值的技能是你的专长。

招聘初级和中级开发人员

我曾经有一个 JavaScript 难题列表,测试诸如函数提升(function hoisting),异步计时技巧(async timing tricks),变量作用域(variable scope)之类的东西。这些题目的问题在于,它们涵盖了初级开发人员可以快速学习的内容。对于初级开发人员而言,快速进行一次结对编程比问任何语言相关的问题都要好。

面试初级开发人员并不是考核他们现在所知道的,而是考察关于他们学习新事物并获得成长的能力和渴望。对于初级开发人员,我会有完全不同的问题集:

  1. 你编码多长时间了?
  2. 那段时间你学到了什么?
  3. 你是怎么对编程感兴趣的?
  4. 你是否有一些当前的代码示例可以给我看看的?
  5. 你是怎么学习?
  6. 你对哪些领域和技术特别感兴趣?前端?设计工作?节点?React?
  7. 你是否有兴趣寻找导师?

招聘高级开发人员

如果你要聘请高级开发人员来处理特定的语言技术栈并奠定体系结构基础,那么对这种语言的专业化和深入理解将大有帮助。至少需要一年(通常是两到三年),才能熟练掌握一种新语言并把一个 APP 架构得很好。

我列出了每个高级JavaScript开发人员都应该知道的问题。这些问题集中于那些构建坚实框架的基础。如果候选人能够回答这些问题,他们很有可能了解所有的坑。针对高级开发人员的问题将根据特定的语言技术栈而有所不同,但它们应集中在该语言的非常广泛的基础上,包括该语言可能的基本编程范例,以及如何将其最好地用于构建灵活的可扩展代码。

高级开发人员应该具有广泛的知识,能够快速学习几乎所有语言,并具有与你的需求相适应的深厚专业知识。如果对方的专业度与你的要求不匹配,你将会为他广而不精的技能最终付出高昂的代价。

你应该问每个人的一个问题

你在《破解代码面试》中找不到任何关于候选人的真正信息。

我认为这种书籍的存在简直是业界的耻辱。你想知道应聘者最近是否研究过算法,还是想知道他们是否可以写代码呢?

我想知道的是“这个人喜欢编码吗?”

你想了解开发人员是否总体上对编码充满热情吗?尝试问这个:

“What is the project you’re most proud of?”

“你最引以为傲的项目是什么?”

可以是他们为雇主所做的事情,也可以是他们在自己的时间上所做的事情……你正在寻找他们眼中的火花。他们对此有多兴奋?他们谈论时会变得更加生气勃勃吗?

彩蛋:如果他们在向你解释某些内容时感到很兴奋,那么他们会更喜欢这次面试,并且他们更有可能对你的 offer 说“yes”。

是否想做相反的事情来彻底摧毁面试?那你就继续玩算法彩票吧。

算法彩票(The Algorithm Lottery)

询问随机算法问题等同于运行算法彩票。开发人员记住了哪些算法,差异很大,并且你在计算机科学中学习的大多数算法在工作中都很少使用。

一些最好的,最有经验的,最有生产力的开发人员,也会做不出算法彩票。他们已经毕业多年了。距离他们上次看到归并排序可能已经十年了。我知道你在那个学位上花了很多钱。我能感受到你的痛苦,但是请不要让求职者感到痛苦。你在折磨候选人的同时,也在同等程度地伤害你代表的公司。

开发人员日常使用的大多数算法都内置于该语言中或在公共库中可用。开发人员真正擅长的是常用概念,具体概念取决于领域的专业。

为什么不问一些关于那些常见领域概念的问题呢?如今,大多数开发工作都是前端。如果你正在招聘前端人员,为什么不要求开发人员点击 Instagram API 并在响应式栅格系统中显示具有hashtag的图像?

如果你正在寻找初级或中级开发人员,那么在他们需要帮助时不要让他们失望。只需雇用他们作为初级或中级开发人员,并支付给他们相应的薪酬,同时认可他们会在工作中学习。

如果你要聘用第一个开发人员,那显然你应该寻找可以帮助你建立和指导强大的核心团队的高级开发人员。

别碰白板

在我整个职业生涯中,最好的面试经历是在我的第一份编程工作中。老板正在带我参观公司,但他突然被叫走了。当他回来时,我正在帮助开发人员进行一个真实的项目。他当场雇用了我。

如果更多的面试是像这样的,我认为世界将会变得更加美好。

The best way to prove you can code is to code.

证明自己可以编码的最好方法是编码。

你想知道应聘者是否可以编码?要求他们编码。真正的。在计算机上。查看为此目的设计的在线编程环境,例如CoderPad。

使用计算机和(可选)投影仪。如果候选人随身携带一台计算机,请让他们使用自己的计算机。很多人会带上自己的笔记本电脑。如果你要线上面试,那么你已经领先于比赛了。我强烈建议进行在线工作和线上面试。

让他们使用Google并不要当成是问题,不论他们搜索的内容是你可以轻松理解的,还是你问他们的那个问题的确切解决方案,嗯,别拦着他们 Google。如果我必须在现实生活中实现一个众所周知的算法,那么我要做的第一件事就是 Google 一下,如果这个算法你多年没用了或者从没用过,你也会 Google 的。

如果他们知道如何快速搜索和找到可行的解决方案,那也是非常有用的。搜索解决方案是所有软件开发人员都需要的一项宝贵技能。

让问题简单死了。在面试中,要求应聘者进行编码的目的仅仅是亲眼验证他们知道编程,而不是试图考察对方知识的全部深度和广度。当我说“简单死了”的时候,我的意思就是“简单死了”。我见过才华横溢、经验丰富的人在面试的压力被 FizzBuzz 卡住。把障碍设低点

一个思路:尝试将自己代码库中的一些常见模式简化为一个非常简单的问题,然后与候选人结对编程(让程序跑起来)。同时阐明这个问题。

观看代码运行。不同的开发人员将针对问题提出不同的解决方案。很多时候,我发现面试官在寻找特定的答案,当候选人的答案跟特定答案不一样时,即使候选人是对的,他们也会认为是错的。在计算机上,你可以观察代码的运行情况,并证明其是否满足要求,甚至可以证明哪种解决方案性能更高,从而可以进行富有成效的讨论,你们可以探讨为什么一种解决方案可能比另一种解决方案更好,以及什么使你你选择了一个而放弃另一个。

说到观看代码运行,如果你在面试之前花了几分钟时间做一些准备,则可以设置带有一些单元测试的CodePen,并要求应试者通过测试。请参考上面的“使问题保持简单死了”。别想着耍他们。

这是一个CodePen示例。你可以随意取用:

学习的文化

我们这个行业,对初级开发人员要求太苛刻了,这会让你的团队付出很多钱。应届生或大学毕业生需要在导师的频繁帮助下吸收他们的第一年经验,但很多时候,他们被抛到最底层,羞愧到觉得自己不能问太多问题。

我非常支持对初级开发人员的指导和结对编程。你所有的高级开发人员应花费大量时间来指导其他开发人员,回答许多问题,并进行大量代码审查。

当然,你将需要高级开发人员的原始火力来布置一些关键的体系结构,或编写供初级人员使用的核心库,但是不应期望你的高级开发人员具有超级英雄的超能力。相反,他们是领导者和指导者,其主要角色应该是确保团队的其他成员始终处于正常状态,并且确保任何初级或中级开发人员在几分钟之内都不会陷入困境。

给他们足够的时间以确保你团队的其他成员富有成效。

要记住:

The best way to be a 10x developer is to help 5 other developers be 2x developers.

成为10x开发者的最佳方法是帮助其他5个开发者成为2x开发者。

结论 现在是时候调整技术招聘的态度了。

Instead of looking for reasons to reject candidates, we need to look for reasons to hire them.

与其寻找拒绝候选人的理由,不如寻找雇用他们的理由。

  • 他们有学习的热情吗?
  • 有成熟的编码能力吗?
  • 他们相信你的公司价值观吗?
  • 他们对你的工作感兴趣吗?
  • 他们能否在你的团队中立于不败之地?如果没有,他们会迅速而热情地学习吗?

如果这些问题的答案是肯定的,录用他们。

翻译:凯西,

校准:阿毛,MOOKEY


声明:此译作仅供学习交流用,不用做商业用途。

原文链接:https://medium.com/javascript-scene/tech-hiring-has-always-been-broken-heres-how-i-survived-it-for-decades-b7ac33088de6

CodePen:面向前端设计人员和开发人员的社交开发环境。你可以在此建立和部署网站,展示作品,建立测试用例以学习和调试以及寻找灵感。

https://codepen.io/ericelliott/pen/ONaMbG

CoderPad:一个实时协同的在线代码面试平台。https://coderpad.io/

CodePen 和 CoderPad 都是海外的网站,国内访问会不稳定。ShowMeBug 集成了这两者的功能,是一款数字化驱动的交互式代码交流的技术面试工具,让用户体验硅谷流行的像真正工作中一样的代码面试,通过在线笔试场景和在线面试场景两大法宝让企业结构化、规模化、自动化、智能化的进行技术招聘从而节约大量的面试时间。

凭借优秀的产品体验和需求的激发,ShowMeBug 增长迅速,注册用户从去年底的 3600 增长至现在的 90000+ ,面试官超过 5000 ,覆盖的科技公司约 3500 家。同时,ShowMeBug 也获得了顶级资本的青睐,半年内获得奇绩创坛、盈动资本、变量资本和真格基金的投资。