写点什么

作为工程主管,我是如何招聘软件工程师的?

2020 年 12 月 15 日

作为工程主管,我是如何招聘软件工程师的?

作者自述:2015 年,当我第一次担任 Packback 的工程主管时,我接手了一个很棒的工程师团队,他们在我升职之前就已经被招聘进来了。那年年底,当我要自己招聘一些人的时候,我不得不迅速制定一套流程,来发现和培训新入职的软件工程师。多年来,我一直在改进这个招聘流程。我的方法有点非常规,但我希望它能激发你的思维。


这篇文章比较长,所以我将它分成五个部分:1、关于招聘的问题;2、我要找的技能;3、我如何发现候选者;4、我如何招聘工程师;5、我犯过的错。


本文最初发布于 Karl Hughes 的个人博客,由 InfoQ 中文站翻译并分享。


2015 年,当我第一次 担任 Packback 的工程主管 时,我接手了一个很棒的工程师团队,他们在我升职之前就已经被招聘进来了。那年年底,当我要自己招聘一些人的时候,我不得不迅速制定一套流程,来发现和培训新入职的软件工程师。


我从公司前辈使用的框架入手,并深受《人件》和 Josh Tyler 的著作“建立伟大的软件工程团队”所影响。多年来,我一直在改进这个招聘流程——主要是通过反复试验——得出这里要介绍的迭代方法。


我的方法有点非常规,但我希望它能激发你的思维。这篇文章比较长,所以我将它分成五个部分:


  1. 关于招聘的问题

  2. 我要找的技能

  3. 我如何发现候选者

  4. 我如何招聘工程师

  5. 我犯过的错


注:如果你正在找一些书来帮助你成为软件工程经理,这里有一些我最喜欢的:https://www.karllhughes.com/posts/reading-for-engineering-managers


关于软件工程师招聘的问题


过去,任何做过招聘的 工程经理 都会告诉你这项工作很难。


有很多限制因素,我们没法完全公平地比较两个候选人,适合一个团队的候选人可能对另一个团队来说就很糟糕。因为这太困难了,所以在这个过程中,人们会更青睐那些和面试官想法类似的人,那些在公司认识人的人,或者那些在压力巨大的面试中表现出色的人。这让那些拥有非传统背景的人陷入了苦苦的挣扎,他们要与形形色色的候选人展开竞争,而这与大多数工程师的日常工作关系不大。


例如,一个典型的面试可能会要求面试官通过电话面试来考查“软技能”。接下来,一个工程经理可能会进行基本技术技能面试,可能会要求候选人完成一个独立的项目,或者到办公室参加一个白板会议。在这两种情况下,面试与工程师的日常工作完全不同


软技能很重要,但是,像“请告诉我什么时候……”这样的问题是为了检验语言组织能力,而 并不能真正的展示出其判断能力或解决问题的能力。在 30 分钟的电话面试中评估一个人的性格是不可能的,因此,你最多就是淘汰那些完全不靠谱或语言交流能力差的人。


同样的,在一个小时的技术面试中也很难全方位地判断一个人的技术能力。Web 开发(以及一般的软件工程)领域是如此之大,以至于没有人能够完美地满足你的需求。你可以问他们熟悉什么技术,看看他们是否能就技术话题进行连贯的对话,但你可能无法触及他们所掌握的知识,特别是如果这些知识与你自己所拥有的知识不存在重叠的话。


最后,我从来不和候选人进行白板或在线编码,很多人讨厌这样做,我认为这是有原因的。在现实世界中,程序员在一个人的注视下用模糊的算法解决问题,没有时间进行独立研究,也无法获得资源。如果那是我的日常工作,我绝不会做这份工作。


考查程序员不需要掌握的东西,并期望了解他们在公司的工作方式,这是妄想。这类面试只会让招聘团队有优越感,并确保拥有传统计算机科学背景的工程师可以获得更好的结果。


我要找的技能


为了围绕软件工程中真正重要的技能重新设计我们的招聘流程,我把这个问题归结为 第一性原则。软件工程师团队需要具备什么技能?


主动性


我从不喜欢事无巨细地管理别人。记得在大学时,我在一家餐馆当领队,对那些在顾客排队结账时闲站着不做事的人,我感到异常恼火。“去点菜或干点其他什么事!”


我跑题了。


大多数正在找工作的软件工程师都有一定的主动性,但是优秀的软件工程候选人总是会付出额外的努力。例如,我在 Packback 工作的时候,有一个家伙建立了一个网站和一个非常受欢迎的 Twitter 账户,用来跟踪警方扫描仪上的聊天记录。他做这一切都是为了学习新东西。


积极主动的软件工程师不会等招聘经理回复邮件,他们会询问下一步的工作,并在参加面试前了解公司的情况。这并没有多难,但确实需要时间,而且很少有候选人会这么做。


可靠性


主动性仅仅是个开始,但 我不要英雄。我想建立一个由始终可靠的工程师组成的团队,他们会随着时间不断进步。


通常,在招聘时,长期工作经验、强有力的推荐信和对项目的全心投入会让他们在我这里脱颖而出。


胜任力


当我还是一名新工程经理时,我有些过度关注技术技能。我们很容易会陷入这样的陷阱:仅仅根据工程师的技术知识来给他们打分(像 Toptal 和 Triplebyte 这样的公司就是建立在这种谬误之上),但那些晦涩难懂的琐事并不能造就一名优秀的工程师。


我会在下文中更详细地讨论我如何衡量应聘者的能力,但关键问题是,我是否认为这个工程师能学会解决我们所面临的问题吗?


我不关心他们是否第一天就知道所有的答案,相反,我寻找的是有好奇心的人,终身学习者,愿意不断提高自己。如果他们有这样的能力,我会设法为他们提供成功担任这一职务所需的信息。


对企业使命的兴趣


我曾经把这称之为“激情”,但 在“欢迎例外”播客上进行了一次生动的对话 后,我决定重新命名这种技能。


最终,我只想招聘那些关心我们行业,关心我们正在解决的问题,关心我们实现目标所用方法的软件工程师。我不想他们加入之前就和我们走在不同的方向上,然后我要在前六周花时间说服他们。


虽然我不想要毫无疑问的忠诚或住在办公室的人,但我确实认为,软件工程师对他们将要做的工作要真正感兴趣,这很重要。这会让他们更快乐,这种积极的情绪会感染到每个人。

我如何发现软件工程师



这些年来,我用了好几种方法来发现和招聘软件工程师。虽然我没有大量的数据来证明这些方法,但我发现,以下这些方法对我有效。


职位列表


职位列表是求职者的 着陆页。


一份引人注目的职位列表应该列出求职者应该知道的工具和语言,求职者将从事的项目,以及尽可能多的关于日常工作预期的信息。我试图让职位列表变得有趣和有创意,所以我通常使用一个 GitHub 储存库,其中包含关于我们团队、我们公司和面试过程的大量信息(下面这个例子是我为 The Graide Network 创建的存储库)。


记住,不要只是和求职者分享这份清单。你还可以通过电子邮件发送给你的人际关系网中的每个人,在社交媒体上分享,并在你的网站提供相应的链接。那是一份公开文档,务必要外观美观、功能强大。

人际关系网


我从来没有花钱做招聘广告,我对此持怀疑态度,原因是:最好的软件工程师从来不会主动在招聘网站上找工作。


他们藏在他们的人际关系网中,包括前经理、同事、朋友以及专业机构中认识他们的人。当他们信任的人告诉他们有一个好机会时,或者当他们四处打听时,他们可能就会跳槽。高级软件工程师经常会笑我们,从天真的招聘人员那里收到了那么多领英信息。


那么,建立软件工程师人际关系网的诀窍是什么呢?


时间。


当我告诉人们,我 每周花 4 到 8 个小时建立和维护我的人际关系网 时,他们很惊讶,但是这种投资回报巨大。每当有新的职位空缺,我就写一份职位列表并分发。我有一个很长的清单,上面都是我希望将来某天与之共事的人,我浏览了一遍,然后找个借口一起去吃午饭。


如果你现在还没有积极地建立你的人际关系网,那就开始 写作、演讲、和有趣的人见面。这会是你职业生涯中最好的投资。

冷不丁的联系(Cold Outreach)


另一个不受欢迎的软件工程师招聘工具是冷不丁的联系。我发现它有效,但你必须小心。这很容易给人留下不好的印象。


把冷不丁的联系当成是为了扩大人脉,而不是直接提出“要求”。“接触别人,真诚地提问;对他们的背景做一些研究;去了解他们。你只是和他们进行对话,最终,可能会提到自己正在关注软件工程师。


在每次电话结束时,问一下你是否可以在几个月后继续联系,然后真的那样做。我就这样遇到过一些优秀的人,即使我们最终未能一起工作。

猎头


猎头在软件工程领域的名声并不好,因为他们很烦人。一些初级猎头会在我上班的时候主动打来电话,或者向我的公司邮箱中发送招聘职位。这种感觉不好。


另一方面,也有一些具有良好人际关系网的、诚实的技术猎头。准备好一大笔钱,因为最好的猎头是需要预付定金的,而不是事成再收费。


即使你找了猎头,也还是需要不断招聘。如果你找的猎头运气不好,你肯定也不希望失去所有的线索。

我如何招聘软件工程师



现在你已经知道了我在找什么,以及我从何处入手寻找软件工程师候选人,招聘过程的下一个环节就是工作面试。多年来,我一直在对这个过程做调整,但目前,我是按照以下五个步骤招聘工程师。

第一步:信息性面试


我没有设置“电话面试”,而是将我们的第一次通话视为双向 信息性面试。


应聘者需要知道我们是否能很好地合作,我需要知道他们是否具备我上面列出的四项技能。我不会试图探究深奥的技术知识,但如果他们的工作经历或简历中有什么特别突出的地方,我也会问。在电话结束时,我向他们推介这个职位,看看他们对这个职位多感兴趣。

第二步:面对面的结对编程项目


以前,我会给通过初步电话面试的候选人分配一个项目“带回家”。我的想法是,给他们一些空间来发挥他们的创造力,而且没有时间限制。另外,在候选人完成之前,也不需要我的团队在他们身上花很多时间,而且,他们可以在自己方便的时间完成。


个人独自完成项目的问题在于,它没有告诉我任何关于候选人在团队环境中如何工作的信息,所以我仍然需要和团队的其他成员开会,以弄清楚他们是否能与每个人和谐相处。


我们也错过了一些优秀的候选人,因为他们没有在项目的“适当”部分投入时间。例如,如果有人没有编写测试或者没有覆盖足够的用例,他们看起来可能就不如覆盖了足够用例的人,即使项目没有严格要求这样做。


所以,在 2018 年,我开始在求职者中使用一个面对面的结对编程项目。这更接近我们的团队成员在日常工作中的做法,而且通常比白板或带回家的项目有趣得多。


通常,我会选择一个有一些问题,但可以在 2 到 3 小时内取得进展的开源项目,安排一个时间与候选人见面,然后就一个问题进行结对编程。通过这种互动,我可以评估他们的批判性思维能力(特别是当他们是负责人的时候),他们的沟通技巧,他们学习新东西的速度,以及我们紧密合作的能力。同样,这也可以让应聘者了解他们是否愿意在未来几年和我一起工作。


最后,如果在第一次信息性面试中还遗留了任何问题,那么在这个环节的末尾,我们会问更多的问题。

第三步:与团队见面


通过信息性面试和技术评估的候选人将与工程团队的其他成员见面。


对于其他工程师来说,这是一个机会,他们可以看看自己是否愿意和候选人一起工作,也可以自己问一些问题。通常,为了方便比较进入这一阶段的候选人,我们会使用一组问题。关于如何让面试问题更客观,Jeff Hyman 的著作 Recruit Rockstars 提供了一些很好的见解。


在团队的其他成员与候选人见过面后,我将分别询问他们的意见。过去,我常常让所有人在一个房间里公开谈论候选人,但这导致了群体思维,通常声音最大的工程师会对招聘产生巨大的影响。现在,我会权衡团队成员的意见,但不会让他们投票决定结果。

第四步:背景调查及录取


在我决定提供这份工作之前,我会要求求职者提供推荐人的联系方式。你可能会认为进行背景调查很容易,但我遇到过很多求职者提供的推荐人都不怎么热情。这让我怀疑自己对他们的判断,并怀疑我是否还遗漏了什么。


假设他们的推荐人证实了求职者的经验和工作经历,我就会打电话给求职者提出工作邀请。


我总是在电话上提出邀请,然后通过电子邮件跟进。我会在电话里给候选人说下薪酬,这可以帮助我知道他们是否对此很感兴趣,或者我提供的薪酬是否太低了。这也给了他们一个机会,可以在花几天时间进行思考之前,直接问一些问题。

第五步:入职


在我提供 offer 并确定薪酬的同时,入职程序也已经开始了。


我会设法与每一位新员工见面,说下前几周希望他们做些什么,并开一个规划会议,帮助他们尽快完成他们的第一个项目。从那时起,新员工的适职过程就取决于他们的经验水平了。如果你想深入了解这个问题,这里有我写的 一篇关于人才发展和入职流程的长文。

我在招聘软件工程师时犯过的错


再说一遍,招聘是很难的。


尽管我有完善的招聘流程和丰富的经验,但有几次我还是招回了非常糟糕的人。不过,错误是学习过程的一部分,所以,如果你刚开始招聘软件工程师,请做好把事情搞砸的准备。以下是我犯过的四个最明显的错误。

1. 忽视危险信号


这是到目前为止我犯过的最大的错误。我招聘了一名求职者,他面试迟到了 30 分钟,因为他现在的工作太忙了。在我雇用他期间,他总是“很忙”,但从来都没有专注于正确的事情或工作。他干了很多工作,但什么也没做成。

2. 注重技术知识胜过学习能力


在一次招聘中,我淘汰了几名很有潜力的训练营毕业生,因为我想要的是在这个领域有几年工作经验的人。这似乎很有道理,但我招到的是一些多年来一直以错误方式做事的人,他们带来了一些坏习惯,我不得不努力帮他们改掉。

3. 在查找个人人际关系网之前联系猎头


尽管我在人际关系网上投入了大量的精力,但在最初的几次招聘中,我并没有充分利用它。我很早就向猎头求助了,虽然猎头有帮助,但他们 并不是小型公司找到最初几名软件工程师的最佳途径。

4. 没有定义我希望候选人具备的技能


我花了很长时间才意识到,我需要一个招聘评分规则。


取而代之,我找到的是一些懂得一套特定语言和框架的人,这样我就不用从头开始教会他们所有的东西。这让我放弃了一些候选人,而他们对我们的企业使命感到兴奋,只是技术技能上并不完全符合要求。


虽然招聘软件工程师仍然是一项挑战,但是,有一个专注于所需(技术和非技术的)技能的健壮流程会好一些。反思过去的成功经验总是能帮助我理解未来如何改进招聘流程,所以我也非常愿意倾听你们的意见。你们的招聘流程是怎么样的?欢迎在 推特 上和我联系。


查看英文原文:


https://www.karllhughes.com/posts/hiring-process


2020 年 12 月 15 日 14:371784
用户头像
陈思 InfoQ编辑

发布了 573 篇内容, 共 198.2 次阅读, 收获喜欢 1156 次。

关注

评论 1 条评论

发布
用户头像
招聘是一门艺术
2020 年 12 月 16 日 10:08
回复
没有更多了
发现更多内容

欧洲央行近期将决定是否建立官方数字货币

CECBC区块链专委会

数字货币 欧央行

Spring 5 中文解析测试篇-WebTestClient

青年IT男

单元测试 Spring5

音乐创作者必备软件,轻松玩转原创

奈奈的杂社

音乐制作 编曲 电音 作曲 乐团

解决分布式session问题

架构师修行之路

分布式 架构设计 session

高并发系列——CAS操作及CPU底层操作解析

诸葛小猿

CAS AtomicInteger compareAndSwap cmpxchg lock

SpringBoot RabbitMQ消息队列的重试、超时、延时、死信队列

Barry的异想世界

RabbitMQ springboot 消息队列 死信队列 延时队列

基于 Flink 的典型 ETL 场景实现方案

Apache Flink

flink

STL总结与常见面试题

C语言与CPP编程

c c++ 编程 编程语言 stl

oeasy 教您玩转 linux 010214 画面转文字 asciiview

o

Java String 面面观

keaper

Java string pool string

测试

Http请求中如何保持状态?

架构师修行之路

大作业

Geek_2e7dd7

甲方日常 14

句子

Java 工作 随笔杂谈 日常

如何搭建第一个 Spring 项目?

码农田小齐

spring Spring Framework Spring Bean

Js 封装:阻止频繁重复操作

lockdown56

一次代码评审,差点过不了试用期!

小傅哥

Java 小傅哥 代码质量 代码优化 代码规范

解Bug之路-记一次JVM堆外内存泄露Bug的查找

无毁的湖光

Linux JVM heap memory GC Linux Kenel

非科班进大厂必备算法

我是程序员小贱

面试 算法

Flink SQL CDC 上线!我们总结了 13 条生产实践经验

Apache Flink

flink

Spring事务是如何应用到你的业务场景中的?

AI乔治

Java spring 架构 微服务 springboot

Spring IoC 到底是什么?

码农田小齐

spring 程序员 ioc Spring Framework Spring Bean

有关 HashMap 面试会问的一切

码农田小齐

Java 数据结构 算法

数字货币合约跟单系统开发app,跟单系统搭建源码

WX13823153201

设计模式只是一把锤子

博文视点Broadview

读书笔记 编程 面向对象 设计模式

前端必会的七种排序算法

执鸢者

算法 前端

python——深入类和对象

菜鸟小sailor 🐕

拥抱K8S系列-07-部署K8S集群(Rancher)

张无忌

Kubernetes rancher

所见即所得的用户增长技术背后是如何实现的

海豚调度

用户增长 大数据技术 大数据架构 用户增长技术 ad-hoc技术

为什么区块链能成为全球贸易的助推器

CECBC区块链专委会

区块链 金融 国际贸易

RabbitMQ 重要概念介绍

hepingfly

Java RabbitMQ 消息队列 JMS

作为工程主管,我是如何招聘软件工程师的?-InfoQ