选自freecodecamp
作者:Uduak Obong-Eren
机器之心编译
参与:Panda
如果你致力于成为一名软件工程师或数据科学家,技术面试往往是求职过程中的必经流程。近日,软件工程师兼科技作家 Uduak Obong-Eren 分享了他在 30 天内完成 60 多场技术面试后总结的经验教训。
如果你是一位希望事业成长的软件工程师或技术人员,技术面试肯定是必然会面临的难关,并且往往让人觉得很难。因此无论是从感觉上还是在其它方面,技术面试有时会让技术人员感到恐惧。
本文将介绍作者软件工程师 Uduak Obong-Eren 在 30 天内完成 60 多场技术面试的经历以及从那些成功和失败中收获的经验教训。这些经验教训分为三个类别,对应典型招聘流程的三个阶段。
尽管这里的大多数经验教训都直接针对的是软件工程师和技术专业人士,但其背后的原理适用于几乎所有职业。希望你能在其中看到对你的职业生涯有用的东西。
我是怎样开始的?
「如果你必将失败,那就快些失败。」——佚名
和其他软件工程师一样,我也参加过多种不同类型的技术面试——从让人望而生畏的白板编程面试到非同寻常的在 Hackerrank 平台上的 45 分钟编程挑战赛。尽管我有一些很棒的面试经历,但也有一些很糟糕甚至极其糟糕的经历。
但我希望能在面试中表现更好,甚至非常好。我希望学习克服面试恐惧症并在面试中展现自信。就像一个技能精湛的冲浪者,我希望能在面试所带来的高压力浪潮中乘风破浪。恰好那时我也一直想要换个工作。
因此从 2020 年 1 月到 3 月初,我申请了美国和欧洲的多家公司并得到了他们的回应。其中既有 Coda 等处于早期阶段的创业公司,也有 Crunchbase 等处于较后阶段的创业公司,还有 Affirm 等中等规模的公司以及亚马逊等大型公司,甚至还有 Webflow 等远程公司。
发出了至少 109 份申请之后,我收到了超过 60 份面试邀请。总结起来,其中包括超过 60 次介绍性的电话面试、50 多次技术视频电话面试、18 次居家编程项目、11 个编程挑战赛以及 8 场现场面试(包括 3 次虚拟面试)。
为了便于理解,我将学到的经验教训分为了三个类别,对应典型招聘过程的三个阶段。
面试前阶段
这个阶段是指与公司初次接触到第一次面试发生前的阶段。
有关工作申请的经验教训
当我开始向公司申请工作岗位时,我想象的是我提交的申请越多,我获得面试的机会就越多。看起来符合逻辑,对吧?所以我当时设定的目标是每天发出 5 个申请,期望每 5 个申请就能获得一次面试机会。
但我的策略的效果并不如我期望的那样。我收到的面试邀请的数量往往不及我的目标:差不多是 1:12 的比例,即每申请 12 次会获得一次面试机会。
我面临着这样一个问题:我需要将我的每日申请量提高一些吗?比如每天发 10 份申请。或者我需要在其它方面做一些改变?每一份不成功的申请背后,我都能看到一些需要改变的东西。
当我不再执着于申请数量,修整一下并开始思考简历的质量时,情况迎来了变化。我开始将每份申请看做是向招聘经理或其他会看到我的简历的人的自我展销,也就是说我自己就是我想出售的商品。如果公司需要填补人才空缺,而我说自己有这些技能,我还需要让他们相信我确实有。
然后,我的新任务就变成了找到一种能有效推销自己的技能、经验和个人特质的方法,以便说服招聘经理相信我就是适合他们岗位的人。
下面给出一个我想出的这类自我推销的例子:
加上我的简历,这份求职信的成功率高达 95%。只有一次这份求职信没有起效,但那位招聘经理仍然回复了我,并告诉我那个岗位已经不再招聘了,不过他希望未来能联系我。
这里的经验教训是:你发出的申请应该非常具有针对性——质量优于数量,最好两者兼备。你要知道你的特有能力和经验,并以一种能满足公司需求的方式呈现它们,同时还要不失你的个性。
你也需要了解你所申请的公司的特点及其具体需求。创业公司或小公司的需求可能与大公司不一样,因此需要不同的技能组合。
推销你自己,并确保在面试时佐证你的说法。
从招聘者来信所学到的经验教训
在这期间,我收到了很多招聘者来信(大都是不请自来的),希望我去应聘他们公司的空缺岗位,但其中大多数岗位我都不感兴趣。
当然,鉴于我的日程繁忙,这些邮件实在太多了,但我学会了保持同理心,我理解这些招聘者只是在完成自己的工作而已。
所以我不再将这些邮件视为我收件箱里的噪声,而是开始努力回复所有招聘者的来信,即使那些职位我并不感兴趣。这样做让我成功构建了一个招聘者网络,这已经成为了我未来转变职业角色时的重要资源。
你倒不必开始回复你收到的每一封邮件。但你要知道,我获得的一些有用的面试建议都是从我回复的不感兴趣职位的招聘者那里得到的。回复一下其实没啥损失。
面试阶段
这部分涵盖有关面试本身的一切,其中涉及多种不同的面试类型。
如何应答介绍性电话
是的,我懂的,你很忙,很多事情都在抢占你的时间。但是,你也是一位出色的专业人员,也就是说你在接到这样的电话时,至少已经知道了两件事:
- 你的面试官的名字
- 关于该公司的至少一件具体有形的事情——他们是做什么的、公司位于何处、近期有什么新闻等等。
我注意到,当我为准备面试而去了解这些事情时,我总是会开始真正对这家公司产生兴趣。这通常是招聘人员在进行这类面试时所期望的事情。
如何应对技术性视频电话面试
在技术性视频电话面试中,唯一最具决定性的因素是,你能否清晰地表达你的想法。
你之前可能听说过这样的事情:
「面试官关心的是你的思考过程。是的,他们可以看你的代码,但重要的是他们想知道你这样写代码的原因。」
面试官不在你的身边,也就无法看见其它非语言的线索,比如你的手势和细微动作。面试官只能通过你的声音来理解你的思维过程。
现在你知道该如何引导这场对话了,接下来的问题是你该如何变得擅长?因为事实上,尽管某些人能够自然地表达自己的思想,但另一些人则很难做到,其中就包括我。
答案是:练习!练习!!练习!!!
练习很多次模拟面试。与朋友进行模拟面试能让我更好更自信地解释我自己的思维过程。但更有意思的,这能帮助我建立对面试的新看法。
我开始将面试看做是与朋友或团队成员的对话。我将另一边的面试官看作是我的朋友(有时候我还会在头脑里给面试官一个名字)。因此,过去被我视为压力巨大的面试,现在变成了我与朋友讨论一个技术问题,仅此而已。
这个新看法辅以许多实际的面试经历帮助我变得更加自信,甚至让我开始享受面试,不对,应该是技术聊天。
如何开始解决问题
永远不要在完全理解问题陈述之前开始解决问题。如果你一开始就让对方澄清问题,那么你几乎就不会出错。如果你能够事先清晰地提问,而不是自己一个人按自己的假设行事,也能给面试官留下一个好印象。
如何解决问题
优秀的候选人知道如何解决问题(比如排序问题),但最好的候选人知道一个问题的多个解决方案,并且理解一个解决方案与另一个之间的权衡。我表现最好的面试是那些我不仅解决了算法难题的面试,而是还提供了替代解决方案并讨论了权衡的面试。
你要以提供问题的多个解决方案为目标,要乐于讨论权衡,并且至少要能实现其中一种方案。
对于技术面试而言,要写出清晰的代码。大多数面试官既关心你的代码质量,也关心你的解决方案的正确性。你要尽可能地写模块化代码,将可复用的逻辑适当地划分为实用函数、名称变量和方法,就像你是 boss 一样。
如果你被一个问题难住了该怎么办?
有时候你会被难住。原因可能有很多:你缺乏必要的知识、你的假设不正确、你遗漏了细节等等。
我过去以为,在这样的时候,面试官会基于我想出解决方案的快慢来评价我。所以我会很安静地思考,不与面试官交流,只是思考。
这就是我们大多数人出错的地方。我也明白,你需要一个人思考的时间。但很抱歉打破你的幻梦,你在接受面试时不是你的个人时间。
是的,如果你能自己想出一个解决方案,面试官当然喜闻乐见,但不要忘了他们也希望看到你能与其他同事合作构想解决方案。尽管公司想要技术明星,但他们也想要团队合作者。
因为你的面试官是一个朋友、一个伙伴、一个团队成员,他和你是一边的,也就意味着你在思考解决方案时应该与他们交谈。
你应该分享你的思维过程,直到你卡住为止;你要充满自信地寻求帮助,而不是哭泣般请求帮助。这样做时你可能就会揭示出解决方案,就像我在接受 Coda 面试时那样。
如何应对编程挑战
这里的经验教训适用于以在 Hackerrank 和 Codility 等平台上执行编程挑战形式的面试。通常这些挑战都是限时挑战,比如 45 分钟或更长时间。
我前面分享的一些经验教训在这里也适用,但其它一些却并不适用,比如让别人澄清问题,因为这里没人可问。这里我推荐一些步骤:
- 通读并完全理解问题。
- 首先写出能工作的代码,即便是暴力搜索算法也行。这可能无法通过所有测试案例,但优先事项是拿出可工作的代码,最好能在前 15-20 分钟完成。
- 使用不同的输入类型测试你的代码,因为这有助于你处理边缘案例。
- 优化效率。
- 重复 4 和 5 ,直到最后一分钟。
这里,很好地掌握计算机科学基础很关键。
如何应对居家编程项目
居家编程项目能让你有机会更好地展现自己的才能,因为你有更多时间。这也意味着这类项目更耗时间。
一家面试我的公司还为从事居家编程项目的时间提供了大约 68 美元一小时的薪资——说明这个任务很严肃,你也应该严肃对待。不过在你花时间搞居家项目之前,你一定要相当确信你希望进入这家公司。
永远不要在居家项目的代码质量上松懈自己。要针对性地进行你的设计决策,即命名规范、代码结构等等都要好好考虑,并且要做好准备为你的选择辩护。
你应该使用什么工具?
在我接受 Course Hero 的面试时,我使用了 regex 来解决我本可用更简单的字符串解析算法来解决的问题。事实证明,这是个糟糕的决定,我也没通过面试。
经验教训:仅使用你非常熟悉而且经验丰富的工具。
如何进行现场面试
在面试前一晚好好睡一觉。面试当天提前到达,然后保持微笑(这有助于你展示信心,而且更重要的是能让你保持放松并感觉一切都在控制中)。
直面你的恐惧并接受它——即使失败,也不是世界末日,毕竟这只是又一场技术聊天而已。然后进门,开始聊天。
如何进行虚拟现场面试
这与现场面试大不相同,因为每个人的眼睛都看着你,这可能让人神经紧张。
我收到了三个虚拟现场面试,而我没通过其中任何一个。很抱歉你没法从我这里获取成功经验。
面试之后
如何应对失败
你没通过一轮面试的原因有很多,我认识的一些最好的工程师都曾在面试时受挫过,现在也仍然会失败。
因此,不要执着于失败的面试,而要从失败的面试经历中找到可以吸取的教训,然后借助它们继续前行。就像他们说的——前进!
面试成功了又怎样?
庆祝你的成功吧,不管你觉得这个成功有多小。我有一些庆祝的思路。
你接下来应该做什么?
- 与朋友进行很多模拟面试。尽管我并不完全同意「练习造就完美」的说法(因为在我看来完美是个一直在变动的目标),但练习能帮助你快速识别面试问题中的模式,帮助你熟练,最终提升你的信心。
- 对于技术面试,很好地理解数据结构和算法基础是必需的。
- 开始面试并不断面试。即便你有工作,也可以时不时面试一下——也许每两个月或一个季度一次。面试是一项技能,可以继续磨炼。
希望这篇文章能帮助到你。
原文链接:https://www.freecodecamp.org/news/what-i-learned-from-doing-60-technical-interviews-in-30-days/
本文为机器之心编译,转载请联系本公众号获得授权。