10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

  • 2020-02-27
  • 本文字数:3582 字

    阅读完需:约 12 分钟

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 联系我。


2020-02-27 12:422922

评论

发布
暂无评论
发现更多内容

JMeter 执行 JUnit 测试用例:集成与自动化的高效解决方案

测吧(北京)科技有限公司

测试

软件测试丨SDK 功能测试

测试人

软件测试

数电票:引领会计行业数字化革命的关键力量

用友智能财务

税务 会计

公有云环境下如何管理IP地址

郑州埃文科技

【YashanDB知识库】YashanDB与Oracle数据类型对齐

YashanDB

数据库 yashandb

Byteman 使用指南(二)

FunTester

怎么制作产品原型?产品经理常用的5款原型工具盘点!

职场工具箱

产品经理 在线白板 办公软件 绘图工具 产品原型设计工具

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

小喵子

云电脑 云游戏 ToDesk ToDesk云电脑

Svelte 最新中文文档翻译(1)—— 概述与入门指南

冴羽

Vue 前端 Svelte 中文文档 SvelteKit

Svelte 最新中文文档翻译(2)—— .svelte、.svelte.js 和 .svelte.ts 文件

冴羽

Vue 前端 React Svelte SvelteKit

【YashanDB知识库】多csv文件一键式导入yashandb

YashanDB

数据库 yashandb

【YashanDB知识库】锁冲突检查

YashanDB

数据库 yashandb

【YashanDB知识库】重装新库及元数据和数据导出导入指导

YashanDB

数据库 yashandb

JMeter 脚本开发与优化:解锁 Beanshell 在性能测试中的强大功能

测吧(北京)科技有限公司

测试

如何使用 Python 进行文件读写操作?

威哥爱编程

Python

VMware Tools 13.0.0 发布 - 客户机操作系统无缝交互必备组件

sysin

vmware

【YashanDB知识库】手工迁移Doris数据到崖山分布式

YashanDB

数据库 yashandb

什么是可信数据空间?有什么作用?

郑州埃文科技

数据要素

Timecho 天谋科技官网解决方案板块上线

Apache IoTDB

微信 Callkit 扩大测试范围;DeepSeek-R1 模型发布,性能对标 OpenAI o1 正式版丨 RTE 开发者日报

声网

QQ设计团队分享:手Q语音消息改版背后的功能设计思路

JackJiang

网络编程 即时通讯 IM

ITIL认证工具商-ManageEngine Servicedesk Plus

ServiceDesk_Plus

ITIL IT服务管理 ITIL认证 ITIL工具

“全球金牌敏捷课程” · 2月22-23日CSM认证课程 · Jim老师

ShineScrum

Scrum Master Scrum认证 scrum敏捷开发

分布式系统架构:分布式缓存

不在线第一只蜗牛

架构 分布式

档案事业与数据要素之间有什么关系?

郑州埃文科技

数据要素

数据要素市场化与农业现代化

郑州埃文科技

数据要素

2020年的谷歌面经:“远程编程面试”流程_文化 & 方法_Ilia Pirozhenko_InfoQ精选文章