|
本文章由海外兔 (osjobs.net) 撰写,海外兔包含求职课程,经验分享,简历工具,高频试题四大板块。
其他求职文章:
- 大厂高频面试题
- 程序员如何写一份更好的简历
- 程序员如何准备技术面试
- 程序员简历例句和模版
概述
自从我离开上一家公司自己创立海外兔之后,依然喜欢去不同的公司面试,感受不同公司的企业文化。去年底我获得机会到谷歌上海面试,虽然最终并没有通过(一共七轮面试,面试反馈是 3 个强烈推荐,2 个推荐,以及 2个不推荐)但是整个过程受益匪浅,经过总结后,我很有信心下一次能够通过。我发现网络比较少国内谷歌的面试经验分享,所以自己写了一篇,首先先回答一些常见问题:
常见问题:
怎样的工程师能申请谷歌?
谷歌是出了名的不在乎求职者的学历,年龄。根据我以及身旁朋友的经验,也证实这并不是纸上谈兵。所以只要你有过硬的技术水平,我都建议你去申请。
英语能力需要达到什么水平
我在电话面试,第一轮现场面试,加试的时候面试官都是外国人,全程使用英语进行面试。所以整体来说对口语表达会有一定要求,如果对方母语也不是英语的话,要求会更高。你可以使用 Pramp 这类免费模拟面试网站来锻炼算法以及口语表达,我在模拟的时候遇到许多不同国家的人,所以对于各地的口音也比较习惯。
工程师有哪些不同级别呢?
一般来说,校招对应 L3 级别,社招对应 L4/L5 级别。L3 不需要考察系统设计,L4的系统设计是可选的(可以与 HR 沟通改为算法),我面的是 L5 级别。
面试主要考核什么地方?
- 但就面试而言,不要耗费时间在编译原理,操作系统,密码学等方面,专注在算法以及数据结构上,面试的题目类似 Leetcode 上中等到难的题目。理论上你可以使用任何你熟悉的编程语言,不过其实最好选择面试官熟悉的编程语言,因为你要确保你的代码面试官可以看懂。我使用的是 Python,仅有在电话面试的时候被要求使用 Java 解题。
- L4或以上的级别会有一轮系统设计。例如设计推特的搜索功能,设计订阅系统等等。
- 一轮非技术问题,包括软技能以及团队合作能力的考核,类似问题可以参考亚马逊的 14条领导力原则。
面试流程是怎样的?
- OA(社招可以跳过)
- HR 面试
- 电话面试
- 现场面试(四轮技术,一轮非技术)
- 招聘委员会审核得出结果
- 组别匹配
面试评价是如何拿到的?
谷歌是不会给书面面试评价的,有的 HR 甚至连面试评价都不给,不过我非常幸运,我的 HR 在每次面试结束后(包含电面,现场面试以及加面)都安排了一次电话会议,她把该阶段的面试评价逐个叙述,因为现场面试包含三轮算法题,她并没有明确指明哪个评价对应哪轮算法,但是我从评价内容中能够对应起来。许多工程师也通过与 HR 沟通的方式获得面试评价,其他例子可以参考:
- [面试经验] 谷歌湾区onsite(贴子里指的 no hire 就是不推荐)
- Google | L4 | Warsaw | Sep 2019 [Offer]
- Google | L3 | Japan | Oct 2019 [Reject]
接下来的部分是我个人经验分享,由于邮件要求不能泄露题目,所以以下内容并没有原题。
找到合适的职位
虽然谷歌中国近两年也在扩招,但是大多岗位都要求 8年工作经验,所以我投的是海外的国家,谷歌大部分的工程师职位都限于在美国本土,如果你没有合适的签证,例如 H1b ,你只能选择其他国家。我申请的时候只有澳大利亚,慕尼黑以及日本在招聘软件工程师,当然这个随时在变动,你可以在 https://careers.google.com/jobs/ 找到最新的职位列表。
准备简历以及内推
确保你符合岗位的大致要求后,就可以开始准备简历了。对于所有大公司来说,我都不建议海投简历。最合适的方法是直接找到该公司的 HR 或者工程师来帮你内推,这样有两点好处,第一,内推的简历通常会要求在一定时间内审核,所以反馈时间也会更快。第二,无论是 HR 还是工程师,一旦内推成功都会有不少的奖金,所以如果他们感觉你有机会的话,会热心地帮你修改简历以及跟进面试流程。以下是几种简历准备方式:
- 你可以通过我们的 求职课程 帮忙修改简历。
- 先在领英上找到对应地区的 HR,然后告诉他们你的基本情况(刷题数量,工作背景等证明你能通过面试的之类),然后请他们帮忙内推。大部分领英上的 HR 都是负责美国地区的,只有极少的宝藏 HR 负责亚太地区。
- 另一个方法是找一亩三分地的国人帮忙内推。由于谷歌入职后是全球分配的,所以美国的工程师也可以内推其他国家的岗位,有的工程师在帖子里还注明可以帮助修改简历,你可以把个人情况以及简历发给他们,请他们帮忙修改以及内推。
要注意,内推成功不一定能够获取面试机会,申请前多找一些朋友帮忙修改简历非常重要。接下来根据内推邮件的指引去申请职位,一切顺利的话,你就会收到 HR 邀请面试的邮件了。
面试流程
一般情况下,谷歌使用的是 Google Hangout 以及 Google Docs 进行面试,但是这两款软件在国内连接不稳定,所以面试前,我还额外买了三家不同 VPN 的会员,并且在面试预定时间的前几天都和美国的朋友进行 30 分钟左右的视频来测试网络稳定性,并确保能够编辑 Google Docs,这一点可能是国内面试特别要注意的。除了 Google Hangout 之外还可以选择不需要科学上网的 Bluejeans 以及非 Google Docs 的代码平台进行电话面试,但是面试官可能对这些软件不熟悉,并不能保证面试过程能够顺利,我建议你提前熟悉下这几款工具,HR 的邮件中会给出官网。
HR 面试
这一轮 HR 会通过邮件和你约定沟通时间,这轮主要聊下你的技术栈,熟悉的语言(虽然谷歌近年一直在推崇 Go,不过大多组别使用的是 Java 以及 C++ 两种编程语言,所以如果你熟悉这两种语言的话,之后的组别匹配会比较容易。)以及一些简单的数据结构题(例如某种数据结构查找的时间复杂度是多少)。我面试的时候恰好遇到国人 HR,所以后半段使用了中文交流,不出意外的话,接下来 HR 会安排电话面试。
电话面试
电话面试是第一轮技术面试,使用 Google Hangout 进行视频,Google Docs 来写代码。电话面试会直接决定你能不能进入之后的现场面试,我非常幸运,遇到一位友善的悉尼资深工程师,好吧,他一开始吃着苹果登场的时候我确实有点吃惊,不过从言谈上能够感觉到他的友善以及乐于沟通,他一开始就说别紧张,我通常都会让别人过的。寒暄几句之后,开始出题:
- 第一题是关于模运算的 Leetcode 简单题,我马上给出了答案。但是在讨论边界情况的时候,在数字的二进制补码的地方犯了个错误。他指正之后并且一步步和我分析二进制补码的原理。
- 第一题结束后并没有直接下一题,而是问了一些数据结构的实现方式,例如 XXX 数据结构是如何实现的,查找的时间复杂度是多少,其中节点存储的值是什么?还有一些编程语言相关的问题,例如数组的插入方法在编程语言中是如何实现的?
- 第二道是 Leetcode 中等难度题,需要结合 sort() ,二分查找以及双指针查找几个技巧,因为我见过类似的题型,也马上写出了答案,因为我感觉题目比较简单,想突出自己的亮点,所以也讨论了编程语言自带的 sort() 使用的是 timsort() 以及 timsort() 如何实现等内容,他很惊讶我那么快能解出这题。
- 最后他还推荐了我一些学习资源,我向他道谢之后,愉快地结束了。
- HR 反馈电话面试官给了强烈推荐的评价。
安排现场面试
HR 会根据电话面试反馈来决定是否安排现场面试,谷歌的面试反馈主要分为三个级别,强烈推荐,推荐,以及不推荐,我不知道如果只是推荐的话能不能进入现场面试环节,这个要根据自身实际情况与 HR 沟通。接下来 HR 将我转到了悉尼分部的另外一位 HR,她与我沟通面试反馈以及现场面试的流程,要准备的东西以及细节,并安排另外一位同事帮我订机票和酒店,谷歌的面试与其他公司不太一样,并不会根据你想去的国家来分配面试官,也就是面试你的不一定是你未来的同事。现场面试地点按照最近原则,国内的话有北京以及上海两个地点,而我被安排到上海。谷歌的工作人员帮我订了来回机票和高级酒店,而且每天有 300 元的饮食报销额度。所以全程基本没花多少钱。
现场面试
谷歌上海分部位于浦东新区的环球金融中心,面试安排的酒店离公司也就五分钟步行路程。虽然现场面试可以提前选择使用白板或者 Chrome Book 来写代码,由于我之前听说有的求职者即使选了 Chrome Book 但是现场却只有白板的情况,所以我购买了一块白板在家练习手写代码,同时我也自带了白板笔以及闹钟方便面试。现场面试分为五轮,三轮算法,一轮系统设计以及一轮软技能,我不确定是因为招聘的Headcount 少还是什么原因,我去的那天整个早上只有三位面试者,而且只有我是面试软件工程师,有一位求职者本来只是电话面试阶段,但是因为担心电话面试信号不好,自费从新加坡飞过来面试。我心里一惊,果然大家都很想进谷歌。
- 第一轮是算法面试,除了这一轮面试官是亚洲的 ABC 之外,其他现场面试官都是国人,全程英文交流。一开始他介绍了自己所在组做的项目,然后把题目写在白版上。果然,Chrome Book 没电,所以我只能在白板上面写代码。出的是一道 Leetcode 的 hard 难度的图查找问题,由于图方面我准备得很充分,手写代码给出了答案,接着讨论了一下在什么情况下需要先建立图(如果之后需要多次查找),什么情况下并不需要,最后讨论了时间复杂度与空间复杂度之后结束面试,面试评价强烈推荐。
- 第二轮算法面试,面试官全程非常冷静,毫无笑容。给我带来一些心理压力,出了一道 Leetcode 的 medium 到 hard 难度的动态规划题,我马上给出了动态规划经典的 bottom up 和 top to bottom 两种解法,但他问能不能找到更好的解法,然后我就卡住了,不断要提示,最后想了快十分钟之后才发现有一个巧妙的逆向思维解法(原本求最大值,需要反过来先求和然后求最小值),快速写了答案之后并检查通过了。然后他给了一个 follow up,然后全部面试中我最后悔的点来了,我以为这个 follow up 也有巧妙的解法,所以一直往巧妙的解法方面思考。面试官额外给了时间,但是我超时之后还是没想出来。最后面试官问你一开始是怎么做的?我才反应过来原来 follow up 没有巧妙解法,还是用动态规划来解。如果 follow up 一开始直接给我的话我一定会做,但是经过了巧妙解法之后再给我反而不会了,我陷入了之前的题目限制中,面试评价不推荐。
- 午饭时间,和非常友好的法国小哥讨论了谷歌中国最近的招聘,扩展情况以及在这边工作的感觉,喝了杯手磨咖啡之后,愉快地结束午餐,顺便一提,餐厅风景一流。
- 第三轮是非技术面试,这类非技术问题其实不难准备,我按照了亚马逊的14条领导者原则每条原则都写出了一两个自己的故事,同时我还看了《谷歌模式》这本书,很多非技术问题在这本书都给出了答案。面试官和我讨论了国内程序员行业的现状以及哪里可以改变,讨论了阶级流动的问题,例如中专的求职者能否进入谷歌的问题,他说现在暂时没有,但是只要他们敢投,有能力,他们就敢面试。最后他说我很有想法,面试评价强烈推荐。
- 第四轮是系统设计面试,他给了我一个看似很简单的问题,我从零开始设计架构以及数据库结构,讨论了选择什么数据库,以及接口设计,然后就结束了。居然没有讨论任何我之前复习的内容,例如一致性哈希,CAP,分布式架构,数据库集群设计,面试评价不推荐。后来我终于知道为什么评价那么低,第一,我把系统设计完全当成算法题来做了,我当初是这样做的,例如设计推特的 hashtag 功能:1)因为推文与 hashtag 是多对多关系,所以使用哈希表来保存 hashtag 与推文的关系 ,2)为了提高查找效率,使用 trie 树来查找 hashtag 3)把哈希表分表进行扩展。这个做法理论上并没有错,但是真实工程中很少直接使用底层的数据结构,而会使用业界验证过的工具来构建系统。推特真正实现 hashtag 功能的方式是使用自建的索引系统来实时检索,具体内容可以参考 Building a complete Tweet index。第二,没有突出自己的亮点,我复习了那么多内容,却没有引导面试官向那些方向提问。
- 最后一轮技术面,有两位面试官,其中一位是预备面试官,但是题目实在太难,Leetcode 的 hard 难度的数据统计题,而且是从没见过的类型,我现场只给出了最基础的解法。结束后面试官礼貌地说我已经算回答地不错了,有一种解法需要四个堆。之后我和两位面试官继续讨论堆删除元素进行调整的优化策略(在 CPython 中已经实现,在 Golang 中已经有 PR),面试官人非常非常好,最后还送我坐电梯。最佳解法直到面试结束我和几位朋友讨论了很久才得到结果,实现起来非常复杂,面试评价推荐。
一系列面试结束之后,最后反馈汇总到 HR 中,HR 给出的结论是边界情况,所以安排了一轮加面。第一次加面,题目看起来很简单,但是我刚准备实现的时候断线了。(感谢 HR 帮我马上安排第二次加面)第二次只能换成 Bluejeans 以及 Codebunk 进行视频面试。这是官方提供的教程链接,有一点要注意的是,官方教程提到使用 Codebunk 的时候面试官是无法编辑文档的,这对于技术面试来说不太友好。我根据 Codebunk 官网发现注册免费会员之后有几次赠送的 session 可以让面试官编辑文档,相对来说更方便。
- 外国小哥,非常友好,Leetcode 的 medium 难度的滑动窗口题,我马上想到了解法,但是实现的过程发现解法出现了问题,花了一点时间才修改好,关键是这个时候他耳机断线,有大概十分钟听不到我的声音,没有沟通。最后讨论了时间复杂度以及空间复杂度草草结束,评价推荐。
HR 请我把手头上的 offer,工资,获得的成就之类的写在一封邮件发给她,然后她提交到招聘委员会,谷歌所有的招聘都会通过这个招聘委员会审核,他们会逐项检查候选者的背景,面试表现,最终给出结果。一周后,HR 告知很可惜并没有通过,我说没关系,我已经打开算法书准备好明年再来。
组别匹配
如果你通过了招聘委员会的审核的话,恭喜你,基本上可以拿到 Offer了,极少数人会在 SVP 进行复审的时候被拒绝(谷歌创业初期的时候,创始人之一拉里·佩奇会亲自复审每一位通过招聘委员会审核的求职者)接下来是组别匹配,来自不同国家不同组别的经理如果对你有兴趣,会安排进行电话沟通。接下来就是相互选择的时候了,如果经理与你都相互喜欢的话,那么就可以选择去该组别,签 Offer 了。
经验
- 谷歌的面试体验非常好,我遇到的 HR 都非常负责,到上海面试的话机票酒店全部免费而且每天还有 300 元的餐饮报销额度。
- 谷歌的算法题并不算太难(虽然我有些没做出来)沟通也非常重要,我使用 Pramp 进行了许多次模拟面试,主要训练在压力下如何沟通以及快速解答。让我印象深刻的是其中一位模拟面试者,他不单单快速解答了题目,还给出了均摊时间复杂度这类的分析,这是一般面试者没有的亮点。后来我知道他原来是在读的 CS 博士,已经在谷歌实习了。
- 我发现国内外大多数的系统设计的教学视频仅仅是逻辑上正确,不是工业上真正使用的架构,我推荐 InfoQ 的 Youtube 频道,里面许多一流公司分享他们实际工程的架构,我也建议看这些公司的技术博客,这远比看专门为系统设计准备的资料有用得多。
|
|