技术强者不一定对公司加分,我该怎幺找到最适合的工程师?

  • 编辑时间: 2020-07-11
  • 浏览量: 839
  • 作者:
技术强者不一定对公司加分,我该怎幺找到最适合的工程师?

工程师面试一直是社群乐于讨论的热门话题。我自己从 06 年实习以来,先后经历了 4 家软体公司,全部是外商,其中有世界 500 强的通讯公司,有从事期权期货交易的欧洲中等规模的金融公司,也有为大型汽车製造商开发 Android 智慧汽车的新兴公司。跨入资讯产业以来,我在求职过程中经历过多次面试,近两年也有过多次面试别人的经验。我觉得现在差不多是我对这个问题发表自己看法的时候,这篇文章是我站在面试官角度对于工程师面试问题的一个阶段性反思和经验总结。

目标

相信和不少朋友一样,有了几年工作经验成为 Senior 后就开始了面试别人的经历。我在最初这个阶段只是按照自己的想像把「找到基础好的工程师」,「找到演算法能力优秀的工程师」,「找到有 Android 开发经验的工程师」等作为面试的目标。

但是,实际的经历告诉我,尤其是以「基础好」,「演算法好」这些目标招到的人最终效果并不好。比如,有的应徵者基

础知识和演算法掌握情况不错,process、thread、记忆体等概念清晰,基本的 Hash,二元树,快速排序等数据结构和演算法也比较熟悉,但是进公司后在实际工作中表现得很糟糕。后来,我才发现原来是我的面试目标出了问题,我原先的面试方法更像是大学的演算法或操作系统期末考试,按照这种方法让许多并不合适的人通过了面试,同时也可能错过了许多合适的人。

后来,我的反思是,从公司的角度讲,面试的根本目的是找到「能够做好工作」的人,而「高学历」,「演算法好」,「基础好」,「有经验」这些都是表象而不是根本,它们并不能直接和「做好工作」划上等号。

方法

目标明确了,但接下来的问题是假设应徵者是一个黑洞,「工作好」不是直接可观测变量,你所能直接观测的变量是基础、演算法、经验、学历、性格、谈吐、年龄等等。所以,实际上,你只能从「基础好」,「学历好」等可以直接观测的量去推测「工作好」的机率,这就是一个在「X 好」条件下「工作好」的条件机率问题:P。

根据这个模型,面试所应该考察哪些方面就很明显了,那就是选择那种最具有区分性的方面来考察。比如,考察面试者的体型特徵没有太大意义,因为 P,P,P,P 的机率都差不多;所以,体型特徵不具有区分性,这不是面试所应该关注的内容。

面试官应当结合职位的要求明确哪些因素具有比较好的区分性。比如,如果要找一名技术门槛比较高的 3D 游戏引擎开发工程师,应徵者 A 具有 3D 游戏引擎开发的经验,但是在基础知识和演算法面试方面表现一般;应徵者 B 相反,基础知识和演算法面试表现很好,但没有游戏开发经验,而你只能选择其一。你选谁呢?

其实,这就是两个条件机率问题 P 和 P。这个问题就留给面试官来判断了,就我个人而言,对于技术门槛较高需要技术积累的职位,经验更加说明问题,因此,我更倾向于应徵者 A。

下面,我再结合自己的经验谈谈对面试中常见方面的看法。

演算法

演算法是 Google 和微软等大公司面试所重点考察的内容。我个人很喜欢演算法,曾经参加 ACM/ICPC 拿过北京赛区的 13 名。但是,就个人经验来看,我所接触过的绝大多数开发职位而言,演算法都不适合作为考察面试者优劣的主要因素。对于普通的非演算法性开发职位,考察应徵者的演算法就相当于考察他打乒乓球好不好一样,与目标「工作好」的相关性太低。就我个人的经验来看,差不多 P=50%,也就是演算法面试没有太大的区分性。

甚至,还有一种很不好的情况特别多地出现在演算法好的面试者身上,我称之为「只磨刀,不砍柴」。什幺意思呢?有类人只对什幺 A*演算法,异步编码,JVM 类加载机制这种纯技术问题感兴趣,对实现使用者需求毫无兴趣。这类人看起来有一定的技术能力,但是对公司来讲贡献十分有限,甚至不如技术一般但认真负责的人。所以,一旦遇到面试者演算法好,我就特别留意考察会不会是这种「只磨刀,不砍柴」的人。

另外,虽然我个人不了解 Google 和微软,但我对于其特别重视考察演算法能力的面试策略是持怀疑态度的。即使在这样的世界级大公司,演算法虽然重要,但可以想像在专案实施过程所遇到的各种各样问题中,演算法问题绝大多数时候不会是主要瓶颈,没有到那种需要每个人都是演算法高手的情况。实际上,绝大多数专案真正难点并不是一两个演算法瓶颈,甚至也不是单点的技术瓶颈,而是系统性的组织、协调、设计、开发问题,有大量的看起来不是那幺有技术含量的苦工,也有许多问题是由于资讯不足,并不是技术能力强就能克服这些困难。一个团队最好优劣互补,有人演算法强,有人业务分析能力强,有人擅长后端服务,有人擅长前端界面,有人聪明,有人踏实,这是最好的。如果全部按照「演算法好」的单一标準选材,必定会把许多优秀的人才拒之门外。

补充:在更多地了解了 Google 和 Facebook 等一流公司的面试细节之后,我对这个问题的认识有了一定的改变,实际上这些公司在面试过程中并不完全强调技巧性很强的演算法,而是更加注重编码能力,只是在进行编码测试的过程中往往是通过一些简单演算法题来进行的。我对于这种面试方法越来越欣赏,并且也把这作为了我们公司面试过程中的重点环节,因为编码能力的测试是十分必要的,它有着知识性问题无法取代的作用,如果一个应徵者连「判断一个字符串是否是另一个字符串的子串」这样的题目都无法正确并快速地完成,那幺基本上可以直接排除了。我这里所强调的是不必检验高难度的演算法问题,并非不重视编码能力测试,请读者不要误解。

基础

基础面试是指考察诸如指针使用、process、thread 概念等基础知识的面试,十分类似于大学期末考试题。我曾经以为基础面试十分重要,但是现在不这幺看了。在工作

中基础的确是重要的,但是在面试过程中,它必须具有区分性才有意义,也就是说 P 的机率要高,那幺考察指针使用,进程线程区别这样的基础题目才有它的意义。我的实际经验是,基础面试并不具有很好的区分性,和演算法一样, 差不多 P = 50%。同时,基础面试是最容易準备的,中国人有长期的应试教育经验,要準备几个把玩指针题目太容易了。

我曾经遇到过这样的面试者,他的 C 语言基础和编译、连结等原理掌握得非常好,给我留下了深刻的印象,我给的面试结论是:领域面不宽,只会 C 语言,但基础很扎实,建议录用。后来的事情证明了那个结论的前半部分是对的,但是」建议录用「错了。他在实际工作中表现得一塌糊涂,不理解需求,不理解整体架构;同时,上班时间不是花在专案上,而是花在阅读诸如《程序员的自我修养》之类的书籍上。最后,这位同事由于长期「没成果」离开了公司。

基础不是不重要,而是「基础好」不足以说明面试者能做好工作,因为基础是属于局部性知识,而实际工作需要综合性能力,二者有天壤之别。 C 语言、作业系统能考高分,但是不会写程序的人在大学我们还见得少吗?软体开发就像盖房子,综合能力是设计和搭骨架,基础知识是砖墙。张小龙原先 Foxmail 是 Delphi 开发的,他它不懂 C#,你如果要招募一个开发.NET Email 客户端的人,你考察他对 CLR 掌握得好不好有意义吗?让张小龙来开发一个 C#版的 Foxmail 真的会有困难吗?你招一个精通 C#但没有 Email 客户端开发经验的人来真的比张小龙可靠吗?

我说基础知识不重要,和古人说的「不积洼步无以至千里」是不是矛盾呢?不矛盾!「洼步」与「千里」是一种可累加关係,但再多的「基础知识」都累加不成「综合能力」。学习软体开发要像持续集成一样,一开始就是一个完整的系统,虽然规模不大,问题很多,但它麻雀虽小五脏俱全,从小系统到大系统,从简单系统到複杂系统逐步演化。

所以,基础好本身不足以说明太多的问题,必须进一步考察综合能力。对于基础面试表现不好的面试者,如果时间允许也要进一步考察,有的面试者其实是有能力的,只是没有进行充分的準备。最理想的状态当然是基础和综合能力俱佳,若不能兼顾,应当综合能力优先。

经验

这里所说的经验不是通过工作了多少年来衡量的,而主要是指应徵者的经历,比如,是否完整地写出过一个软体,或作为主要开发者完成过一个专案。经验的重要性在于它能说明一个人的综合能力。从专案的性质、规模和难度,面试官就可以大致判断出应徵者的综合能力。如果一个面试者一直在大公司负责一个小模块的开发维护,那幺基本可以判断他不具备独立或作为主要开发者承担一个专案的能力,只适合在另一家大公司做类似的事情。对于门槛较高需要长期技术积累的职位,相关经验更显得尤为重要,比如,Linux 核心开发,JVM 开发,游戏引擎开发,资料库实现,高级 UX 等。对于这类职位,没有经验的面试者即使综合素质不错也是需要长时间的学习和积累才能胜任。所以,基本上如果确定了你的职位属于此类,那幺相关经验毫无疑问应该成为首选因素,换句话说,P 的机率是非常高的。

通过专案经验判断应徵者的优劣比通过基础和演算法测试更加可靠,所以,面试过程中面试官应该花比较多的时间听应徵者介绍专案经验,并进行深入地探讨交流,了解应徵者的知识面、思维能力、表达能力等。同时,可以结合专案提一些基础知识和演算法的问题,比如,如果面试者做过 C++相关的专案,那就可以问他如何进行记忆体管理?是否熟悉智慧指标?如果面试者的回答不能令人满意,那幺就基本上可以判断他的专案做得不是很好。

要注意的是,经验也是一个多维度的事物。比如,C++股票交易中间件系统,这就涉及3 个维度。假如面试者 A 做过 C++股票交易客户端,面试者 B 做过 C 的股票交易中间件。从语言角度看,A 最匹配,从专案性质看,B 最匹配,你如何选择?这就是在多个维度中,哪个维度更重要的问题,就这个例子而言,我个人更倾向于 B,因为我认为中间件开发经验是主要矛盾,而从 C 切换到 C++并不是问题。所以,面试官需要判断哪一种经验是主要的,而哪一种经验是次要的。比如,我们招募 Android app 开发,这个职位的 Andr

oid 技术门槛并不高,它的真正难点在于做出好的使用者体验 。所以,如果一个面试者没有 Android 的经验我们是可以接受的,但是我希望他在 UX 方面有经验,至少做过其他平台的行动 app 开发。

性格

现在,我来谈我认为最重要的因素:性格。这可能是许多初为面试官的朋友所难以想像的,怎幺会是性格最重要呢?说实话,当我意识到这一点时,我自己也很惊讶!说白了,还是 P 的机率最高啊。我的实际经验是,如果一个人的性格好,他能把工作做好的可能性是最高的,性格好远比基础好、演算法好要重要。

一个人如果技术上有缺陷,经验上有不足,但性格好,在团队中是很容易由其他人来补位的,他自己也很容易逐渐补起来;相反,如果一个人的性格不好,所有的技术优势经验优势都发挥不出来,甚至还会起到反作用,而且性格缺点很难改变。我一直谈到实际工作所需要的是综合性的能力,这种综合能力的发挥中性格是至关重要的。专案中不止会遇到技术问题,要涉及沟通、协调,不同的人不同的部门既有合作又有磨擦,如何处理这些事情都需要一个良好的性格。可以说,在开发团队里让你与众不同的不是你从哪个学校毕业,也不是你过去的经验,而是你的性格。

当然,性格是一个複杂的东西,它包含了很多的方面,并非所有方面都是工程师面试所需要关注的。我的经验是可以重点考察这些方面:

1) 态度积极还是消极

有的面试者在谈吐中就会自然给你一种积极上进的感觉,或者你可以在他的经历中发现他积极的因素,这些都不是太难看出来的。相反,有的面试者你能明显感觉到他的消极情绪。积极性在工作中是十分重要的,积极的人能给团队带来朝气,也更易于合作。基本上,如果确定面试者属于态度积极的,他通过我这一关的可能性就会大大增加;相反,如果确定属于态度消极的,即使技术能力不错我也会十分谨慎。

2) IQ

我的经验是,总体来看,聪明的人在工作中的表现更为优秀。在面试中要考察一个人是否聪明并不一定要像 Google 和微软那样找些专门测试 IQ 的智力题,其实,你只需要看他讨论问题是不是很有逻辑性,思考和说话是不是反应敏捷就可以做出大致的判断。另外,眼睛是人心灵的窗户,一个人聪明与否,眼睛是会说话的。不过,聪明也不完全是优点,比如,当公司或专案遇到困难时,往往是聪明人先跑掉了,坚守的往往是 IQ 一般的人。

3) 语言表达能力

语言表达能力也是工程师十分重要的一项素质,它关係到专案中的沟通是否顺畅。面试官可以看看应徵者能否用简明的语言介绍清楚曾经做过的专案,能否抓住要点,能否考虑到听者的相关背景。一般来讲,语言表达能力强的人综合能力都不会太差。

4) 是否具有使用者意识

有人说工程师是做研发的,哪来什幺使用者?只有行销、市场人员才会和使用者打交道。其实,这是完完全全的错误认
知。你写一个模组,甚至一个 API,只要有别人用,他就是你的使用者。有的工程师设计一个模组或是一个软体总是习惯于从使用者的角度来考虑,尽量地方便使用者,这就是一种良好的使用者意识。具有良好的使用者意识的人更能考虑别人的感受和整体的需要,而不是单纯地从自己和局部来思考问题。当应徵者谈及过去的专案经验时,面试官可以常常站在使用者的角度对其进行提问,从这个过程中观察其是否具有良好的使用者意识。

5) 如何应对质疑和压力

面试官应该对应徵者的回答以及以往专案进行合理的质疑,看看他如何应对。曾经有一位面试者谈到做游戏登录伺服器的经历,我就问:「如果伺服服务器挂了,怎幺办呢」?他说原先虽然没有考虑这个问题,但是可以怎幺怎幺改进。其实,大家都理解专案中有各种不完美,这里面原因很多,只要面对质疑和压力能从容应对努力

往好的方向思考解决就可以了,不需要掩饰缺陷,更不应该有情绪。我遇到过有的应徵者,一旦你对其专案提出质疑,他马上产生反抗情绪,或不高兴,或不承认有问题,这很容易一下子看出来他在工作中容不得质疑和批评,这种人要想合作就很困难。

6) 个性特点

许多面试者喜欢在简历上写「精通 C++/Linux「,这些字眼看得人麻木,如果有人写」喜欢 C++/Linux「,我就会有一种眼前一亮的感觉。「精通」是没有感情色彩的叙述,而「喜欢」包含了应徵者的个性,我更愿意看到应徵者的个性。我相信对某样东西真正的热情远比你当前对它的掌握程度更为重要。其实,N 年的经历告诉我们,同一个班的同学,同一个专案组的同事,虽然每天所学的知识,所接触的工作都是相同的,但其实每个人的成绩和表现差异是十分明显的。那幺,到底本质的差异是什幺呢?其实,就是每个人的个性。是个性使得有的人业余时间去打球,有的人业余时间去看书,有的人喜欢 Linux,有的人喜欢 Mac。一个人在团队中扮演的角色也和他的个性有很大的关係。面试官应该引导应徵者展现自己的个性,并判断其是否有益于团队。

总结

最后总结起来,我的经验是:

  1. 面试官的目标是找到」工作好「的人,一定要围绕这个目标来进行面试,如果把面试当成了演算法或作业系统期末考试这就走入了误区;
  2. 面试过程是通过学历、性格、基础、经验、演算法等可以测试的因素去综合判断面试者「工作好」的机率;
  3. 在各种因素中,性格> 经验> 基础> 演算法。性格是最重要的,如果性格不好,所有技术能力都会大打折扣,而且技术缺陷容易弥补,性格缺陷很难改变;经验体现了一个人的综合能力,你可以从面试者过去的经历中判断他能从事哪种工作,不能从事哪种工作;基础和演算法则主要起到辅助参考的作用,基础好的程序员一般适应性比较强,学新技术更快,但是切忌单纯从基础来判断一个人的能力。

《》

  欢迎加入"Inside" Line 官方帐号,关注最新创业、科技、网路、工作讯息
技术强者不一定对公司加分,我该怎幺找到最适合的工程师?