你好,我是软件工程师熊燚,网上大家都叫我四火,很高兴在这个专栏和你见面。

我曾经是华为、Amazon 的软件工程师,现在我在 Oracle 工作,我之前在极客时间写过一个技术专栏《全栈工程师修炼指南》,自己也有一个很长时间的独立技术博客《四火的唠叨》。

工作的这十多年来,我以工程师的身份经历过不少团队,面试过许多软件工程师候选人,指导过一些经验尚浅的面试官,也目睹过许许多多不同风格的面试,更了解过这些面试的候选人在入职后截然不同的职业发展轨迹。

现在我在云计算的某个团队工作,除了是一个几十人团队的 Team Lead,也担任公司招聘环节的 Bartender 角色。过去这一年多来,我面试了将近 100 位候选人,主导或参与了他们每个人的面试结果决策会(debrief)。也就是说,平均下来基本上每周我都会参与面试,而他们中的大部分人都是软件工程师。

面试这件事听起来似乎挺简单,做起来却非常困难。从我的长期经验来看,这里存在的问题和误区实在太多了,不妨听听来自面试官的真实“吐槽”吧:

  1. “是不是拿算法题让候选人做就好了?可如果他做过这个题目怎么办?”
  2. “候选人都是工作好多年的老司机了,怎么有面试官问那种简单粗暴的算法题!”
  3. “‘面试造火箭,工作拧螺丝。’工作内容普普通通,为什么面试要问那么难的问题!”
  4. “新入职的同事,上来就给我们的系统埋雷,还不服批评,这种性格脾气面试是怎么过的?”
  5. “招怎样的人好,是能立马干活的,还是有潜力的?有潜力的培养起来跑掉了怎么办?”

有没有觉得“似曾相识”或者“一见如故”呢?

这样的问题还有很多,我就不一一例举了,但有一点,我想你是非常清楚的,面试就是打造团队的第一道门槛,它可能短暂、直接地影响你一个项目的进度,也可能长期、潜在地左右你整个团队的战斗力。

既然如此,那我们不妨重新来系统地审视一下,负责技术面试这件事儿,对你、对团队来说,到底意味着什么?

晋升第一课,招募人才

首先,去负责技术面试,帮助公司和团队招募人才,就是一个职业上升通道的必攻克项。

这里你不妨想想,你们公司的面试官都是什么样的人?技术骨干,管理骨干,具备软件工程师背景?对于绝大多数团队来说,的确是这样的,因为经验等综合能力可以帮助他们做出中肯评价与合理评估。

所以,当你开始关注这些,或者已经为公司和团队把关人才的时候,恭喜你,你的视野、看问题的方式、沟通和筹划事情的技巧,还有做出合理判断的能力,已经有了质的提升,或者说得到了团队的认可。这对你的职业生涯来说,无疑是一个助推器

但我也要实话实说,做好这点,挑战可不小!在后面的课程中,你将会深刻体会到这点,但我还是非常鼓励在阅读学习的同时,不断去尝试。

因为,**面试还是一个预期和限制都很明确的快速学习机会,并且,是一个双向的学习机会。**预期,指的是我们针对软件工程师这个特定岗位对于候选人的期待;而限制,则明确了双方需要在每轮短短几十分钟的时间内进行交流与合作,完成话题的讨论,或是问题的解决。面试官可以从中得到不同的观点,获知各异的思路,拓宽自己的视野。而这些东西,课本上没有,老师不会教给你,项目组内也学不到,这就更显得颇为珍贵了。

所以,在专栏中,我会讲到一些经典的面试问题,其中一些我已经在面试中问过不下几十次了。比较有意思的是,有的问题我见过 10 种以上的解题思路,其中超过一半,都是我从候选人身上学来的。

**从这点出发,你还能深度体验换位思考,让自己和市场保持同步。**显然,你不会永远是面试官,没有人会。当你准备往更高处发展,去接受新的挑战时,这之前的每一天就都成了准备。

流畅地表现和表达自己,具备出色的沟通能力,都会是你当下以及未来的加分项,这也恰恰体现了面试官这个角色为技术人职业发展所带来的价值。

除了个人,在团队里,这对于你个人影响力的打造也是很有帮助的。这就不局限于工作中做一个项目、解一个 bug 了,还有同事间相处、合作、互助等等。无疑,参与面试是一个加深了解的好机会。

正所谓“世事洞明皆学问,人情练达即文章”,小小的面试,隐藏了大大的道理。在通过反复实践来磨练以后,能够承担面试官重任的人,最终一定会同时具备优秀的技术功底与良好的沟通技巧,以及相应的理性思维与决策能力。

打造优秀团队,严把人才关

当你了解了面试对于个人发展的意义之后,我想从公司和团队层面再给你一点建议。在其位、谋其政,高度更高,视野要更广。

你有没有听过这样一句话,“招聘是研发团队日常活动的第一要务”。Facebook 是有比较多的类似观点在宣扬,而在我刚加入 Amazon 的第一天,我的老板也和我讲过类似的话。

可能你觉得夸张了,人不对换了就是了,工作还得继续,给招聘戴上高帽未免危言耸听。

先说说工作这么多年后我对这句话的体会,对于招聘的重要性,我是认同的。举个最简单的例子,就说软件工程吧,如果开发环节马马虎虎,那么测试环节就需要加倍投入去覆盖核心功能与非功能点;如果测试草草了事,那么运维就要开足马力修 bug、打补丁。总之,从需求、设计、开发、测试到运维,你总归要有一个环节把质量严格地把控好,否则就要让某个下游环节买单,下游环节不买单,那就要留给用户买单了。

同理,研发团队不同岗位之间的协作也是如此。如果软件工程师们具备优秀的沟通与合作技巧,脾气秉性能够兼容,那么团队经理的负担就会轻很多;如果他们具备一定的项目和任务管理能力,那么 PM 的介入就不用那么激进;如果他们能够具备优良的编程习惯,严格把控好质量,那么许多产品我们并不需要专职的测试团队……

你看,从研发团队的核心来看这件事,面试严把关,可以省掉不少管理工程师的成本,以及给其它环节买单的成本,甚至是“少招人”;反之,一个“不合适”的工程师加入,不但研发团队无法高效运转,还要其它环节和角色陪跑,此时付出的代价就太大了。

于公司、于团队、于面试官来说,管理成本和团队建设都是逃不开的两个关键词。而面试,就是在有限的时间内,评估候选人是否“合适”的最佳方式。

候选人成长空间

最后,还有一点我觉得值得讨论一下。如果你此时还只是一位候选人,你会关心面试官的目的和套路吗?

金融市场上,有投资和投机两种行为,前者更看重长期的回报,而后者更关注短期的收益。我认为,了解面试行为本身,恰恰是二者都注重的表现。在面试这个过程中,长期看,你可以了解到哪些知识和能力是值得长期投入的;短期看,你可以了解对方的初衷和心态是怎样的。

面试通过了,皆大欢喜,我们还可以从中评估和强化自己的认识;面试没通过,你也不至于说挂得不明不白。

但更重要的一点是,不要觉得你只有候选人的身份,其实,**候选人也是面试官。**因为面试是双向的,面试官在面试你的时候,你也在面试他。如果对方考察候选人的方式折射出欠缺思考的视角、糟糕的判断,甚至对候选人缺乏尊重,那么十有八九,这样的公司和团队,你也是忌惮加入的,对吗?

你的收获

到这,我再来说说你能从这个专栏中具体学到什么吧。

从范围上讲,**这个专栏不是讲完整招聘的,而是专注于技术面试本身,并且,更多例子和技巧是针对软件工程师这个职位的。**当然,我们也会讨论通用型的招聘技巧,和面试前后的林林总总。

具体分为以下三部分:

面试前:我将介绍为什么要对软件工程师进行技术面试,应当覆盖哪些面试角度,以及我们该怎样去设计面试题。

面试中:专栏的重中之重,我将结合实例探讨怎样主导技术面试。包括怎样把控流程,怎样进行算法和数据结构的考察,系统设计的考察,面向对象和测试能力的考察,基础知识的考察,以及行为面试的操作方法等等。

面试后:我将针对候选人的评估讨论会如何开展来介绍。包括怎样收集事实、提炼数据,怎样引导争辩、达成共识,以及最终怎样给出客观中肯的评估。

从交付形式上看,你会一直处于面试场景中,熟悉的问题会带你步步深入,我希望能通过先破典型、后立观点的方式,打破你对于面试的固有认知,收获不一样的学习体验。另外,你在课程中还会看到很多的技能卡片和总结性脑图,来帮助你记忆与回顾。

再者,我想说,市面上系统、完整讲解如何主导软件工程师技术面试的材料非常少,这个专栏融汇了我 10 多年来在国内外大厂的面试经验与思考总结,相信能带给你富有启发性的设计思路,以及实战检验过的全新观点。对于面试来说,“问题是多变的,套路是永恒的”,如果你能消化和吸收隐藏在它背后的原则和思路,这趟旅程定不虚此行。

最后,我深知技术面试和一般的技术内容相比,观点繁杂、方法多样,落到个体实践更是差异巨大,但就像我们期待一场相谈甚欢的面试一样,这个专栏除了交付体系化的方法心得,我也希望给你提供一个畅所欲言的窗口,一把打开更多技术面试相关话题的钥匙。

因此,对于更多问题,欢迎你在评论区留言,我将尽力一一回复。此外,我还特别策划了若干期专题答疑,尽可能把你的疑惑都覆盖到。

我是四火,我们下节课见。