最近半年一直在不间断参与部门的面试工作,抽空总结一下,从一个技术面试官的角度来看面试工作。
第一节
见过兄弟部门准备了一套面试题集,参与面试的面试官提前看一下自己部门的面试题集,然后在面试时抽出一些来问面试者,然后根据回答情况,考虑是否录用。我总觉得这样的做法并不合适,虽然对于SN这样的大公司,各个产品线都已成熟,招来的技术人员,大部分都是做产品维护,也就是复制粘贴,但是真的背诵一套面试宝典就能成为一个合格的软件工程师吗?
面试过一个应试者,因为应试者工作经验不足三年,所以问题的问题也相对基础,然而面试者回答并不好,为了给应试者更多的回答问题和展示自己长处的机会,所以问题稍微多一些,应试者在面对问题卡壳时,我会转换角度给应试者另外一个问题,让他回答。结果问了几个问题后,应试者恼火了,直接问我:“你们只会问一些面试宝典的东西,如果背诵一下面试宝典就可以过关,我看你们SN也不怎么样,不来也罢”。那么,类似面试宝典这样的知识,是不是必须的面试环节呢?
公司近来由于项目进度紧张,而编制不足,所以会从人力资源外包公司招聘一些顾问过来参与公司的开发,所以常会通过电话面试一些还在外地的顾问,曾面试过一个顾问A,Java技术栈还算比较全面扎实,从Java基础到JVM、GC,到DB、事务,到分布式服务以及缓存都还比较熟悉,面试结果还都比较满意。同期进来的两个顾问,另外一个顾问B面试结果和他相比差一些,但是入司工作后,顾问B的表现却胜出一大截,顾问A不善于交流,遇到问题自己啃,往往又太重细节钻到牛角尖里,而顾问B则善于沟通,脑瓜灵活,工作中对自己要做的事情来龙去脉问个清楚,遇见不熟悉的业务,向同事请教,做起事情比较快而且bug少。那么对于合格的软件工程师,具备扎实的技术能力就足够了吗?
第二节
那么作为一个技术面试者应该从哪些方面去衡量一个应试者是否就是那个我们遇见的对的人呢?我认为有几个关键点必须抓住:
第一:技术能力,这个重要性自然不用多说。
第二:学习能力,一个工作人员在相应的工作年限内该有的工作技能和知识体系,既是这个人的学习能力,学习能力不是在毕业就停止了,很多年前我们就听人喊着终身学习的口号,这个一点都不虚,学校学的那点东西只是一个启蒙。
第三:沟通能力,项目组内每个版本的问题总结,所有组员一直的认知都是沟通有待提高,软件开发工作是劳动密集型工作,一个庞大的软件每一行代码都是组员一个一个字符敲进去的,而所有组员的工作合起来才是一个完整的软件,每个组员的想法都千变万化,所有组员必须要达到高度协调一致,才能将完整的软件做成功,这种协调一致,只能通过沟通来解决。所以面试时一般对能够清晰的描述所做的项目,面试回答口齿清晰声音洪亮,看上去性格开朗爱笑的人印象比较好。
第四:自我认知,什么是自我认知,这个很虚,我觉得至少要达到一种情况,我知道我是谁,我会什么,我要做什么,我能够做什么。所以我在面试开始时会问你最近的项目,项目组成员组成结构,你在项目组中是什么角色;面试结束我会问你觉得你能够达到什么水平,初级中级还是高级,如果是中级,中级100分,你的水平在中级的多少分。
第三节
社招和校招有一个很大不同点,校招的应试者都是读了4年大学,用人单位只需要简单的根据学校的排名,将应试者分为三六九等就OK了,因为高考已经为做好了选择,参加过高考的人都知道,高考简单的两天考试,考的是学生12年的坚持,能够在高考中胜出的人相对来说是更加具有顽强拼搏,持续抗压能力的人。
而社招的应试者这不一样,短则只有一两年的工作经验,长则有十数年甚至数十年的工作经验,这时候不能简单的一以概之了。曾听过这样一句话,如果你毕业十年还在用你大学的光环提升自己的身份,你们说明你这十年奋斗的并不好。所以社招我更看重这个人参与工作后做了哪些事情,学到哪些东西。
对于社招的应试者我们一般是按着工作年限分为四个档,3年以下,3到5年应试者,5到8年,8年以上。
第一:对于3年以下的应试者,我会认为他的基础理论比较扎实,学校里面学的东西还没有全部还给老师。我一般都会从最基础的问题问起,从操作系统原理到数据结构算法,从Java关键字作用,到Java网络编程,基本也都是面试宝典之类的知识。一个3年以下的应试者,没有多大的机会自己独当一面做过很大的项目,不会有太多成熟的工作经验,一般也都是在老员工的带领下做些事情,如果他连这些面试宝典里面的东西都不会,那么我会认为他的基础不扎实,自学能力不足,技术是不过关的。
第二:对于3到5年的应试者,会有一个很普遍的现象,工作经验比较丰富了,有些可能在一些重要的岗位上独当一面了。但是可能是过于看重生产实践忙于工作,疏忽了技术基础的沉淀,大都在基础技术方面一知半解。基本都表现为,这个东西我会用,我知道有哪些坑,我知道遇到问题怎么解决,但是不了解原理,不知道为什么。对于这一个阶段的应试者,我一般都会从应试者的角度出发问问题,你做过哪些东西,最近在做哪些东西,你遇到过哪些问题,如何解决。问这样的开放性的问题,然后在结合应试者自己的经验陈诉中就一些问题深入挖掘,考核应试者是否真的深度参与了曾经做过的项目,或者应试者依然在别人的带领下浮于表面的复制粘贴。然后在结合自己项目中遇到的困难,问应试者他该如何解决,也许他经验丰富的直接给出解决方案,也许他会一点点剖析问题,我会跟着他的思路给他提供自己的信息,这样可以考核应试者的遇到问题分析问题的能力,最怕一类面试者,遇到自己没见过的问题,两眼一抹黑说不知道。
第三:对于5到8年的应试者,我直接会给他定义为专家或者准专家,我们也都知道一万小时定律,在普通情况下8年成专家。如果是一个求上进的软件工程师,到这个工作年限,必须觉有独挡一面的能力了,不应该再简单的面向百度的编程了,应该有足够的耐心坐下来好好的就自己的工作面读读经典书籍,将自己的知识点铺开成面,完善自己的技术栈。工作不在仅仅是填坑,要细化自己的知识体系,知其然知其所以然。所以对于这个阶段的应试者,我们不仅仅要考核它们的工作经验,还要考核他们的基础技术能力,考核它们的知识体系,考核它们对知识的理解深度。
比如说事务,对于3年以下的应试者,要知道什么是事务,事务有哪些特性;对于3到5年的应试者,要知道如何使用事务,知道事务隔离级别对系统设计的影响范围,知道事务传播机制在代码结构上的影响范围;对于5到8年的应试者,要知道数据库的锁机制,知道事务隔离级别在不同数据库中的设计原理,知道事务导致的死锁原理及应对方案。
第四:对于8年以上的应试者,不能再简单的以一个软件工程师的标准来考核了,该阶段的应试者应该觉有一定的团队领导能力,能够将自己的过往经验,以合适的方式传输给项目组成员,指导项目组在项目资源范围内完成既定目标。应该具备足够的业务沉淀,具有一定的业务建模能力,和软件架构能力,将业务需求转换为软件架构。一个工作十年的人,应该具有面试他人的能力,也必须应该了解面试时自己应该如何凸显自己的能力。对于这一类应试者,应该做很少的提问,以应试者为主场,如果他自己控制不了面试的节奏,说明他团队控制能力不行。如果他不知道讲什么说明他肚里没货,没有足够的项目沉淀。如果他夸夸奇谈没有重点,说明他自我认知不够。如果用创业者的角度来讲,招一个十年工作经验的人就是在招一个合伙人,去留成本都很高。
第四节
曾和一个部门的小伙伴一起参与面试,在面试中小伙伴经常提问题时会不时笑一下,如果应试者回答问题不理想,他有时也会面向我笑一下,示意回答的不是他想要的答案,当时给我的感觉并不太好,后来思考过,作为一个面试人员,我们是不是只要招来我们想要的人员就可以了?我想答案就那么简单。
如何做一次好的面试,我要要包括以下内容:
第一:衣着合体,在我们公司,大家调侃说程序员还要穿正装的公司,面试官衣着方面应该是没问题的。
第二:面试场所,因为公司经常大批的招人,结果应试人员来了,找个会议室超难,经常都是在沙发区找个坐的地方就差不多了,这方面不可强求。
第三:就是面试人员的态度,我觉得作为一个技术面试官,是公司面向应试者的门面,还是要严肃对待,该端着还是要能够端起来,当然也不能做作,让应试者觉得你屌屌的样子也不好。以认真的态度,对应试者合适的引导,将应试者带到面试的地方,请就做。然后自我介绍,然后提问,然后请应试者提问,主流的环节体现出职业化。提问环节,避免眼神对视给应试者造成压力,偶尔眼神对视时报以浅浅的微笑。如果应试者遇到问题卡壳时不要纠结,换个问题,不与应试者争论。