Your Best Partner

面试了100多位软件工程师后,我给求职者这些建议

浏览: 时间:2020-10-09 分类:前沿洞见

编者按:如何才能拿到自己心仪的软件工程师工作?从应聘者的角度介绍的经验教训已经有很多了,但是从面试官的角度介绍的文章就比较少。本文作者Hugo Rocha在过去2年曾进行过100多场面试,他希望能够从对面的角度为申请工作的人提供一些有益的建议。原文标题是:My Advice After Interviewing 100+ Software Engineers


划重点

要在2、3个小时内判断出应聘者的能力是很难的

对优秀的界定没有统一的定义,要实现做好功课,让自己的知识、经验和态度契合对方的需求

要善于提问,表现出你的批判性思维

推理过程比结果更重要

不要灰心丧气,不要让面试失败压垮你

一切都跟热情有关,热情往往就是一场普通面试和出色面试之别

从完成赫拉克勒斯的12项任务后一名英雄出现,到马戏团训练过的动物毫无意义地连续转圈之间,是一件棘手又紧张的事情,我们轻描淡写地称之为工作面试。我们都讨厌面试,但是这是我们职业生涯不可避免要迈过的一道坎。

软件工程技术面试是一个令人不自在的世界,当我第一次天真地冒险进入这个世界时,我没用多长的时间就有了这样的感受:要想在2到3个小时内判断出软件工程师的能力,其准确性简直就跟中世纪用的验证受害尸体出血一样(编者注:中世纪欧洲人认为,如果凶手走近尸体的话,受害尸体就会出血)。

但是,我一直想知道坐在另一头的感觉如何,如何一名工程师很适合某个职位的话,有什么东西是需要我理解的。在过去两年的时间里,我一共进行了100多次对软件工程的技术面试,尽管每一家公司都有自己独特的流程,但是大家很容易会陷入到常见的陷阱里面。以下是我对于如何避免掉进陷阱的真诚建议。

什么是优秀的软件工程师

“成功之路和失败之路几乎是同一条路。”

—— 柯林·戴维斯(Colin R. Davis)

什么样的人才是优秀的软件工程师?在这个问题上并没有一个唯一的定义。它关系到岗位需求以及公司的多样性和成熟度。如果是新成立的初创公司,无疑要求推向市场的时间要短,而如果是已经发展出庞大客户群的更成熟一点的公司,则可能会面临一系列的扩张和架构方面的挑战。开发产品同时理解什么对企业才有意义跟解决复杂技术挑战是不一样的。事无巨细的完美主义者工程师跟追求快速迭代的工程师又不一样。你得了解公司要找的是什么,然后用那种理念来设计自己的行为和话语。不要搞那种一体适用的简历,而是要适应现实。如果你得事先进行宣讲(不管怎样,你总得先介绍一下,正式或者非正式的),宣讲的框架要围绕着潜在招聘对象会如何成为公司的资产来设定。你应该了解待填补的岗位空缺的必要性,并问自己这种必要性是不是能够激励你,是的话再去拥抱这个角色。你应该明确在该公司的背景下什么才是“好”,并说明你的知识、经验和态度是如何契合这一定义的。

做好你的功课

“不做准备,就是在准备失败”

—— 本杰明·富兰克林

在不了解公司的情况下去面试就好比去约会的时候光谈自己,当然这未必意味着你不再有第二次约会的机会了,但肯定不会给人留下很好的印象。要下功夫了解面试的企业,了解他们的目标、使命,战略以及业绩。我从来不会因为某人对公司一无所知而将其淘汰,但这表明了面试者的动机。而且,这也是HR往往要评估的标准条件之一。除了商业目标以外,也要时不时看看公司的技术博客,了解对方的技术栈(如果有的的话)。面试者往往不会对公司表现出足够的兴趣,但是当你表现出来时,就是脱颖而出的绝妙方法。

要有批判性

“包容一种观点但不一定接受它,这是头脑训练有素的标志。”

——亚里斯多德

我在自己的职业生涯当中遇到过杰出的技术专家,他们是形形色色的人。尽管如此,这些杰出的技术专家至少有一个共同点。他们是藐视现状并能对流程和技术做出改进的人。太多的面试者,在被问到有没有问题时,往往没有任何补充。回避提出问题就是浪费机会,应该抓住这一刻去了解公司做出了哪些技术决策,所面临的挑战是什么,或者讨论每一种技术的取舍权衡也好。

举例:

  • 他们有没有打算转向HTTP / 3?

  • 他们有没有打算转变到事件驱动的微服务架构?他们用哪种消息代理?为什么不用Kafka来取代RabbitMQ ?

  • 他们用哪一种数据库技术?用例是什么?在这个用例的情况下用ElasticSearch来替代SQL是不是很好?

诸如此类。对技术决策提出质疑会表明你不仅了解这些技术,可以提出什么时候应该使用这些技术的想法,而且还可以进行批判性思考,并最终表现出你对改进自己要做的应用很关心。

技术挑战

再多的实验也没法证明我是对的。一个实验就可以证明我错了

——艾尔伯特·爱因斯坦

不懂得感激,不加掩饰的歧视——目前技术面试情况令人震惊。大多数的面试过程都牵涉解决某种与计算机科学基础相关的算法问题,比方说图搜索或者排序算法。我发现,面试的时候他们喜欢让面试者要用最少的资源实现树遍历算法,这样当对方拿到这份工作时,要做的第一件事就是调试一个已有十年历史的单体程序。既当过面试者又做过面试官的我发现这种炫耀自己工作复杂性的企图令人沮丧。这些类型的挑战很可能会让一些已经不太记得相关概念的高级开发人员被错过,哪怕他们拥有对这个职位来说最重要的经验。

我同意,这类练习也不是完全没有用;快速解决小问题的能力跟解决需要耗时数日的复杂问题的能力有关,但二者之间有着根本的不同。面试过程应尽可能反映日常工作的现实情况。其中的一些面试过程可以包括发现和修补实际应用出现的错误,结对编程或者进行自动化测试扽,而我发现考考这些要比深奥的算法问题合适得多。对于此类情况,务必确保你对公司选择的语言得心应手,而且不要怕提问题,这样才能了解全面了解那个挑战的情况。

不过大多数时候,你要面对的都是某种算法或数据结构问题,除非你对计算机科学的基础知识有了充分的了解,否则就无法解决。像《破解编码面试》(Cracking the coding interview)、Leetcode 或Pramp 这样的资源也许是很好的参考。

不管怎样,一定要确保大声解释你的推理。一般而言,问题是环环相扣的,只要你能够把问题的其他部分搞定,搞砸了某个题目也没关系。如果你遇到困难,面试官会为你提供帮助的。关键是能够看到面试者能够从某个自己不够的问题当中恢复过来,在剩下的环节表现出色。此外,经验丰富的面试官在你遇到困难的时候可能会从提问变成教学,不要把这种转变理解成是自己的失败。上下文的转变能够帮助大多数人解除阻碍。

面试官是要评估你,但同时也可以帮助你。你可以把他当作是一位老同事,正在指导你解决问题。确保要讨论各种解决方案,权衡利弊;这会展示出你对这一主题的了解程度。

不要灰心丧气

成功就是爬起来比跌倒多了一次。

——奥利弗·戈德史密斯(Oliver Goldsmith)

我曾经遇到过一个面试者,此人在面试过程中表现得非常的不坚定,缺乏自信。尽管感觉有点不牢靠,事后还进行了自我批评,但他做得很好,所以仍然被录用了。不过,在安顿下来之后的日常工作中,他表现得非常有信心,能够引领讨论,指导团队进行技术性工作。后来我问他为什么在面试时和工作中的表现为什么会如此的截然不同。他向我解释说,自己经历过了一系列灾难性的面试,在当时对被拒的处理得还不够好。被拒是这个过程的一部分,不应该受到它的影响。

在几个小时之内想要评估跟软件工程师相关的每一项能力根本是不可能的。每一个面试过程都会选择跟公司相关的部分,并尝试用最好的方式对其进行评估。所以有时候对方问到的东西正好是你擅长的,有时候也可能正好是你不擅长的。

糟糕的招聘对公司来说会很艰难,尤其会打击他们所加入的团队的士气。而且糟糕的招聘也是很大的一笔成本。再加上很多公司都缺乏标准化流程(重点是面试者的比较,所以每一位面试者都应该问相同的主题,并且应该有一个定义好的流程,公平对待每一位面试者),会存在相当大比例的假阴性(漏报)的情况。面试表现不好未必就意味着你不行。这只能说你展现出来的能力对于那个时间的那个过程来说并不是最好的。

我知道,当我失败的时候看到或者听到类似的教诲时,我也总会认为是胡说八道。我这辈子都想成为一名斗士。但有时候我会输掉太多的战斗。总是失败的斗士跟别人用来练习拳击的吊袋没什么两样。但有时候,你必须找到那股内在的力量才能把自己从已经屈服的那具残骸里面拖出来。要站起来,举起你的手,示意要再打一次,不要让失败压垮你。

一切都跟热爱有关

“工作将占据你的大部分生活,而能让自己真正满足的唯一方法就是做你认为伟大的工作,而做伟大的工作的唯一途径就是热爱你所从事的工作。如果你现在还没有找到,那就继续寻找,绝不要凑合。全心全意地寻找,找到的时候你就会知道。”

——史蒂夫·乔布斯

当我们设法去拨开日常生活的迷雾,厘清头绪的时候,当我们在挑战或者任务当中失去了自我,时间扭曲、现实逝去的时候,我们渴望那些豁然开朗的时刻。在那些超然存在的时刻,你似乎已经过了一辈子却浑然不觉。对我和我们当中的很多人来说,这就是编程的真髓,那种永恒而坚定的热情是根植在我们内心深处的。同样的这股热情也是成功的秘诀。

我看到那些最终在我们面试过程当中胜出的应聘者,他们的表现相对于我们要招聘的职位而言只能算是中等。其实他们并不差,他们很有才华,知识渊博,但就是表现比较平庸。有时候,你就是擅长做一些你并不在乎的事情,但是正是那种热情在推动你成功。而评估软件工程师的热情并不容易。但是,如果我问你有什么样的业余项目,或者自认为自己做得最好的一个项目是什么,你大概可以跟我讨论一整个下午。至于那个项目是一个拥有数百万用户的平台还是一个几用不了的业余项目并没有关系。一个充满热情的程序员会热情洋溢地介绍自己用到的每一种模式,征服过的每一个挑战,甚至每一次破解和失败。带着愉悦和怀念地介绍。然后,任何面试官都会知道,桌子对面的人就像自己一样,是一个对编程有着无可救药的热爱的程序员。

这是一种非常真实的反应。你几乎可以通过他们的眼神和肢体语言看出来。你要么对此充满热情,要么就没有。如果你有的话,一定要讨论那些让你浑身来劲的项目,这也许就是一次普通面试还是出色面试之间的区别。

总结

我一直觉得,去应聘的压力在于知道自己需要获得这份工作,同时还要证明自己足够优秀。当然,当面试官也不是完全没有压力,面试官需要确保让某人通过或者不通过要有充分的理由,自己的决定要经得起审核,就我而言,这一点永远是这样的,尤其是对得起自己的良心方面。

大多数面试官之前都有过被别人面试的经历,所有很有可能他们对应聘者是有同理心的。我希望自己能够从对面的角度帮助你了解如何做好面试,我真心希望我的建议能帮助你拿到自己真正想要的工作。

译者:boxi。