如何准备谷歌面试并失败。 两次

如何准备谷歌面试并失败。 两次

文章的标题听起来像是史诗般的失败,但实际上一切并不那么简单。 总的来说,这个故事的结局非常积极,尽管不是在谷歌。 但这是另一篇文章的主题。 在同一篇文章中,我将讨论三件事:我的准备过程是如何进行的,谷歌的面试是如何进行的,以及为什么在我看来,一切并不像看起来那么清楚。

这一切是如何开始的

在塞浦路斯的一个寒冷的冬夜,我突然想到,我对经典计算机科学的了解远非平均水平,需要对此采取一些措施。 顺便说一句,如果有人还没有读过为什么塞浦路斯的夜晚如此寒冷,那么你可以了解一下 这里。 经过一番思考,决定从学习算法和数据结构的在线课程开始。 我从我的一位前同事那里听说了 Robert Sedgewick 在 Coursera 上的课程。 课程由两部分组成(部分1 и 部分2)。 如果链接突然发生变化,您可以随时通过 Google 搜索作者的姓名。 每个部分持续 6 周。 课程是在一周的开始的时候进行的,在这一周中你仍然需要做练习。 课程的第一部分涵盖基本数据结构、基本排序类型和算法的复杂性。 第二部分已经更高级了,从图形开始,到线性规划和难处理性等内容结束。 经过考虑以上所有内容后,我得出的结论是,这正是我所需要的。 顺便说一句,好奇的读者可能会问,谷歌与它有什么关系? 事实上,直到这一刻他都与这件事没有任何关系。 但我需要一个目标,因为在没有目标的情况下连续 12 周晚上学习有点困难。 获取新知识的目的是什么? 当然,他们在实践中的应用。 在日常生活中这很成问题,但在大公司面试时这就很容易了。 快速谷歌显示谷歌(请原谅同义反复)是欧洲(我专门针对欧洲)进行此类采访的最大公司之一。 也就是说,他们的办公室位于瑞士苏黎世。 所以就决定了——学习然后去谷歌面试吧。

为第一种方法做准备

12周很快就过去了,我完成了两门课程。 我对这些课程的印象非常积极,我可以将它们推荐给任何感兴趣的人。 我喜欢这些课程的原因如下:

  • 讲师英语说得相当清楚
  • 材料结构良好
  • 华丽的演示展示了每个算法的内部结构
  • 材料的合理选择
  • 有趣的练习
  • 网站上自动检查练习,然后生成报告

我的课程工作通常是这样的。 我听了1-2天的讲座。 然后他们对自己对材料的了解进行了快速测试。 这周剩下的时间里,我多次迭代了这个练习。 在第一次获得 30-70% 的成绩后,后续的成绩达到了 97-100%。 该练习通常涉及实现一些算法,例如 缝雕 или 压缩包.

完成课程后,我发现很多知识伴随着很多悲伤。 如果说以前我只是知道我什么都不知道,现在我开始意识到是我不知道。

由于当时只是五月份,而且我安排了秋季面试,所以我决定继续学业。 在审查了该职位的要求后,决定并行两个方向:继续研究算法和学习机器学习基础课程。 对于第一个目标,我决定从课程转向书籍,并选择了 Steven Skiena 的巨著《算法》。 算法设计手册。 虽然不像克努特那样具有纪念意义,但仍然如此。 为了第二个目标,我回到 Coursera 并报名参加 Andrew Ng 的课程。 机器学习.

又过了三个月,我完成了课程和书。

我们先从书开始吧。 阅读结果非常有趣,尽管并不容易。 原则上,我会推荐这本书,但不会立即推荐。 总的来说,这本书更深入地介绍了我在课程中学到的知识。 另外,我(从正式的角度来看)发现了启发式和动态编程之类的东西。 当然,我以前用过它们,但我不知道它们叫什么。 这本书还包含了许多作者生活中的故事(战争故事),这在一定程度上淡化了演示的学术性质。 顺便说一句,本书的后半部分可以省略;它只是描述现有的问题和解决这些问题的方法。 如果在实践中经常使用它是有用的,否则它会立即忘记。

我对这门课程非常满意。 作者很清楚他的知识,而且说话很有趣。 再加上我在大学时记得的相当多的内容,即线性代数和神经网络的基础知识,所以我没有遇到任何特别的困难。 课程的结构非常标准。 课程分为几周。 每周都有讲座和简短的测试。 讲座结束后,你会收到一份作业,你需要做、提交,系统会自动检查。 简而言之,课程中教授的内容如下:
- 成本函数
- 线性回归
- 梯度下降
- 特征缩放
- 正规方程
- 逻辑回归
— 多类分类(一对一)
- 神经网络
- 反向传播
- 正则化
— 偏差/方差
— 学习曲线
— 错误指标(精确率、召回率、F1)
— 支持向量机(大边距分类)
— K 均值
—主成分分析
- 异常检测
— 协同过滤(推荐系统)
— 随机、小批量、批量梯度下降
- 在线学习
- 地图缩小
- 天花板分析
完成课程后,对所有这些主题都有了了解。 两年过去了,几乎所有的事情都自然而然地被遗忘了。 我将其推荐给那些不熟悉机器学习并希望充分了解基本知识以继续前进的人。

第一次运行

已经九月了,是时候考虑面试了。 由于通过该网站申请是相当灾难性的,所以我开始寻找在谷歌工作的朋友。 选择落到了 数据小子,因为他是我唯一直接认识的人(即使不是个人认识)。 他同意转发我的简历,很快我就收到了招聘人员的一封信,提议在他的日历上为第一次谈话预留一个时间段。几天后,我就接到了电话。 我们尝试通过环聊进行沟通,但质量很差,所以我们改用电话。 首先,我们快速讨论了标准的制定方式、原因和原因,然后继续进行技术筛选。 它由十几个问题组成,其精神是“插入哈希映射有什么困难”,“你知道什么平衡树”。 如果你对这些东西有基本的了解的话,这并不难。 筛选很顺利,根据结果,他们决定组织一周内的第一次采访。

采访也是通过环聊进行的。 首先他们谈论了我大约 5 分钟,然后开始讨论问题。 问题出在图表上。 我很快意识到需要做什么,但我选择了错误的算法。 当我开始编写代码时,我意识到了这一点并切换到了另一个选项,我完成了该选项。 面试官问了几个关于算法复杂程度的问题,并询问是否可以做得更快。 我不知何故变得迟钝,做不到。 这时,时间到了,我们告别了。 然后,大约 10 分钟后,我突然意识到,在这个特定问题中,我可以使用广度优先搜索,而不是我使用的 Dijkstra 算法,而且速度会更快。 过了一段时间,招聘人员打来电话,说面试总体很顺利,应该再组织一次面试。 我们同意再过一周。

这次事情变得更糟了。 如果说第一次面试官还算友善、善于交际,那么这次他就有些阴沉了。 我无法立即解决问题,尽管我提出的想法原则上可以解决问题。 最终,经过面试官的多次提示,我找到了解决方案。 这次结果又是广度优先搜索,只是从几个点出发。 我编写了解决方案,按时满足了他们的要求,但忘记了边缘情况。 过了一段时间,招聘人员打电话说,这次面试官不高兴,因为在他看来我需要太多提示(3或4条),而且我一边写一边不断地改代码。 根据两次面试的结果,决定不再进行进一步的面试,如果我愿意的话,可以将下一次面试推迟一年。 这就是我们说再见的原因。

从这个故事我得出了几个结论:

  • 理论很好,但你需要快速掌握它
  • 没有实践的理论是没有帮助的。 我们需要解决问题并使编码自动化。
  • 很大程度上取决于面试官。 对此我们无能为力。

准备第二次运行

想了想,我决定一年后再尝试。 并稍微修改了目标。 如果说以前主要目标是学习,谷歌的面试就像一根遥远的胡萝卜,那么现在通过面试就是目标,学习就是手段。
于是,制定了一个新的计划,其中包括以下几点:

  • 通过阅读书籍和文章继续学习理论。
  • 解决500-1000件的算法问题。
  • 通过观看视频继续学习理论。
  • 通过课程继续学习理论。
  • 研究其他人在 Google 面试的经历。

我在一年内完成了这个计划。 接下来我将描述我针对每一点具体做了什么。

书籍和文章

我什至不记得我读过多少篇文章;我读过俄语和英语的文章。 可能是最有用的网站 此人。 在这里您可以找到大量有趣算法的描述以及代码示例。

我读了 5 本书:算法,第 4 版(Sedgewick,Wayne),算法导论第 3 版(Cormen,Leiserson,Rivest,Stein),破解编码面试第 4 版(Gayle Laakmann),编程面试暴露第 2 版(Mongan,Suojanen) ,Giguere),编程访谈的要素(Aziz、Lee、Prakash)。 它们可以分为 2 类。 第一个包括塞奇威克和科曼的书籍。 这是一个理论。 剩下的就是面试的准备。 塞奇威克在书中讲述了与他的课程中相同的事情。 只是书面形式。 如果您已经学习了该课程,那么仔细阅读它并没有多大意义,但无论如何还是值得略读的。 如果您还没有观看过该课程,那么阅读它是有意义的。 科门对我来说太无聊了。 说实话,我很难掌握它。 我刚把它从那里拿出来 主定理,以及几种很少使用的数据结构(斐波那契堆、van Emde Boas 树、基数堆)。

为了准备面试,至少值得阅读一本书。 它们都是基于大致相同的原理构建的。 他们描述了大型科技公司的面试过程,给出了计算机科学的基本知识、这些基本知识的问题、问题的解决方案以及解决方案的分析。 在以上三项中,我可能会推荐《破解编码面试》作为主要内容,其余的都是可选的。

算法问题

这可能是准备过程中最有趣的一点。 当然,你也可以傻傻地坐下来解决问题。 有许多不同的网站可以提供此服务。 我主要用了三个: Hackerrank, 厨师长 и 力码。 在 CodeChef 上,问题按难度划分,但不按主题划分。 按复杂性和主题划分的黑客排名。

但我很快就发现,还有一种更有趣的方法。 这些都是竞赛(编程挑战或编程竞赛)。 所有三个站点都提供它们。 确实,LeetCode 存在一个问题——不方便的时区。 这就是为什么我没有参与这个网站。 Hackerrank和CodeChef提供了相当多的不同竞赛,持续时间从1小时到10天不等。 不同的格式有不同的规则,但我们可以讨论很长时间。 竞争之所以有好处的主要原因是在学习过程中引入了竞争(又是同义反复)元素。

我总共参加了 Hackerrank 的 37 场比赛。 其中,32 个是评级的,5 个要么是赞助的(我什至在其中一个中收到了 25 美元),要么是为了好玩。 在排名中,我有10次进入前4%,11次进入前12%,5次进入前25%。 最好的成绩是27小时1459/3和一周22/9721。

当 Hackerrank 开始减少举办比赛的频率时,我转向了 CodeChef。 我总共参加了5场比赛。 在十天的比赛中,最好成绩是426/5019。

总的来说,在比赛中,就这样,我解决了1000多个问题,这些问题都符合计划。 不幸的是,现在没有空闲时间来继续竞争活动,就像没有可以取消非空闲时间的目标一样。 但这很有趣。 我建议对此感兴趣的人找到志同道合的人。 一起或在一个小组中,这会更有趣。 我和一个朋友玩得很开心,所以也许进展顺利。

观看视频

读完斯基纳的书后,我对他所做的事情产生了兴趣。 和塞奇威克一样,他也是一名大学教授。 在这方面,他的课程视频可以在网上找到。 我决定回顾一下课程 COMP300E - 编程挑战 - 2009 香港科技大学。 我不能说我非常喜欢它。 首先,视频质量不是很好。 其次,我并没有尝试自己解决课程中讨论的问题。 所以参与度不是很高。
另外,在解决问题、试图找到正确的算法时,我看到了 Tushar Roy 的视频。 他曾在亚马逊工作,现在在苹果工作。 后来我自己发现,他已经 YouTube频道,他在其中发布了对各种算法的分析。 截至撰写本文时,该频道包含 103 个视频。 我必须说他的分析做得非常好。 我试着看其他作者的作品,但不知何故没有效果。 所以我绝对推荐这个频道观看。

参加课程

我在这里并没有做什么特别的事情。 观看了 Google 的 Android 开发者纳米学位的视频并参加了 ITMO 的课程 如何赢得编程比赛:冠军的秘密。 纳米学位相当不错,虽然我自然没有从中学到任何新东西。 ITMO 的课程在理论方面有点偏颇,但问题很有趣。 我不建议从它开始,但原则上这是值得的。

学习其他人的经验

当然,很多人试图进入谷歌。 有的进去了,有的没进去。 有些人写了有关此的文章。 我可能会提到的有趣的事情 这个 и 这个。 在第一种情况下,这个人为自己准备了一份清单,列出了他需要学习什么才能成为一名软件工程师并进入谷歌。 它最终进入了亚马逊,但这已经不再那么重要了。 第二本手册由 Google 工程师 Larisa Agarkova 编写(拉尔)。 除了本文档之外,您还可以阅读 她的博客.

阅读 Glassdoor 上的采访评论是有意义的。 它们都或多或少相似,但您可以获得一些有用的信息。

我不会提供其他小文章的链接;你可以在 Google 上轻松找到它们。

第二次运行

现在一年过去了。 事实证明,学习方面非常紧张。 但我以更深入的理论知识和实践技能迎接了新的秋天。 距离年底还剩几周时间,我需要做准备,突然一封来自谷歌招聘人员的信被投进邮件中,他在信中问我是否仍然有在谷歌工作的愿望,是否愿意在谷歌工作。我介意和他说话。 我自然不介意。 我们同意一周后打电话。 他们还要求我提供一份更新后的简历,我在简历中添加了我这一年的工作和总体情况的简要描述。

经过终生的沟通,我们决定一周后进行环聊面试,就像去年一样。 一周过去了,到了面试的时间,但面试官却没有出现。 十分钟过去了,我已经开始紧张了,突然有人插话了。 不久之后,我的面试官因故未能出现,我们紧急寻找替代者。 该人在设置计算机和进行采访方面都有些准备不足。 但后来一切都很顺利。 我很快解决了这个问题,描述了哪里可能存在陷阱,以及如何规避它们。 我们讨论了问题的几个不同版本以及算法的复杂性。 然后我们又聊了10分钟,工程师告诉我们他在慕尼黑工作的印象(他们显然没有在苏黎世找到紧急的替代者),然后我们就分手了。

当天,招聘人员联系了我,说面试很顺利,准备邀请我去办公室面试。 第二天,我们通过环聊打电话讨论了细节。 由于我需要申请签证,我们决定在一个月内安排面试。

当我准备文件的时候,我同时与招聘人员讨论了即将到来的面试。 Google 的标准面试包括 4 次算法面试和 XNUMX 次系统设计面试。 但是,由于我正在申请 Android 开发人员的工作,所以我被告知面试的一部分将是针对 Android 的。 我无法从招聘人员那里得知具体内容和具体内容。 据我了解,这是最近才推出的,他本人也不是很清楚。 我还报名了两个培训课程:如何通过算法面试和如何通过系统设计面试。 这些会议的用处一般。 在那里,也没有人能告诉我他们向 Android 开发者询问了什么。 因此,我这个月的准备工作主要有以下几点:

  • 买一块标记板,凭记忆在上面写下 2-3 打最流行的算法。 每天3-5块。 总共,每个都被写了好几遍。
  • 刷新你对Android上日常不使用的各种信息的记忆
  • 观看一些有关大规模和类似内容的视频

正如我已经说过的,同时我正在准备旅行的文件。 首先,他们要求我提供制作邀请函的信息。 然后我花了很长时间试图找出塞浦路斯谁签发瑞士签证,因为瑞士大使馆不处理这个问题。 事实证明,奥地利领事馆正在这样做。 我打电话预约了。 他们要了一堆文件,但没有什么特别有趣的。 照片、护照、居留证、一堆不同的证书,当然还有邀请函。 与此同时,信还没有到达。 最后,我采用了常规打印输出,效果非常好。 三天后,这封信到达了,塞浦路斯联邦快递找不到我的地址,我不得不自己去取。 与此同时,我收到了来自同一个联邦快递的包裹,他们也无法将其交付给我,因为他们找不到地址,并且自 3 月以来(5 个月,卡尔)就一直躺在那里。 因为我不知道,所以我自然不会认为他们有。 我按时收到了签证,之后他们为我预订了酒店并为我提供了航班选择。 我调整了选项以使其更方便。 不再有直飞航班,所以我最终经雅典飞往那里,然后经维也纳返回。

办完所有旅行手续后,又过了几天,我真的飞到了苏黎世。 顺利到达那里。 从机场到市区我乘坐火车——又快又方便。 在城里逛了一圈后,我找到了一家酒店并入住了。 由于订的酒店是不含餐的,所以就在隔壁吃了晚饭就睡觉了,因为是早上的航班,已经想睡觉了。 第二天,我在酒店吃了早餐(需要额外付费),然后去了 Google 办公室。 谷歌在苏黎世设有多个办事处。 我的采访不在中心。 总的来说,这个办公室看起来很普通,所以我没有机会看到“普通”谷歌办公室的所有优点。 我向管理员登记并坐下来等待。 过了一会儿,招聘人员出来告诉我当天的计划,然后他带我去了面试的房间。 实际上,计划包括 3 次面试、午餐和另外 2 次面试。

面试第一名

第一次面试是针对Android的。 而且它与算法完全无关。 不过,令人惊讶。 好吧,这种方式更常见。 我们被要求制作一个特定的 UI 组件。 首先我们讨论了什么以及如何进行。 他提出使用 RxJava 制定一个解决方案,描述了他具体要做什么以及为什么。 他们说这当然很好,但是我们还是用Android框架来做吧。 同时我们将在板上编写代码。 而且不仅仅是一个组件,而是使用该组件的整个 Activity。 这是我还没有准备好的。 在板上编写 30-50 行算法是一回事,而编写大量 Android 代码又是另一回事,即使带有缩写和注释,本着“好吧,我不会写那个,因为它已经很明显了”的精神。 结果是 3 块木板的某种油醋汁。 那些。 我解决了这个问题,但它看起来很愚蠢。

采访二号

这次的采访是关于算法的。 而且还有两个面试官。 一个是真正的面试官,第二个是年轻的学徒(影子面试官)。 有必要提出一种具有某些属性的数据结构。 首先,我们像往常一样讨论这个问题。 我问了不同的问题,面试官回答了。 一段时间后,他们被要求在黑板上写下所发明结构的几种方法。 这次我或多或少是成功的,尽管有一些小错误,但我在面试官的提示下改正了。

采访三

这次的系统设计,突然也变成了Android。 有必要开发具有某些功能的应用程序。 我们讨论了应用程序、服务器和通信协议的要求。 接下来,我开始描述构建应用程序时将使用哪些组件或库。 然后,当提到 Job Scheduler 时,出现了一些混乱。 关键是我从未在实践中使用过它,因为在它发布时我刚刚切换到支持没有任务可供使用的应用程序。 开发后续产品时也发生了同样的情况。 就是理论上我知道这个东西是什么,什么时候用,怎么用,但是没有使用经验。 而且面试官似乎不太喜欢这个。 然后他们让我写一些代码。 是的,在开发应用程序时,您立即需要编写代码。 再次在板上编写 Android 代码。 结果又吓人了。

午餐

本来应该有另一个人来的,但他没有来。 谷歌也会犯错误。 结果,我和前一位面试官,她的同事一起去吃午饭,过了一会儿,下一位面试官也加入了。 午餐相当不错。 同样,由于这不是苏黎世的主要办公室,餐厅看起来很普通,但非常漂亮。

采访四

最后是最纯粹形式的算法。 我很快就有效地解决了第一个问题,虽然我错过了一个边缘情况,但在面试官的提示下(他给出了这个非常边缘的情况)我发现了问题并纠正了它。 当然,我必须在板上写代码。 然后又给出了类似的任务,但难度更大。 为此,我找到了几个非最佳解决方案,几乎找到了最佳解决方案,5-10 分钟不足以完成这个想法。 好吧,我没有时间为其编写代码。

采访五号

又是Android面试。 我想知道为什么我一整年都在研究算法?
起初有几个简单的问题。 然后面试官在黑板上写代码,要求找出其中的问题。 找到它,解释它,修复它。 讨论过。 然后一些意想不到的问题开始了,“方法Y在类X中做什么”,“方法Y内部是什么”,“类Z做什么”。 当然,我回答了一些,但后来我说我最近工作中没有遇到过这种情况,自然我不记得详细是谁在做什么、怎么做。 之后面试官就问我现在在做什么。 问题都是围绕这个话题进行的。 我已经在这里回答得更好了。

最后一次采访结束后,他们拿走了我的通行证,祝我好运,然后送我上路。 我在城里走了一会儿,吃了晚饭,然后去了酒店,然后就在那里睡觉了,因为航班又是一大早。 第二天我安全抵达塞浦路斯。 应招聘人员的要求,我写了面试反馈,并在一项特殊服务中填写了表格,以退还所花的钱。 在所有费用中,Google 仅直接支付门票费用。 酒店、餐饮和交通费用由候选人支付。 然后我们填写表格,附上收据并发送给专门的办公室。 他们处理此问题并将资金相当快地转入帐户。

处理面试结果花了一周半的时间。 之后我被告知我“有点低于标准”。 也就是说,我有点不足。 更具体地说,有 2 次面试进行得很顺利,2 次面试不太顺利,系统设计也不太顺利。 现在,如果至少有3个顺利的话,我们就可以参加比赛,否则就没有机会了。 他们提出再过一年再来。

当然,一开始我很沮丧,因为准备工作花了很多功夫,到面试时我已经在考虑离开塞浦路斯了。 加入谷歌并搬到瑞士似乎是一个不错的选择。

结论

我们来到本文的最后部分。 是的,我两次谷歌面试都失败了。 这是可悲的。 在那里工作可能会很有趣。 但是,你可以从另一个角度来看待这个问题。

  • 在一年半的时间里,我学到了大量与软件开发相关的知识。
  • 我参加编程比赛很开心。
  • 我去了苏黎世几天。 我什么时候再去那里?
  • 我在世界上最大的 IT 公司之一获得了一次有趣的面试经历。

所以,这一年半的时间里发生的一切,都可以简单地认为是训练,或者是训练。 而这次培训的成果也已让人感受到。 我离开塞浦路斯的想法成熟了(由于一些家庭情况),我成功通过了另一家知名公司的几次面试,并在8个月后搬家。 但这是一个完全不同的故事。 不过,我认为我仍然应该感谢谷歌,感谢我自己工作的一年半,以及在苏黎世度过的有趣的两天。

最后我还能说什么? 如果您从事 IT 工作,请为 Google(亚马逊、微软、苹果等)的面试做好准备。 也许有一天你会去那里到达那里。 即使你不愿意,相信我,这样的准备也不会让你变得更糟。 当你意识到你可以(即使只是运气好)获得这些公司之一的面试机会时,比你开始准备之前有更多的道路向你敞开。 一路上你所需要的只是目标、毅力和时间。 祝你成功 :)

来源: habr.com

添加评论