关于大型科技公司面试的思考

2025-06-07

关于大型科技公司面试的思考

本文最初发布barbarianmeetscoding.com。😊

几周前(我记得),我浏览了dev.to ,其中一篇文章让我反思了自己在大型科技公司(作为一名面试官)的面试经历。所以我想……为什么不分享它,帮助那些正在面试的人?或者那些正在考虑申请但可能不敢尝试的人?或者那些只是好奇,可能把它作为长期职业目标的人?

好了,就这样!在本文中,你将了解如何应对大型科技公司的技术面试。你将从我的经验和错误中学习,我们将把所有内容提炼成一种方法论:一种在面试前和面试过程中让你的身心都做好准备的方法 (:D)。

一堆准备编程面试的书籍,还有一本写着鼓励语的笔记本。你搞定了!

准备好那些采访书,拿起纸和笔,让我们开始吧!

免责声明!

以下内容基于我作为受访者的个人经历和观点。我绝不代表谷歌,也不代表谷歌的观点,也不会透露任何尚未公开的信息。

所以很多很多年前的一天,我接到了亚马逊的电话……

亚马逊

……虽然那不是电话,实际上是通过领英(Linkedin)联系的。没错,领英似乎确实很适合做这类事情谷歌也通过领英联系了我,不过我们先别急,因为那事儿发生得已经很久了。

亚马逊的一个招聘团队即将前往瑞典,从维京人以及其他与他们生活在一起的生物(比如我)中挖走最优秀的人才。招聘人员觉得我的个人资料很有意思,鼓励我大胆申请面试。面试会有一个在线练习,并通过专门的面试工具进行记录。如果一切顺利,我就会被邀请去斯德哥尔摩参加一整天的现场面试。

停下来描述一下当时我是多么地无知,以至于无法想象亚马逊作为科技巨头的盛名。我当时是微软的铁杆粉丝(我的天哪,我可是 Windows Phone 的骄傲拥有者),如果你告诉我“亚马逊”这个词,我脑子里唯一会想到的可能就是电商网站Kindle。仅此而已。根本没有想过 AWS 或亚马逊本身就是一家科技巨头。所以我觉得很酷,但没觉得这会是什么大事(其实……还挺……大事的)。

所以我毫无准备地去做了在线练习。老实说,我根本不知道我应该为此做准备,我的理由是:我是一个有一定经验的软件开发人员,一个优秀的开发人员,我应该能够向他们展示我的才能,因为我确实花了大部分时间在编码上。我不记得实际的问题,但我记得这次经历非常有趣。我有个主意。向他们展示我通常如何编写软件,这样他们就能了解与我一起工作是什么感觉。所以我接受了这个问题并通过 TDD 找到了解决方案。他们一定很喜欢我的方法,因为不久之后他们就给我发了现场面试的邀请。耶!我们开始吧!

好的。既然我提到了 TDD,我觉得我们需要聊聊这个话题。我们先深入探讨一下,然后马上回到现场面试。请注意,我们现在正处于 Jaime 的怪异实验阶段,而且从来没有人给我任何口头反馈说这个主意对编程面试来说是个好主意。你可以直接跳过这个话题,忘掉我之前提过这件事。但如果你只是有点好奇的话……

编程面试中要用测试驱动开发吗?真的吗?

我是否建议在你的编程面试中使用 TDD?

,除非你是经验丰富的 TDD 开发者。否则,TDD 只会给编程面试增添面试官意想不到的额外顾虑,并会给你需要解决的任务以及面试本身带来额外的压力和复杂性。

在尝试之前,你应该已经对 TDD 非常熟悉了。但我认为,如果你能抽出时间提到你会为你的代码编写自动化测试并讨论一些测试用例,你肯定会获得加分。一位优秀的面试官应该会引导你继续前进,或者引导你回到手头的问题上。这应该能让你明白,他/她/它/他们是否认为进一步了解你的测试实践很有价值,或者你是否应该完全专注于正在解决的问题。

为什么我认为用 TDD 解决编程面试非常酷?

TDD 是一种非常美妙的方式,可以让你观察别人解决问题,因为它是由外而内解决问题。当你逐步实现软件主体时,它能以一种非常直接的方式引导其他人参与进来。此外,它还能展现你对自动化测试和系统化解决问题的深切关注。

但它并不适用于所有问题,在某些情况下你可能需要用白板来补充它。例如,TDD 在解决实际业务问题时非常有效,比如当你需要设计一个小型汽车租赁服务或计算器(呵呵1)时,它也很适合编写数据结构,比如链表或树。对于纯算法问题,它并不是那么好,因为 API 表面可能是一个单一的函数,而所有的核心都在算法本身的实现中(尽管我觉得即使在这种情况下,先从简单的输入到不那么简单的输入编写测试用例也非常优雅)。

为什么 TDD 编程面试可能是一个非常糟糕的主意?

值得重复的是,如果你不习惯使用 TDD,它就会成为额外的负担。别这么做。

再说了,编程面试通常很短。一眨眼,面试就结束了。编写测试确实会浪费你宝贵的时间,而这些时间你或许应该用来解决问题。另一种方法是只编写第一个测试,然后提及其他测试用例,而无需实际编写函数体。

然后还要考虑公司文化。有些公司文化非常不赞成不花点时间思考和反思就直接开始编码。在这样的环境下,打开笔记本电脑开始打字可能并非最佳选择。留意一下类似这样的提示:“哦!你马上就编码?

亚马逊现场面试

我带着和在线练习时一样的心态,毫无准备地参加了亚马逊的现场面试。哦,真是太天真了!回想起来,当时我对大型科技公司的面试一无所知,真是有点尴尬。面试过程非常有趣,所有的面试官都非常棒:鼓励人、乐于助人、而且很有趣。除了最后一次面试,我参加了所有面试,因为最后一次面试之前我被打发回家了

以下是我觉得自己做对的一些事情:

  • 我的心态很好:我开放、精力充沛、好奇、快乐、积极,而且我对自己通过面试的能力非常有信心。
  • 我在技术面试中表现出色,努力拼搏,没有慌乱。由于当时我在计算机科学算法方面经验不足(大学毕业已久),所以我尝试从第一原理出发解决所有问题,虽然速度慢,但有效。这里所说的第一原理是指我知道不同数据结构和算法工作原理的概念基础,但我可能没有亲自解决过,也没有彻底实践过。因此,为了解决问题,我需要从最基础的原理开始运用推理。
  • 在解决问题时,我非常乐意交流我的思维过程

以下是我做错的其他事情:

  • 我本应该为编程面试做好充分的准备,尤其是那些计算机科学相关的算法和数据结构问题。事后看来,这似乎非常基础和显而易见,但我还是没有做到。我没有培养出扎实的算法编程面试所需的实践、敏捷性和模式匹配能力,这在各个方面都体现得淋漓尽致。
  • 注意文化差异并留意暗示。美国人和欧洲人可能长得相似,行为举止相似,拥有相似的西方文化,但你仍然需要注意文化差异(欧洲国家之间也存在文化差异,很多例子可以问问我的瑞典妻子)。特别是如果你是欧洲人,而面试官是美国人。在这个特殊的案例中,我的面试官非常渴望了解我在之前的工作中做过什么,而我作为一个优秀的欧洲人,在自我推销方面有很多困难(大多数时候仍然如此),并且一直使用“我们”这个词(比如我们做了这个我的团队做了这个,等等)。当时我觉得我在整个面试过程中几乎都在用“我们”这个词,但如果我听进去了,我就会明白面试官在问我什么。(此外,面试官应该更加注意文化差异,特别是如果他们像这次一样在欧洲巡演)。
  • 我对亚马逊本身及其技术栈仍然一无所知。如果能对这家公司、他们的服务和产品以及开放的职位做一些研究,我就能更好地与工程师沟通,提出更好的问题。我有机会与那些开发出令人惊叹的产品的工程师们交流,但坦白地说,我对此一无所知,这真是令人尴尬。

亚马逊面试教学总结

教学#1. 为面试做好准备

如果你在面试前没有接触过太多计算机科学知识,不妨好好准备、学习和练习。专注于你最弱的领域,不一定非要是计算机科学,也可以是架构、分布式系统、系统设计、用户体验以及其他与职位相关的领域。

我将在后面的部分中为您提供有关如何准备的更具体的建议。

教学 #2. “我能行”的心态

我们最大的敌人是自己。相信自己。面试前调整好心态,展现最好的自己。

教学#3. 说话,说话,说话

面试官无法听懂你的大脑。他们试图评估你的思维过程,除非你把想法说出来,否则他们无法做到。而且,如果他们不知道你在想什么,他们就帮不了你。所以,要大声说出来,沟通,把你的想法全盘告诉他们。

教学#4. 注意文化差异

如果你的面试官来自不同文化背景,那么在沟通时要考虑到文化差异。如果你面试的是美国人,不要害怕自我推销或展现你的工作经历。说“我们”是可以的,但也要具体说明做了什么。留意提示并调整。

谷歌

2010年,我在瑞典开始了第三份软件开发工作(第一份工作是在一年前在西班牙,第二份在瑞典的工作也只是短暂的)。我清楚地记得自己凌晨4:30去上班的情景(我尝试过很多非常奇特的生活习惯),天很冷,很黑,我听着一本有声书。这本有声书的名字是《In The Plex》,讲述了谷歌的故事。我记得当时一边听一边想:“哇……太酷了……在谷歌工作该有多棒啊……”(虽然你知道这永远不可能实现,对吧?)

(快进)

那是2016年1月。瑞典寒冬零下25摄氏度,严寒笼罩着大地。万物沉睡,萎靡不振,等待着温暖的春天到来,万物复苏。当然,除了招聘人员之外,一切都停滞了。我刚和斯堪的纳维亚的家人庆祝完圣诞节回家,就惊讶地发现收件箱里有两封领英邮件:一封来自微软,另一封来自谷歌。(什么鬼?!

两周后,我参加了 Mojang 和 Google 的面试。我们稍后再谈 Mojang,现在先集中讨论 Google。

我在谷歌面试的职位是技术解决方案顾问,这有点像软件工程师,负责与谷歌的合作伙伴和客户密切合作,帮助他们采用和使用谷歌的产品和服务,作为值得信赖的顾问与他们合作,并在与其他谷歌工程团队的关系中充当客户的管家。这个职位需要进行一系列的技术面试。

一边全职工作,一边忙于业余项目,一边处理着既定事务,还要过着安稳的生活,准备一家大型科技公司的面试可不是件容易的事。时间真的不多了。你需要培养很强的自律性,专注于准备,不去想其他事情。所以我就这么做了,在几周的时间里,我全身心投入面试准备。我没有记录工作时间之类的,只是把所有的空闲时间(只要我女朋友允许 :D)都用来准备了。以下是我的做法:

我当时的心态可以概括为:“尽力而为,但不要抱太大希望” :D。你从我几乎没告诉任何人我正在参加谷歌面试这件事就能清楚地看出这种态度。我觉得我内心深处不相信自己能通过面试,只是不想告诉任何人,以免日后不得不承认我失败了。这太糟糕了。我们不应该那样。我也不应该那样。我们应该抛开自我设限和恐惧,尽情拥抱生活,全身心投入其中,如果失败了就失败了,下次你会做得更好。我还在努力。

两个月后,我收到了消息,谷歌发来了一份工作邀请。我要去谷歌工作了。我的天哪!

以下是我觉得自己做对的一些事情:

  • 这次面试我可是准备充分了。耶!Jaime!你从上次的面试中学到了很多东西。给你点赞。感谢谷歌的招聘人员,他们非常乐于助人,设定了正确的预期,并为你提供了一些准备面试的话题和材料。
  • 我在准备和面试过程中都保持着极佳的心态。虽然我没想到自己会成功,但我真的在准备和面试过程中倾尽了全力。每次远程面试前,我都会通过冥想、两杯咖啡,以及——没错,相信我—— 《上古卷轴5:天际》原声带里的《龙裔》(那玩意儿火了!Dovaki!Dovaki!)来让自己精神抖擞。就这样,我把最好的自己带到了这些面试和现场面试中。

以下是我做得不好的其他一些事情:

  • 我希望我当初能相信自己,相信自己配得上谷歌。有些人天生就拥有那种自信平和的气质。而我没有。

Google 面试技巧 #1

教学 #5. 练习,练习,再练习

多练习!不仅要练习题目本身,还要在与考试环境相似的环境中练习。

如果你打算用白板进行编程面试,那就练习一下;如果你没有白板,就用纸笔。如果你打算用 Google Docs 进行编程面试,那就练习一下。在解决编程问题时,练习大声朗读。练习,练习,再练习。

Google 案例 #2

我非常非常热爱软件开发和编程。我最喜欢的是编程的创造性。我喜欢创造东西。作为一名技术解决方案顾问,我并没有太多这样的机会(有一些,但远远不够)。因此,尽管我在那个职位上做得很好,我拥有的很多品质在那个职位上非常有用,但我并没有感到满足。我试图通过利用空闲时间来弥补这一点,但我觉得我开始迷失自我。感觉我就像两个人,同时在两条截然不同的道路上行走。我最不想成为的那个人走得更快,也更强大,而另一个人却在慢慢消失。

我非常不开心。我拥有一份很棒的工作,和很棒的同事,在一家很棒的公司工作,一切都很好,但我并没有做自己一生想做的事情。我为自己是一名优秀的软件开发人员而感到自豪,但我能感觉到自己的技能正在生疏、退化、消失,我再也没有时间去培养软件编写的艺术了。你做什么,你就变成什么样,你不做什么……

在担任技术解决方案顾问一年半后,我决定转行到软件工程。非常感谢我的经理,他给了我极大的鼓励和支持,也非常感谢我的前同事和新同事们(尤其是其中几位,我会永远感激他们)。当时我感觉非常生疏,对自己作为软件开发人员的技能充满怀疑,而且我还得面对另一轮面试,因为面试官又添了一项重头戏。当时我和 Malin 刚刚初为人父母,我们的儿子 Teo 才 3 个月大。好吧,那就来吧。

如果说之前的面试准备已经够难了,想想一边照顾孩子一边准备面试会是怎样的感受。2017年末,我和马林承受着多么巨大的疲惫,简直难以言表。只有亲身经历才能真正体会。想象一下,晚上10点,你用奶瓶喂完宝宝哄他入睡,工作和照顾了一整天,在三个月睡眠不足之后,你打开《破解面试密码》,在接下来的三个小时里开始做题,直到筋疲力尽地睡着。没错,很艰难。

《破解代码面试》当时成了我最好的朋友之一,《面试蛋糕》(真的。好。网站)、《数据结构和算法的常识指南》《编程面试要素》《算法设计手册》(虽然在参加面试之前我并没有深入研究最后一本)也是如此。

2018年初,我收到了一个超级开心的消息。我即将成为谷歌的一名软件工程师。说我欣喜若狂都不足以形容我的心情。宝贝,我回来了!

Google 面试技巧 #2

教学#6:模拟面试

准备现场面试的一个很棒的方法是进行模拟面试。找一位好朋友帮忙,让他面试你。你们甚至可以互相面试。

教导 #7. 你比你想象的更坚强

教导 #8. 没有比现在更好的时机

如果你已经决定在这些公司中发展事业,如果你已经决定要有所作为,那么现在就是最佳时机。生活会给你一千个借口,告诉你为什么现在不是最佳时机,让你等到情况变得更好、更稳定。你总能找到借口不去做某事。那就行动吧。

大型科技公司的面试方法

让我们把所有的教材整合起来,形成一套方法论,让你能够按照它来准备面试,最终获得成功。就这么定了!

早在采访之前

了解自己。你喜欢做什么?你讨厌做什么?你的职业目标是什么?你想如何度过你的人生?你不需要知道所有这些问题的答案,但只要填写一些空白,你就能更好地决定是否想在某个公司工作,担任某个特定的职位。这也能为你在面试官面前提出你感兴趣的问题奠定基础。同时,倾听你内心的声音

采访前

  1. 从《谷歌生活》中的这些视频开始,它们可以为你提供一些指导,让你了解编码面试是什么样的(即使你面试的是谷歌以外的公司,这些建议也很有帮助):
    1. 如何准备谷歌面试
    2. Google 编码面试示例
  2. 准备你的知识并锻炼你的解决问题能力
    1. 连续阅读《破解编码面试》一书。解答所有问题。重复。
    2. 如果你有钱,可以看看“面试蛋糕”网站。它真的是一个很棒的资源,而且如果你面试不通过,他们会退还钱。
    3. 用纸笔练习,用 Google Docs(或类似的没有语法高亮的编辑器)练习编程,用白板练习,练习面试中可能遇到的任何情况。找个朋友一起做模拟面试。
    4. 练习在解决问题时大声说话。目标是帮助面试官了解你的思维过程
  3. 调整心态
    1. 阅读《障碍就是道路》
    2. 相信自己!你能行!积极一点!
    3. 解决的每一个问题都会增强你的信心。
    4. 有些日子比其他日子好,如果你感觉不舒服,就继续坚持下去。即使是糟糕的日子,也会累积起来。休息一下也没关系。

准备时:

  • 专注于弥补你的弱点。如果你很久没研究过计算机科学问题了,那就专注于此。如果你是刚从大学毕业的初级开发人员,你可能需要花更多时间在系统设计、架构、分布式系统等方面(但也要花相当多的时间在算法上)。
  • 用纸笔粗略地解决数据结构和算法问题比用实际代码解决要快得多。如果准备时间有限,你可以选择用纸笔来解决问题,并限制用代码解决的问题。这样可以让你接触到更多类型的问题。

通常我在解决问题时会遵循以下方法:

  1. 找到最简单的解决方案。通常这会是一个蛮力算法
  2. 用纸笔将暴力破解算法写成伪代码
  3. 用大 O 符号分析该解决方案的复杂性
  4. 通过优化运行时间或空间,或者消除重复工作来改进算法。通常,改进算法需要权衡利弊。增加一些内存的使用可以使算法速度提高几个数量级,记忆之前的结果可能会产生显著的影响,等等。
  5. 用伪代码编写改进的算法
  6. 用代码写出改进的算法
  7. 改进方面可能会有更多改进
  8. 考虑可能的测试用例、边界条件、偏差 1 误差等等。用一些示例输入来调试你自己的算法。一般来说,使用示例输入对于推理算法非常有帮助。

解决大量问题之后,您将能够将问题按类型进行匹配,并培养出一种直觉,知道哪些类型的算法和技术可以更快、更有效地解决特定问题。

采访期间

  1. 就在采访之前
    1. 制定一个面试前的仪式来让自己兴奋起来。可以尝试《上古卷轴5:天际》、《虎眼》、《柯南》、《碧昂丝》等等,任何适合你的歌。站稳,张开双臂。做个活力四射的练习。你一定可以!
    2. 如果你要参加编程面试,那就试着解决一个简单的问题。这会让你的大脑进入解决问题模式,并在面试前增强你的信心。
  2. 采访期间
    1. 要充满热情、渴望和好奇心。我们都是人,面试官会评估他们是否愿意和你一起工作。至少在潜意识里,如果他们没有被主动要求思考并回答这个问题的话,他们会评估。最重要的是,不要做个混蛋(无论去哪里都要记住这个建议)。
    2. 提出问题!手头的问题还有什么模糊的地方吗?有什么不明白的地方吗?提出来!不要害怕提问。
    3. 说话!引导面试官了解你的思路。这有助于面试官了解你解决问题的方式,如果你走得太远,面试官会引导你离开;如果你走的路正确,面试官会轻轻地提醒你。
    4. 倾听面试官。他们问了什么?他们告诉你了什么?整个面试过程中都存在着一个元维度,如果你认真倾听,就能挖掘它。
    5. 面试结束时,会有时间提问。利用这段时间与面试官进行面谈,进一步了解该职位和公司。这家公司适合你吗?这个职位适合你吗?
    6. 玩得开心!

在编程面试中,一个很好的原则是想象你和面试官是同一个团队的成员,你们正在一起解决问题。记住这一点,然后提问,谈话就会更加自然。

结论

就是这样!大型科技公司的面试过程可能漫长而艰辛。你需要做好身心准备,在面试中展现最佳状态,并且在整个过程中保持极大的耐心和毅力,进行更多面试、准备更多,最终等待结果。如果你已经开始了这段旅程,我真心希望这篇文章对你有所帮助。加油!即使失败了,也没关系,你可以从错误中吸取教训,再​​试一次。正如你在本文中看到的,我失败过很多次。祝你好运!

另外,如果你有兴趣了解谷歌的招聘实践,可以读一读这本很棒的书,叫做《工作规则!谷歌内部的洞见将改变你的生活和领导方式》,里面有很多关于它的信息。

关于我其他面试经历的一些琐事

  • 抵达瑞典后,我找工作找了大约7个月才找到工作。我投了大约200份简历和求职信,直到一个很棒的人信任了我。谢谢你!我本应该把这些时间花在学习瑞典语上,但我却学了测试驱动开发(TDD)(甚至更多)。这说明,你认为不重要的事情,实际上可能是你申请公司的硬性要求,是决定性因素,甚至至关重要。
  • 2010 年代初,我参加了 Opera Software 的面试。那场编程面试我失败了。同样,当时我一头雾水,准备不足,用第一性原理就搞定了。他们问我是否事先知道答案,我说不知道。我觉得他们以为我撒谎了。但我没有撒谎。
  • 虽然在 Mojang 工作很棒,但最终没能如愿。我参加了团队的面试,但我觉得他们觉得我不太合适。是不是因为他们重度依赖 Linux,而我的背景是微软 .NET Enterprise?谁知道呢。面试失败后很少能得到反馈。我们应该改变这种现状。
  • 我最喜欢的一次面试经历是在 Active Solution。他们会给你一个问题,让你在家里舒服地解决。然后你把问题发过来,如果觉得足够好,你就会和团队见面,讨论你是如何解决的。真有意思!

  1. 如果你还没意识到,计算器就是 TDD 的典型例子。它就像 TDD 中的 ToDoList。↩

文章来源:https://dev.to/vintharas/thoughts-on-interviewing-at-big-tech-companies--1ek3
PREV
TypeScript:JavaScript + 类型 = 卓越的开发人员生产力
NEXT
Vim 中的多语言编程(或如何在 Vim 中获得任何语言的良好开发体验)