写点什么

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:423054

评论

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

高效!启科量子线路模拟器 QuSprout 与 Amazon HPC 集成,赋能量子计算

亚马逊云科技 (Amazon Web Services)

量子计算 Hero 专栏

单体分层应用架构剖析

京东科技开发者

架构 模块 应用架构 服务层 业务层

“鸿蒙开发套件”焕新升级 端到端赋能助力开发运维事半功倍

最新动态

《鸿蒙生态应用开发白皮书》正式发布,携手更多开发者迈入鸿蒙世界

最新动态

观察者模式在spring中的应用

京东科技开发者

Java spring 编程 观察者模式

Spring6正式发布!重磅更新,是否可以拯救Java

宋小生

高管对上新老板的 Twitter

HoneyMoose

异常的基本概念和Java中的体系

共饮一杯无

Java 异常 11月月更

代码质量与安全 | 使用Incredibuild加速Klocwork静态代码分析

龙智—DevSecOps解决方案

代码静态分析 SAST工具 SAST 编译器 加速器 编程语言

深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化

Serverless Devs

阿里云 Serverless

从零开始学习Java系列之Java运行机制与跨平台特性

千锋IT教育

ITSM | 对话——从业务场景、中国市场策略角度解读Atlassian ITSM解决方案

龙智—DevSecOps解决方案

ITSM ITIL

【实用工具】解决PCB设计难题,痛击风险漏洞!

华秋PCB

工具 PCB PCB设计

华为开发者联盟学堂上线超1800门课程,为开发者提供一站式赋能

最新动态

技术指南 | 如何集成Perforce版本控制系统Helix Core (P4V) 与敏捷规划工具Hansoft

龙智—DevSecOps解决方案

敏捷 版本管理

车间工厂看板还搞不定,数据可视化包教包会

葡萄城技术团队

数据可视化 看板 智能工厂

PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

汀丶人工智能

图神经网络 图学习 11月月更 论文节点分类任务 新冠疫苗任务

DHorse系列文章之操作手册

tiandizhiguai

微服务 云原生 k8s管理 微服务治理 Serverless Kubernetes

JVM 核心知识体系

钟奕礼

Java java面试 java编程 程序员‘

2022中国区Cyber Monday限时优惠来袭,Linux基金会开源软件学园带来优惠

kk-OSC

k8s Linux基金会 CKA CKS

这可能是最全的SpringBoot3新版本变化了!

艾小仙

Java spring could spring-boot

即时通讯技术文集(第7期):长连接网关、P2P等 [共10篇]

JackJiang

网络编程 IM 即时通讯IM

东莞理工学院-网安学院举办第二届“火焰杯”软件测试高校就业选拔赛颁奖典礼

测试人

软件测试 自动化测试 测试发开 测试比赛

软件测试自动化“领导者”SmartBear举办首场中国线上研讨会:洞悉全球自动化测试走向,探讨降本增效之策

龙智—DevSecOps解决方案

自动化测试 API测试 UI测试 软件测试自动化

端云一体开发,助力鸿蒙应用开发效率全面提升

最新动态

咱也不知道这份牛P哄哄的【Nginx实战】资料是不是你们想要的

钟奕礼

Java 程序员 java面试 java编程

DNS中有哪些值得学习的优秀设计

小小怪下士

Java 程序员 DNS

《鸿蒙生态应用开发白皮书》正式发布,携手更多开发者迈入鸿蒙世界

最新动态

一次MTU问题导致的RDS访问故障

京东科技开发者

数据库 Linux MTU RDS vpn

A/B测试有哪些常见应用场景?——火山引擎DataTester科普

字节跳动数据平台

大数据 AB testing实战

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