面试对于大多数开发人员来说是一项很基本的技能。一次失败的招聘会造成很严重的长期的后果,二流的人会把三流的人带进公司(一流人才雇一流人才,二流人才雇三流人才)。另一方面,把优秀的应聘者拒之门外更是一种伤害。
一场技术面试至少包括三部分。首先验证简历的真实性,然后评估应聘者的经验价值,最后测试应聘者的技术能力。
1: 验证简历
简历上的任何东西都是假的,除非被证明。简历中实际有价值的两个部分就是“技术特长”和“项目经验”,所以验证简历围绕这两个部分进行。应该重点关注哪些入职后会用得上的技术和经验,其他项目用作对诚实度的考察,不过适当的“文学修饰”应该被当作自我营销手段而接受,“熟练”和“精通”的区别是很难定义清楚的。
关于技术特长:
可以根据对方擅长的方向由浅入深循序渐进的询问技术细节,以便考察应聘者的掌握程度。除非是精确的定向招聘,否则不要仅通过询问你自己擅长的、只涉及某个狭窄领域、方向的技术细节来确定对方价值。有些人可以通过CPU针脚输出各种电信号,但是却无法在屏幕上打印”hello”。也有很多前端一直使用代码布局而从来不用可视化布局工具。掌握这些技术对他们来说易如反掌,回答不上来你的问题只是因为使用习惯不同而已。可以通过技术趋势或技术社区等方向来考察一个人对某个技术的了解程度。这些问题并没有正确的答案,但是通过交流可以了解到对方对此技术的关注程度。
对这个技术的看法,这个技术的未来发展趋势?
与竞争技术对比有哪些优缺点?
此技术(或开发环境)有哪些点可以吐槽?
此技术的主要社区或blog有哪些?针对某一阶段,有哪些书籍可以推荐?
关于项目经验:
不要通过对方很久以前的项目技术细节来考察对方诚实度,1~2年以上的项目技术细节或架构是很难有完整记忆的。但是项目背景、应用领域、人员结构、开发中遇到的重大问题以及大的技术方向选择对方应该十分清楚。
项目背景,客户群体是怎样的,为什么开发这个项目?
项目人员组成,你负责哪部分?
你负责的部分使用了那些技术,为什么不用其他(具体)技术?
项目遇到过哪些重大问题(或有趣的事),怎么解决的?
2: 经验价值
经验不等于工作时间。除非你是真正的天才,否则永远不要低估经验的重要性。一个有经验的优秀程序员仅凭直觉就可以预测出需求是否合理。经验和工作年限并不完全成正比,一个人可能在一年的时间里经历从初级程序员到项目总监的变迁。也可能一生都投身于公司内部软件中某个模块的维护,学不到任何新东西。一个人可能仅利用业余时间就开发出一款优质的产品。也可能集公司之力也仅写了一些DEMO,业余时间完全不关心技术。真正的经验价值取决于个人经历,可以通过对方的技术成长路程获得大致的了解,比如(注意验证真实性):
什么时间、什么原因加入这个行业?
学习过哪些技术、编程语言,具体应用在那些项目中?
是否有个人项目,或业余时间研究过哪些技术?
是否做过主要开发者,在哪个项目中?
是否有分享总结习惯,是否有技术blog?
3: 技术能力
如果简历和经验价值满足招聘要求,但是对应聘者依然不放心,可以通过实际编码来验证一下对方的技术能力。不过想在很短的时间内了解一个人的技术深度是非常困难的,对于优秀的程序员,条件允许的情况下针对职务定制面试主题更为适合,不要把重点放到某个函数/参数或用法,更不要一味的学习google/apple问一堆算法问题(取决于:你的项目是否需要程序员对算法有深入的研究),重点是对方对相关技术的理解程度。多考察一些原理和技术应用场景,在这些方面没有捷径也很难事先造假,在对方回答的过程中问一下答案纲要,可以防止浪费太多时间。一些基础的问题方向可能包括:数据结构和算法。
线程、进程。
内存。
设计模式。
计算机原理。
操作系统。
以上做法主要针对有经验的程序员。对于那些经验有限但潜力十足的应聘者并不公平。而对于很多非常优秀的高级开发人员来说,招聘方应该把重点放在“怎么吸引对方过来”的问题上。毕竟,能遇到优秀的人本身就是一种运气。