最近公司开始了新的一轮招聘,身为面试官,我主要负责Senior Developer和System Architect的技术面试。面的人多了,在不断打磨自己提问方式的同时,多少积累了一点心得。
首先,我理解的面试官的核心职责是,识别出面试者的真实水平,判断他是否能胜任应聘的职位,及是否能符合公司对他的期望。
那么,如何做到这几点呢?
审核简历时,注重简洁性及解决过问题的难度。看过太多像工作编年史的简历,对每个项目都是事无巨细的介绍。一方面,简历不“简”,动辄10几页;另一方面,无法确定面试者在项目里真正做了哪些工作,在开发团队里的贡献有多少。
于是,在电话面试时,就需要通过提问,理清面试者在最近一份工作的具体内容,解决过的问题难度,对编程的理解是否深入。为什么是最近一份工作呢?个人发现,其实很多面试者都没有充分的准备就来面试了,过往的经历大多想不起细节,一句记不清了,很难判断他的真实水平。但如果最近一份工作都讲不清细节,只能说明他不是一个有心人,对细节不够敏感和专注,通常是不予通过电话面试的。这一轮面试的主要目的,是通过提问澄清简历中的模糊信息,筛掉工作职责与期望明显不符或者对技术的理解有很大出入的面试者。
下一步,就需要通过笔试和面对面交流来进一步考察面试者的水平了。考察一个人的编程水平的最好方式就是review他写的代码,因为代码是程序员之间沟通的第二语言,写出来的代码清晰与否,直接体现一个人的编码水平和逻辑能力。
在笔试题的设计方面,我会从编程思想的本质入手,结合设计模式,类的设计和简单的算法题,来综合考察面试者的编程功底,细化问题、解决问题的能力以及我最看重的对编程的元知识的理解。题目会设计的比较开放,乍一看很简单,让每个面试者都能写下一些答案,但实际上要答好一道题需要考虑很多细节,比如说设计完善的测试用例来测试实现的方法,考虑开放封闭原则重构已有代码的设计等等,这些答案一方面可以作为后续面对面的沟通的基础,避免泛泛而谈;另一方面,也可以区分出不同面试者考虑问题的深度和广度,为量化评分提供依据。
除了讨论笔试情况,在面对面沟通环节,我还会仔细挖掘面试者在最近一个项目里的具体工作内容,通过不断细化提问,逐步澄清细节,进而判断他解决过的问题的难度。这一环节我会让面试者通过UML图描述他在项目中最满意的一段设计或者他认为的项目中的难点,沟通过程中不仅可以考察他的解释问题的能力,也可以以点窥面进一步确定他的解决问题的思考方式和面向对象编程的设计能力。
除了上述两点,软技能、如何带领开发团队、保证Scrum有效运转,对技术的热情和职业规划也会在这一环节重点考察。
大体上,面对面沟通时我会这样安排提问的顺序:
1. 请用3分钟时间简短的介绍下自己的工作经历,并重点介绍下最近收获最多或者贡献最多的项目?然后深挖他描述的项目细节。预计用时20分钟。
2.在讨论笔试题的答案的同时,穿插考察面试者对高质量代码的理解,工作中如何做code review?当团队成员不接受code review意见时怎么办?如何响应需求的变化重构代码等等。预计用时20分钟。
3.考察面试者的对技术是否有追求和对开发流程的理解。例如,作为team leader,如何帮助team有效的执行scrum?如何支持多个team的开发工作?对自我编程水平的认识,下一步准备怎样提高?当业务和编程语言都很熟悉以后,如何克服工作中的瓶颈期?预计用时15分钟。
4.询问面试者的职业规划及为什么选择我们公司。这一部分的答案可以作为向老板引荐的理由。预计用时5分钟。
以上就是我在面试的各个环节的一些心得和总结。
给初为面试官的建议:
1.不要怕面试工作经验比自己长的人,因为提问的一方是占优势的。
2.把自己在工作中的困惑或者深入思考过的点包装成问题询问面试者,无论怎样,这都是你开源想法和学习的一种方式。如果面试者都能一语点醒你,那不正好说明你找对人了吗。
给面试者的建议:
1.仔细打磨自己的简历
2.精心准备下自我介绍