范非凡同学是「技艺丛谈」的号主在去年认识的一个北大学霸,他人如其名,面试表现非同凡响。如他这样优秀的人才,当然是中国互联网公司争夺的对象,最后他加入谷歌,也算是得其所愿。这次有幸邀请到他,给我们分享下他宝贵的校招求职经验,尤其是怎么拿到 Google 的 Offer 的。
Google 的面试经验,不仅对面试微软、Facebook、Hulu等外企有很高参考价值,对面试国内大小厂也同样如此。此外,虽然本文是校园招聘的经验分享,对社招同学的求职同样具有参考意义。希望非凡同学的这次分享,能够帮到大家。
1、个人情况
本人为 2017 级毕业的硕士研究生,本科就读于南大计算机系,硕士就读北大信科,无 ACM 竞赛背景,在去年找工作季幸运地拿到了 Google 的 offer ,应平哥邀请,分享一下面试 Google 的体会。
2、背景介绍

2.1、面试流程

去年 Google 的校园招聘共有 5 次 APAC Online Test ,通过任意一次都可以进入下一环节,今年对应的有 Kickstart Test ,可以在 Google Kickstart 官网上查看练习过去几年的考题。
根据 APAC Test 的成绩表现,Google 会对部分候选人增加 1-2 轮的电话面试,形式一般考察算法和数据结构,通过在线白板写 code 。
接下来一般在一个月内 HR 会邀请候选人来 Google office 参加 4-5 轮 onsite 面试,每轮面试 45 分钟,去年的形式为 2+3 ,前两轮面试通过后会安排后面的三轮面试,一般会在一周内完成 onsite 面试流程。onsite 面试主要考察算法和数据结构,也会考察一些计算机科学基础知识,以我去年情况为例,5 轮面试中有 4 轮考察算法,1 轮考察系统设计。
面试通过后,HR 会收集候选人的面试表现,成绩单 GPA,简历等提交给 Hiring Committee,来审核候选人是否最终通过了 Hiring Bar。通过后,会进入部门匹配环节,匹配成功后则发放 offer。

2.2、校招名额

根据一些往届面试者收集的信息,Google 近三年在中国招收的名额整体呈下降趋势,海外的 offer 主要集中在美国 Moutain View 总部,但由于工作签证 H1b 抽签的随机性,导致很多 candidates 拿到了 offer 却不能去工作,需要 park 在其他国家的 office ,但 remote office 的招收名额相对较少,并以招当地人为主,所以给安排这些拿到美国总部 offer 却没抽中工作签证员工的工作地点存在比较大的麻烦,所以海外名额的数量越来越少。
以 Facebook 为例,2015 年还在大陆招收员工,有 1/3 的员工抽中了工作签证,1/3 的员工 park 在伦敦,1/3 的员工直接 Gap 一年不管了,下一年继续抽签,抽不中就友尽,同时 2016 年开始就没有专门在中国区招聘了
Google 这两年都是招聘小年,名额整体比较少,不过随着 AlphaGo 掀起的 AI 浪潮,Google今年可能开始在中国招收 AI 领域的员工。

2.3、划重点

  • 面试语言为英语。
  • Google 在校招季会有 batch interview week ,面试官会在一周内只参与面试任务,所以不同轮次的候选人会遇到相同的面试官,多和其它应聘者沟通!
3、前期准备

3.1、干货们

  • LeetCode (在线刷题)
刷题必备网站,包含了各种经典算法问题,新颖面经问题等,而且有按算法专题,公 司专题,热题排行榜等,非常全面。部分题型和功能需要付费,前期可以先把免费题型训练完,面前一个月充个会员把带锁的题目以及公司专题看一下。
关于刷题的策略,首先按算法专题过一遍(如二分查找,DFS,BFS,动态规划等),熟悉每种算法的套路(如遇到新问题往哪个算法上靠,即每种经典算法的特征?什么类型问题用二分查找?二分查找写法有多个变种,每个变种解决什么类型问题?常见算法复杂度分析,动态规划常用的优化空间时间的方法?),然后分析每种系列题型(如 Best Time to Buy and Sell Stock 有 n 个变种,分析每个变种的差异,如何扩展的;再例如 DFS 经典问题排列和组合,排列和组合都可以用 DFS 解决,写法有什么差异,排列组合问题的各个变种中 DFS 的写法怎么变化的;动态规划中每种题型的变种条件的改变怎么引起动归方程的改变等),然后按照公司专题来做题,还有时间的可以再看看 Top Hits。
Leetcode 在前年还稳定在经典的 151 道题,从去年开始题量就增长很快,截止到去年我面试 Google 时(见下图)大约有接近 400 道题目,现在再看 leetcode 的列表,已经接近 700 道题了。Leetcode 题目增长很快,包括很多最新的面经,以我去年刷题体验来看,大约把 leetcode 做了 2-3 遍(第一遍比较慢,后面几遍主要是查漏补缺,同时加强对之前解题思路的理解,速度会快很多),也很难保证每道题都能很快写出 bug-free 的代码,所以面试前我会使用一种策略,确保能够快速地将问题映射到使用某种算法上:打印出 leetcode 题目列表,挨个看题目标题,迅速脑海构思应该用哪种算法解决(动归?DFS?二分查找?堆栈数据结构?),有什么坑在里面(正负数?异常输入及溢出?空指针?),但不去思考代码细节怎么写,从而筛选出不太熟练的题目,再次加强复习,查漏补缺。
  • LintCode(在线刷题)
    China 版 Leetcode,题目和 leetcode 有很多重合之处,与 leetcode 可以配合补充使用,比如 Leetcode 上有 Permutations I 和 II,lintcode 还有额外的一些变种,两者配合可以增加了解题型变种的差异。
  • Elements of Programming Interviews ( EPI,好书!)
    该书涉及了面试的方方面面,除了算法外,还有很多计算机基础知识,如信号量,互斥锁等,很多 leetcode 的题目都来源于该书的习题,刷完 leetcode 后适合每个章节都快速过一下(很多题目在 leetcode 已经做过了,可以跳过),同时通过该书复习计算机科学基础知识。
  • GeeksforGeeks(solution library)
    除了在线刷题外,还会遇到各种面经中没有提供 solution 的问题,经常可以在 GeeksforGeeks 上找到解答,以及很多经典算法的写法,该网站也常有一些合集。比如二叉树序列化到多叉树序列化问题(来自面经)都可以在上面找到解答。
  • 一亩三分地(面经专版)
面试前两周就要开始刷面经了,面经的题目列表针对性更强,中奖率更高。一亩  三分地是一个好平台,可以看到很多近期的真题面经,我一般选择热心网友整理 的面经集合(整理了近几个月来该平台上某司的面经帖子)
  • CareerCup(面经)
该网站面经更新速度比较快,感觉更多是老外在上面贴面经,一亩三分地都是华人发贴,富有余力的可以再看看这上面近期的面经。
  • 其他(编程之美,程序员面试金典)
    前面的刷完,应该就差不多了,还有兴趣的可以看微软的《编程之美》以及《程序员面试金典》(Cracking the Coding Interview 中文翻译版)
3.2、个人简历
  • 实习/项目经历
    在前几年 Google 还比较看中实习经历,对在微软,hulu 等外企的实习经历比较认可,可能会作为筛选简历的一个因素。但从去年开始,Google 就对所有候选人一视同仁,都需要参加 APAC Online Test,根据该成绩决定后续是否进入面试环节。实习经历可能在 Hiring Committee Review 和 Team match 的时候还具有一定影响,比如往届有同学在网易有道实习过,然后匹配部门时匹配到了 Google 输入法团队。
    就国内的企业来看,还是比较重视实习和项目经历的,很多公司可能只根据其过去的经历决定是否录用,面试走个形式。一般考察的是实验室的科研项目和公司的实习项目经历,特别对于研究生而言,在校期间最好能在老师指导下有一定的科研成果,这是最能专心做研究的时光。这样既证明了自身的创新能力,对找工作求职也有很大帮助,特别是偏研究的岗位。求职季的暑假可以考虑实习的机会。大公司实习有比较大平台和数据可供学习,小公司实习时灵活性更高,能涉猎的技术领域和踩的坑都比较多。个人觉得实习期间算法研究,工程开发都可以搞一搞,将来总会有用得着的时刻。
  • ACM 竞赛经历
    有 ACM 竞赛经历还是有一定优势的,比如你辛辛苦苦刷 leetcode 600 道题,别人很早之前都做过 3000 道题了,这次只是复习一下。不过有一点是,面试官看你有竞赛经历,可能会对候选人要求更严格一点,给正常候选人出个 medium 难度题目,给 ACM 选手就出 hard 题目,所以这个有一定的不确定性。另外就是 Google 面试出原题概率较低,不管怎么样,题目是做不完的,刷题还是要注重多思考和总结。
  • 简历修改
    写好的简历找身边小伙伴看看,给些修改意见。

3.3、简历内推

不仅是 Google,面试各家公司最好都先找往届的师兄师姐内推一下,会有一定的帮助。另外,尽可能地找和自己关系比较熟,对自己了解的人内推,这样在写内推意见时就比较靠谱和贴合实际。此处感谢一下之前内推我的强师兄,认真负责的给我写了一页推荐意见。

3.4、划重点

  • 刷题!刷题!刷题!重要的事情讲三遍
  • 整理手刷代码清单,经典算法迅速能给出 bug free code
  • 不求刷题快,但求刷题精,每道题可以多看一些高分解答,多去思考总结规律,避免陷入刷过忘,忘过刷的循环
  • 面前看面经,刷公司专题
  • 认真改简历,简历要内推
4、模拟面试
面试中解决算法题和平时刷题的感觉还是差别挺大的,所以在有一定刷题积累后,开始和身边的小伙伴组织一些模型面试,前期可以中文面试,后期增加一些英文模拟面试。题型可以选择难度适中且相对比较新颖一点的题目,以锻炼在面试中遇到新问题如何快速反应的能力。
模拟面试的形式以 4 人为例(见下图),每次开展两轮面试,每个人分别做一次面试官和一次面试者。写代码方式可选纸笔,白板,在线编辑(google doc 或者 http://collabedit.com/)推荐刚开始和面试官交流时用纸笔,实际写代码在电脑 doc 上写(速度快,方便更改)。去年面试时,HR 会给面试双方发个共享 doc 链接,面试时在上面写 code。
5、临阵磨枪
进入 onsite 面试前一周,就可以开始临阵磨枪,此时主要以刷面经为主,来源如一亩三分地,careerCup 等。考前还有一招前文提到的锻炼快速分析题型的技巧,即打印 leetcode 题目列表,迅速构思每一道题应该用哪种算法解决,进而查漏补缺。
面试前调整心态,默念十遍:You are ready!
题目永远刷不完,相信之前的积累,心态放平和。
6、面场发挥
每一轮面试时间为 45 min,其中有前面 1-2 分钟自我介绍和后面提问面试官问题 1-2  分钟。一般会考察两道算法题,第一道简单点,第二道复杂些,或者第二道是第一道的 follow-up。
开始做题后,先思考有哪些 edge case,并向面试官提问(如空指针输入,负数,无效输入等),大约花个 3-10 分钟思考 solution,然后和面试官沟通解法及算法复杂度,面试官觉得思路 ok,就可以开始写 code。开始写 code 后一般就专心写,如果思考到有需要确认的 case,也可以及时和面试官沟通。写完 code 后,告诉面试官自己先 check 一下 code,然后自己思考一个测试用例,人肉检查一遍代码运行情况,然后思考一下 edge case 是否没问题,然后告诉面试官 ok 了。面试官边检查 code 时,可以在解释自己的 solution 时,先整体介绍用了什么算法,再分开介绍第 X 行到第 Y 行的功能。
面试语言主要为英文,去年我参加 5 轮面试,只有 1 轮系统设计面是中文。因为当时面试时间是在 batch interview week ,面试官主要是由美国总部过来的员工。不过一般面试官会将题目写出来,所以不用担心听不懂题目。面试官可能提出一些 follow-up,如果没有听明白,可以礼貌地让其重复,这个没啥影响。
自我介绍准备好,一般 1 分钟左右就行,主要介绍教育背景,做过的项目(举一个例子即可)及拿过的奖项等。
要咨询面试官的问题准备好,比如他们组主要做什么?跨部门之间的合作?避免问一些很专业的问题,如 Google XX 技术怎么实现的?

划重点

  • Speak Out。在思考 solution 过程中,及时和面试官沟通你的思路变化,避免陷入长时间单方面的思考,特别是遇到不会的题目,及时和面试官沟通你当前的思路,面试官也可能根据你的思路提供一些 hints ,也能了解你解决问题的分析思路。
  • 避免思维定势。遇到似曾相识的题目,却记不起解决方案时,就当做一道新题来处理,一方面节省时间,另一方面避免陷入挖掘模糊的记忆,特别很有可能这道题目是一个变种题,和之前的题目不一样。
7、乘胜追击
通过 Hiring Committee 后,现在都会先进行部门匹配,匹配成功后才发放 offer。越早开展匹配,成功的概率越高。近两年来的坑比较少。拿 Google offer 是个长期战线,面试通过以后也要经常催促一下。前两年的情况,通过面试后基本上都给匹配了某个 office,时间周期跨度也挺大,如 3 到 7 个月不等。不过去年有不少候选人最后没有匹配 office,因为去年坑太少了,不过记录还都在系统中,未来有开放的职位后还会联系这些候选人,据说有一些是候选人都入职了才匹配的。
此外,对于选择国内 Google 还是国外 Google,因人而异,国外名额集中在美国总部,不过 h1b 的中签率也比较感人,往届有不少抽不中,然后再等匹配其他 office, 经历更长的时间等待。选择国内的话有一定的缓冲时间,一方面可以逐步适应英语的工作环境,另一方面将来也有 transfer 的机会。国外的待遇相对比较好,过得相对比较安逸,世界这么大,我想去看看。
8、总结
相对于国内的面试,Google 整体的招聘流程一般考察候选人的基本功,而对候选人的过往经验不太看重,Google 想选拔优秀的员工,安排到任意的岗位中都能够胜任,所以内部部门间的流动性也比较大。国内的公司相对更多看中候选人过去的项目实习经历,希望能够到匹配的部门快速开展工作。
相对于微软、 hulu 等外企,Google 的坑比较少,不过面试的风格比较类似,都是偏向算法考察。
对于选择算法研究岗还是工程开发岗的问题,Google 目前主要招聘的是 Software Development Engineer,今年也开始招聘 Research Scientist 和 Machine Learning Engineer 职位,具体选择哪种道路可以参见之前平哥的系列文章。个人感觉两个方向都可以学习一下,将来总会有用得着之处,也许还会切换了职位。
最后想说的一点是,心态要好,面试具有运气成分,是否通过 Google 的面试不能说明什么,将来的道路还很长,总会找到适合自己的一条道路!
继续阅读
阅读原文