关注上方“深度学习技术前沿”,选择“星标公众号”,
资源干货,第一时间送达!
本文转载自:图灵TOPIA | 编译:安然
作者:Pablo Samuel Castro
Pablo Samuel Castro是谷歌Brain的一名高级研究员,其研究内容包括强化学习、机器学习等。近日,Pablo分享了他作为谷歌面试官的一些经验,以期对有意向到谷歌工作或从事软件工程工作的研究者有所帮助。
人们经常问我:怎样才能在谷歌找到工作?基本要求是通过面试;这又会涉及另一个问题:我是如何通过谷歌面试?
虽然通过谷歌面试没有硬性规定,但我确实有一些在过去帮助过别人(包括我自己)的技巧和指导方针。尽管这篇文章的大部分内容都是谷歌特有的,但大部分内容仍然应该适用于其他公司的软件工程职位。
这篇文章主要适用于软件工程(SWE)的职位,但其中的一些内容应该也与其他职位相关(如研究科学家);在结尾处可以看到关于这个职位的一些想法。虽然谷歌的面试流程不是很完美,但是我觉得它是很好、很客观的。
无论结果如何请记住,你的价值不应该由是否得到了这份工作来决定。
背景介绍
我应该申请谷歌吗?这是一个常见的问题,答案几乎总是:是的!这将挑战你的极限,你可能会学到一些你可以提高的东西,如果你确实尝试了,但没有成功,我保证你会成为一个更强的程序员或面试官。
当完成博士学位时,我的想法是成为一名学者,但当时的就业市场真的很糟糕(大约在2011年)。在主管的建议下,我申请了谷歌。这是我申请的唯一一份行业工作,因为这是我最感兴趣。
但是在我决定申请之后,我为面试做了很多准备。我确信,如果我在申请当天就参加面试,我是无法通过面试的:我花在准备面试上的时间是至关重要的。
当我参加面试时,我觉得我已经做好了最大的准备。我的努力得到了回报:我收到了加入匹兹堡谷歌的工作邀请,从2012年开始就在谷歌做SWE。
我在Google匹兹堡的办公桌
文章的其余部分是我的经验:
为面试做准备
作为SWE在谷歌工作
进行数百次采访
主持数十个面试研讨会
成为招聘委员会成员
在谷歌内外,我与许多人进行了讨论。
这里的建议并不能保证你能得到谷歌的工作,但它应该会有所帮助。
如何准备谷歌面试?
你可以在谷歌求职网站上找到你认为合适的工作。
找人推荐会有帮助,如果你认识已经在谷歌的人,让他们推荐你。如果你不认识谷歌的任何一个人,你已经申请了职位,但是在一段时间里没有收到回复了,请随时把你的简历发给我,我看看有什么我可以做的。
注意,这仍然不能保证你会得到面试机会。不幸的是,我对应征者如何被选中参加面试知之甚少,在面试过程中的影响力也有限。
我如何准备谷歌面试?
至少有三个要素能让你在面试中表现出色:编码、算法和数据结构,以及个性。谷歌经常有研讨会,你可以做模拟面试。
编码
你需要能够编写功能代码,最理想的情况是能够立即编译/运行。语言不是特别重要,但是你需要具体说明你想用什么语言面试,所以一定要掌握好。伪代码不是一种语言。
贫乏的编码
如果依赖于花哨的 IDE来编写代码,那就去做最基本的工作吧!无论你用什么程序来写代码,请关闭语法高亮和自动完成。事实上,尝试使用一个基本的vim来编写所有的代码是大有裨益的(即使在今天,我仍然使用一个非常简单的vim来编写大多数东西,包括这篇博客文章),我想你也可以使用Emacs。
练习、练习、再练习
准备面试的时候,我主要用c++编程,所以我决定专注于此。我发现了一个在线编程比赛,它有以前比赛的日志,这样我就可以“假装”自己在比赛。很棒的是,这个在线服务可以以编程方式检查我的代码的语法和算法正确性。
我做了足够多的工作,最终可以从头开始编写c++代码来编译并解决这个问题。在做到这一点之前,我经历了很多很多的反复。很长一段时间,我仍然需要查找需要包含哪些库,如何正确地执行I/O等等。
我不记得我使用了什么网站,但似乎topcoder有一个实践问题领域,可以达到相同的目的。
浏览glassdoor这样的网站也是很有用的,那里有很多过去谷歌的面试。尝试解决所有这些问题!请注意,如果你在这样的地方看到了问题,你在真正的面试中被问到这个问题的可能性很小。
在白板上写代码
试着在白板上写代码(如果没有粉笔或白板,也可以用手写)。在白板上写代码感觉是很不一样的,但这就是你在面试中要做的。最好是你已经有了一些经验,我的建议是在白板上练习写完整的程序,然后在你的电脑上编码,并确保一次编译/运行。如果没有,再试一次!
当别人在看的时候,在白板上练习编码也是非常有用的,可以让你适应潜在的焦虑反应。
虽然有一些语法错误是可以接受的,但是我们要注意的是,如果代码很粗糙,而且语法错误很多,这表明你使用的是你可能不太熟悉的语言。
算法和数据结构
我用来准备面试的那本书是我本科时用过的:托马斯·h·科曼(Thomas H. Cormen)、查尔斯·e·雷瑟森(Charles E. Leiserson)、罗纳德·l·里维斯特(Ronald L. Rivest)和克利福德·斯坦(Clifford Stein)合著的《算法导论》(Introduction to Algorithms)。
这里并没有太多需要了解的算法和数据结构,但是这里有一些事情是你绝对应该知道的,并且是需要非常熟悉的。请注意,这绝不是详尽无遗的,如果你觉得我遗漏了什么,请告诉我!
分类:你了解几种不同的分类方法,什么时候会用?他们的复杂性是什么?
链表:它们是什么?你能从头开始编写链表吗?插入的复杂度是多少?删除吗?搜索吗?什么时候使用链表?链表有不同的类型吗?
散列函数:什么是散列函数?什么是好的散列函数?冲突是什么?如何处理碰撞?平均复杂度?最坏的复杂性?
二叉树:二叉树是什么?你能从头开始编写二叉树吗?什么是二叉搜索树?搜索的复杂度是多少?插入吗?删除吗?树的平衡意味着什么?复杂性?动态规划是什么?有什么用处?你能用它来解决一个问题吗?
图形算法:图形遍历(BFS/DFS)、有向图和无向图,你可以从头编写图形数据结构的代码吗?什么时候用图表?修改图形有哪些不同的方法?
上面的列表并不是需要了解的全部内容,但我认为知道这些都是应该的。
就像编码一样,关键是练习、练习、再练习。当你处理不同的问题时,请考虑解决这些问题的最佳数据结构。
它已经在上面的列表中有所暗示,但是你应该能够对你编写的任何代码执行复杂性分析(即big-O)。我个人几乎总是在候选人写完他们的代码后问这个问题,因为这表明他们能够分析他们实现的有效性。
正如我将在下面详细介绍的,即使你只能为一个问题提供一个简单的解决方案,如果你能够正确地分析它,也会有很大的帮助。
个性
这个有点难准备,但它仍然很重要。作为面试官,我们需要问自己的一个问题是:我愿意和这个人一起工作吗?
如果你是个天才,能够解决抛给你的所有问题,但你在面试中表现得十足差的话,那么你被录用的机会就很低。关于准备工作,我没有太多的建议,但在面试过程中有几点需要记住,我会在下面列出。
面试的时候
恭喜你,你已经安排好面试了!这已经是很大的成功了,(不是每个人都被邀请参加面试),所以你应该为自己感到自豪。这里有一些重要的事情要记住:
把它当作一次谈话,而不是审问。虽然在面试中存在明显的权力不平衡,但我们并不是要欺骗你或让你犯错。事实上,我们大多数人都在暗中支持你!
谈谈你的思考过程。一定要把脑子里的想法用语言表达出来,尤其是在你把代码写在白板上之前。作为面试官,我们需要为你的良好表现提供证据,所以通过你的思考来说话可以帮助我们收集证据。
此外,如果你误入了我们不想花时间解决的问题,我们也可以更容易地帮助你。如果你保持沉默,直接编写错误的代码,我不知道这是因为你偏离了轨道,还是因为在你的思维过程中有一个简单的误解。
另一方面,如果你保持沉默,直接编写完美的代码,我将不知道你是否真的很聪明,或者你是否已经看到了我刚才提出的问题。
简单的解决方案是很好的起点。不要觉得必须马上想出最有效的解决方案。从幼稚的解决方案开始是一个伟大的战略,原因如下:
尽管这个问题看起来微不足道,但通常存在一些难以预料的复杂情况。它们更容易通过简单的解决方案找到并解决。
它允许你非常快速地将代码放到板上,这对于收集对你有利的证据非常有用!
简单解决方案的复杂性分析可能比更复杂的解决方案容易得多。
如果你能很快地编写出简单的解决方案,那就太好了!一旦它停止了,你可以转移到更复杂的解决方案,但至少你有一个作为基线的解决方案。
对于面试官来说,理解一个简单的解决方案要比理解一个复杂的解决方案容易得多。你希望面试官理解你的解决方案:你不会因为欺骗/迷惑面试官而得到分数!
遍历一个简单的解决方案是代码的“手动分析器”,它可以帮助你识别冗余的工作和优化的机会(感谢Pascal,对于这一点)。
回到这是一个对话的问题上。从一个简单的解决方案开始,很明显你知道一个解决方案。然后你可以问面试官你是否想找一个更好的解决办法。
但是再一次,你要确保告诉面试官你从一个简单的解决方案开始。
可以简化假设。如果它可以帮助你更清楚地思考问题,那么完全可以进行简化假设(例如,“我可以假设列表已经排序了吗?”),其原因与简单解决方案类似。
这实际上是一个很好的信号,因为它表明你可以将一个问题分解为多个部分,并且你可以识别那些导致更多问题的部分。一旦你用简化假设解决了这个问题,你就可以得到一个不需要假设的解决方案;至少你已经有了一个有效的解决方案!
使用测试用例。提出一些可以在代码上测试的测试用例。写下一些测试用例将帮助你确保你的代码是正确的,它也可以帮助你说服面试官!
此外,当你试图与面试官消除误解时,在面试板上有一组具体的例子是非常有用的。面试官甚至可能会增加一些额外的测试用例来突出你可能错过的一些边缘用例。
花几分钟整理一下思绪是可以的。即使我建议你把你的想法从头到尾说一遍,也不要觉得有必要从头到尾都说一遍,尤其是如果你还没有把你的想法完全组织好,因为这往往会让你误入歧途。
简单地说“我能花一两分钟整理一下我的思绪吗?”,然后在你的头脑中解决问题,重要的是让面试官知道你在做什么。,果你觉得整理思绪的时间太长,你可能会被问题的一部分弄糊涂,这就引出了我的下一个观点:
寻求帮助是可以的。如果你感觉被困住了,可以寻求帮助,但要尽量具体说明你的问题症结是什么。通常可能只是你在问题中误解了什么,你没有注意到问题的一个关键方面,有时甚至可能是面试官忘记提及问题的一个重要部分!我曾经遇到过这样的面试,应聘者似乎真的被难住了,但只要我给他们一点帮助,他们就能解决问题。
不知道也没关系。在进行访谈时,我实现了一个自定义数据结构,以简化解决方案的其余代码。面试官问我:“你为什么不用地图呢?”,我回答说:“我不知道那是什么。”面试官很快在黑板上解释了地图的语法,然后我就能更快地解决这个问题了。我不知道我是否因为不知道而被扣分,但我得到了这份工作。
没有单一的“正确”解决方案。至少在大多数面试中不是这样。我最喜欢问的问题是那些我可以很快陈述的,容易理解的,承认幼稚和更有效的解决方案,并且可以很容易变得更复杂的问题。我想大多数面试官都会问这类问题。这意味着我们不希望你得到答案,越远越好!
不要问你的解决方案是否正确。最好是试着通过测试示例来完成你的解决方案,并说服你自己(和面试官)它是正确的。
别怕有分歧。不同意面试官的观点是可以的,但是要有礼貌。使用具体的工件(例如代码和测试示例)来为你的参数打基础确实很有帮助;只说不做的讨论常常会导致误解,这会占用你有限的时间。试着去理解面试官的观点(即使他们看起来是错的),并且冷静地确保面试官理解你的观点。
把每次面试都看作是一个新的开始。如果你觉得你的一次面试非常糟糕,试着把这件事抛到脑后(或者推迟到一天结束的时候再考虑这件事),重新开始下一次面试。我知道这说起来容易做起来难,但是要记住,下一位面试官不会知道你在前一次面试中的表现。正如下面所描述的,即使你的一次面试很糟糕,你仍然可以通过面试!
如果有时间,可以问面试官一些问题。在面试结束时,我尽量会留出一些时间,让面试者问一些关于在谷歌工作、我的角色/经验等方面的一般性问题。这不是必须的,但如果你有一些问题,而且确实是你热切和感兴趣的,你可以问一些。
如果你已经没有什么问题可以问了,一个好的问题是让面试官告诉你他们在谷歌的角色和经验。不要问“我在面试中表现如何?”或者“正确的解决方案是什么?”,因为我们无法回答,而且这可能会让事情变得尴尬。
面试结束后
唷!你成功了,再次祝贺你!随后的过程如下:
每个面试官都会为你写他们的反馈,并提供雇佣/不雇佣的建议。面试官看不到其他面试官的反馈。
你的简历——包括所有东西:你的简历、面试反馈、过去的面试等等——会经过几个招聘委员会的审核(但我不知道具体有多少)。这是一群谷歌人(没有一个面试过你),他们会通读你的简历,并根据你的简历内容提供他们自己的招聘建议。将有许多人阅读你并提供反馈。
根据招聘委员会的决定,可能会发生以下几种情况:
你被录用了!
你被要求接受额外的面试。这并不一定意味着你在面试中表现不够出色。可能有很多不同的原因,比如有一种技能在面试中没有得到恰当的评估。
你被考虑扮演一个不同的角色。再说一遍,这并不是一件坏事,这只是意味着根据你的分组,不同的委员会认为不同的角色更适合你。这可能会涉及到一些额外的面试。最后,这是一件好事,你申请的职位可能不是你想的那样。
你没有得到工作机会。如果这是你的结果,我很抱歉。在谷歌获得一份工作是非常困难的,人们已经暗示有很高的假阴性率。所以不要气馁!你为这次面试所做的准备工作,以及面试本身的经历,肯定会帮助你在其他面试中表现得更好。最后,你可以在一年后重新申请!我查看了一开始收到无报价的信息包,一年后又收到了报价。
最后的一些想法
这篇文章比我预期的要长很多,但我真的希望它对你有用。虽然这篇文章主要是为谷歌的SWE面试而写的,但是这些建议应该也适用于其他公司的SWE职位。
几年前我为Shopify面试过,我运用了以上所有的技巧;我最终得到了一份工作机会,但我拒绝了,因为我被邀请加入了谷歌Brain(我现在愉快地在那里工作)。
这篇文章对non-SWE角色也有一定的帮助。我最熟悉的non-SWE角色是研究科学家(RS)。我对RS角色进行了一些研究访谈,但还不足以提供具体的指导。然而,我要说的是,即使是对于RS角色,你也必须通过一些编码面试。
我面试了一个应聘RS职位的人,他在理论方面很强,但在编程面试中表现很差,因此我提出了不聘用的建议 (这个人从来没有加入谷歌,但我不知道他是否被录用了)。
还有很多人分享了非常有价值的建议,Mekka Okereke在这个帖子中分享了一些很棒的建议,还有Steve Yegge,一些人也建议把《编码面试》作为一本值得学习的好书。
参考链接:
https://twitter.com/mekkaokereke
http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
https://twitter.com/mekkaokereke/status/1135981075086266368
原文链接:
https://psc-g.github.io/interviews/google/2020/02/25/interviewing-at-google.html
???? 更多精彩咨讯,长按识别,即可关注