两周前,我在谷歌进行了一次现场求职面试。我面试的职位是谷歌SRE。SRE代表站点可靠性工程。站点可靠性工程师(SRE)既是软件工程师,又是系统管理员,负责谷歌从端到端的生产服务。
我采访了八个不同的人。前三个是通过电话,剩下的五个是在现场。第一次面试是与招聘人员进行的,不是很技术性,但其他七次面试都是技术性的。
不幸的是,我刚刚得知我没有被录用。招聘人员说,早上的面试不是那么棒,我应该在他们的关键任务团队中获得更多的工作经验。
更新:本文已被翻译成日文。更新:本文已被翻译成德文。
在我在Google Chrome上发布代码重用的帖子后不久,Google的一位招聘人员联系了我。这封电子邮件写道:
我在谷歌招聘顶尖的软件工程人才。我最近偶然发现您可能是一名世界级工程师,我很想更多地了解您。我保证也会交换一些关于我们的详细信息。有兴趣听更多吗?想成为谷歌的一名有影响力的玩家吗?那么请给我一份最新的(英文)简历,我很乐意打电话给你讨论。
起初,我以为我会申请一个软件开发人员的职位,但在我们检查了我的技能后,招聘人员得出结论,我更适合做一名SRE。我同意他的看法。这对我来说似乎是一个完美的职位。我热爱系统管理,就像热爱编程一样。
第一次面试是在9月10日,招聘者参加了面试。他向我解释了谷歌招聘流程,我们仔细检查了一下我的技能。我必须在C编程(8)、C++编程(7)、Python编程(6)、网络(6)、算法和数据结构(6)、分布式系统(5)、Linux系统管理(9)等一系列领域对自己进行从0到10的排名。
根据我的回答,我们得出结论,SRE是我的最佳职位。SRE必须了解所有内容:算法、数据结构、编程、网络、分布式系统、可扩展架构、故障排除。这是一个很棒的黑客职位!
面试的后半部分有一些基本的技术问题,以确保我不是在虚张声势。这些问题涉及Linux系统管理、算法、计算机体系结构和C编程。你可以在这篇文章的底部找到所有面试中的所有问题。
我犯了几个错误,但他很满意,我们安排了下一次电话采访。他警告我,这将是非常技术性的,我应该做好真正的准备。我请他给我充足的时间准备,我们把下一次面试安排在9月22日。
他还告诉我,每次电话采访时长为45分钟到1小时。
我制定了一份日程表,并开始准备。我找到了关于SRE的三个演示文稿:
因为我不知道在接下来的采访中将使用哪种编程语言,所以我在C++Cookbook、Python Cookbook和Perl Cookbook中查看了几十个食谱。
第二次电话采访是对谷歌的一名工程师的采访。他在负责运营AdSense、AdWords和其他广告的广告团队工作。
这次面试非常技术性,一开始就有一个算法问题,这个问题太大了,计算机内存无法容纳。我必须准确地告诉他我将如何解决这个问题,以及我将使用什么数据结构和算法。他还让我大声地想一想。采访继续就数据结构、DNS、TCP协议、与TCP相关的安全漏洞、总体网络以及Google本身等问题进行了讨论。
面试结束后,工程师必须写反馈给招聘人员。结果是积极的,我可以继续面试了。
我给了自己更多的时间准备,第三次面试是在10月1日。是和谷歌交通团队的一名工程师。
在这次采访中,我有一个非常简单的编程问题,我必须通过电话进行编码。我可以自由选择语言,我选择了Perl,因为它是我最喜欢的编程语言。无法通过电话口述我的美元符号元素的Perl语法open paren at data close paren open curly括号.。右花括号&34;所以我通过电子邮件提交了我的Perl程序。
问题是:编写一个程序来找出设定的差值。给定两个集合A和B,查找A-B中的元素,或者换句话说,查找集合A中不在B中的元素。
然后,同样的问题被带到了下一个级别,如果我们正在处理的数据是GB大小,TB大小,该怎么办?我的计划/解决方案会有什么变化?
最后,我又有了一个关于DNS的问题,然后是HTTP协议、路由和TCP数据传输。
反馈又是正面的,我可以为现场面试做准备了。在与招聘人员的谈话中,我得知将有五次现场面试,每次面试时间正好是45分钟。一个是关于我以前的工作经验,一个是关于算法和数据结构的,一个是关于故障排除和联网的,还有两个是关于软件开发的,重点是C和C++。
第四次面试最终在山景城的谷歌综合大楼进行。上午10点,我会见了我的招聘人员,我们就面试问题进行了15分钟的讨论。他告诉我,我现在有两次面试,然后谷歌的一名工程师会带我去谷歌的一家餐厅吃午饭,然后我还会有另外三次面试。
上午10点15分,第一次现场采访开始。是关于我以前的工作经验。我过去有过很多工作经验,我决定讲述几年前我在Linux上用C语言编写的一个物理安全通知系统。系统通过串口接收消息,通过SMTP发送电子邮件,通过GSM调制解调器发送文本消息。
在采访的最后几分钟,他问了我一些基本的Unix文件系统问题,例如,什么是inode?
第五次面试于上午11点开始。这是一次编码会议,以刁钻的问题开始,而不是真正的编码问题。刁钻的问题是这样的:当它是3:15?&34;时,时钟指针之间的夹角是多少?然后,我被要求用C语言在任意时间(小时/分钟)实现这个解决方案。解决方案是一个单行返回语句的数学表达式。然后我被要求在白板上写一个二叉树的实现。在编码时,我忘了初始化我编辑了mallow()的数据结构。程序在现实生活中会有段错误,而我会注意到这个错误。我说这里没有错误,但谷歌工程师指出我没有初始化数据。
这次面试之后,工程师请我吃了午饭,他在第二次电话面试中面试了我。她告诉我,她在谷歌工作了两年,对此非常高兴。我们去了Googleplex的亚洲餐厅。然后她带我参观了Googleplex。
第六次面试于下午12点45分开始。这是一次故障排除和网络面试。面试官在白板上画了一张网络图,并在上面想象了一个问题。我不得不问了一堆具体的网络问题来定位问题。他很满意,在采访的最后几分钟,他问了我一些具体的网络设备问题,比如路由器和交换机的区别是什么,OSI的型号是什么。
第七次面试于下午1:30开始。那是一次编码会议。我被要求实现一个简单的字符串操作子例程来查找两个C字符串中的公共字符。我可以使用C或C++。我选择了C。我在那里犯了一个小小的错误。整个采访都集中在这一个问题上。
最后一次,也就是八点,采访于下午2点15分开始。这是一次算法和数据结构面谈。这里提出的问题与第二次面试中的问题类似。这不仅是一个太大的问题,计算机内存无法容纳,而且它还是分布式的。如何对内存中放不下的数据进行排序,而您有100台计算机来对其进行排序。我不得不使出各种诡计来解决它。这次采访非常自由,我们就这个问题来回讨论。我在面试接近尾声时得出了正确的解决方案,他说没有多少应聘者走得那么远。我还被问到是否知道map-Reduce,当然,我知道map-Reduce,因为我刚刚读了谷歌的那篇论文。这是一个地图缩减问题。
面试结束后,工程师护送我去了大厅,我打车回了酒店。
总体而言,谷歌的采访非常有趣。我喜欢这样的琐碎问题。这些问题都是技术性的,但不是很有挑战性或难度。
假设有100 GB的文件和一台内存为1 GB的计算机,您会如何对其进行排序。