作者自述:2015 年,当我第一次担任 Packback 的工程主管时,我接手了一个很棒的工程师团队,他们在我升职之前就已经被招聘进来了。那年年底,当我要自己招聘一些人的时候,我不得不迅速制定一套流程,来发现和培训新入职的软件工程师。多年来,我一直在改进这个招聘流程。我的方法有点非常规,但我希望它能激发你的思维。 这篇文章比较长,所以我将它分成五个部分:1、关于招聘的问题;2、我要找的技能;3、我如何发现候选者;4、我如何招聘工程师;5、我犯过的错。
本文最初发布于 Karl Hughes 的个人博客,由 InfoQ 中文站翻译并分享。
2015 年,当我第一次 担任 Packback 的工程主管 时,我接手了一个很棒的工程师团队,他们在我升职之前就已经被招聘进来了。那年年底,当我要自己招聘一些人的时候,我不得不迅速制定一套流程,来发现和培训新入职的软件工程师。
我从公司前辈使用的框架入手,并深受《人件》和 Josh Tyler 的著作“建立伟大的软件工程团队”所影响。多年来,我一直在改进这个招聘流程——主要是通过反复试验——得出这里要介绍的迭代方法。
我的方法有点非常规,但我希望它能激发你的思维。这篇文章比较长,所以我将它分成五个部分:
注:如果你正在找一些书来帮助你成为软件工程经理,这里有一些我最喜欢的:https://www.karllhughes.com/posts/reading-for-engineering-managers
过去,任何做过招聘的 工程经理 都会告诉你这项工作很难。
有很多限制因素,我们没法完全公平地比较两个候选人,适合一个团队的候选人可能对另一个团队来说就很糟糕。因为这太困难了,所以在这个过程中,人们会更青睐那些和面试官想法类似的人,那些在公司认识人的人,或者那些在压力巨大的面试中表现出色的人。这让那些拥有非传统背景的人陷入了苦苦的挣扎,他们要与形形色色的候选人展开竞争,而这与大多数工程师的日常工作关系不大。
例如,一个典型的面试可能会要求面试官通过电话面试来考查“软技能”。接下来,一个工程经理可能会进行基本技术技能面试,可能会要求候选人完成一个独立的项目,或者到办公室参加一个白板会议。在这两种情况下,面试与工程师的日常工作完全不同。
软技能很重要,但是,像“请告诉我什么时候……”这样的问题是为了检验语言组织能力,而 并不能真正的展示出其判断能力或解决问题的能力。在 30 分钟的电话面试中评估一个人的性格是不可能的,因此,你最多就是淘汰那些完全不靠谱或语言交流能力差的人。
同样的,在一个小时的技术面试中也很难全方位地判断一个人的技术能力。Web 开发(以及一般的软件工程)领域是如此之大,以至于没有人能够完美地满足你的需求。你可以问他们熟悉什么技术,看看他们是否能就技术话题进行连贯的对话,但你可能无法触及他们所掌握的知识,特别是如果这些知识与你自己所拥有的知识不存在重叠的话。
最后,我从来不和候选人进行白板或在线编码,很多人讨厌这样做,我认为这是有原因的。在现实世界中,程序员在一个人的注视下用模糊的算法解决问题,没有时间进行独立研究,也无法获得资源。如果那是我的日常工作,我绝不会做这份工作。
考查程序员不需要掌握的东西,并期望了解他们在公司的工作方式,这是妄想。这类面试只会让招聘团队有优越感,并确保拥有传统计算机科学背景的工程师可以获得更好的结果。
为了围绕软件工程中真正重要的技能重新设计我们的招聘流程,我把这个问题归结为 第一性原则。软件工程师团队需要具备什么技能?
我从不喜欢事无巨细地管理别人。记得在大学时,我在一家餐馆当领队,对那些在顾客排队结账时闲站着不做事的人,我感到异常恼火。“去点菜或干点其他什么事!”
我跑题了。
大多数正在找工作的软件工程师都有一定的主动性,但是优秀的软件工程候选人总是会付出额外的努力。例如,我在 Packback 工作的时候,有一个家伙建立了一个网站和一个非常受欢迎的 Twitter 账户,用来跟踪警方扫描仪上的聊天记录。他做这一切都是为了学习新东西。
积极主动的软件工程师不会等招聘经理回复邮件,他们会询问下一步的工作,并在参加面试前了解公司的情况。这并没有多难,但确实需要时间,而且很少有候选人会这么做。
主动性仅仅是个开始,但 我不要英雄。我想建立一个由始终可靠的工程师组成的团队,他们会随着时间不断进步。
通常,在招聘时,长期工作经验、强有力的推荐信和对项目的全心投入会让他们在我这里脱颖而出。
当我还是一名新工程经理时,我有些过度关注技术技能。我们很容易会陷入这样的陷阱:仅仅根据工程师的技术知识来给他们打分(像 Toptal 和 Triplebyte 这样的公司就是建立在这种谬误之上),但那些晦涩难懂的琐事并不能造就一名优秀的工程师。
我会在下文中更详细地讨论我如何衡量应聘者的能力,但关键问题是,我是否认为这个工程师能学会解决我们所面临的问题吗?
我不关心他们是否第一天就知道所有的答案,相反,我寻找的是有好奇心的人,终身学习者,愿意不断提高自己。如果他们有这样的能力,我会设法为他们提供成功担任这一职务所需的信息。
我曾经把这称之为“激情”,但 在“欢迎例外”播客上进行了一次生动的对话 后,我决定重新命名这种技能。
最终,我只想招聘那些关心我们行业,关心我们正在解决的问题,关心我们实现目标所用方法的软件工程师。我不想他们加入之前就和我们走在不同的方向上,然后我要在前六周花时间说服他们。
虽然我不想要毫无疑问的忠诚或住在办公室的人,但我确实认为,软件工程师对他们将要做的工作要真正感兴趣,这很重要。这会让他们更快乐,这种积极的情绪会感染到每个人。
这些年来,我用了好几种方法来发现和招聘软件工程师。虽然我没有大量的数据来证明这些方法,但我发现,以下这些方法对我有效。
职位列表是求职者的 着陆页。
一份引人注目的职位列表应该列出求职者应该知道的工具和语言,求职者将从事的项目,以及尽可能多的关于日常工作预期的信息。我试图让职位列表变得有趣和有创意,所以我通常使用一个 GitHub 储存库,其中包含关于我们团队、我们公司和面试过程的大量信息(下面这个例子是我为 The Graide Network 创建的存储库)。
记住,不要只是和求职者分享这份清单。你还可以通过电子邮件发送给你的人际关系网中的每个人,在社交媒体上分享,并在你的网站提供相应的链接。那是一份公开文档,务必要外观美观、功能强大。
我从来没有花钱做招聘广告,我对此持怀疑态度,原因是:最好的软件工程师从来不会主动在招聘网站上找工作。
他们藏在他们的人际关系网中,包括前经理、同事、朋友以及专业机构中认识他们的人。当他们信任的人告诉他们有一个好机会时,或者当他们四处打听时,他们可能就会跳槽。高级软件工程师经常会笑我们,从天真的招聘人员那里收到了那么多领英信息。
那么,建立软件工程师人际关系网的诀窍是什么呢?
时间。
当我告诉人们,我 每周花 4 到 8 个小时建立和维护我的人际关系网 时,他们很惊讶,但是这种投资回报巨大。每当有新的职位空缺,我就写一份职位列表并分发。我有一个很长的清单,上面都是我希望将来某天与之共事的人,我浏览了一遍,然后找个借口一起去吃午饭。
如果你现在还没有积极地建立你的人际关系网,那就开始 写作、演讲、和有趣的人见面。这会是你职业生涯中最好的投资。
另一个不受欢迎的软件工程师招聘工具是冷不丁的联系。我发现它有效,但你必须小心。这很容易给人留下不好的印象。
把冷不丁的联系当成是为了扩大人脉,而不是直接提出“要求”。“接触别人,真诚地提问;对他们的背景做一些研究;去了解他们。你只是和他们进行对话,最终,可能会提到自己正在关注软件工程师。
在每次电话结束时,问一下你是否可以在几个月后继续联系,然后真的那样做。我就这样遇到过一些优秀的人,即使我们最终未能一起工作。
猎头在软件工程领域的名声并不好,因为他们很烦人。一些初级猎头会在我上班的时候主动打来电话,或者向我的公司邮箱中发送招聘职位。这种感觉不好。
另一方面,也有一些具有良好人际关系网的、诚实的技术猎头。准备好一大笔钱,因为最好的猎头是需要预付定金的,而不是事成再收费。
即使你找了猎头,也还是需要不断招聘。如果你找的猎头运气不好,你肯定也不希望失去所有的线索。
现在你已经知道了我在找什么,以及我从何处入手寻找软件工程师候选人,招聘过程的下一个环节就是工作面试。多年来,我一直在对这个过程做调整,但目前,我是按照以下五个步骤招聘工程师。
我没有设置“电话面试”,而是将我们的第一次通话视为双向 信息性面试。
应聘者需要知道我们是否能很好地合作,我需要知道他们是否具备我上面列出的四项技能。我不会试图探究深奥的技术知识,但如果他们的工作经历或简历中有什么特别突出的地方,我也会问。在电话结束时,我向他们推介这个职位,看看他们对这个职位多感兴趣。
以前,我会给通过初步电话面试的候选人分配一个项目“带回家”。我的想法是,给他们一些空间来发挥他们的创造力,而且没有时间限制。另外,在候选人完成之前,也不需要我的团队在他们身上花很多时间,而且,他们可以在自己方便的时间完成。
个人独自完成项目的问题在于,它没有告诉我任何关于候选人在团队环境中如何工作的信息,所以我仍然需要和团队的其他成员开会,以弄清楚他们是否能与每个人和谐相处。
我们也错过了一些优秀的候选人,因为他们没有在项目的“适当”部分投入时间。例如,如果有人没有编写测试或者没有覆盖足够的用例,他们看起来可能就不如覆盖了足够用例的人,即使项目没有严格要求这样做。
所以,在 2018 年,我开始在求职者中使用一个面对面的结对编程项目。这更接近我们的团队成员在日常工作中的做法,而且通常比白板或带回家的项目有趣得多。
通常,我会选择一个有一些问题,但可以在 2 到 3 小时内取得进展的开源项目,安排一个时间与候选人见面,然后就一个问题进行结对编程。通过这种互动,我可以评估他们的批判性思维能力(特别是当他们是负责人的时候),他们的沟通技巧,他们学习新东西的速度,以及我们紧密合作的能力。同样,这也可以让应聘者了解他们是否愿意在未来几年和我一起工作。
最后,如果在第一次信息性面试中还遗留了任何问题,那么在这个环节的末尾,我们会问更多的问题。
通过信息性面试和技术评估的候选人将与工程团队的其他成员见面。
对于其他工程师来说,这是一个机会,他们可以看看自己是否愿意和候选人一起工作,也可以自己问一些问题。通常,为了方便比较进入这一阶段的候选人,我们会使用一组问题。关于如何让面试问题更客观,Jeff Hyman 的著作 Recruit Rockstars 提供了一些很好的见解。
在团队的其他成员与候选人见过面后,我将分别询问他们的意见。过去,我常常让所有人在一个房间里公开谈论候选人,但这导致了群体思维,通常声音最大的工程师会对招聘产生巨大的影响。现在,我会权衡团队成员的意见,但不会让他们投票决定结果。
在我决定提供这份工作之前,我会要求求职者提供推荐人的联系方式。你可能会认为进行背景调查很容易,但我遇到过很多求职者提供的推荐人都不怎么热情。这让我怀疑自己对他们的判断,并怀疑我是否还遗漏了什么。
假设他们的推荐人证实了求职者的经验和工作经历,我就会打电话给求职者提出工作邀请。
我总是在电话上提出邀请,然后通过电子邮件跟进。我会在电话里给候选人说下薪酬,这可以帮助我知道他们是否对此很感兴趣,或者我提供的薪酬是否太低了。这也给了他们一个机会,可以在花几天时间进行思考之前,直接问一些问题。
在我提供 offer 并确定薪酬的同时,入职程序也已经开始了。
我会设法与每一位新员工见面,说下前几周希望他们做些什么,并开一个规划会议,帮助他们尽快完成他们的第一个项目。从那时起,新员工的适职过程就取决于他们的经验水平了。如果你想深入了解这个问题,这里有我写的 一篇关于人才发展和入职流程的长文。
再说一遍,招聘是很难的。
尽管我有完善的招聘流程和丰富的经验,但有几次我还是招回了非常糟糕的人。不过,错误是学习过程的一部分,所以,如果你刚开始招聘软件工程师,请做好把事情搞砸的准备。以下是我犯过的四个最明显的错误。
这是到目前为止我犯过的最大的错误。我招聘了一名求职者,他面试迟到了 30 分钟,因为他现在的工作太忙了。在我雇用他期间,他总是“很忙”,但从来都没有专注于正确的事情或工作。他干了很多工作,但什么也没做成。
在一次招聘中,我淘汰了几名很有潜力的训练营毕业生,因为我想要的是在这个领域有几年工作经验的人。这似乎很有道理,但我招到的是一些多年来一直以错误方式做事的人,他们带来了一些坏习惯,我不得不努力帮他们改掉。
尽管我在人际关系网上投入了大量的精力,但在最初的几次招聘中,我并没有充分利用它。我很早就向猎头求助了,虽然猎头有帮助,但他们 并不是小型公司找到最初几名软件工程师的最佳途径。
我花了很长时间才意识到,我需要一个招聘评分规则。
取而代之,我找到的是一些懂得一套特定语言和框架的人,这样我就不用从头开始教会他们所有的东西。这让我放弃了一些候选人,而他们对我们的企业使命感到兴奋,只是技术技能上并不完全符合要求。
虽然招聘软件工程师仍然是一项挑战,但是,有一个专注于所需(技术和非技术的)技能的健壮流程会好一些。反思过去的成功经验总是能帮助我理解未来如何改进招聘流程,所以我也非常愿意倾听你们的意见。你们的招聘流程是怎么样的?欢迎在 推特 上和我联系。
查看英文原文:
领取专属 10元无门槛券
私享最新 技术干货