过去的两年时间里,一直都有参与到团队的工程师招聘。参加了大概有几十场面试,在这个过程中,我也一直在思考如何更好的面试候选人。在这里,我想分享一下我在面试过程中的一些经验和思考。
很多人可能会觉得工程师的面试是一个非常客观的过程,但是其实在短短一小时左右的沟通,面试更多的是对候选人形成一个整体的印象,很难说非常客观,有时候是带着不少面试官的主观判断在里面的。
通常我们的面试分为一次电话面试和一次现场面试,当然疫情以来大部分面试都是两轮电话面试。第一轮电话面试由一位一线工程师或者一线主管面试官负责,第二轮电话面试由一位一线工程师(也可以是团队主管) + 部门技术负责人或者部门负责人一起参与。
作为团队主管,第一轮面试和第二轮面试我都会有所参加,但我不会同时参与同一位候选人的两轮面试。
以下是团队总结出来的内容大纲,但面试不总是需要严格遵守,只是作为一个指导性大纲:
在面试的过程中经常会遇到一些候选满嘴跑火车,面试时间就这样流失了。因此面试官或者团队面试官要达成一致,对候选人有一个大致的衡量标准,比如写出某道编程题占比是多少。避免面试了半天最后什么也没获得。确定好一个衡量标准也有利于彼此对齐招聘要求。
如果是第一轮面试,我一般会提前 5 分钟进入线上会议室。如果候选人提前进入,我会先和候选人打个招呼,然后提前告知本次面试大致需要的时间、提前告知候选人有编程题提前准备好可以写代码的工具,并简单介绍我们团队的情况。之后例行的让候选人做一下自我介绍,这也是给候选人消除紧张感的机会。
在没有和候选人有过其他交流的情况下,大部分情况下简历是一场面试里信息含量最大的,同时简历里的内容也是候选人自己最熟悉的。因此我们应该更多的围绕简历展开提问。尽量提问对方了解和擅长的话题,让对方有足够的表达机会,发挥出正常水平,考察候选人擅长的部分要比不擅长的部分更有价值。
可以让候选人展开介绍 TA 觉得具有技术挑战的项目。这个过程可以捉一些细节提问,验证一下简历内容的真实性。在现实情况里有一小部分候选人会把其他同事的工作内容写到自己的简历里,求职的时候我们可以尽可能地把简历写得更好,但是不应该把别人的工作内容写成自己的。
技术类问题可以从一个简单的问题开始,候选人给出回答后,可以就上一个问题相关的问题继续发文,考察候选人思路是否灵活。尽量避免在不同方向、不同类型的小问题之间反复的来回跳跃,这对候选人不友好也不利于面试官把握面试节奏。
当然如果我们想试探一下候选人的对未知问题解决能力,也可以从一个困难的问题开始,考察候选人分解复杂问题的能力,在长时间没有进展时应该给出一些提示。同时也要注意考察候选人在遇到困难时是否会问合适的问题。
现在很多人在面试前都会被一些所谓的八股文,这也提醒我们面试提问不要浅尝则之,最好能有一些 follow up 来区分候选人的水平。
我一般都会在面试中准备一个开放性的问题,比如如何实现一个 json parser, 如何实现 redis 的 scan 命令等。这类问题在面试中能不能正确回答出某个难题并不是特别重要,最重要的是展示出自己面对难题时的思路以及积极的态度。看候选人能否积极尝试以不同的思路分析和解决问题,比如把问题的规模变小、先考虑简单的特殊情况、或者从几个实例中去发现规律等。
一些候选人可能对八股文类型的问题很熟悉,而且也比较能说,但是实际编码能力却比较差,这类候选人并不是我们的目标人选。因此我们一般都会考察候选人的现场编码能力。
两轮面试一般都会有编程题,但是编程题的难度不一样。
类型主要是基础数据结构以及二分查找的变形等等,对于客户端工程师两轮编程题难度基本都是 low(有时候客户端工程师只有一轮会考察编程题), 而对于后端工程师都不会超过 medium。
完成代码的基本功能只能算是完成 60 ~ 80% ,之后应该请候选人写一些测试用例,考察是否有良好的测试习惯。同时应该观察候选人的代码风格,是否有良好的编码习惯。
沟通能力是推进工作的基础,也是我们看重的能力之一。在面试过程中,应该尽量了解候选人的沟通能力。 如果在面试的过程中觉得与候选人的沟通不顺畅则应该慎重考虑。
这里并不是说要求候选人体现出外向的性格,毕竟大部分工程师在沟通上都相对不会太主动。但是至少在沟通上不存在问题,不需要面试官重复一些问题或者常识性问题,并且双方的沟通是融洽的。
面试官应该时刻提醒自己我们在考察候选人的时候,候选人也在考察我们。
在阿里的那三年我个人也参与了比较多的校招面试和社招面试,一些面试官的行为我实在不能苟同。比如之前有一个阿里同事说他每次都准备一些八股文题目,如果候选人给不出标准答案就直接 pass, 有时候整个面试过程仅仅持续十几分钟。
在面试过程中,可能部分候选人的表现比较差,可能面试到一半面试官心里已经有了判断。但是我们还是应该致力于让候选人有一个完整的面试体验,面试官应该把整个面试流程都走完。
在面试结束前应该给候选人提出对我们的团队、产品、职位需求等方面问题的机会。这个过程也可以了解到候选人对下一份工作的预期。
招一个“错误”的候选人付出的成本远远高于错过一个好的候选人,因此当我们犹豫的时候不必有内疚感这时候回绝不管对于候选人还是对于团队可能都是更明智的选择。
每次面试结束后都应该尽快开始写面试笔记,首先是总结一下对候选人技术水平和整体能力的评价并给出是否通过的结论。 然后回大致列出面试聊到的内容以及题目,给下一轮的面试官提供参考,避免重复的问同一个问题。
在面试完成之后我们尽快给出一个面试结论,如果有不确定的地方也可以在团队内来。这也为了尽快给候选人一个答复,我一般都会在面试当天或者第二天给出面试结论,方便 HR 推进下一轮或者结束流程。
作为求职者时非常不好的一点体验是在 BAT 这些大厂里完全不对求职者的面试结果做回复,即使回复也是非常久之后的事情。现在我都记在大学毕业时求职,光子和阿里的 offer 就等了半个多月才有结果,官网一看永远都是面试中,完全没有太好的记忆。
以上这些问题不仅不利于我们了解候选人的技术能力,而且也会让候选人感到不舒服。