在为 58 赶集集团工作的最后一年里,我面试了近百位求职者。今天我想粗略地梳理总结一下,我关于技术面试所沉淀下来的思考。
一般来说,一线成熟企业技术岗位的典型招聘流程分为以下几个步骤:
- 初筛:一般由直接领导的技术经理或 HR 进行,重点考察教育和工作经历。
- 一面:一般由可能直接与之共事的工程师进行,重点考察基础和工作能力。
- 二面:一般由直接领导的技术经理进行,重点考察技术深度、广度和发展潜力。
- HR 面:由人力资源部门进行,重点考察入职时间、职业规划、薪资要求等。
当然,各个公司情况是不同的,有的公司可能会在面试前设置笔试或电话面试,有的公司会有两轮以上的技术面,有的公司会有由兄弟部门再把关的交叉面,有的创业公司甚至可能只有 CEO 或 CTO 亲自出马的一轮面试……
给谁面试机会?
首先要明白的是,发起招聘的并不是一家公司,而是一个具体部门的技术经理。
技术岗的简历来源主要有两个渠道:行业垂直招聘网站 、HR 或员工内推,在特别紧急的情况下,还会启用猎头。
招聘部门总是更欢迎那些有过类似业务开发经验并使用相同技术栈的员工,这样沟通成本会低很多。
在一线成熟企业(比如某度和鹅厂)呆过一年以上的求职者也更有机会获得面试机会,这是因为信任背书的力量:能通过一线成熟企业的面试,并顺利度过实习期的人,不会差到哪里去。
另外根据招聘部门情况不同,有时需要能攻坚能带团队的资深工程师,有时需要进来就能干活的一线工程师,有时需要的是基础好可培养的新人。
当时我所带领的团队由于部门整合刚刚进行大换血,严重缺少人手,所以需要的是进来就能干活的人。
在刚开始招聘时,我认为所有人应该都拥有平等的机会,自己也缺乏从简历中筛选的经验,于是采用海面的策略,只要不是应届毕业生的求职者只要投简历就约面。
在面试了数周后发现,面试的通过率实在太低,于是不断总结思考,调整初筛策略,后期我所使用的策略是这样的:
- 优先考虑 2-3 年工作经验的人,因为工作才一年就跳槽的人大多不够成熟,而工作多年还没升管理岗又换工作的人大多古板平庸,技术栈僵硬,还自恃甚高。
- 不考虑从编程培训班毕业的人,他们中的大多数人基础不扎实,且缺乏自主学习能力。
- 不考虑一年内换过多次工作的人,因为这说明他浮躁且缺乏思考能力,经常做出不靠谱的决策。
- 不考虑在简历中多次提到“精通”字眼的人,因为这说明他不仅不精通,而且并不明白什么是精通。
- 不考虑在简历中出现多处明显拼写错误和错别字的人 ,因为连简历这么重要的文件都不知道 review 的人,完全没有责任心可言。
以上内容可能会让部分朋友觉得不适,所以我需要特别说明一下:我并不是歧视工作经验少或者从编程培训班毕业的人。
近年来,大部分一线公司在招聘时对学历的要求渐渐都从大专升级到了本科,但这并不是在歧视大专生,其逻辑是一样的。
一年工作经验、从编程培训班毕业以及大专生群体中当然不乏出色的人才(我自己就是大专),但占比实在太低。
在做人员储备的时候,标准可以适度放宽;但在闹人荒的时候,有限的面试资源只能分配给合格概率更高的群体。
怎么安排面试?
程序员的面试一轮通常是一个小时,由于双方的信息不对称,对求职者的考察往往不够全面。
有些一面表现非常出色的人,二面就原形毕露;也有一面表现平平,二面却有惊人之举的。
在有限的时间里,必须尽量获取更多的信息,才能对求职者的能力作出更准确的判断。
我会尽量避免在早上安排面试:
- 一方面,面试双方都可能因为高峰期堵车而导致迟到。
- 另一方面,早上可能会有一堆积累的事务要处理,PM 讨论一下需求,QA 提两个 Bug,回复完邮件,精力就已经消耗得差不多了,马上又临近饭点,饥肠辘辘下很难集中注意力进行面试。
因此,我一般会把面试安排在自己精力最充沛的时间,也就是下午 3 点 - 5 点之间,在午休完处理完所有紧急事务之后。这个时间段也躲开了上下班高峰期,不太可能因为交通原因而迟到。
确定面试安排后,我会打电话通知求职者面试时间,并通过邮件发送面试地点、交通路线和注意事项,并要求对方收到后进行确认回复。在面试前 1 个小时,我还会再次打电话核实对方的安排。
有的求职者接受了一个 Offer 之后,就没把其他公司的面试放在心上,然而这样会浪费面试官的时间和精力,留下很差的印象。
我甚至还遇到过个别奇葩求职者,完全忘掉了已经安排好的面试,居然还能厚着脸皮提出改时间再约……
面试时最应该考察什么?
面试经验不丰富的求职者,往往一开始会表现得比较紧张。所以在走向面试地点的路上,我通常都会闲聊几句前公司伙食如何之类的话,目的是拉近距离感,缓和一下紧张的情绪。
在面试正式开始前,我还会先让求职者进行简短的自我介绍,让他尽快适应这个陌生的环境,并调整到让双方都觉得舒服的声线。
而我则会认真地倾听并不时点头反馈,让求职者感受到我们更像是在进行一场对话,而不是考试。
一场面试,不外乎是从能力和潜力两个方面来考察求职者。
能力
主要考察求职者掌握了多少知识与技能,以及拥有多少实战经验。事实上,这些在求职者的简历里都已经写得很清楚了,只多不少。
能来参加面试的求职者,其简历上所描述的能力必然已经满足了招聘者设立的基本条件,没有人会愿意在不够格的简历上浪费时间。
所以面试官的工作主要是验证简历上面描述的真实性和可靠性。只要求职者在面试中的表现能充分印证简历上的描述,最好再能表现出一点点超出预期的地方,就能让招聘者满意。
因此求职者最忌讳的,就是在简历上对自己的经历和能力进行不实的描述。比如明明只分担了某系统中的一个模块,非写成整个系统是自己主导开发的;明明只是写过一个 Demo,就说自己精通 XXX……
由于面试的时间短暂,所以面试官只能对求职者的经历和能力进行抽样考察。
我在考察求职者的工作经验时,一般会让他先挑一个最有把握、最能展示自己实力的项目,然后让他讲解这个项目,并追问一些技术细节和实现方式。
如果这个过程中发现他对这个项目其实并不了解,说不清楚核心逻辑是怎么回事,那其他的就不用再问了。
另外,还有一个难以从简历判断,只有当面才能考察的重要能力:沟通能力。
沟通能力强的人很容易理解他人的意图,也能清晰地表达自己的想法,和他们合作会让人感觉很放心。
而沟通能力差的人则是团队的噩梦,你总得在他们身上多操份心,否则他们可能到了上线前最后一天才会告诉你任务完不成,你懂得。
潜力
主要考察求职者的品质、习惯和态度:
- 这个人是否诚实?是否能客观地认识自己?会不会不懂装懂?
- 这个人是否热爱学习?喜不喜欢读书?读完有没有行动?
- 这个人是否愿意去琢磨事物背后的原理?有没有刨根问底的精神?
- 这个人是否有总结和反思的习惯?曾经犯过哪些错误?
- 这个人是否有优化和控制风险的意识?是否有追求完美的精神?
- ……
以上任何一个话题展开来,都可以写一篇长文,这里限于篇幅不便一一细讲,等我有机会再撰文和大家分享。
比如说, 我最讨厌的就是不懂装懂的人,这种人说话完全不负责任,想到什么张口就来,还底气十足。
和对事实真相的探索比起来,更看重自己在别人心中的形象,演着演着连自己都相信自己真的已经懂了。
这样的人真的很可怕,因为关键时刻如果你不懂,他就把你给蒙了,到时候怎么死的都不知道。
再比如说,我坚信学习力才是一名程序员的核心竞争力,如果有两位能力相当的应聘者,那我一定会选择更会学习、更会分享的那一位。
因为能力只说明了他现在处于什么位置,是一个衡量积累量的绝对值;而学习力决定了他今后能走多远,相当于速度和加速度。
能力可以通过时间来不断积累,而学习力想要发生蜕变的难度是不可想象的。
什么才是最有效的面试题?
大公司很喜欢用算法题来面试,然而一来算法在工作中的实用性并不高,二来很容易被求职者提前刷题应试,所以一直被人诟病。
而直接问一些知识类的问题,感觉又很 low,容易被求职者 diss。那到底什么面试题才能有效地考察求职者的能力与知识面呢?
我特别喜欢下面这个从前任领导王磊那里得来的面试题:
- 假设你所负责的一个 api 接口正常的请求响应时间在 50ms 以内,某一天突然监控报警,发现很多线上请求的响应时间都超过了 500ms,该如何定位并解决问题?
要迅速定位一个未知的问题出在哪里,这需要扎实的经验基础和清晰的思维能力,以及问题分解和隔离调试的意识。
通过这个问题,能够全面考察求职者的知识面及分析和解决问题的能力:
- 是否清楚一次 http 请求的全过程?
- 如何确定问题的影响面,并初步判断问题出在哪些环节?
- 如何不断缩小问题范围,并最终定位问题?
- 如何在不影响线上服务的情况下进行调试?
- 如何在分布式部署的环境下进行调试?
- 如何在问题正式解决前,先做一点事情来快速止损、优化用户体验?
- 解决问题时,应该先做什么,后做什么?
- 解决方案会不会产生不良副作用?是否可控?
- ……
在招聘的后期简历大增,一一面试根本安排不过来,只能先进行 15 分钟的电话面试。
我就只问这一个问题,然后追问下去,很快就能判断出这个人到底是行还是不行。
只要节奏明快,层层递进追问,也很容易辨别出求职者是真有经验还是提前准备过。能通过电面的,当面面试的结果也都是很满意的。
大家可能都玩过通过问“是与不是”来猜词的游戏,有一种比较无耻的合理策略是:记住对方问过的所有问题,在符合条件的所有答案集合中不断地切换答案。其实这个思路也是完全可以用在面试中的。
一开始,我会先假设一个导致问题发生的原因,比如网卡故障、DB 连接被打满、某个同步调用的服务异常……
如果求职者没有对整个流程的主要环节进行分析判断,那就算他凭直觉(或运气)找到了我预设的问题原因,我也会合理地切换答案,让他继续进行思考和探索,直到他表示“没办法了”为止。
大多数人只知道按自己曾操作过的模式,去解决自己曾解决过的问题。最典型的是一上来就去翻 SQL 慢查询,我说没有慢查询,他们就一筹莫展了。
要知道,现实工作中我们遇到的问题,大多都是以前没有经历过的新问题,如果只会靠百度找答案的话那就完蛋了。
而优秀的求职者知道如何通过设计针对性的测试,来迅速缩小问题的范围。他们会有条不紊地提出一系列问题,排除最有可能的原因:上线事故、遭受攻击、流量变化、服务异常……
这些都是多年处理问题的经验沉淀,可以说是处理问题的“缓存”。然而优秀者并不依赖缓存,当缓存没有命中时,优秀者也具备按索引查找的能力,必要时还可以启动全表扫描。
该不该提前结束面试?
不管面试进展如何,我每次都会用足一个小时,对此领导颇有微词,认为我在浪费时间,有些人聊上 15 分钟就可以打发走了。
而我觉得面试是双方共同选择的结果,双方的时间是等价的(实际上由于路途往返的原因,求职者时间成本会更高一些),所以我应该给求职者足够的时间和展示机会。
我总会把事情往好的方向考虑:
- 会不会我正好问到的是他不熟悉的领域?
- 他是不是有点紧张,没有发挥好?
- ……
退一万步讲,尽管这个人明显不能满足招聘的要求,但由于每天下午的日程安排都很紧凑,就算提前结束了面试,多出来的一点点碎片化时间也无法拿来做高产出的工作,只能被无谓地消耗掉。
与其这样,我更愿意在接下来的时间里,让他多积累一点面试经验,帮助他发现自己的问题出在哪里,给他一些可行性的建议,对他产生一些好的影响,让自己这一个小时变得更有价值一些。
哪怕就算是帮求职者做下职业规划,顺便给公司做下正面宣传也是好的。
没有达到预期的目的,并不一定就在浪费时间。一次理想的面试下来,无论结果是否通过,面试双方都应该得到了成长。
在面试过程中,求职者和我的知识体系发生直接碰撞,双方都有可能得到思路上的启发,并认识到自己在某个领域的认识上不够完整和严谨。
通过向求职者追问和解说,我不仅锻炼了自己的表达和总结能力,也巩固并强化了自己的知识体系。
不过,我回过头来也需要反思:
- 为什么这名求职者能够通过我的初筛?
- 我在哪些环节还可以改进,以避免类似的情况再次发生?
- ……
后话
面的人多了,我就不禁想在为数不多的通过面试者身上找到一些共同的特质,借此提升以后面试的效率和准确率。
结果发现,应聘者大致可以分为以下两类:
- 有的人想让自己变得更优秀。他们会把面试看作一次学习和成长的机会,当遇到不会的问题时坦诚自己不知道并谦虚求教。
他们在说“不知道、没用过、没听过”时,不会觉得不好意思。因为他们明白“全知全能”是绝无可能的,也是毫无意义的。
- 有的人只是想让自己看起来很优秀。他们会把面试当作一次表演,为了维护自己的形象,即便不懂也要装懂,演着演着连自己都相信自己真的已经懂了。
当面试者指出他们的问题时,他们便进入防御战斗姿态,千方百计要证明自己是强者。
孰不知只有弱者,才会想用语言来证明自己很强。而真正的强者,只是默默地站在自己“做到”的结果旁边。
下面这张图引自刘传的「认知学习法」课程:
不同的思维模式,决定了人是持续成长还是固步自封。然而只要你能意识到自己的思维模式,就可以改变它。就像给大脑刷一个新版本的操作系统一样。你,是哪一种?
作者:张砷镓
简介:一名具有独立思考能力和代码洁癖,且兴趣爱好广泛的程序猿,曾任赶集黄页事业部技术经理,现从事编程教育工作。骨灰级游戏玩家,曾在魔方、扫雷、俄罗斯方块等领域取得国内第一,多次打破全国记录,扫雷网(saolei.net)创始人。