曾在 Google、Facebook、Foursquare、Dropbox、Fog Creek 等公司面试。
1. 谷歌
2. 雾溪
3.彭博社
4. Dropbox
5. Twilio
6. Foursquare
7. Facebook
总结
结论
这篇文章最初发表于我大学三年级时的博客上。由于它与 DEV.to 的用户相关,我决定在这里重新发布。
今年我申请了几家科技公司的实习,包括 Google、Facebook、Foursquare、Dropbox、Twilio、Bloomberg 和 Fog Creek。
下面,我将描述所有这些公司的面试流程。对于潜在的申请人,本文将提供我在这些面试中收到的所有问题,这应该会成为面试准备的有用资源。对于所有编程电话面试(我没有签署保密协议),我都附上了面试时编写的实际代码。
我只能提供轶事证据,但我相信我在这些公司的面试经历可以深入了解他们的招聘理念。
这是一篇很长的文章(约 3000 字),因此请随意跳过您不感兴趣的公司。
1. 谷歌
采访次数:3
职位:软件工程师实习生
经历:我在谷歌网站上申请了职位,大约三周后收到了HR的邮件,安排了两次连续50分钟的电话面试(中间休息10分钟)。我签了保密协议,所以不会透露具体的问题。这两次面试都与我在其他公司的经历截然不同。
第一次面试,面试官打电话迟到了20分钟,50分钟的面试变成了30分钟。他问了一道涉及UTF编码的低级编程题。我第一次听到这个问题时,完全不知道该怎么回答。我对操作单个位(bit)的经验不多,所以我慢慢地、刻意地把问题重复给他听,以确保我理解了他的意思。我很快在Google上搜索了如何在C语言中使用位运算符,并在StackOverflow上找到了这个很棒的代码片段,它让这个问题变得很容易解决。我提前写了一个解决方案,面试官似乎对我的答案很满意。
(更新:为了回应一些读者在电话面试中提出的使用谷歌的道德问题,我需要澄清一点。在我完成面试中的那个 UTF 编码问题后,面试官问我校验位宏在哪里找到的(他看到我粘贴了它)。我告诉他我从 StackOverflow 上找到了它。他似乎并不关心。)
在第二次面试中,我采访了一位谷歌员工,他负责管理一个服务器集群,并参与谷歌专有服务器硬件固件的开发。面试过程中,他占了90%的发言时间,用了大部分时间来解释他的工作有多么出色。他用夸张的语言详细描述了他工作的设施,并解释了他的服务器是如何存储PB级缓存搜索数据的。他只问了我几个问题,这些问题似乎是针对电气工程师的(例如,关于如何降低硬件功耗的问题)。我凭借自己微薄的物理和电子工程知识,给出了一些模糊的回答,但他都给出了很好的回应。
电话面试结束后,我对面试的问题不太满意。我觉得这些问题没能让我展现出我的计算机科学知识。面试官没有问任何关于数据结构或算法的问题,我唯一巧妙的做法就是快速地在谷歌上搜索了其中一个问题的答案。我虽然充满希望,但对自己的胜算却不太有信心。
两次面试几周后,HR 再次联系我,令我惊讶的是,他们告诉我我进入了最后一轮。招聘人员给我发了一封邮件,解释了最后一轮的流程:
简单来说,流程的下一个阶段是为您寻找项目。此流程可能需要三周时间才能完成,并且我们无法保证一定能找到项目或提供报价。我们承诺会尽力为您匹配合适的项目!
作为项目匹配流程的一部分,我会将您的信息分享给我们的实习生导师。实习生导师会审核您的信息,如果他们认为您有潜力胜任他们的项目或团队,会通知我。如果导师感兴趣,我会安排您参加 30 至 45 分钟的导师面试。面试将通过电话进行,旨在考察您的技能与项目的匹配程度。虽然导师的面试方式各不相同,但您应该做好心理准备,因为这可能是一场技术面试(因为许多导师希望进一步了解您的技术技能与他们项目的匹配程度)。
下一轮的运作方式是谷歌独有的。所有进入这一阶段的申请人都会被放入一个匹配池。这意味着所有这些申请人(包括他们的简历、候选人资料、以往面试成绩等)都会被录入一个数据库。潜在的面试官可以搜索这个数据库,并根据编程语言、GPA、分数等筛选结果。每位面试官都可以选择自己想要匹配的暑期实习生。通常,这位面试官会从一批申请人中挑选出一位进行第三轮面试,然后从中挑选一位实习生。
我处于匹配阶段超过三个半月,最终一位房东选中我参加第三次面试,而不是招聘人员说的“三周”。匹配成功让我如释重负;在11月到2月中旬这段时间里,我决定拒绝其他工作机会,争取获得谷歌的工作机会。
在第三次面试中,我与一位负责 YouTube HTML5 视频界面的工程师进行了交流。他让我用 JavaScript 编写一个简单的 DOM 选择函数,然后我们简短地讨论了事件委托。看起来面试进行得很顺利。最后一次面试结束大约十五分钟后,我接到了招聘人员的电话,邀请我到加州圣布鲁诺的 YouTube 公司工作。
谷歌的面试流程显然存在缺陷,其中最糟糕的部分莫过于匹配环节。这个匹配池对实习生来说似乎非常实用便捷;实习生可以选择具备符合自身需求技能的实习生。然而,匹配环节对实习生来说却是一个痛苦的过程。匹配环节大约一个月后,我拒绝了另一份工作邀请(因为截止日期已过),为了争取谷歌的实习机会,我冒了很大的风险。拒绝了另一份邀请后,我又在匹配池里待了十周,那时我已经完全放弃了获得谷歌工作机会的希望。不知何故,事情终于有了转机。
优惠:有
2. 雾溪
采访次数:6
职位:软件工程师实习生
经验:我在他们的网站上提交了在线申请后,两天内就收到了人力资源部门的邮件回复,安排了一次电话面试。我通过 EtherPad 进行了两次 45 分钟的编程电话面试,之后人力资源部门给我发了一封邮件,邀请我去纽约办公室进行现场面试。在 Fog Creek 办公室,我与 Fog Creek 的开发人员进行了四次 60 分钟的面试。
在我申请的所有公司中,Fog Creeks 的问题是最侧重数学和数据结构的。所有面试都涉及 ANSI C 编程,而且涉及编写一些非常酷炫的函数。以下是一些面试问题:
- [根据 Fog Creek 的要求编辑]
- 现场面试 3:写下itoa 。我很惊讶他们会问这个问题,因为 Joel 的《游击面试指南》明确提到这是一个很好的面试问题。
Fog Creek 的面试流程可以说是所有公司中最好的。HR 的邮件回复很快,他们的问题很有挑战性但又切实可行,而且我去办公室的时候他们提供了很棒的便利设施。他们的面试系统条理清晰,非常完善。虽然我没有收到录用通知,但我相信我在 Fog Creek 的面试中,最准确地展现了我的程序员技能。Fog Creek 的面试流程如此出色也就不足为奇了:他们的 CEO Joel Spolsky 甚至写了一本关于招聘科技人才的书。他们持续推出优秀的产品,这一点我并不感到惊讶。
优惠:无
3.彭博社
采访次数:3
职位:金融软件工程师实习生
经历:我通过校园职业中心网站申请,并参加了45分钟的校园面试。之后,我被安排去纽约办公室进行现场面试,最终进行了两次各60分钟的面试。所有编程问题都是一些简单的C语言字符串操作问题,不需要超过8-10行代码。示例问题:
- 编写一个函数来转换字符串,使连续的下划线序列变成单个下划线。例如\ (_hello___world__ => _hello_world_)
- 栈和堆有什么区别?
- 给定一个char* 字符串,编写一个函数返回最常出现的字符的最后一次出现的索引。
- 编写一个函数,接受一个char *string并将一系列连续的相同字符转换为连续字符的数量和字符本身。例如 (aaabbbbcccccdde => 3a4b5c2de)
彭博社问的问题和编程面试准备书中的题型一模一样。对一家公司来说,这种做法很危险;使用众所周知的问题会增加招到不合适的人的可能性。一个平庸的程序员即使记住了《编程面试大揭秘》中的例子,也能在彭博社的面试中表现出色。更糟糕的是,我在校园面试和公司内部面试中都被问到的第一个问题都是一样的(连续下划线题)。第一次我花了几分钟才解开,但第二次我当然立刻就记下了答案。对于彭博社这样的大公司来说,这简直是偷懒。我怀疑这不是巧合;我敢打赌,彭博社的员工都会拿到一本面试样题手册来问求职者。
优惠:有
4. Dropbox
采访次数:0
职位:软件工程师实习生
经历:进入新一年,我最想去 Dropbox 工作,而不是其他任何公司。他们发展速度惊人,我忠实地使用他们的产品,而且他们解决了一个计算上很有趣的问题。我在线申请了职位,但没有收到回复。等了两个月后,我在 Dropbox 网站上搜索了一下,找到了两位招聘人员的邮箱。我给他们都发了邮件,附上了一封特意写的求职信和我的简历。但我什么也没收到,甚至连一封承认我存在的电子邮件都没有。真是太扫兴了。
优惠:无
5. Twilio
采访次数:2
职位:软件工程师实习生
经验:我在 Twilio 网站上申请了职位,第二天就收到了 HR 的回复邮件。我参加了两次 30 分钟的电话面试,但最终没有收到录用通知。示例问题:
- 创建一个推文搜索引擎,允许你将推文插入数据库,并按单词或短语搜索推文。不应使用关系数据库;所有数据结构都应存储在内存中。代码
- 描述不同类型的数据库索引(主索引、唯一索引、索引等)。这些索引分别在何时使用,以及它们在数据结构层面有何不同。
- 描述数据库规范化:要求是什么,不同的范式,为什么规范化很重要,等等。
我对 Twilio 的面试过程了解不多,因此无法对这个话题发表太多评论。
根据我的经验,他们的问题较少关注数据结构/算法,而更多关注 Web 开发和数据库。
优惠:无
6. Foursquare
采访次数:2
职位:软件工程师实习生
经历:我是在网上申请的,大概一个月后,HR联系我安排电话面试。
第一次面试不涉及编程,更像是一场技术讨论。首先,我和面试官各自做了5分钟的自我介绍,介绍了自己的背景和正在做的项目。接下来的半个小时,我们讨论了几个计算机科学方面的话题。我们谈到了以下几点:
- 数据库系统中的事务
- 死锁、锁粒度
- 并发,Peterson 解决方案
下一轮是编程电话面试。面试官要求我
用脚本语言实现一个 Foursquare 排行榜。本质上,我需要
创建一个类来存储用户在过去 7 天内每天获得的积分,并实现addPoints(user, points)和getTotalPoints(user)
方法。
我的第一个解决方案是一个七桶数组,用于存储用户过去七天获得的积分。当用户获得积分时,这些积分会被添加到数组的第 0 个桶中。午夜时分,一个 cron 任务或其他函数会将所有积分值向右移动,并将 0 积分值放置在第 0 个索引处。
看到这个问题后,面试官解释说,随着用户群的扩大,运行每日 cron 作业的计算成本会很高,并要求提供更好的解决方案。
我添加了一个属性,用于保存用户点阵列上次更新或读取的时间戳。每次读取/更新点阵列时,都会有一个方法计算自上次读取/更新以来已经过了多少天,并相应地移动点阵列。
第二次电话面试几周后,我收到了录用通知。
优惠:有
7. Facebook
采访次数:
职位:软件工程师实习生
经历:我在十月的第一周在线申请了职位。两个多月过去了,我还没有收到回复,于是我联系了去年在 Facebook 面试过的朋友。他给了我他的招聘人员的联系方式,我联系了她。她立即回复说,申请者太多了,所以我需要在 InterviewStreet 上完成一个 45 分钟的限时编程挑战,作为电话面试前的准备工作。
我以为这个挑战会很容易,毕竟这只是电话面试前的准备。
结果我觉得相当难,不过你自己可以判断一下(Facebook
面试题)。一开始我用 PHP 回答了 20 分钟,后来我意识到自己用 C 语言编写这类数据结构更有经验,于是决定换用 C 语言。这个选择很糟糕。我没能及时完成,也没能进入下一轮。
优惠:无
总结
以下是我在大学面试过程中学到的一些经验教训:
面试准备书籍固然不错,但为了好玩而编码更佳——面试官问我的大多数问题都不是面试准备书籍中涵盖的类型。真正好的问题会涉及一些你从未见过的数据结构或函数。在我的 Fog Creek 面试中,面试官问我是否听说过间隙缓冲区 (Gap Buffer)。当我回答“没有”时,他回答“很好”,并接着描述了间隙缓冲区,并让我实现一个。面试官想看看你如何处理新事物。这就是为什么为了好玩而编码的价值所在;当我为了好玩而编写新程序时,我至少会花 25% 的时间在 Google 和 StackOverflow 上学习如何执行 X、Y 和 Z。通过这种练习,你可以学习如何快速学习新事物。
尽早申请,不要胆怯——我大二的时候,直到二月份才申请暑期实习。那时,很多科技公司已经招满了暑期实习生,而我却没有在顶级科技公司找到工作。大三的时候(今年),我在十月的第一周就提交了所有申请。如果公司没有回复你,就找到招聘人员的邮箱,给他们发个消息。利用你所有的人脉。你表弟的同父异母兄弟的叔叔在Facebook工作吗?联系他,让他帮你联系HR。问问他,你不会有什么损失。
做一个副业项目——我知道大家都这么说。但说真的,一定要去做。我之前提到的每家公司都让我描述一个过去有趣的编程项目。拥有一个副业项目会让你的自我介绍更有趣,它能展现你对编程的热情,还能让你积累解决实际问题的经验。谈论我的副业项目(ClosetPilot,一个Poshmark 机器人。阅读Poshmark 技巧)总能给面试官留下深刻印象。
结论
希望你喜欢我在博客圈的首篇文章。我之前从未见过任何文章概述科技公司面试流程的差异,所以我决定自己写一篇。
如果你好奇的话,我决定接受 Foursquare 的邀请。
鏂囩珷鏉ユ簮锛�https://dev.to/seanh/interviewing-at-google-facebook-foursquare-dropbox-fog-creek-etc-1hin