历时两个月 我一步步拿下 Google Offer

历时两个月,我终于踏进了梦想的公司……

在内心深处我深知必须努力尝试,因为进入 Google 并非不可能。只有尝试过我才会知道结果,有点像薛定谔的猫,这种想法让我感到不安。

历时两个月 我一步步拿下 Google Offer

作者 | Prajakta Tathavadkar

译者 | 弯月

与其他众多的技术人员一样,从一开始 Google 就是我梦寐以求的公司。 此次在我通过 Google 的面试后,很多朋友都来找我,希望我能给他们接下来的面试提供一些技巧和指导。在与他们交流的过程中,我总结出了一些心得,而且觉得既然我明白面试的困难,就更应当把这些心得记录下来。整个过程非常艰难,尤其是如果你正在从事一份全职工作的话会更加费劲。在我准备的过程中,网上的很多文章给予了我很大的帮助,现在轮到我回馈开发者社区了。希望对大家有所帮助!

有趣的是,我在 2014 年参加过一次 Google 的面试,但失败了。那次面试非常糟糕,所以我完全记不清当天的情况了,那么只好谈一谈我这次的面试经历了。另外,在本文的最后,我会提到在准备面试期间我犯的一个让我十分后悔的错误。

历时两个月 我一步步拿下 Google Offer

动机

在我从事软件工程师三年半的时间里,我曾在一家创业公司与一些金融科技公司共事。每段经历都教会了我很多东西,每一步获得的知识都让我距离进入 Google 的目标更近了一步。这一次,当我决定寻找下一个机会的时候,我做了一个明确的决定:我想花点时间来为进入科技大公司而认真做准备,这一次我不会再屈就妥协。尽管我也面试了几家大型的科技公司,但老实说,我能够进入 Google 的机会连 1% 都没有,因为 Google 软件工程师面试的难度是业界数一数二的。但在内心深处我知道我必须努力尝试,因为进入 Google 并非不可能。只有尝试过我才会知道结果,有点像薛定谔的猫,这种想法让我感到不安。

历时两个月 我一步步拿下 Google Offer

确定面试的要素

根据我的经验,一般面试准备都涉及掌握五大重要内容:写代码、设计、语言特定的概念、以前的项目经历、简历,以及最后一项(但并非最不重要)是具体了解该公司。

写代码

在我的职业生涯中,我参加过面试的所有公司都至少有两轮纯算法的问题,他们会给你一个问题,而你需要提出一个解决方案并写出代码。

例如,编写代码在控制台上输出数字 1 到 10(当然这只是一个例子)。

我会在本文的其余部分详细阐述本节的具体细节。

设计

根据我参加的面试的级别,有些公司会给出一轮设计问题,他们会给你一个相当抽象的系统,你需要为该系统做一份设计。

例如,如果你需要从零开始构建一个社交网络,那么你将如何设计这个系统?

对于接下来的 3 个方面,有些公司会专门再给出一轮,而有些公司则可能将它们融合到写代码或设计的环节。

熟悉首选语言

在大多数面试中,你都需要提供一门你最熟悉的语言。除了编程能力之外,在大多数情况下,你应该了解这门语言的基础知识。有些公司可能会问你一些基础知识,而有些公司则可能会深入问你某个领域。

例如,Java 中的继承是什么?

以前的项目/简历

这是有时我会完全忘记准备的环节之一,因为我会全神贯注到写代码和设计等方面,但面试不只是写代码!面试是为了证明你是一个潜在的队友。这就需要向他们解释在过去的项目中你如何与其他人合作。这个环节的问题因人而异,比如他们会根据简历上的技术或项目提问等。

例如,谈谈最让你感到自豪的项目吧。

了解公司/好奇心

认真了解公司并专门做准备通常是最容易被大多数候选人所忽视的环节,而我只能说,这才是真正能够让你脱颖而出的环节。他们可能不会直接问及有关公司的问题,但是做一些了解可以帮助你更好地为上述环节做准备。你阅读我的这篇文章正是因为你想在即将到来的某次面试中取得好结果,那么说明你已经在朝着正确的方向努力了。

例如,为什么你选择我们公司作为你的下一个目标呢?

历时两个月 我一步步拿下 Google Offer

面试准备

我利用了各方面不同的资源来为面试做准备,下面我列出了在某个具体领域内曾对我有所帮助的资源:

课程学习

我在做准备的时候,购买了以下 3 门 Udemy 的课程。这些课程帮助我明确了基本知识。注意:我未能完全学完这些课程,但完成了大部分内容。此外,我选择参加这些课程是因为与阅读文本相比,我个人通过视频的学习可以更快更好地掌握内容。再加上让别人讲给你听,比你自学学得好。我已经很久没有参加过面试了,所以这些课程还帮助我进行了编程练习。

  1. 数据结构与算法分析:了解如何从头开始实现数据结构。
  2. 面向软件开发人员的 Java 编程精讲:Java 编程的基础知识。
  3. 全面解析软件工程面试:通过一些实时的练习,了解 Google 面试的整个流程。

Leetcode 高级会员

对于我这个级别的人员来说,大多数科技巨头的面试都会围绕编程与算法,因为我没有太多行业方面的经验。所以,Leetcode premium 的高级会员非常适合我。我需要缴纳 35 美元的月费,但是我花的 70 块钱的每一分都物有所值。Leetcode 是我练习编程的唯一资源,我强烈向那些想要进入科技大公司的人推荐。编程的准备工作范围很广且内容很深,所以我在后面的小节“一个月集中精力做技术准备”中详细介绍了这个环节,解释了我充分利用该资源的方法,以及在此过程中我犯的一些错误。

YouTube 视频

在准备期间 YouTube 帮了我很多忙。不仅仅是为了学习,也是为了放松。再怎么疯狂我也从未想过短短两个月后我会参与 YouTube 的工作!奇迹真的出现了!

在你发现有些概念理解起来有困难或者只能理解一部分的时候,你可以看视频。下面我列出了一些给了我很大帮助和改变了我的命运的一些视频。然而,在浏览获取信息的时候,我曾观看过许许多多其他的视频。你永远无法预知哪条小消息可能会帮到你。

https://youtu.be/oWbUtlUhwa8
https://youtu.be/78t_yHuGg-0

其他资源

Gayle Laakmann McDowell 的图书可以帮助你做好编程面试的准备:

《Cracking the Coding Interview》(攻克编程面试)

一步一步攻克面试(超级有用的图):

历时两个月 我一步步拿下 Google Offer

准备设计面试:

Hired in tech 的课程:

https://www.hiredintech.com/classrooms/system-design/lesson/52

来自 Ramon Lopez 的有关系统设计面试方面的播放列表:

历时两个月 我一步步拿下 Google Offer

一个月集中精力做技术准备

玩转 Leetcode

Leetcode 是一个网站(https://leetcode.com/),你可以在上面编写和运行与面试问题类似的程序。注意:在 Google 的面试中,他们问我的问题网上并没有,但基本概念仍然相同。因此,归根结底你还是要掌握解决问题的艺术、识别规律并进行练习。

Leetcode premium 有4个级别:

简单

中等

困难

公司特有的问题

每个级别又有多个子类别:

数组

字符串

链接列表

回溯

搜索/排序

图表

数学(概率等)

计划

现场面试前的一个月我开始了编程集中训练,最后总共解决了大约 60-70 个问题,这是攻克面试所必须付出的努力,关键在于计算机科学的基础知识。

每天我都会解决两个以上的问题。简单的问题花费的时间可能有所不同,大概需要 30 分钟到 1 小时。中等难度的问题实际上对我来说很难(有时反倒是连简单的问题对我来说很难)。中等难度的问题限时为 1 个小时,开始 15 分钟后,如果你不知道解决方案,那么就需要查找并尝试实现。1 个小时后,如果你的解决方案行不通,或无法通过某些测试用例,那么就只能停止并查看解决方案。下面是一个粗略的计划,但是你可以随意改编,以免准备过程过于枯燥。

完成数组和字符串的简单问题(前 5天),赢取一些自信;

每天做一个中等难度的数组或字符串问题,以及一个简单的链表或回溯;

树和图表的简单问题;

排序和搜索;

其他剩余的问题。

我的准备工作主要集中在掌握大多数简单问题和中等难度问题上,困难的问题我解决了不到 10 个。如果我无法理解某个特定的解决方案,那么我会搜索 YouTube,找个人来给我解释这个解决方案。回溯是我最难理解的一个方面。

一个让我很后悔的错误

Leetcode 高级会员中有一个环节是某个公司特有的问题,也就是 Google、Facebook 等公司特有的问题。我犯的最大的错误就是一开始就准备了 Google 的问题。那些问题超级难,结果让我丧失了动力,最后只好不了了之。所以,一定要从简单的问题开始,然后逐步尝试中等难度和困难的问题。

我最喜欢的 Leetcode 高级会员功能

下面是我最喜欢的三个功能:

针对你的解决方案运行各种测试用例;

生成一个图表,让你可以与其他高级用户比较运行时;

查看其他 Leetcode 用户提交的最佳运行时的示例解决方案。

历时两个月 我一步步拿下 Google Offer

小贴士

不要给自己压力。在准备面试的过程中,我一如既往地生活,并 100% 地完成当下公司的工作。

每天花费的时间不需要太多,但是要坚持一两个月,有效利用每天的准备时间。

周末的时间十分宝贵,要充分利用!我把周末称作“周末加油站”,因为如果我能在周末完成所有 Leetcode 上的简单问题和一些中等难度的问题,那么就会感觉元气满满。

招聘人员也是你的朋友!在参加面试之前,可以随时向招聘人员询问招聘的形式、期望、准备材料以及提示等等。这可以帮助你将注意力集中在重要的事情上,因为计算机科学这个领域太大了。

首先从常规的准备开始,比如参加 Udemy 课程、观看 YouTube 视频、阅读文章等等。把 Leetcode 放到最后,因为如果最近你编写了类似的问题(在 1 个月以内),对你的面试帮助才最大。

我建议你不要一整周都专门用于编程,应该结合其他方面的学习。时不时地做一些设计,在中途观看一些视频,学会享受学习的过程!

特别对于 Google 来说,有一件事情对我的帮助很大,那就是我要求招聘人员给我提供了一台 Chromebook 来写代码,因为通常白板会给我制造麻烦。我的做法是:利用白板整理出解决方案,方便面试官查看,然后最后用 Chromebook 写出代码。现如今很多公司都鼓励这种做法,但是你必须提出这样的要求!

有时只是在网上随便闲逛也会有所收获,我曾阅读过其他人攻克面试的文章,在很多方面给予了我帮助。

做最坏的打算,曾经我问自己:“如果进不了Google,该怎么办?”我的答案是:“没关系,我有一个备用计划。我会尝试其他顶尖的公司,并继续努力,直到我拿到我想要的结果。”为此我保持冷静,并取得了更好的表现。