面试是个技术活,其本质上是一次沟通的过程。候选人要在限定的时间和条件内向面试官展现自己的才能,而面试官同样也要在有限的时间和条件内发现候选人是否适合该职位。对于候选人的观察,很多人存在误区,那就是:技术主导,只要技术牛,那就是我要找的人。其实我认为这样是非常不靠谱的,为什么?因为我认为,无论什么行业,作为一个部门负责人或者团队负责人,在选择候选人的时候,应该把德行放在第一位,其次才是技术水平,第三是身体状况和其他因素。下面我就这三点展开来谈一谈。
第一:德行
对于一个程序员候选人来说的话,如何评判一个候选人的德行呢?我觉得有以下几点:
眼神
注意观察候选人眼神是否飘忽不定,是否总是不敢直视你的眼睛,或者回答问题的时候总是往左右两边瞟。一般来说,眼神是一个人性格的直观表现之一,如果眼神不够沉稳坚定,说明此人不踏实,心境飘忽,很有可能不诚信(比如爱撒谎,不诚实,不讲信用等等)。
身体语言
如果一个候选人在跟你聊的过程中,整个人吊儿郎当,身体左摇右晃,一会二郎腿,一会把脚放到大腿上(别怀疑,我真遇到过),那么说明此人一定不沉稳,性格轻佻浮躁,最好谨慎考虑。相反,如果候选人坐姿规矩,谈话间体态得体,自然,不紧张,不做作,那么该候选人应该比较有家教,个人习惯很好,性格比较稳定。
沟通
在跟候选人对话时,注意对方的语气语调。如果候选人语速平缓,吐字铿锵,说明此人准备比较充分,不急躁。当遇到一些一时回答不上的问题时,能够保持冷静,集中精神思考,如果实在不会,没有打算糊弄过关或者顾左右而言他,而是直接答复不知道,那么就说明该面试人性格比较沉稳,而且比较诚实,不滑头。甚至你可以故意说错一些细节,看看对方以何种方法给予纠正或者不纠正。你也可以直接故意用错误去质疑对方正确的表述,看看对方的反映,如果对方一下就被点燃了一样蹦起来,或者总打断你说话,说明对方性格比较急躁,这是程序员的大忌。当然此招能少用尽量少用,而且一次足矣,如果老这样,会让候选人觉得面试官不行,而心生鄙视。
细节
最常见的就是对方电话来了,看对方的反应,一般来说候选人会选择直接挂掉,或者任由电话震动。如果对方当着你的面,直接接起了电话,说明对方在为人处事方面肯能有些欠缺,起码不是很懂礼貌,或者根本不大重视这场面试。另外,一般来说前台会给面试者打一杯水,等到面试结束,或者有需要中途更换面试场所(例如换会议室等等),如果对方随手拿起水杯而不是留在原地,说明该候选人素质比较高的,而且心应该比较细。
第二:技术
技术排第二不是说技术不重要,作为一个程序员岗位,技术当然是非常重要的。很多企业喜欢让程序员做卷子作为首面的内容。我认为这是不妥当的,是面试官在偷懒的表现。不是说做卷子不能反映问题,只是这种方式太死板,并不能真正过滤掉不合格的面试者。比如,我其实没有什么技术能力,但是我面试前背了很多书,那么做卷子这一关我有可能可以过,到真正面试的时候才会被拒。所以,做卷子只能过滤那些真正没有技术,而且没有背书的面试者。但是,即便是直接面试,面试官真的碰到这样的面试者,又花的了几分钟就可以判断出来再拒绝呢?所以,我建议,不要做卷子,直接面试,并且分成以下几个内容来考察面试者。
过往经验
可以让候选人介绍最近一个项目,并且描述自己的工作内容。首先看看候选人是否能够说得清楚这个项目,比如有哪些模块,每个模块有哪些功能,实现了一个什么业务逻辑,自己负责的这一块的详细业务逻辑又是怎样的,等等,如果连这些都说不清楚,那么基本上可以判断候选人在撒谎。了解了项目之后,可以通过候选人负责的内容进行深入技术提问,比如候选人说使用了MVC4,那么就可以就MVC4的相关知识进行提问;候选人说使用了多线程,那么就多线程相关的知识进行提问,但是注意要由浅入深,不要一上来就问一些很难很深的问题。一般来说如果候选人没有撒谎,那么应该来说还是可以回答一些不太难的问题的。
基础知识
一定要考察候选人的基础知识。很多候选人在说起自己做过的项目的时候眉飞色舞,一套一套的,甚至满嘴都挂着一些热门的词汇,比如大数据,高并发,云计算,等等。但是一问基础知识就傻眼,最简单的值类型引用类型都不知道有什么本质区别。很多候选人都会辩称,自己会编程,能够实现业务逻辑,为什么还要去背那些概念性的东西,殊不知,那些他们认为没有的概念性的东西,正是我们构筑大厦的根基所在。举个例子,我造一所房子,地基打了10米,你造一所同样的房子,没有地基。我们都造好以后,在风和日丽的时候,看上去一模一样,你会笑话我,“看,我们一样,但是我比你不知道省了多少工序“,但是你要知道,并不是每天都会风和日丽,总会遇到狂风暴雨,等到考验真正来临的时候,谁的房子更不容易倾塌呢?
分类考察
在面试候选人的时候,最好是分类进行考察,每个类别准备5个问题左右,并且由浅入深。比如基础知识5道题,我一般会问:值类型引用类型什么区别?构造函数什么特点,合适被调用?string和StringBuilder什么区别?子类被实例化的时候会调用父类的构造函数吗?接口和类有什么使用场景上的区别?问完了基础知识,一般会问C#的相关知识,然后是数据库相关知识,然后是框架的知识,例如MVC的知识,最后问一些Web前端相关的,例如ajax,Jquery,JS等等。一般来说我不会考察算法,数据结构相关的内容,更不会让候选人写一个“二分查找法”,或者“单例模式”的代码,什么道理呢?因为我招程序员还是以实际应用为主,而且.net里面已经封装了很多算法,知道如何使用即可,对于原理性(注意,是原理,不是基础)的东西,如果自己能花时间去了解去掌握更好,如果不太了解,但是能够熟练应用封装好的东西就行。毕竟顶尖的互联网公司就那么几个,一般的公司招聘真的没必要搞那么高大上,两个字,务实!。
第三:身体状况及其他原因
为什么把身体状况单独拎出来说呢?因为之前招过一个不错的程序员,但是其身体极其瘦弱,脸色也比较苍白,但是我还是把他招进来了,并且分配了相对重要的工作,但是该苍白弟来了之后没几天,就旧疾复发(我也不知道入职体检是怎么做的),需要住院了,好在他也比较nice,也没算工资,就直接离职了。所以面试官在招聘时,一定要注意候选人身体状态,如果有明显的身体状态问题或者不正常,千万要慎重考虑。另外,需要考虑的还有下面的因素:
候选人是否准备创业
有些候选人因为首次创业失败,需要找个地方打工解决一下生活问题,一旦缓过劲来,就会离职重新创业。说实话,我是不太愿意招此类程序员的,太不稳定。
之前换工作太频繁
一般我认为,正常情况下,IT行业换工作频率在2年一次以上是比较正常的,当然后写不正常情况另当别论,例如公司倒闭老板跑路,例如被收购后辞退,等等。但是,如果正常情况下,连续3分以上工作的更换频率在1年以下,那么这种候选人需要谨慎对待。
其他
比如提一些无理要求的,期望薪水过高的,完全不尊重人的,等等,这些候选人都要谨慎考虑。
总结
洋洋洒洒又写了这么多,希望对各位面试官有些帮助。在考查候选人时,一定要查看候选人的德行,如果候选人德行不好,最后会让负责人非常头疼(亲身经历)。目前我的团队中开发17人,16人是我亲自招的,不说有多优秀多顶尖,但是绝对是一支战斗力极强的队伍,高效,专业,稳定(从去年6月建团队到现在只走了4人,其中老团队成员2人,一人回家,一人被以前同事挖走。新团队成员2人,一人上文提到的苍白弟身体抱恙离职,一人因为对公司有意见主动离职)。所以,千万不要光盯着候选人技术能力,要从各方面综合去考察一个候选人,这样才能找到你真正需要的人才。