2020 年的谷歌面经:“远程编程面试”流程

本文翻译自“ Google Interviewing Process for Software Developer Role in 2020 ”,原作者为 Ilia Pirozhenko,翻译已取得作者授权。

我刚刚参加过谷歌的面试,迫不及待地想和大家分享一下面试过程中的苦与乐,希望大家能从文中了解到谷歌的面试流程,知道会发生些什么。我也会分享一些心得,让大家知道如何准备面试和避免犯错。

如果你想看的是成功经验,那这篇贴子很可能会让你失望了。我没能通过面试。整个面试过程对我来说还是非常有趣的,并为我开启了职业生涯的另一扇大门。关于这一点我会在文末细说。为了保护相关谷歌员工的隐私,文中涉及的人名和身份信息都是改动过的。

准备阶段:面试前奏

我的故事开始于去年十月,那是一个下雨的清晨。谷歌招聘专员 Olivia 给我发了封邮件,标题是“有兴趣来谷歌解决些高难度的工程问题吗?”当时我刚刚做完了几个项目,也正在寻找新机会。有机会去谷歌工作的话,谁都不会拒绝,所以我马上就回复了:“当然愿意!”同时和她约定在谷歌 Hangouts 上进行更进一步的沟通。

两天后,我们在 Hangouts 上开始了对话。Olivia 向我描述了在谷歌工作是多么令人兴奋的事,以及招聘流程是怎样的。我想向她了解更多关于招聘岗位的细节,她说现在是为位于波兰首都华沙的新公司进行招聘,主要工作是对企业客户的谷歌云功能进行开发和支持。我想进一步问岗位的具体职责,属于哪个部门,结果她说在现在这个阶段还不必关心这些细节,等我通过招聘流程中规定的所有阶段之后,就可以自己选择心仪的部门和岗位了。这一点让我觉得有些不舒服,但我想还是可以坚持一下的。

不爽的感觉#1:万一我对谷歌的所有团队都没兴趣怎么办?

Olivia 告诉我,谷歌的面试流程分三个阶段:首先会有两场关于算法和数据结构的编程面试。如果成绩很优异,可能一场就可以过关,但对大多数的面试者都会安排两场。然后是在某个谷歌办公室举行的现场面试,包括好几轮编程面试(还来……),一次系统设计面试,还有必不可少的压轴大戏“谷歌范儿(Googleyness)和领导力”。最后一项面试会检验你能否很好地融入公司。

小贴士#1:要通过谷歌的面试是很难的,可能会耗时若干个星期。你应该全力以赴,认真准备。

Olivia 还说,就算你能排除万难通过所有的面试到达最后一关,也不代表肯定会被录用。因为谷歌的面试流程还有另外一步,而且是不需要你本人在场的。在最后一步,几个资深谷歌人(他们并不认识你,也没有面试过你)会查看你的简历,阅读面试记录,一起讨论你是否是谷歌想要找的人。只有得到了他们的同意,你才能得到这份工作。这又是让我不舒服的一个地方。

不爽的感觉#2:就算你以全 A 的成绩通过所有面试,也还是有可能没办法进谷歌工作,因为那些老谷歌人有可能会觉得不该录用你。

与 Olivia 谈过之后,我感觉自己被录用的机会非常渺茫,但我决定就从丰富自己经历的角度来说,我也要努力在面试的道路上走得更远一些。

第一步:远程编程面试

Olivia 帮我安排了第一次远程编程面试。在等待面试的时候,我在 geeksforgeeks 网站上做了许多题,并完成了上面的“面试准备必学课程”。我并不太推荐这个,因为课程上的问题都特别抽象,而且平台也有很多问题。但对于第一次编程面试来说,还是绰绰有余的。

面试还是在谷歌 Hangouts 上举行的。面试官简要地自我介绍了一下,就出了一道题给我做。我不能说太多这道题的具体细节,毕竟这样不合适,而且也不会对你有什么帮助。我只能说这是一个象棋设计中的贪婪算法问题。我花了 50 多分钟完成了这道题,几乎没用面试官给我任何提示。我用 Python 给出了答案和相应的测试。这类面试一般都是在某种共享笔记本上进行的,这一次我用的是 Google Docs。老实说,我还是挺喜欢这个面试官和这道考题的。

我在忐忑不安中等待着结果,也不知我到底表现如何。过了一个星期,我忍不住去问了问面试官,才总算为这个阶段画上了一个句号。后来才知道原来每轮面试都是这样的:总要等上一个星期,总要问问面试官,然后才会有面试结果。

小贴士#2:别不好意思,直接找面试官问结果就好了。

Olivia 说我的面试结果是“位于平均水平之上”。另外有点不足之处在于我解决问题花的时间太长了:本来题目设计是不能超过 45 分钟的。因此 Olivia 为我安排了第二轮远程编程面试。这时候我总算知道了,谷歌认为我的水平在软件开发者中只能算一般,而不是杰出。不过我还是会继续努力。

一个星期之后举行了第二轮远程编程面试,过程和第一轮非常相似。考题也非常简单。这是一个组合问题,要用上数学公式,并且要仔细考虑边界条件。我花了 40 分钟就完成了,可以这么快速而又优雅地解决这个问题,这让我非常高兴。于是我又花了一个星期等结果,如果通过,下一轮就要到波兰去一趟,进行现场面试了。

等待持续了一个星期,在这段时间内面试官没有回复我的任何问题。Olivia 回复说她出差了,等回到公司之后就会告诉我进一步的消息。面试结束后过了两个星期,我才接到了 Olivia 打来的一个电话,说我的面试结果仍是“位于平均水平之上”,不足之处在于我用了太多的伪代码。她也提到我的测试做得很好。可能原因在于四年前我读过《谷歌软件测试之道》这本书吧,谁知道呢。

小贴士#3:你的每一行代码都要被测试到。当面试官让你对代码做测试时,你就直接把这句话说给他听,然后再开始写测试用例。

谈话的开头是如此令人愉快,接下来 Olivia 却告诉我她不知道下一步的安排是怎样的,我还要再等等看。又过了一个星期,Olivia 给我发了封邮件,告诉我下一个面试官叫 George,这是个伦敦公司的同事,我还要再通过两轮远程编码面试才行。接下来的事情 George 会为我安排。

当天晚些时候我和 George 打了个电话,他说我的编程面试会在一个月内完成,仍然是远程的方式,具体日期可以由我来选择。他没有透露做远程面试的原因,但说了接下来的编程难度会远大于之前。如果我能通过,接下来就会受邀去他们办公室现场面试。我考虑了一下,觉得既然已经有了开头,我就该一直继续下去,总要得到个结果。

第二步:更多的远程编程面试

于是我开始准备另外两场面试。这次我用的是 HackerRank 和它的“面试准备工具集”。我推荐这一套工具,上面的体验和实际发生的面试非常相似。

小贴士#4:要准备谷歌的编程面试,最好用 HackerRank 和它的“面试准备工具集”做练习。

新年刚过,面试的安排来了:第一场安排在一月 20 日的上午 11:00(时长 45 分钟),第二场直接安排在第一场结束的 15 分钟之后。这实在太让人意外了。我问 George 能不能把面试安排在两天,一天一场?结果回复很让我意外:“很不好意思,Ilya,我们需要把面试安排在同一天,这样才能让你参与的面试环节少一些,也让面试更高效一些”。这一点也让我挺不舒服的。我等他们等了好几个星期,结果反过来他们现在想“更高效些”。

不爽的感觉#3:谷歌不会迁就你的时间安排。

这一次的面试题对我来说就比较难了。第一道是棘手的图搜索问题,我开始时只想到了穷举的方法,后来想明白其实可以用图的方案来解决,但为时已晚。

第二道题是关于“2048 游戏”的。这是头一次我没能想明白题面到底是在考什么,可能跟我从来没玩过 2048 游戏也有关。这道题要求我能在 2048 游戏中取胜,并且用比较优雅的方式安排好下个面板的状态。过了两天我才想明白,这 2048 游戏实际上是“15 拼图”游戏的变种,用 A* 搜索算法就可以找出解决方案。

很明显,这是我的错,准备面试的时候我忽略了图算法。不要再犯我的错,我在开篇时就提过,最好全力准备面试。

一个星期之后,George 给我打了个电话,告诉我没能通过面试,建议我努力补补算法复杂度和图理论相关的知识。他还提到一年后我可以再次申请谷歌的工作。

这次谷歌面试经历带给我的收获

从一开始我就知道成功的概率很小,但我还是收获颇丰的,主要就是经验,各方面的经验,而且对谷歌的内部工作机制有了一些了解。谷歌总是宣传她的工作条件有多么好,这也许是事实,但对我来说并非如此。这几个月的面试经历告诉我,其实谷歌也就是另一家大型公司而已,内部也有着她自己的官僚问题、模糊的流程、奇怪的规则,等。大家想了解一下谷歌的另一面的话,可以读读 Michael Lynch 的贴子:“ 为什么我告别谷歌,成了自由职业者 ”。

接下来的安排

经历了这次谷歌的艰苦卓绝的面试,又在若干家小公司面试之后,我觉得我不适合在别的公司打工。我想成为一名企业家,创办自己的公司。很明显第一步就是成为自由职业者。我有着丰富的全栈网页应用开发经验(我最擅长的技能包括 Node.js/Javascript/React/Docker,你可以在我主页上“我的项目”页面了解一下我的项目经验)。

现在我正在积极寻找客户和提高知名度。如果我可以帮你做什么项目,或者你知道哪里在寻找远程的全栈开发者,请立即与我联系。我很愿意了解你的业务,也可以免费为你提供一些建议。如果我们双方都觉得可以合作,那就可以更进一步。合作不成也没关系。请直接通过邮件 ilia@ipirozhenko.com 联系我。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章