写在前面
在一个小时内对一个人做出 yes or no 的判断,是一件复杂的工程 —— 信息的输入、消化、整合、再输出都要在面对面的形态下,实时密集的进行;同时,信息的不对称也增加了我们的沟通成本,不时伴随着困惑与纠结。技术面试确实容易在很多方面出现问题,本文基于自己在面试经验所成,不妨一看。
一些容易被忽视的原则
首先,面试是一个双向选择的过程。从面试角度来讲,考察候选人的时候看的是这个人,而反过来候选人看面试官看到的是一个公司的形象代表,所以作为面试官,主要目标应该有两个:一是尽可能深入地了解候选人,二是需要向候选人展示我司形象。(面试官行为规范)
其次,切忌和候选人比拼知识技能。一方面知识技能和每个人的经历关系很大,我们很难找到完全匹配当前工作的候选人,考察注重的应该是候选人的学习能力,另外一方面展示面试官的自身技能并非面试的目的。
最后,我们要找的是合作者、未来的同事。一方面在面试过程中,候选人陷入困局的时候不妨点拨他一下,想想自己团队如果有个同学搞不定问题时你会怎么做?另外一方面在最终决定要不要通过时如果犹豫不决,一定需要问自己一个问题,那就是如果这个人成为你的同事,你是不是很愿意和他在一个团队并肩作战?
面试前的准备以及开场
首先,面试前最好能够阅读一下候选人的简历,了解一些基本信息,发现一些有待澄清的疑问点,以及可能的兴趣点。
其次,面试开场白主要是让候选人进入面试的状态,所以简单寒暄几句就好,不建议让他完整地介绍人生旅程,或者重复简历上已有的内容,否则就是在浪费时间。
最后,面试的同时可以及时的备注面试者的回答信息,方便后续面试官的信息同步和决策判断。(面试官评价模版)
工程的面试问题
一、询问过去工作中碰到过的一个项目或者解决过的问题
尽可能按照 STAR (Situation, Task, Action, Result) 的技巧来组织对话,了解问题背后的信息,候选人本人的贡献,以及反映出来的能力。
通常来说这个问题我习惯放在最前面,因为对于这类问题候选人比较熟悉,回答的时候不会过于紧张。另外可以通过这个问题引出后续的一些具体的技术问题。
这个问题可以有很多变形,比如你做过的失败的项目是什么,最成功的项目,最难的项目,印象深刻的项目等等,提问的时候要考虑候选人对于回答的内容记忆是否是比较清楚的,这样有助于挖出很多细节的信息。
对于候选人的回答,需要判断其语言的信息量,如果形容词比较多,比如做得很好,客户反应不错之类的回答,应该要求其给出明确的描述,到底好在什么地方,有没有明确的内容和数据,而不是含糊的形容一下。通常如果一个工程师在得到明确提示的情况下还是不能切换陈述事实的方式,那么我基本上可以认为这个人对于平常的工作是缺乏理性思考的。
二、根据简历 / 背景询问关于某个具体的知识点的细节
算法编程题
算法或者代码编程题阶段,要注意候选人的思考过程,可以让他自己说说自己解题的思路,计算的复杂度,潜在的问题和局限性,以及解决的方案等等。(Coding 标准)
设计问题
比如设计一个开放平台系统,一个在线购物网站等等。可以要求画出模块图,给出关键的 API 的定义或者类和类之间的关系。
注意这类问题需要提前准备,注意不要选择脑筋急转弯的问题,而应该是大家能理解的实际可能碰到的问题,另外就是不要一上来把问题全部解释清楚,因为你需要看看候选人能否主动来了解产品需求(产品往往不会把所有需求说清楚)。另外一个需要注意的是这类问题可以很容易改变或者新增需求,所以可以考察候选人的方案如何适应变化的需求。
发散的面试问题
关于 * 你怎么看
这一类问题一般是没有明确的答案的,主要考察候选人是否有自己的理解,比如可以问候选人对于一些常见的编程和软件工程理念的看法,DDD、OOP、SOA、设计模式、微服务等等,来看看候选人平常对于这些问题是否有思考和总结,也可以是对于最近的一些技术热点的关注,等等。
不要期望这类问题的回答是不是和自己的观点一致,如果不一致的时候也不要想着和候选人争论,而是应该引导候选人完成地表述自己的逻辑,了解其观点背后的内容,考察候选人对于概念的理解和实践的程度,看看候选人是否有比较严密的能够自圆其说的逻辑。
你的朋友或者同事是怎么评价你的
注意这个问题其实是候选人自己理解到的外在对他的评价,但是还是能获得很有意思的信息,注意有时候需要深挖。深挖的时候要让候选人描述一个能符合其观点的事实,这样才能正确评估候选人实际的状态。
这个问题可以考察候选人是不是一个自省的人,能否认识到自己的长处和短处。
最近在看什么书
我比较喜欢提的一个问题,看起来简单,但是能够观察候选人的学习方式和行为习惯,除了让候选人报出书名,一定需要让他讲讲这本书里面让他印象深刻的章节,以及他从中学到了什么?
工作之余做什么事情
提出这个问题是观察候选人是不是真的对技术有兴趣和热情,一个工程师的业余生活也很有可能和技术有很大的关系,比如看些开源的软件、写些日常的博客等等。
应该避免的状态
候选人反复在同一个问题上纠缠太久
如果候选人思维陷入某个问题无法自拔,而面试官无法从沟通中获取有效信息,因为总的面试时间是有限的,所以有时候需要礼貌地打断候选人,比如说” 好的,我已经知道了,……“转移话题。
一上来就问非常困难的问题
很多候选人在碰到非常困难的问题又长时间不能解决的时候会非常紧张,影响后续发挥,既然我的目的是为了寻找平常工作中的合作伙伴,通常来说没有必要把候选人弄得特别紧张。
提前太早结束
即使开始几个问题候选人回答不是特别顺利,最好也能从不同的侧面考察候选人,因为可能候选人还存在其他比较优秀的方面,而且从礼貌的角度来说我也尽量尊重候选人。
陷入争执
这一点一定要避免,一旦出现争执,后面的面试基本上就很难继续了,即使勉强继续下去,也无法真实地考察候选人。在可能争执的点上先放下,不要试图说服候选人,转移到其他问题上。
其他的面试技巧
如何识别技术人才
在我的普遍印象中,好的技术人才往往在面试开始的时候不会非常热情,但是当聊到某个具体问题的时候,可能会突然涛涛不绝地谈论从上到下的细节,同时又能在适当的时候收回来,不至于让人觉得非常不适。优秀的人往往能够从原理到实现都理解得非常透彻,既能回答具体的细节问题,又能提出自己的观点和思考总结,并且对于新的问题能够迅速给出自己的比较靠谱的思考和解释。
面试中的沟通技巧
需要注意的是,在面试的过程中不仅仅要考察问题的回答,同时也要注意很多沟通技巧,比如观察对方是不是能够准确地理解问题,面对问题陈述有没有做适当的复述,有没有在没有问清楚需求的情况下就开始自顾自解答了。
候选人在回答的时候,如果偏题太远,需要通过适当的方式中断候选人的陈述。如果候选人陷入问题出不来的时候,需要给予适当的提示帮助他解答出问题以便顺利结束面试(不等于要最后放他通过)。