为什么写这篇博客

最近正在帮公司面试一些候选人,突然就想写点东西记录一下我对于如何技术面试一个人的理解。

首先我自认为自己并不是一个面试能力非常出色的人,个人以往的面试经历基本是 60% 左右的成功率,所以这篇文章并不是教你怎么去准备面试,而是肤浅地站在面试官的角度谈谈怎么去面试一个工程师会相对更加合理高效。

我第一次面试其他工程师缘于好几年前我在一家创业小公司的经历。说来很搞笑,当时我第一次进行技术面试的时候甚至比候选人还紧张,因为我很担心自己的言行举止给对方留下不好的体验。后面这种经历逐渐多了之后,我也相对成熟了不少,也稍微总结了不少经验和教训,就以这篇文章记录一下。

几个原则

无论进行何种类型的面试,我觉得必须坚持下面两个大原则(也许未来会再增加几个原则,但是就当前来看,我觉得下面两个大原则就足以涵盖大部分场景):

  1. 保持平等和尊重

    面试官和面试者一定是平等且相互尊重的,一个好的面试过程是对彼此保持必要友善度的过程。虽然面试官拥有对面试者能力的裁判权,但是这并不表示面试官有权利以高高在上的方式对待候选人。作为面试官,一定要尽量避免因候选人的某些背景信息就轻易进行先入为主的评判,而是要站在多元的价值观的基础上去了解和理解候选人。面试官最好能在站在候选人的角度思考问题,避免生硬和不合适的价值观输出,也避免侵犯他人隐私。当你不清楚你当前行为是否遵循这个原则时,不妨换位思考:如果角色互换,你希望面试官用现在的方式和你沟通吗 ?

  2. 选最合适的人

    在有限的时间段内,我们只能选最合适的人,而非技术最厉害的人(或者履历最光鲜的人)。我们要根据当前公司的发展阶段,可以提供的薪资能力,公司的文化,当前团队的价值观取向等关键因素,从当前的候选人中选择相对合适的人。不合适的人一旦进入团队,其不好的影响是指数级上升,不仅影响整体团队的士气,也会对项目造成不必要的损失,同时也会彼此留下职业上的阴影。所以,选人要慎之又慎,一定要选最合适的人。

    从原则 2 出发,我们不难得出,面试的标准是五花八门的。如果你没有通过某家公司的面试,请不要灰心,很多时候是匹配度暂时不行。比如某大公司希望招聘资深的技术专家,那么相应的招聘标准就有可能是充分的领域从业经验和成功的大规模项目经历,此时候选人的活力和潜力因素就不一定特别看重。

面试非常重要

对一个公司或者团队来说,面试是一件非常重要的事,必须以优先级极高的事项进行统筹安排。认真地对待每一场技术面试,不仅是对候选人的尊重,也是对自己团队人才梯队建设的负责。因为你是在为你们团队寻找可以信赖的搭档,而不是简简单单地填补人力而已。

我认为,如果你有幸成为了面试官,一定要注意自己的言行举止,因为面试也是一次很好的企业文化的展示。哪怕候选人最后没有通过面试,你们公司也能在对方心中留下一个相对较好的形象和口碑,长此以往,公司就能建立起相对正面的形象,这样也能促进人才的招揽。

节奏

我觉得整体面试时长最好控制在 60~90 分钟,过长的面试会太消耗彼此的精力。就面试方式来说,我比较推崇轻松的聊天式面试

我个人经常采用以下方式来进行一场技术面试:

  1. 面试官首先简单自我介绍

    面试官可以采用以下模版进行自我介绍:

    我是今天的面试官,我叫 XXX。我目前在 XXX 公司负责 XXX 方向的开发。我们今天面试的岗位是 XXX。

    我先简单介绍一下我们公司。我们公司主要业务是 …

    如果面试官担心泄漏个人隐私,可以隐去自己关键的身份信息,比如只介绍自己的姓氏。通常状况下,由于面试官事先看了候选人的简历,所以面试官掌握了比候选人更多的信息。这时候如果面试官主动介绍自己和公司,不仅可以让面试者有更多信息了解公司(被尊重的感觉),也有助于缓和面试的紧张气氛。这个环节约 1~2 分钟左右

  2. 让候选人简单自我介绍

    由于有了第 1 步面试官的自我介绍,这一步就会显得更加自然,就像两个不认识的人希望成为朋友,彼此互相介绍自己一样。这个环节约 2~5 分钟左右

    环节 1 和 2 更多是起到暖场作用,让双方都互相简单了解。

  3. 聊项目

    由于我接触的大部分是社会招聘,所以我更倾向于让候选人聊自己做过的项目。如果对方做过的项目比较多,我会让对方自己选一个觉得最能代表自己技术能力的项目来讲。这个环节重点考察候选人的领域知识能力和基础工程能力。

    当候选人在讲述项目的时候,我会将聊的过程聚焦在以下几个方面:

    • 项目的背景:为什么要做这个项目 ?它解决了一个什么样的问题 ?

    • 技术架构和关键业务逻辑:整个项目可以分为哪些层次和模块 ?架构为什么要这么设计,有什么实际的权衡考虑 ?

    • 技术选型决策:为什么要使用这项技术 ?还有没有调研过业界其他可供选用的技术 ?最终的技术决策逻辑是什么 ?

    • 技术细节深挖:面试官根据个人经验深挖候选人项目中的一个技术细节,刨根问底;

    整个环节大约为 40 分钟左右,面试官一定要注意尽量引导候选人聊自己最擅长的领域。当对方不清楚问题的答案时,一定不能咄咄逼人,可以尽量说一下可能的思路和暖场的鼓励话,比如我一般会这么说:

    • “我感觉是不是采用 XXX 架构做会更好一些,因为这样可以有 XXX 好处,你觉得呢 ?”

    • “是不是没有啥思路 ?没关系,我讲一下我个人的一些思路,你看看合不合理……”

    总而言之,尽量在原则 1 的基础上充分给候选人能力表现的机会,而面试官更多的是当一个话题引导者。当彼此意见不合的时候尽量避免无谓的争论,因为这是一场面试而非技术讨论,你更多的是需要理解候选人的思维过程从而判断其技术能力。

  4. 随便聊聊

    这个环节比较灵活,大约在 15~20 分钟左右,更多是基于候选人实际背景自由安排,比如:

    • 聊聊候选人的职业规划,为什么想换工作以及对未来的工作有什么想法和诉求;
    • 最近有没有在研究有趣的技术 ?如果对方曾经在其他技术方向上做过不少研究,可以和对方详细聊聊研究的过程;
    • 挑一些比较有代表性的、相对灵活且开放的技术设计问题来发散聊聊。比如根据候选人技术背景出一个系统设计问题,看看对方会如何去设计这个系统,整体的思路是怎么样的 ;
  5. 让候选人问面试官 1~2 个问题,然后结束面试

    这个环节约为 5 分钟左右,更多的是加深候选人对公司和面试岗位的了解,你也可以从中了解到候选人的其他关注点。这一步也为第 2~4 环节提供了一个即时的反馈渠道。

这里可能并没有引入常见的算法题面试流程,但是可以在环节 4 中适当引入。我个人对这类标准化的算法题面试(其实更多的是数据结构逻辑题)带有一定的 “偏见”,所以大多数时候并不会主动使用这类模版化的考试题。我自己就特别不适应这类白板写编程题的面试方式(容易紧张+训练不够),而且我也见过不少人题刷得很多,但是实际工程设计和编码一塌糊涂。带着这类偏见,我其实更喜欢与候选人聊对方实际做过的东西,问对方实际的工程问题,这样不仅可以让对方更好地发挥,我自己也能从中学到不少有趣的东西。更有意思的是,就算面试者提前知道我想要问什么问题,也并不很影响最终的面试质量,整个面试过程可以像一场个性化的开卷考试。

细节

我觉得一些面试细节非常重要,一旦不注意,就很有可能给候选人带来极坏的印象:

  1. 提前预约候选人的时间

    面试官尽量去匹配候选人的时间,让对方能够提前有充足的心理准备时间

  2. 面试官不能迟到

    面试一定要准时开始,如果你迟到了,请及时向候选人进行道歉。如果迟到时间过长,可与候选人重新协商面试时间。

  3. 提前确定面试形式

    根据个人的经验,现场面试效果最好,但是由于最近几年的疫情以及分布式办公的兴起,我现在比较喜欢远程视频面试。这样一来,视频会议的邀请链接可以提前以邮件形式发送给候选人,从而让整个面试邀请显得更加正式且时间清晰。

  4. 提前仔细阅读候选人简历

    在面试开始前就对候选人的基本信息有大概的了解,如果对方做过一些面试官并不了解的东西,面试官应该提前进行简单的了解。一个比较好的模式是:当你读完候选人简历,你最想问对方什么问题 ?我们可以提前准备几个基于候选人技术背景的有针对性的问题。

这样就够了吗

当然不够 !想要更好地了解候选人,短短 1~2 个小时是绝对不够的。好多年前读过的一篇博客比较好地讲述了这个现象。这也就是为什么有些公司会更看重候选人的基本背景信息,因为这类信息很难造假且相对客观公允:

  • 教育背景:比如学历和毕业学校;

  • 从业背景:比如有没有在知名大公司任职的经历;

  • 行业认可的级别体系:比如国内比较具有代表意义的是阿里和腾讯的级别体系;

  • 技术影响力:比如是否为某个顶级开源项目的主要作者或维护者;是否为知名开源项目贡献过代码;是否发表过顶会论文;是否出版过较有影响力的技术书籍 ?是否写过较有影响力的技术文章等等;

总而言之,面试官除了实际的面试过程之外,也可以尽量挖掘候选人更多的背景信息(你也可以主动向候选人询问),从而对候选人有更加准确的了解,这样有助于做出更好的决策。不过还是那句话,选最合适的人

参考

  1. 怎样花两年时间去面试一个人