技术面试如何“试”

07/Nov/2021 · 1 minute read

毕业7年了,经历过多家不同公司的面试,这些公司的面试方式不尽相同,给我的喜恶程度不一;反过来,自己作为面试官,前后也为公司筛选物色了不少候选人,我希望我所认可的人能在后续的工作表现中证明我没看错人。我时不时会想:在技术面试中,以怎样的方式对候选人进行评估筛选,才足够高效精准?不妨先从自己所经历过的面试形式聊起吧。

我所经历过的几类面试风格

细想一路走来,我所经历过的面试风格大致分为几类:

  1. 全凭一张嘴,双方直接聊
  2. 家庭作业型
  3. 理论知识问答
  4. 算法能力考查

全凭一张嘴,双方直接聊

这种面试风格,存在于早期的互联网企业面试中,而据我了解,目前一些小公司也会采用这种方式。就我自己来说,15年我面试 4399 以及大疆的时候,均是采用的这种风格的面试。

面试双方就简历上的项目展开讨论,了解候选人在项目中的具体工作和成果,以及候选人在编程素养等方面的水平。这种面试方式简单快速,但是有效与否,很大程度上依赖候选人的表达能力以及面试官自身经验能力水平以及对人才的判断能力。

采用这种面试风格的公司,大抵是一些小型公司或者初创公司,因为这类公司一般相对难以吸引到拥有“优秀”背景的人才前来面试,除非事前双方都是知根知底的,于是公司必然会在人才招募上务实。如果本身吸引到的人才数量有限背景有限,公司自己还平添很多繁琐的面试环节或者提高通过门槛,最终可能一个人都招不到。所以,开门见山,直奔主题。

家庭作业型

这种面试形式,是在简历通过筛选后,面试官给候选人发送一份家庭作业一样的项目需求,描述一个极小型项目的设计要求,然后让候选人自己在业余时间完成。之后的技术面试则一方面结合这个小项目进行实现思路以及架构设计交流,另一方面则通过过往项目经验了解候选人的能力水平。我在 15 年面试 ThoughtWorks 以及 20 年面试 crypto.com 公司的时候,都体验过这种面试形式,也是我个人最为喜欢的形式。而根据朋友的分享,我了解到 AWS 中国也是采用的此类面试形式。

我之所以喜欢这种面试风格,主要是因为方式灵活以及代码更容易让技术面试双方建立共同语言。灵活性方面,它给我自己发挥的空间最大,比如我想向面试官展现我的开发习惯,比如单元测试和代码注释等,那我就会在这种作业型项目上用心完善单测和注释。其次我也会注意文档的编写和注释,特别是一份帮助面试官方便快速运行你的代码的 README 文档。这些,都不需要像其他面试一样临场发挥,我只需要思考如何准备得更好就行了。另一方面,代码是技术人之间的共同语言,这种方式拉近了我和面试官之间的距离。比如我在去年面试 crypto.com 的过程中,我在交完作业到开始正式面试中间的这段时间里,我和 crypto.com 的面试官在微信上就已经开始就代码问题进行了多次讨论。在这种非正式的交流过程中,我得以一种比较轻松自在的方式去表达我的思考,而面试官也在此过程中向我展示了他自身的技术水平,这种方式让我感觉就是在进行如常的技术交流而已,仿佛是在一个同事或者同行一起探讨而已。

尽管我自己喜欢这种面试风格,但是身边还是会有朋友或者同事并不认同这种方式,甚至觉得恶心。主要原因有两种,一是这种方式会更多地占用候选人的业余时间,二是这种方式可能会存在候选人作弊,由他人代为完成了作业。只不过我真觉得这两对我而言都不是问题。假如我需要追求一个未来3-5年适合我的公司,我觉得充分的准备以完整展现自己,是值得投入时间的。而第二个问题,我觉得配合面试流程中对作业中的实现细节以及架构思路等进行讨论,是可以快速判断这个代码是不是候选人自己独立完成的。

理论知识问答

这种就是大家常说的“八股文”了,就是面试官按照题库给出数据结构、数据库、计算机网络以及编程语言等等科目相关的基础知识问题,由候选人做出正确的回答。大家常吐槽的题目比如红黑树的原理、MySQL innoDB 存储引擎的索引设计、TCP 三次握手/四次挥手以及 Golang 语言的 goroutine 调度原理等等。而由于这种面试环节中的题目过于基础和客观,导致候选人不得不在面试之前花费大量的时间和精力进行复习,但是入职后在工作岗位上却由于没有实践机会后快速遗忘,留下了“面试造火箭,日常拧螺丝”的调侃。

至于采用这种面试风格的公司,皆是各类校招社招人才热捧的大公司,比如国内的 BAT,美团字节以及 Shopee 等等。这些公司所提供的薪资水平在业界出于中上甚至天花板水平,自然每年都能够吸引到大量优秀人才前往应聘。

我自己在去年面试腾讯和字节的经历中,一路摸爬滚打,每天起早摸黑复习基础知识,或者是根据面试过程中暴露的薄弱知识点进行强化复习,最终才终于通过这些公司的技术基础关。

尽管我并不喜欢这种方式,但是在 Shopee 公司担任面试官的时候,按照部门统一面试要求,我还是不得不机械地从题库中挑选各个知识点的题目,逐一向候选人提问。在一个半小时的时间里,我需要按序完成对候选人项目经验、编程语言基础、数据结构、计算机网络、数据库理论、操作系统原理、网络安全的理论知识考查,另外还包含一道中等难度的编程题,因为面试评估采用各环节得分累加的形式,我无法跳过其中某一部分。我仅有的发挥空间,大概就是面试开场的项目经验交流以及对候选人的回答决定是否追问了。

这种面试形式,更像是一种应试考核,尽管不够个性化,但是却仍然不失为一种筛选人才的方式。因为本身这类热门公司就能够吸引到超级多优秀人才,在简历筛选环节留下来的人选,绝大部分人基础都不会太差,基本素养也不至于太糟糕,而大公司在实现一种盈利机制的稳定之后,并不需要太多领军型人才,更多是需要一些踏实勤奋的人去保证这套机制的运作如常,甚至允许部分蛀虫的存在。在这种背景下,大公司的面试筛选机制便可以相对简单粗暴,公司只需要确保挑选出来的人在某个角度客观上比其他人突出即可。古代科举考试以及现代高考或者公务员考试制度,大致如此,虽说无法挖掘人的特长或者个性,但是确实公平。

算法能力考查

除开上面几种类型,我遇到的这种类型特点是面试绝不寒暄,也不多聊理论,简单自我介绍后,面试官直接给出算法题目,要求直接完成算法题实现。去年在 flexport 公司就是这种面试形式,当然,我没有通过。而众所周知,谷歌、微软、字节跳动、pony.ai 等公司都是比较重视算法能力的,如果候选人想要追求这类公司的岗位机会,算法能力太差是注定不行的。而今年在和一个海归的朋友聊的时候,他也聊到美企普遍重视算法能力,所以面试多是简单粗暴的多道算法题。这就让人忍不住又得提一下 Homebrew 作者 Max Howell 因为没有完成翻转二叉树的算法题而没有通过谷歌面试的故事。

尽管好的算法对于软件设计来说确实可以降本增效,但是对于大部分工程师来说,更多时候他们需要完成的是如何通过技术方案的组合来给出一个商业产品的解决方案。这也让我想起18年底的时候,一个刚入职微软半年左右的朋友,通过猎头找到我,希望跟我了解 Shopee 的工作情况,他正在考虑跳槽 Shopee。因为他觉得入职微软之后大失所望,尽管他准备微软的面试上花了很大力气,微软在他的想象里,一直是个高效专业的公司,但是实际他当时所在的团队所维护的代码,实在难以恭维,而且很多所学毫无用武之地。

小结

这里我们先汇总对比下几种面试风格:

形式 形式简述 举例公司 好处 不足
纯口头交流 全程口头沟通,交流技术想法等 早期的大疆、4399 简单快速,成本低 重度依赖候选人表达能力以及面试官慧眼识人能力
家庭作业型 面试前完成作业,面试中交流作业实现思路等 thoughtworks、crypto.com、AWS 给候选人更多发挥空间,能更真实考查候选人的编码习惯和规范等 加大业余时间成本,需要避免候选人作弊,难以通过作业考查复杂架构能力
理论知识问答 结构化面试,一问一答,客观问题作答 腾讯、字节跳动 简单粗暴、相对公平 相对死板,可能错过高潜人才
算法能力考查 直接完成算法编写,每轮面试以编写算法代码为主 微软、flexport 相对公平 相对死板,可能错过高潜人才

面试方式与体验

这里想插入说一声的是,面试是公司形象宣传的第一站,好的面试体验带给候选人好的印象,甚至可以成为口碑传播的基础,所以对于面试形式的选择,除了效率,还要考虑候选人的体验。就我自己而言,由于我非常喜欢家庭作业型的面试风格,我个人也感觉在这类面试中,我的表现是最好的。尽管由于客观原因,我都没有去成这些公司,但是我至今仍对这些公司存有好感,以至于在面试后的很长一段时间,我都会持续地向身边找工作的朋友安利这类公司。我的逻辑很简单:能给候选人发挥空间的公司,相信在公司内部,文化也会相对更开放。所以,如果你是20年底到现在找我推荐公司的朋友,很大概率都会听我提到 crypto.com。

技术面试何去何从?

纵观当下的技术面试评估方式,各有各的适用方式,即所谓存在即合理。小公司吸引力有限,不得不直奔主题,大公司总体供大于求,可以任性采用客观考题等等。但是合理之余,是否可以更高效?

不妨回归到面试本身的供需双方,作为候选人,我希望面试不要是一种内卷的形式,我需要展现的是我日常工作的真实能力水平以及我所积累的经验等等;而作为雇主,首先需要想明白到底自己需要的是怎样的人才,其次在保证候选人真实展现他的能力水平之后,我可以快速评估我的岗位需求与他的能力水平是否足够契合,如果不够,他是否有足够的潜力在不久的将来胜任这个工作?行业和世界持续演变,目前技术面试评估的形式不会是终点,但是它会往哪去呢?另外考虑到程序员行业人才的持续饱和以及国内的业务发展进入一个存量市场的角逐,还有最近屡屡传闻的大厂取消 996 甚至推行 1075 工作制的新闻,未来一定是一个各个企业精打细算过日子的世界,未来是一个追求高效的市场。那么所谓高效意味着什么?

理想的“高效”

候选人一方的高效,是不需要在面试之前额外花费大量的时间和精力去刻意学习一些与日常工作关系不大的东西,而是能够有一种方式支持候选人将日常工作中的积累转换为一种看得见的真实的可考查的形式。或许我们可以对候选人在全网声誉(博客、开源代码等)进行一种量化评估,也可能给候选人提供一个精准的个性化问题,让候选人可以在面试过程中随机应变运用自身积累对问题求解实现。

在雇主一方的高效,是希望尽可能还原真实的候选人的形象,而不是一个临时抱佛脚所修饰出来的形象,以便客观地将候选人与自身业务所需人才的特征进行契合度评估,以求通过面试的人才能够胜任工作并且和团队一起走得更远。更长远看,雇主肯定希望招募到出活更好更快的人才,称手高效的技术评估手段必然是关键一环。最理想的面试,自然是完整还原工作场景,让候选人代入到其中。比如团队向候选人直接呈现自己所曾经或者现在面对的问题或者挑战,进而观察候选人在问题或者挑战面前所采取的解决问题的思路和所做的尝试等等。但是碍于很多干扰因素,比如技术选型、商业机密性等等,我们实际上还是需要屏蔽掉很多无关信息,直击要害,那么,我们必然要对每个问题进行抽象,再由候选人尝试做出解答。

设想这样的未来:候选人没必要刻意刷题,也没得刷,随时都可以在面试中淋漓尽致地展现真实的自己,将更多的业余时间留给真正需要自我提升的地方;而企业可以有更高效的方式筛选候选人,面试官不再是一个没有感情的提问机器。这个未来所需要的解决方案,我也还没有答案,也没有在市面上找到答案,但是或许,会是下一个机会。

而最后,这真的是人性深处的需要吗?要是,不管工具多完美,人最终的归宿是想着办法卷起来呢?