面经 | 拿到 Google offer,我做了哪些努力?

知识库 黑人 ⋅ 于 3周前 ⋅ 980 阅读

来 源:AI开发者@微信公众号
原标题:How I got into Google
作 者:Prajakta Tathavadkar
翻 译:薛原、谢玄xx、Hier17、David95、霜骨炽翼、LMike
审 校:唐里、王立鱼

两个月的旅程,我的梦想公司

在我脑海中的某个地方,有个声音告诉我,我必须去尝试!毕竟进入谷歌对我来说并非不可能的事。直到尝试后才会知道结果,有点像薛定谔的猫,这种想法让我感到不安。

像许多技术人员一样,从一开始谷歌就是我梦寐以求的公司。我通过这次谷歌面试后,很多朋友都向我寻求一些技巧和指导,以面对他们即将到来的面试。在这些对话过程中,我开始注意到一定的方式,觉的有必要记录这些方式,因为我知道在面试时进进出出的困难。这是一个艰难的过程,如果你正在做一份全职工作,有时会特别费劲。网上的很多文章在我的准备过程中帮助了我,本文是我回馈开发者社区的一种方式, 希望可以帮到大家!

有趣的事情是,我在2014年尝试去谷歌面试了一次,但是以失败告终。那天的面试非常糟糕,我的大脑一片空白,草草结束了和面试官的谈话。

所以,在这篇文章的后面,我会提及在我之前准备面试的过程中所犯的错误,这些错误我真希望当时没有发生。

动机

在过去的3年半里,我在一家刚起步的公司和几家金融科技公司当软件工程师。每一次经历都让我受益匪浅,我想说的是,比起我刚毕业时一无所知的状态,在每一次面试里我所获得的知识都让我朝着谷歌的旅程更容易了些。这次当我决定去寻找下一个机会时,我很清楚一个事,我要花时间来为我的下个更好的工作做准备,并且不为任何更差的工作妥协。尽管我在面试一些科技行业里的巨头,但说实话,我不曾认为我有1%的希望会进入谷歌,因为众所周知这是行业里最难的软件工程师面试。但是不管怎样我知道我必须去试一试,因为进入谷歌不是不可能。如果我不去尝试,我将永远不会知道结果。

一般来说,求职者最容易忽视的部分就是阅读有关这家公司的资料,并为之做专门的准备。我能说的是,这是一个能让你脱颖而出的步骤。

明确面试的几个要素

据我的经验,任何面试的准备,都需要掌握5个重要的因素。代码能力、设计、语言充足的概念、项目经历和简历,当然还有对该公司充分的研究和理解。

* 代码能力

在我参加过的企业面试中,所有企业都至少有两轮纯算法问题。面试官会给你一个指定的问题,而你需要为它提出一个解决方案,用代码实现。

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

* 设计

根据我面试的经验,一些公司会有一轮设计问题,面试官会给你一个相当抽象的系统,你需要为该系统进行一个设计。

例如:如果你要从头开始搭建一个社交网站,你将如何设计系统?

对于接下来的3个部分,一些公司将为它们专门设置一轮考核,而另一些公司可能会将其与其他部分(如编码或设计)结合起来。

* 熟悉你所选择的语言

对于大多数面试,企业方往往会要求你挑选一门你最熟悉的语言。这要求你掌握除了代码能力以外的,在大多数情况下适用的该语言的基本表达。一些企业可能只会问你一些最基本的语言问题,而一些企业则会深入到某一具体领域进行语言提问。

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

* 现有的项目/简历

由于我完全将自己的注意力集中在代码和设计环节,所以这是一项我有时会完全忘记准备的一个部分,但是面试一定不仅仅是代码面试!它更意味着要证明你自己是一个潜在的靠谱队友。这也就要求你向面试官阐述你在你上一个项目中如何与他人愉快合作的经历。这部分的问题可以是一些关于你简历上所写的技能问题,或者是关于一个项目的问题。

例如:你可以简要地讲讲你最引以为傲的项目经历吗?

* 企业相关知识/好奇心

对于面试你的企业足够了解并做好充足的准备,这基本上是面试者最易忽略的环节,而我所能说的是,这是将你和其他面试者区分开来的几个环节之一。面试者将会直接或者间接地问你这些问题,不过阅读本篇文章将会让你更好地准备以上几个面试环节。如果你想要在接下来的面试环节中表现良好,那你已经在正确的行进方向上了。

例如:你为什么要选择XYZ作为你下一个尝试目标?

file

在我的准备过程中,油管是我的良师益友。不仅是因为我通过它在努力学习,而且我也通过看它进行放松(强推艾伦秀)。我从来都不敢相信,在了短短两个月之内,我就可以在油管的屏幕后面工作了!奇迹总会发生的,不是吗?:)

准备面试

我会从各种不同的方面准备面试。只要能帮助我面试通过的东西,我都会去了解。

* Udemy课程

一开始为了准备面试,我在Udemy上面买了三个课程。这些课程使我了解了一些基础知识。提示一下:我并没有完成全部的课程,只是完成了比较重要的那部分。我选择学这些视频,因为相较于文字,我个人认为视频的形式能让我学的更快。尤其是当别人想你解释一件事的时候,视频比你自己去理解要好得多。我最近都没有面试过,通过课程中的‘编程练习‘中,我能更加熟悉面试。

1.数据结构和算法分析:理解数据结构的重要性。

https://www.udemy.com/course/data-structure-and-algorithms-analysis/

2.给软件开发者的Java编程大师班:讲解java编程基础。

https://www.udemy.com/java-the-complete-java-developer-course/

3.软件工程师面试揭秘:理解Google面试的全过程。

https://www.udemy.com/course/software-engineer-interview-unleashed/

* Leetcode 高级版

面试像我这种职级的人(比较高水平的面试),很多时候会问编程或算法。由于我没有太多的实战经验,Leetcode(一个编程平台)高级版就是对我来说最合适的。它花费了我35美金,但是每一分钱都是值得的。Leetcode是我用来练习编程的唯一一个平台,如果你想成为高手,我非常强烈的推荐给你。编程即需要特别深入也需要特别广泛的知识。因此我付出了一整个阶段来准备。在文章的后半部分,我会讲到我是如何充分利用这些资源的,尽管我也犯过错误。

* YouTube视频

在我准备面试的过程中,YouTube一直陪伴着我。不仅用来学习,还用来娱乐(强烈推荐一个节目:TheEllenShow)。我从没有想过,经历两个月的准备之后,我能有机会为YT工作,真是个奇迹。

我的做法就是看各种可能是你难以理解或者只片面理解的话题或概念相关的视频。这里我列出了一些对我帮助很大的视频。不过我看过的还是有非常多的其他的视频没列在这里。因为你从来不会知道一些细节的、有用的信息会出现在哪里。

https://youtu.be/ko-KkSmp-Lk

https://youtu.be/XKu_SEDAykw

https://youtu.be/oWbUtlUhwa8

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

https://youtu.be/nYFd7VHKyWQ

https://youtu.be/CZ3wIuvmHeM

其他资源

如果你还没有做到这一点,那么请看一些Gayle Laakmann McDowell(《程序员面试金典》、《金领简历》等书籍的作者)提供的资源吧:

  • 破解代码面试

  • 一步步地完成代码面试:(超级有用的图表)

file

为设计类面试做准备:

我于在线面试的一个月之前开始集中的写代码练习的准备,最后大概做了有六七十道题,而且这些就足以通过代码面试了。关键在于要掌握隐藏在题目之下的计算机基础知识。

我为期一个月的强化技术准备

* 了解LeetCode

你可以在LeetCode高级版这个网站上编写并运行程序来解决一些编程类问题,在面试中你也会被问及相似的问题。特别说明:每道在Google面试中问到我的问题在网上找不到原题,但是涉及的基础知识都是相似的。因此代码面试基本就是要掌握解决问题的手段技巧,识别出(这道题的)模式并且为此做一些练习。

LeetCode高级版主要分为四大部分:

  • 简单题

  • 中档题

  • 难题

  • 特定公司的题目

每个大目录下又分了多个子目录:

  • 数列

  • 字符串

  • 链表

  • 回溯法

  • 查找/排序

  • 数学类(概率论等等)

* 计划

我于在线面试的一个月之前开始集中的写代码练习的准备,最后大概做了有六七十道题,而且这些就足以通过代码面试了。关键在于要掌握隐藏在题目之下的计算机基础知识。

每天至少做两道题。简单题会有所不同,可能要花30分钟到1小时不等。中档题对我来说确实很难解决(有时甚至简单题也很难解决)。将你的中档题解决时间设定为1小时。在15分钟后,如果还不知道解决方案,可以查一下(方法)然后尝试完成它。一小时后,如果你的答案还是不对或无法通过某些测试用例,直接停下来然后看看给的答案。下面是一个大致的计划,可以随意打乱点顺序啥的以免准备的时候感到单调乏味。

  • 完成数组和字符串类型的简单题(5天时间),以此获得些自信。

  • 每天做一道数组或字符串的中档题,同时做一道链表或回溯法的简单题。

  • 做树的简单题以及图论的题

  • 做排序和查找的相关题目

  • 做其他的剩余题目

我把准备工作集中在掌握大多数简单和中档题上了,然后做了不到10个难题。如果我不理解某道题的答案,我会直接在YouTube上搜索,看看能否找到可能解释了这道题答案的人和视频。回溯法就是我曾经挣扎过的一类问题。

一个我希望我能撤回的错误

LeetCode高级版中有一个部分是针对特定公司的一些题目。有一系列像Google,Facebook等公司的习题集。我最大的错误就是从准备Google的习题集开始的。那些题目极难因此导致我变得没有动力了,并最终使我一无所获。要确保你是先从简单题开始的,之后再是中档题和难题。

我最喜欢的LeetCode高级版的特点

  • 能运行很多不同的测试用例来测试你的答案。

  • 能生成一个图表让你能和其他高级版用户的比较一下运行时间。

  • 能看到别的LeetCode用户提交的运行时间最短的样例答案。

我自己常常会想,“我如果没能进Google怎么办?”。答案是“没什么大不了, 我有后备计划。我会尝试申请后面的一系列顶尖的公司并且会一直尝试直到我得到我想要的。”这样做真的能使我冷静下来而且表现得更好。

常规技巧

  • 不要给自己压力。我过着自己的生活,在为面试做准备的同时,也把自己的100%奉献给了现在的公司。

  • 每天花更少的时间,但坚持一两个月,让每天的这几个小时富有成效。

  • 周末是你最好的朋友!最大限度地利用它们。我个人有一个“能量周末”,我称它为“能量周末”,在那里我完成了几乎所有的leetcode简单的问题和一些中等问题。这真的给了我很大的鼓舞。

  • 招聘人员也是你的朋友!在任何面试之前,都可以向招聘人员询问面试的形式、期望、准备材料、一般技巧等。这将帮助你把注意力集中到特定的事情上,否则CS将是一个巨大的领域。

  • 先从一般的准备工作开始,如Udemy课程,YouTube视频,阅读文章等。把leetcode部分留到最后,因为如果你最近(在一个月左右的时间内)写过类似的问题,你在面试中会更有效率。

  • 我的建议是,不要把整整一周的时间都花在编程上。混合一下。偶尔做一些设计。看一些中间的视频。开始享受学习的过程吧!

推荐阅读:
深圳汇顶科技股份有限公司面试经验(算法(图像)岗位)
机器学习成才之路:这是一条 GitHub 高赞的学习路径
计算机视觉面经之追一科技和乐信

file

△ 扫一扫关注 极市平台
每天推送最新CV干货

黑人

回复数量: 0
暂无回复~
您需要登陆以后才能留下评论!