我通过了 Google 技术面试,所以你也能行!
作者 | Emma Bostian
在通过了Google技术面之后,我中途退出了应聘流程。我知道你会怎么想:“你疯了吗?!谁会中途退出Google面试?”
这篇博文将讨论我在Google面试中的经历,以及通过技术面流程的技巧(适用于任何公司的技术面)。
Google以超难的技术面而闻名,而且是一家让很多面试者垂涎不已的公司,所以我选择在此博文中重点介绍它。
虽说如此,但其他的好公司也有很多,其中一些没有Google这个技术巨头那么知名,但这并没有什么关系。要成为一名成功的开发人员,并不一定非要为一家知名公司工作。
此外,为大公司工作也是有利有弊的(我将在本文中介绍)。想清楚自己要从一份工作中得到什么,然后去寻找符合这些核心价值观和工作环境的公司。
我只能就Google(或任何其他公司)的JavaScript /前端面试流程谈谈,而我的面试经历可能跟你的面试经历有所差别,因此请有所保留地听取我给出的建议和经验。
我不会透露我在Google面试(或任何其他技术面试)中被问到的面试问题,因为我认为这对公司不公平。作为候选人,你想要凭借自己解决问题的能力获得工作机会,因此我选择在本文中强调你应该学习的技能,而不是面试中会问的问题。
不要背诵答案,而要学习解决问题的能力,从而构建高效的解决方案!有关如何成功进行技术面试的更多见解,可以参考本文的面试技巧部分。
最后,我只想对整个Google团队,以及与我交谈过的任何现任或前任员工表示感谢。我遇到的负责招聘的人员都非常出色,与每位面试官的交流过程都十分愉悦。他们给我的感觉很舒服,从来没有让我觉得自己不够聪明。我被问到的都是一些公平的,能够评估我日常工作中所需技能的问题。为此,我要说谢谢。
历史
这是我第三次面试Google(每次的进度条都走得更远一些)。以下是概述。
回合1:2016
我的第一次面试是在2016年,当时我还住在德克萨斯州的奥斯丁。那一次我对技术面试的准备非常的不充分,但居然还是坚强地通过了招聘人员的电话筛选,并且经过了两道技术电话面试题才被拒绝。
回合2:2019
我第二次面试Google是在2019年底。我以为我参加的是材料设计(Material Design)团队中的用户体验工程师(UX Engineering)的面试,但我最终完整走了一遍软件工程面试的过程,所以有些准备不足。
我通过了电话编程挑战,然后转到去慕尼黑的园区参加现场面试。我进行了两轮前端技术面试,两轮数据结构和算法面试,以及一次围绕开发过程,沟通和文化契合度的面试。
我的前端面试中的一轮是在Chromebook上通过Google Hangouts进行的,很不幸,我们遇到了技术问题(Chromebook无法启动,Hangouts无法屏幕共享),并且一半的面试时间都花在了故障排除上。面试官后来告诉我,我的JavaScript技能还有进步空间。
结果就是,我没有通过面试,但团队希望我在一两个月后再到慕尼黑园区重新面试。我那时的生活有点混乱,所以婉拒了重新面试的邀约。
回合3:2020
2020年初,我重新面试了Google的用户体验工程师职位,因为我在几个月前刚刚面试过,所以这次的面试流程就加快了(我不必重新进行电话代码挑战,现场做数据结构和算法题,或进行过程/文化契合度面试了)。
我把一个用户体验工程项目带回家做,设计了用户流和信息架构,使用Sketch创建了高保真模型,并搭建了一个app。然后,我在一个文档中简洁地记录了我的流程以及工具选择。
通过了这个项目挑战之后,我又用Google Hangouts进行了三次Google现场面试(由于COVID-19疫情无法实地面试)。我进行了两次前端技术(代码)面试,一次用户体验面试,在用户体验面试的过程中讨论了我带回家做完的项目,以及可以从用户体验的角度进行的改进。
在“现场”面试之后,我的招聘人员(面试两天后)通知我,我已通过面试,且后续会进入招聘委员会和团队匹配阶段。
我与招聘主管见了面,我们讨论了手上的这个职位。巧合的是,我在慕尼黑的第二轮面试中遇到过这个主管,所以再次见到他还挺开心的。
在这之后,我等了几个星期,在此期间也继续面试其他公司。不幸的是,由于COVID-19疫情,Google的内部招聘流程有些混乱,所以我最终接受了另一家公司的offer。
我永远也不会知道自己最终是否真的能收到Google的offer,但起码我已经通过了技术面,所以已经很为自己骄傲了。曾经有人说我的技术不够出色,我也曾经觉得自己的技术无法在这个行业立足,以前的时候我觉得能进入现场面试这一轮就已经很不错了。
怎样才能成为Google的员工?
想要应聘去Google,你必须具备以下特征。
做一个善良的人
愿意学习
具备良好的沟通能力
做一个优秀的问题解决者
展现出色的团队合作精神
具备同理心根据我的经验,招聘人员们找的不是天才,而是具有良好沟通和团队合作能力的善良,勤奋的人,而且许多其他公司也都是如此。
一般面试流程
Google的一般面试流程包含五到六个阶段:
Google的一般面试流程包含五到六个阶段:
招聘人员电话面试
技术电话面试/代码挑战
带回家做的能力测试*
现场面试
团队匹配阶段
招聘委员会
*此步骤仅针对用户体验工程师,而不是软件工程师。
让我们再深入研究一下这几个阶段。
招聘人员电话面试
在招聘人员电话面试期间,招聘人员会向你提供有关这个职位和面试过程的更多信息。但是,不要轻视这次面试,因为面试过程中的每个步骤都很重要,并且会影响公司对你整体表现的评估。
招聘人员电话面试的一些技巧:
提前阅读关于这个职位和公司的内容
要准时
准备好两三个问题,用来在面试时问招聘人员
最后不要忘记感谢他们抽出时间
你的招聘人员会努力为你争取offer,因此对他们nice一些!
技术电话面试
如果招聘人员电话面试进行得顺利,接下来你将进行技术电话面试。在通话过程中,你将与一名Google员工配对,TA会给你出一个编程挑战问题。
我回答了一个问题,这个问题主要是测试以下技能:
DOM操作(访问DOM节点,执行某些任务,动态生成新的DOM节点)
CSS
我在Google文档中写下了我的答案。下面是我的解题思路。
提一些问题:由于招聘人员希望了解你的想法,所以他们问的问题本身会不够全面。
编写伪代码:写伪代码的过程可以让你在写真代码之前先理清思路。
写出暴力解决方案:你不必第一次就写出最优解。从暴力解决方案开始,然后再进行优化,这能够显示出你对性能的关注度。
优化你的方案:如果已经有了暴力方案,那么该从哪里着手进行优化呢?你能否将一个嵌套的for循环重构为两个顶级循环?
测试边缘例子:在你的方案能够运行且已经过优化后,你需要创建一些测试用例。这将让你知道自己是否错过了任何极端情况。
编程项目
如果你的技术电话面试顺利进行,你可能会被要求把一项编程项目带回家完成。在软件工程面试中,我没有被要求做任何项目,但是在用户体验工程面试中,我被要求完成一个项目。
我非常喜欢做这种编程项目,原因如下:
我能够从两个项目中选一个,这两个项目分别展示了不同的技能
我有一个星期左右的时间来完成该项目(尽管对方告诉我这个项目应该只需要几个小时),这减轻了编程面试的“现场”压力
我能够展示一些我最擅长的技能,例如详尽的文档,用户流程,以及信息架构
我可以自己选择技术栈
在埋头写代码之前,你应该先与招聘人员明确一下项目要求。例如,如果你想使用一个JavaScript框架,就应该先询问一下可不可以。
我对编程项目的一些小贴士如下:
尽量不要过于依赖第三方库。我当时选择使用Material UI(Google的设计系统)来做UI,因为这展示了我对设计系统的了解,并且保持了UI的一致性,但使用UI框架可能会对性能产生一定影响。
坦白地对待你想要改进的地方。在提交一份带回家做的项目作业时,我总是会在里面添加“还能改进的方面”这一项。如果再给你的项目几个小时或几个星期的时间,你会做些什么改变?
通过可访问性测试器运行你的应用程序。我通过Google Lighthouse运行我的app来测试可访问性。
不要在项目上花太多心血。如果招聘人员告诉你,在项目上花费2-3个小时就差不多了,那么就不要花一个星期。你会感到身心俱疲,而且如果公司在此之后拒绝了你,你会觉得自己被利用了(我的经验之谈)。
把你的代码收拾干净。确保删除注释,并确保代码格式正确。
考虑一下项目架构。你的文件结构应该清晰有序。
添加安装说明。如果检查你代码的人不知道如何运行你的程序,则你可能就无法进入下一轮面试了。
现场面试
如果你已经成功晋级到了现场面试这一轮,恭喜你!你已经跨出很大的一步了,你应该为自己感到骄傲!
在我第二次面试Google时,我去了慕尼黑园区,并参观了办公室(办公环境真是太棒了!),但在我最近的这次面试过程中,由于COVID- 19疫情,所有的现场面试都是通过Google Hangouts进行的。
现场面试分为五轮:
两次前端面试(代码)
两次数据结构和算法面试(代码)
一次过程/团队合作/文化契合度面试
前端面试将集中考察HTML,CSS和JavaScript等前端技术,但也可能会对性能和异步JavaScript等其他领域有所涉及。
前端面试
以下是我建议为前端面试准备的技能:
有关要点内容,请点击:
https://gist.github.com/emmabostian/aea646464456c2fb4ad66f1051faba83。
数据结构与算法面试
以下是我建议为数据结构和算法面试准备的技能:
有关要点内容日,请点击:
https://gist.github.com/emmabostian/c996c68458dd5eb770529b52dd7bfb00
团队合作,流程,以及文化契合度面试
团队合作/流程/文化契合度面试融合了多种主题,从敏捷方法论到工作流,从团队精神与协作到冲突的解决等等。
为了确保这个面试的成功,有以下小贴士:
拥有两个或三个项目可供讨论。
拥有一到两个你解决团队冲突的例子。
团队匹配阶段
如果你所有的现场面试都已经通关,那么困难的那部分已经过去了!有些候选人会直接进入招聘委员会,但另一些会进入团队匹配阶段。
在此阶段,你将会与潜在的主管见面,并讨论你将加入那个团队,以及你将从事什么样的工作。
如果哪个团队想要你,他们会告诉你的招聘人员,然后这个团队会被加入你的应聘文件夹(portfolio)中,然后被提交给招聘委员会。
招聘委员会
招聘委员会是面试过程的最后阶段。在我的理解中,委员会由几名Google员工组成,他们会审查候选人在整个面试过程中的表现。
在招聘委员会会议召开的前一两天,审核人员会阅读候选人的数据包,并就是否录取候选人发表意见。在会议上,审核人员会讨论他们的意见,如果所有成员都同意,那候选人就会得到offer。
我没有收到有关招聘委员会意见的反馈,因为我在收到之前就退出了流程,因此很遗憾,我也不清楚通过招聘委员会的概率。
学习技巧
对于面试,以下是一些一般性建议,这样能确保你发挥出自己全部的才能。
每天学一点
尽管这样你可能不会感觉自己每天都有巨大进步,但是每次的少量信息结合起来最终会取得惊人的结果。我喜欢James Clear撰写的Atomic Habits一书,这本书里更加深刻地阐述了这个观点。
当你每天集中精力学习一小段时间,就更不容易感到疲惫,而且这能让你的大脑有更多时间来消化学到的东西。
边学边做
你可以学会世界上所有的技术,但是如果你不把这些技术应用到各种各样的项目中,那么你在面试中可能很难使用它们。我建议学习一两个技能,然后找到一个示例程序来进行应用。
学着去看其他人的解决方案
你的解决方案可能好用,并且可能已经优化过了,但是阅读其他人的解决方案并了解他们的想法始终是有好处的。你可能会找到一种更高性能的方式来完成一项任务,但总的来说,学会阅读代码是一项非凡的技能,并且也是必备的。
面试技巧
当现场面试终于到来时,下面的一些技巧可以帮助你定下心来:
喝水
喝点东西可以给你一个深呼吸并放松下来的契机。你的面试官们应该会问你是否需要饮料,但如果他们没有主动提供,你尽可以问他们要。
澄清问题
白板问题会故意留有一些空白,因为面试官希望看到你解决问题的能力。如果有什么问题看起来仿佛没有讲清楚,那可能它的确不清楚!写下你所知道的东西,并推理出你不知道的东西。
如果卡住,就先暴力解然后再优化
如果你完全没有头绪,那就先从性能较差的方案开始。可以稍后再进行优化。
例如,如果要求你在有序的数组中搜索某数字,如果找到则返回true,那么你总是可以用一个for循环遍历每个数组下标,如果找到就返回true。在最坏的情况下,复杂度为O(n),其中n是数组的长度,因为我们要检查数组中的每一个元素。
在面试中,过了一会你可能会意识到,“哦,原来数组已排好序了!我可以使用二分查找来找到该元素!”二分查找是一种出色的分治算法,它通过每次减小数组的大小来重复对目标元素的搜索。最终这可能会比上一个解决方案性能更好。
说出你的思考过程
面试就是为了考察你是如何思考的,因此你必须大声说出自己的想法!你的面试官又不懂读心术。
如果你在两种解决方案之间摇摆不定,就告诉你的面试官,并解释为什么你对两种解决方案都持保留意见。他们也许能够指引你选出正确的那个。
测试你的方案
当你已经有了解决方案,并已经对其进行了优化,那就应该进行测试了。许多面试者会忘记测试,但测试是编程挑战的一个重要组成部分。你的解决方案可能适用于75%的测试用例,但忘记了其他25%的边缘用例。
在面试中,测试你的方案是不可或缺的一步。
不要依赖工具
Google通常会让你使用Word或纯文本编辑器来编写代码挑战问题,因此,不要依赖linters或Prettier来规范代码格式。要学会在无法使用工具的环境中编写代码。
最后的想法
Google并不是 “一劳永逸”的终极梦想公司。你甚至可能会不喜欢在大公司工作!
关于面试,要记住的最重要的一点就是,这是个双向的过程。公司在面试你,同时你也在面试这家公司。
你所拥有的技能是很有价值的,即使这家公司拒绝了你,也并不意味着你不够出色。
对于所有人来说,我们被拒绝的次数都要比得到offer的次数多,所以请加油,坚持下去。
文中所有插图都来自UnDraw,在此表示感谢!
原文:https://dev.to/emmabostian/i-passed-the-google-technical-interviews-you-can-too-4i6m
作者:Emma Bostian,软件工程师,藏书爱好者,猫咪铲屎官。