2020年5月9日星期六

Google 软件工程师教你面试技巧 | 工作日志

Google 软件工程师教你面试技巧 | 工作日志


编注:@浮沉之主,在首页发有文章《北美计算机硕士,这样深度使用 Coursera 学习编程》《听说你想学编程?北美 CS 硕士帮你挑选在线课程,让你逆袭做学霸》。了解他已经在 Google 就职后,我们邀请他分享了一些面试技巧和入职体验。诸如「Google 福利如何」「在大陆能不能申请职位」「Google 面试是不是很严格」等大家最好奇的问题,相信在文中都能找到答案。


最近刷社交网络,发现国内各大互联网公司纷纷优化结构(裁员),大家无不感叹寒冬袭来。被优化出去的员工们需要寻找下家,未毕业的同学们则担心就业去向。
回想当年自己找工作时的经历,我决定将软件工程师岗位的准备面试过程和学习资源整理出来,并且结合我在 Google 的工作经历,一起分享给有需要的朋友。
我在读研期间拿到了 Google 的暑期实习 Offer,实习结束后通过了转正面试拿到全职 Offer 并已入职,算是对 Google 的整个面试过程以及作为实习生、正式员工两种身份的工作体验有一定的了解,文章也基于 Google 的面试,但其中的很多技巧也适用于其他互联网公司。

几个最受关注的问题

鉴于 Google 在国内的特殊地位,坊间总是流传着一些半真半假的传言,比如把人逼疯的面试题、无限吃喝的零食、自由开放的极客文化……所以在正式分享面试经验之前,我想先解答几个备受关注的问题。

问题一:Google 不是退出中国了吗?

是的,早在 2010 年 Google 便宣布退出中国市场,但其实 Google 在上海、北京及广州还保留有办公室(此外还在香港、台北设立了办公室),其中上海办公室位于繁华的陆家嘴环球金融中心。
Google 的招聘岗位涉及人工智能、移动平台、大数据、软件测试等领域。除了本文主要探讨的工程开发类岗位,还有设计、财务、人力资源、营销、销售和支持等岗位在招聘1
 。
Google 每年也会招收一定数量的暑期实习生,并且到各大高校举办校招宣讲会及举行笔试,这是在校学生了解 Google、进入 Google 的最好途径。对于社招,从 Google 中国的招聘页面上也能看到有岗位开放接受工作申请。如果想在 Google 上海工作,所有面试都可以在国内进行;如果想拿海外办公室的 offer,则在通过了电面筛选之后需要飞到美国加州总部进行面试。不过不用担心,机票酒店饮食和交通全部报销,退一万步说即便面试失败,能免费去硅谷顶尖公司感受一番开阔眼界,这经历也是极好的。
虽然我在美国工作,但对上海办公室心仪已久。在包邮区上海,国内的美食、遍历快捷的网购、各种各样精彩的文娱活动以及离父母家人近,这些优势都是美国无法比拟的。而由于 Google 这块招牌,Google 工程师往往是人才市场上的抢手香饽饽,以后就算想跳槽也有很多很棒的机会。

问题二:资本寒冬下 Google 还招人吗?

答案是肯定的,实际上很多业务部门都已经把招人这件事列入了季度/年度考核指标
我作为一个刚入职不太久的新人,都经常收到 HR 发来的邮件鼓励大家去做面试官:因为要招的人太多而面试官不够,因此阻塞了公司的招聘进程(顺带一提 Google 员工入职满半年并通过面试培训后即可担任面试官)。我参加了几次大组的全员大会,大佬们也是鼓励大家多多内推认识的靠谱工程师。尽管 Google 已经是个六、七万人的公司,她仍在继续招人扩充业务线。

问题三:Google 传说中的福利是真的吗?

Google 的福利想必大家都有所耳闻。在我进入 Google 之后,一位资深的工程师同事告诉我,他最怀念的 Google 福利一是每周都能拿到新的印有 Google Logo 的免费 T 恤(穿脏了直接丢掉领新的,还不带重样),二是只要有合适的理由(例如需要和巴黎办公室的某个小组开会),就可以名正言顺地去 Google 全球各地的办公室工作一段时间,并且公司报销来回机票。只不过随着公司规模日渐庞大,这些曾经吸引人的福利已经渐渐消散在传说之中。
不过瘦死的骆驼比马大,没了免费 T 恤的 Google 仍然依靠着这些福利吸引着一批又一批的优秀人才。

有竞争力的薪酬待遇

Google 给的薪水已不是硅谷最顶尖的,但仍在第一梯队的前列。美国的科技公司所给待遇,一般由底薪+股票+奖金构成。在 Google(美国)工作若干年,往往年收入可以达到二三十万美金。
如果不考虑买房,还真是是一人工作全家吃饱。此外 Google 员工普遍比较看重 work-life-balance 并且尊重员工的个性,据说有员工的工作时间从每天凌晨 4 点到下午 2 点,只因为他想避开硅谷上下班高峰的交通拥堵,而他的主管对此完全同意。每次我和美国的同事提及国内互联网公司盛行的 996,他们没有一个不吐着舌头/耸肩/摇着头。

同事或主管发起的现金奖励

比如某项工作深得主管赏识,又或者本职工作之外帮助同事完成了他/她的一些任务,那么主管或同事可以给你发起现金奖励(内部称为 peer bonus 和 spot bonus),无须行政审批立刻加入到下一次工资单中。
我入职两个月的时候由于成功完成了对一个服务(service)的性能提升,分别得到了一位同事的 peer bonus 和主管的 spot bonus。虽然加一起也就一千来美刀,但那种获得同事们认可的自豪感还是令我对工作充满了热情:因为知道自己做的事情真正被人认可。

办公园区内的设施

健身房、球场、游泳池,洗衣机、医疗中心、按摩及理发(自费),目的大概是让你尽可能地把业余时间留在公司。说起游泳池就不得不提一下这个「逆水游泳,不进则退」的无边泳池(我们叫它 Infinite Pool)。其实 Google 是有全尺寸的游泳池的:D
园区中充斥着各式各样「中二」的玩具

内部软件架构工具

软件工程师当然关心内部构架工具,毕竟这可是吃饭的家伙。Infrastructure 可以说是地表最强的,绝不拖累开发工作。
Google 海量数据中心和服务器遍及世界各地,内部自成一套的高性能平台框架层出不穷,如果你是技术狂来了 Google 一定会欣喜若狂。但由此而来的问题在于,一个工具/平台不是已经废弃,就是正走在被废弃的路上 😜

海量组别和项目,以及相对来说较低的转组流程

在 Google 容易找到感兴趣的项目和方向。在目前组待满一年就可以考虑是否转组,Google 内部以转组形势进行的人员流动极大,有时候一两年过去一个组就换了一拨人。这批工程师小部分跳槽去其他的公司,大部分转到自己感兴趣/技术新/热门的组里去。
而转组也相对容易,只需要:
  1. 想去的那个组愿意接收;
  2. 自己当前主管同意。
由于 Google 内转组之频繁,主管对组员转组往往抱着开放态度,并不会有什么阻碍,毕竟也会有工程师从别的地方转过来。此外 Google 特有的 20%项目也是真的:你可以花费工作时间的 20%(相当于一周 5 个工作日里有 1 天)在自己所在组之外的项目上面。所以一个来自 Android 团队的后端工程师有可能花费他 20% 的时间在 YouTube 团队的某个 AI 项目上,这也往往成为员工们迈出转组的第一步。

高配置的办公设备

来看这串长长的清单:
  • 升降桌
  • 人体工程学椅
  • 人手一台 64G 内存的高性能工作站
  • 2 台 27 寸的 2k 显示器或 1 台 32 寸显示器
  • 顶配新款 Macbook Pro
  • 工作需要(如需要值班)可申请 iPhone 或 Pixel 手机
  • ……
至于人体工程学键鼠和各种数据线、充电线转接头,都是要用拿。

印有 Google Logo 的小物件

传说中的 T 恤没了,但还有别的:背包、帽子、水杯、上衣外套以及……浴巾和袜子?下图是我实习结束时收集到的所有 Google 小物件。

免费的三餐、水果和无限的饮料咖啡

这些已经渐渐成为互联网公司的标配了,这里贴几张 Google 上海的食堂照片。
Google 上海的食堂

Google 的招聘流程

Google 招聘的中文页面上有详细的聘用原则和流程,和我们相关的环节其实只有:
  1. 投递申请
  2. 面试
  3. 签 offer
需要注意的是,从简历开始就得是英文的,面试当然也要用英文。
Google 在世界各地都有办公室,因此每年收到的求职简历也是海量,最快的招聘流程也需要一个月。如果有意延长招聘流程(比如拿到了面试资格但希望推迟面试好多做练习准备),长达半年也不是什么难事。我在面试 Google 实习生的时候,临面试还有两天突然觉得心里很没底,于是给 HR 发邮件问能不能延期。HR 人很好地表示理解,并帮我把面试延到了一个月之后,给了我更多的准备时间。

实习生招聘

Google 美国的实习生招聘需要通过两轮电话技术面试。

实习生转正

在实习期间 HR 会联系实习生是否需要进行转正。如果实习生确认需要,那么在实习期结束的前一周,会进行两轮技术面试。此外实习期间的导师和一名组里很熟悉实习生工作的工程师(常常是小组主管)会分别提供一份对实习生的评语。这两份评语加上两轮面试的评语被打包交给 Google 的招聘委员会,由他们决定实习生是否通过转正。

全职招聘

全职招聘流程较复杂,首先需要通过 2 轮电话技术面试,然后被邀请到公司总部进行 4–5 轮现场技术面试(称为 onsite interview)。之后所有面试的评语会打包给 Google 的招聘委员会,由他们决定是否通过面试。
需要说明的是,招聘委员会决定候选人通过面试之后,还需要给候选人确定职位级别和具体薪资待遇,然后交给部门副总审核签字,才能真正发出 offer。一般来说通过了招聘委员会就比较稳了,因为后面的事情大多情况下只是走个流程。
放满 Android 版本雕塑的「安卓墓地」——其实是纪念公园Google 纽约办公室内的乐高墙

如何准备工作申请

接下来介绍下准备工作,相信这才是大家所关注的。虽然本文标题是 Google,但是接下来要说的内容对任何一家互联网公司求职都适用。

0. 从长计议

如果还是在校学生,一定要把在校绩点(GPA)提上去。Google 注重多元化的人才,但如果你是名校又有好看的绩点/年级排名,谁看到你的简历都愿意给个机会。
如果已经毕业无法改变 GPA,那么一定多多积累有一定难度,能够反映你能力的项目。此外还需要练习好英语,至少能够看得懂英文邮件,听得明白面试官问什么,以及能够说清楚自己的想法思路、解释清楚自己的代码。
最后可以尝试建立职场人脉。通过 LinkedIn 等职业社交网站结识已毕业的校友、企业中高层主管、与名企有业务往来的猎头、名企的 HR,说不定他们会为你提供内推机会和回答你关于求职的问题。

1. 如何准备编程项目

想要成为软件工程师,一定需要有实际的编程项目来证明能力。开始求职前就要找到自己想要从事的方向:前端、后端、移动端、人工智能、大数据、内部平台、测试等等,并挑选三四个过去的项目经历来证明自己的能力。无论是否已经毕业工作,挑选出的项目最好能够证明三件事情:
  1. 你具备扎实的软件开发的基础能力:编程语言,数据结构和算法,软件测试及调试技能,数据库,网络及操作系统等等基础知识。
  2. 你具备团队协作的软实力:发现问题和解决问题的能力,在这些项目之中你需要与他人协作和沟通,如何与他人一起解决问题。
  3. 你所做的项目有一定影响力,或者你在这些项目中体现了你的影响力:例如你说服大家采用敏捷开发,你带领团队攻克了某个技术难题,你在某些决策中选择了对用户友好的方案。
以上三点多少有点抽象,如果你的项目具备一定的复杂度(比如你尝试了全栈开发,一个人完成了后端、前端、存储、移动端),并且有一些技术亮点,当你讲给面试官时有信心引起面试官的兴趣,那么这个项目就满足以上的标准。
我在准备申请的过程中,也遇到了优质项目不够的窘境。当时我有微软的实习经历和国内互联网公司的全职经历,但是微软的实习项目年代已久没什么好说的,而在国内的全职经历所用技术和 Google 软件工程师的要求重合度颇低。所以当时蛮积极地寻找能做的项目,最后通过下面几个途径完成了四五个软件、大数据和机器学习的项目:
  1. 首先是对学校课程项目的优化和升级:例如数据库的课程大作业是做一个电商平台的后端系统,那么在此基础上开发前端页面或者移动端。或者搜索引擎课程大作业是做一个简易搜索引擎,那么在此基础上加上机器学习、自然语言处理等算法来提升其可用性。
  2. 其次是在线课程网站提供的作业项目:可参考 Udacity、Udemy 及若干独立编程教学网站。缺点是遇到问题时很难寻找到有效的帮助,可能需要花费一定的时间和精力。
此外,还有一些在线培训班会手把手教你用一些时下流行的技术,做一些难度不太大的完整项目。我个人没有尝试培训班,但是有在网上阅读过他们的课件,由于所用技术蛮潮流,唬唬人还是很可以的。缺点是含金量见仁见智,而且总有一点点速成催熟的感觉?

2. 如何书写求职简历

有了合适的项目,接下来就是将其写到简历。如果你想投递多个岗位,那么最好为每个岗位有针对性地准备一份单独的简历。比如你想申请前端开发和移动端开发两个岗位,那么给前端的简历里要突出你前端的相关开发经历,给移动端的简历里突出移动端的相关开发经历。
用一份简历应对所有的公司和岗位,往往是申请失败的开始:HR 看你的简历不过短短十数秒,不要把宝贵时间浪费在跟所申请岗位无关的内容上。
如果对英文简历的板式不熟悉,这里有一个傻瓜式的填鸭简历模板 resumemaker 只需要把联系方式、教育经历及项目经历粘贴进去,这个网站会自动帮你排好版。
至于英文简历的措辞,可以参考这篇文章:《如何写出优秀的英文简历?
需要注意的是,简历是打动 HR 的唯一敲门砖,实在是非常的重要。一份让 HR 无法说不的简历往往具备以下特点:
  1. 名校/高 GPA/高排名/获得过奖学金
  2. 名企实习/热门领域(人工智能/深度学习/无人驾驶/区块链)
  3. 充实的项目(充实不等于数量多,而在于项目本身的深度广度)
  4. 与所申请岗位匹配(符合职位需求页上所要求的编程语言、框架、技能)
如果说上面前二条是硬指标有就是有、没有就是没有,那么后两条完全可以通过话费时间和精力来不断完善和优化。尤其最后一条,一定要做到简历里体现的信息能够与申请岗位匹配。例如职位详情页面里提到了这个岗位需要熟练掌握 Spark,那么简历里最好有一两个专门的大数据的项目运用了 Spark 并且能够突出你对这项技术和相应的 AP 非常熟练。

3. 如何准备技术面试

说了这么多项目和简历,其实也不过是为了拿到面试机会而已。Google 的面试流程其实颇为简单粗暴:电话面试 + 现场面试。并且软件开发的岗位,面试内容均为编程相关,也就是算法题加系统设计(针对社招)。

3.1 算法面试

想要做好一件事情,首先需要了解这件事情的本质。算法面试的本质在于:
  1. 考察应聘者在面试过程中解决问题的表现:
    1. 是否正确理解问题,是否了解问题的范围(即处理这个问题的时候,应该考虑什么因素、不应该考虑什么因素)
    2. 解决问题的思路和步骤是否有条理
    3. 是否对边界情况考虑周全
    4. 面对多种可能的解法如何分析取舍
  2. 例如,给你一个全是整数的数组,找到其中倒数第 k 大的元素。在写代码之前,你需要考虑到的因素可能有:这个数组的长度比 k 小怎么办?这个数组排好序了吗?这个数组里有没有重复元素?这个数组是空的怎么办?
  3. 考察应聘者对常用算法的熟练程度
    1. 是否能够通过上面对问题的分析选取恰当的算法
    2. 是否能够分析不同算法所带来的时间、空间复杂度
  4. 例如:什么时候该排序,什么时候可以使用优先级队列;建一个二叉搜索树的时间复杂度是多少,遍历一棵二叉树的时间复杂度又是多少。这些应当能够做到条件反射般自然。
  5. 考察应聘者的编程能力
    1. 是否能够选取恰当的数据结构来实现算法
    2. 是否能够写出高质量的精简代码
    3. 是否处理好边界情况
    4. 是否熟悉常用的 API(如数组操作、字符串操作、常见的容器操作)
  6. 考察应聘者的沟通能力
    1. 在对问题不熟悉的情况下如何通过交流搞清楚问题的本质
    2. 如何与面试官「合作」一起解决这个问题
    3. 遇到困难的时候如何向面试官「寻求帮助」
沟通能力说起来有点玄乎,其实面试时你在做算法题,面试官也在评估:如果这位候选人就是和我合作的同事,我是否愿意和他/她一起共事。虽然候选人是解决算法问题的主导者,但遇到困难(如完全没有一点思路、编程语言的某个语法细节不记得了)时,完全可以开口询问面试官:「您能否给我一点提示」;「我的思路是 XXX 这样的,但是在处理 XXX 情况的时候可能会有一点问题」;「我不记得如何将字符串转成小写的那个函数名了」,这是完全允许的。
而上述种种,都需要在 45 分钟的面试中展现。你一定会觉得短短 45 分钟又要想解法又要写代码,不足以展现你的方方面面。Google 也是这么认为的,所以他们会给你安排 2 轮电话面试+5 轮现场面试。想要拿下这么多场面试,对算法和编程的熟练程度至关重要,于是这便引出了大家口中的「刷题」。
问题一:题什么是题?
这里指的题当然是算法题。形式如「给一个长度为 2 N 的整型数组,其中 N 个元素的值相同,其他 N 个元素的值互不相同,找到其中的重复元素?」
问题二:在哪里刷题?
有诗云:「码农岗位千千万,不识领扣也枉然」。最广为人知的刷题网站当然是 LeetCode
力扣(LeetCode)收集了大量公司的海量面试算法题,并且社区非常活跃,是练习算法题、讨论交流解法的好地方。
问题三;该刷到什么程度去面试?
当你开始有一定的自信,即便面对新题,第一眼看到心中隐约能有一两种解法、甚至代码已经跃然脑海。

3.2 系统设计面试

系统设计面试的本质在于(除去算法面试已经提到过的内容):
  1. 如何通过沟通估算出要实现的系统需要承载多少用户、访问、读写量。没有这些业务指标,无法科学地指导我们选取合适的架构、框架和工具。
  2. 如何设计系统架构,来实现功能性、安全性、可靠性、扩展性、性能。
  3. 面对模糊不清的指标/功能,如何对架构和设计进行取舍。
系统设计的面试相比算法面试,更加灵活,更加注重沟通。虽然不需要写什么代码,但考察的是对整个系统和架构的把控能力。
举个例子:YouTube 播放视频的页面上有点赞这个按钮,你觉得应该如何来设计它的实现?
乍一听好像就是在界面上加一个按钮,然后当用户点击奇数次的时候把数据库里对应的点赞数加一,点击偶数次的时候把对应数值减一。
但是想深一层,YouTube 后台服务器部署在世界各地,存储点赞数值的数据库表也分散在世界各地的数据中心。如何更新缓存,何时真正写入数据库,浏览器里如果打开了多个该视频的页面该如何现实,热门视频点赞 TPS 过高该如何应对等等。这些都需要超出算法以外的工程眼光和实战经验来找到合适的解答。
除了算法面试和系统设计的面试,很多公司也出现了其他形式多种多样的面试(如现场做一个小 project、与面试官一起 code review 等等),但与本文相关度不高,在此表过不提。

一些资源链接

现今社会分工细致,从项目准备到面试准备,整个流程的各个环节都能找到付费的培训机构和培训班。这些机构自有其存在的原因,效果口碑也有好有坏,因人而异。
我个人是比较反感报名这类机构,如果连编程算法这些基础的技能都需要人手把手指导,能否跟上快速变更的技术浪潮实在存疑。但不能否认很多人从中获益,能力和见识得到提升,毕竟 Every coin has two sides. 
这里推荐一些自己用过的资源,适合自学且质量靠谱,真正做到不需要氪金,通过自己的努力就可以变强!(真正原因是我穷 T_T)

结语

其实在面试 Google 实习生之前我也紧张的不得了。时间再往前推一年,如果有人跟我说能去 Google 工作,恐怕我自己也无法相信。但是事实证明,经过充分的信息收集和漫长的练习准备,无论最后是否拿到心仪公司的 offer,自己都已经有所成长和提升,不再是两年前的自己。以上就是我对于 Google 工作岗位申请和准备的一些心得和总结,希望能给想来 Google 工作的朋友一点信心和鼓励。
  1. 可见 Google 里面不全是谢耳朵。
  2. 也可选顶配 Chromebook 或 Thinkpad 笔记本。

没有评论:

发表评论