两年前,我在 Facebook 完成了100场面试的里程碑,分享一篇对于面试心得讲了讲面试对我带来的个人能力的提升。今年五月,我差不多在一年半的时间里又完成了100场面试让总数达到了200场。接着到了今年十月份,其中一类面试—行为面试(Behavioral Interivew) 我也完成了100场。感觉是个不错的时机来再来写篇文章分享一下,但这次我没有特别心得体会总结,就聊聊一些随意的想法。
美国科技公司对于软件工程师招聘比较常用三种面试形式:写代码(Coding),系统设计(System Design),行为面试(Behavioral)。对于大公司来说,他们常年都会很多招聘指标,也有大量的申请人,所以相对于中小公司,在大公司更容易获得面试方面的培养机会。(Facebook内部对不同类型的面试都有内部代号,但是因为不对新人记忆不友好,慢慢开始弃用了。)
当我作为面试者时,我对它们的难易程度排列为:系统设计>>行为面试>写代码。毕竟代码是可以通过刷题来提高的,行为面试也主要是讲自己的故事,而系统设计的广度和深度的把控就比较不确定了。
而当我变成面试官时,从另一个角度排列顺序就变成了:行为面试>系统设计>写代码。这排位主要根据我写面试反馈结论所花的时间来衡量:一般代码面试的结论我需要5-10分钟完成,系统设计则要15-30分钟,行为面试则尝尝花费我30-60分钟。主要原因是行为面试要做的内容记录就很多,次要原因是英文写作还是我的短板。因此我后来只做行为面试来锻炼我自己的英文写作,同时也让我享受挑战的乐趣。
之前的文章我讲了面试在广义层面带来的各种不同的好处,面试了所以不同类型面试后,我想再聊聊各类面试对于作为面试官的软件工程师在公司内的职业发展不同阶段所能带来的特定技能的锻炼和提升。进而让面试者从另一个角度来了解面试的意义和价值。
代码面试(Coding Interview)对面试官最直接的能力体现就是“代码审核(Code Review)”。当面试者完成算法实现之后,面试官就要对提交的代码进行审核查看是否完成了问题需求,代码是否整洁,是否有bug等等。在我做代码面试的时候,我对不同的面试者基本都只问相同的几道题目,即使我已经见到了很多不同的解法,但仍然会碰到面试者给出不同的解法实现也依然有效,就需要我去仔细验证同时要接受不同于我初始想法的解决方案。当公司或者团队规模比较大的时候,代码审核这一工作就是保证代码质量的一步重要流程,所以对于每个软件工程师都应该去参与和提升的技能。
做代码面试也可以锻炼如何向他人发布任务并且清晰表达任务内容的工作。当面试者答不出来或者走到错误方向的时候,还要想合适的办法去引导他们。有时会在初期的电话面试里,面试者的能力水平差别较大,我还会要给他们做知识点讲解和指导帮他们了解让他们不觉得做不出来会有压力,但这种情况基本面试就到此为止了。
系统设计面试(System Design Interview)对面试官的能力要求就在“设计审核(Design Review)”。在大公司里,一般系统比较复杂并且参与研发的人数众多,在增加或修改某个功能的时候就需要通过各类文档来进行沟通交流和记录,其中包括架构提案文档、设计方案文档等等。然后公司里比较资深的工程师们会阅读审核这些文档来提出各类不同修改意见,甚至驳回。系统设计面试差不多就在模拟这种审核会议的场景,面试者就是方案的提出者,面试官就是审核人员。由于每个人背景知识不同,所以关注点也会各不相同。
行为面试(Behavioral Interview)对面试官的能力要求在我看来主要是如何通过几个问题从主观角度挖掘出面试者的内心渴望,并考察是否与公司和团队的方向一致并提供支持。前两种面试的评价都有客观标准可以考量,行为面试的评价则趋于主观,但是当面试官经受过比较好的培训和练习,也能在心中对于特定问题的答案定出一系列的标准尺度。大公司里有晋升和绩效考核,因此管理者们(Engineering Manager)就需要有这种挖潜组员内心渴求和对职业发展的期望。因此对于希望从技术岗转到管理岗,或者刚到管理岗的人会有很大的帮助。对于面试者而言,了解公司的企业文化和工作方式,给出与之相应的答案会更容易得到青睐。
总结一下,对于初中级工程师来说做代码面试最合适提高基础能力,对于高级程序员想再往上升就可以花时间在系统设计面试上,对于想转管理岗的工程师则尝试更多行为面试。
另外,对于在公司里做不做面试官或者做哪类面试,主要看对自身以及团队和公司的成长是否有大的帮助。比如对我个人来说在工作中我已经做了大量的代码所以很快对代码面试失去了兴趣转而做更多系统设计面试,但后来我想转管理岗位,所以就专注在了行为面试上。最近我又完成了对管理岗面试的培训,以提升自己对于招聘管理者的能力对于中级管理职位的了解。