神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:Facebook是很多人梦寐以求加入的公司,自然它的招聘也是非常严格。不过严格是有道理的,一位伦敦的女程序员讲述了她成功应聘Facebook的心路历程,希望对你有帮助。本文译自Medium,作者 Kriti Joshi,原标题为“Insights and My Experience From My Interview at Facebook”。
Facebook办公室——位于伦敦Rathbone广场(来源:Facebook伦敦)
我刚开始求职那会儿,真的不敢想象能去Facebook工作。
但是五个月后,我拿到了Facebook的offer。
我的这次求职过程既有惊喜也有意外,本文将与大家分享我的经验和心得。
我之前在三星电子做了两年的软件工程师,想换个工作了。7月份我开始准备求职海投——所有那些热门的科技巨头公司我都准备去申请——只除了Facebook。我当时很没底气,想先去其他公司面试,磨炼一番,如果表现出色,自然会大大增强我的自信,然后我再去Facebook碰碰运气。
我利用上下班通勤的时候以及在准备面试的休息时间,开始在LinkedIn上建立人脉网络。我那会可执着了。我搜索找到想应聘的公司的招聘人员,给他们发邮件(如果他们在LinkedIn上的Contact Info下有留邮箱的话)或发站短。我并不期待会发生什么实际的结果,但这个联系招聘方的过程使我觉得很受激励,能够让人保持乐观,帮助我度过了求职的准备阶段,相信我,这需要巨大的努力。
Tip:LinkedIn是一个很好的平台,真的能够收到招聘方的回复,但需要坚持。不要犹豫,去接触陌生人,寻求他们的帮助。通过LinkedIn的站短,我联系上了亚马逊、微软、Snapchat、彭博社和苹果等公司的招聘人员并收到了他们的回复。
更幸运的是,我在8月份给Facebook的招聘人员发了邮件,他们真的打电话给我了。
Tip:接到第一个招聘方的电话(建立初步接触)是我找工作中最耗时的部分。尽管我感觉自己还没有准备好,但我还是去应聘了。在安排第一次面试之前,你可以向招聘人员要求几个月的准备时间。
第一次面试是电话会议的形式,我期待能有好结果,同时也做好了最坏的心理准备。面试官来自Facebook的AR/VR部门。
一点信息:Facebook分为多个部门,每个部门都独立招聘,它们分别是Facebook工程部、Facebook AR/VR部门和Facebook AI部门。
面试官问了关于我现在的工作岗位和工作经验的问题。在我职业生涯的大部分时间里,我一直是一名C/C++开发人员,我没有做AR/VR的经验。我担忧的是自己并不符合招聘方心目中的候选人要求。我被告知,只有当我在电话面试中表现得非常出色才有机会,因为我的工作技能点与他们团队需要的并不完全一致。
我的分析:当时Facebook工程部有一个招聘条件限制:只考虑有7年以上工作经验的候选人。可能8月是Facebook招聘季的尾声,这时全年的HC已经招得差不多了,空缺较少。我觉得在10月份之后,新的招聘季刚刚开始的时候,应聘会比较容易。
技术面试安排在两星期后进行。面试有两道题,要求在45分钟内解决。题目很基础,代码也很简单(数组和字符串问题)。我想强调的是测试运行,这非常重要。
测试运行:面试时你编写的代码没有编译和执行过。因此为了验证代码的结果是否正确,面试官要求进行测试输入,并展示代码如何运行。
Tip:测试运行是面试时调试代码的好方法。在面试准备中一定要加入测试运行哦。
对于面试官的第二个问题,我想到了两种解决方案,并向面试官分别解释了它们。然后,他让我比较两种方案,分析一种方案相对另一种的优势,最后会预留5分钟向面试官提问。我认为这5分钟对面试者的结果评估作用不大,所以不用担心。
Tip:众所周知,Leetcode是一个非常好的准备面试的网站,我觉得它非常有用。Leetcode上有一个鲜为人知的好工具——Leetcode Discuss,大家在这里分享自己的面试经验(和问题),相信我,很多问题确实都是重复的。
Facebook AR/VR事业部办公室。在伦敦还有其他两个Facebook的办公室。
Facebook的面试过程相当快。我在两天内就收到了他们的回复,然后飞往伦敦进行现场面试,一共安排了4轮。
共有两道题,需要在45-50分钟内解决。涉及的领域有二叉树、字符串、栈和列表。面试者需要先和面试官讨论解决方案,然后在白板上写下你的代码。
Tip:代码中总有一些极端情况需要处理,在临场发挥压力很大的情况下,要处理好这些极端情况并不容易。有一个技巧帮助我度过了难关,那就是测试运行。编码完成后,我马上告诉面试官,我要在一个通用的例子上测试运行我的解决方案,先自己调试一下。第一次测试运行我就找出来了代码中明显的错误——自己找出来总比被面试官指出来的好。通过测试运行我也有更多时间去思考极端情况如何处理,然后可以将其合并到代码中。
这一轮面试对入门级软件工程师来说是挺有趣的。它的目标是从头开始设计一个系统。问题陈述通常是这样的:
设计一个已经存在的产品,如WhatsApp、Facebook、Google搜索等。
实现这些应用中的一个特定功能;比如说,Facebook App中的时间线。
设计一个完全假设的场景;比如说,创建一个系统来存储相隔很远的三台服务器的日志。
这个面试肯定需要特别准备,最著名的辅助工具就是《系统设计面试》(Grokking the System Design Interview)。
好在这个面试没有标准答案。你应该能够证明你的设计选择的合理性,了解你所做的权衡。
这是面试中最简单的一项,但不要掉以轻心,因为在这次面试中出现的任何失误都会让你失去机会。面试问题都是非技术性的,如领导能力、团队精神、如何处理分歧等。这些问题几乎是固定的,可以事先准备答案。
Tip:面试前一天,先把热门的职场问题清单看一遍,想一想你过去职业生涯中的案例轶事,有哪些可以作为你回答问题时的例证的。在一系列技术面试的间隙,可以借助这个面试来放松一下。这一轮面试的信心提升有助于提高你的士气。
一周后我收到了面试反馈。我感觉自己表现得很好,但结果却不尽如人意。我在两轮面试中得到了很不错的评价,编码面试其中的一轮反馈也不错,但是挂在系统设计那一轮上了。以下是我从面试体验和反馈中获得的感悟:
系统设计面试是至关重要的一轮。务必要以结构化的方式有条理地展示你的想法,不要遗漏设计细节,例如数据库架构,协议定义等(请参阅《 Grokking系统设计面试》中的这些要点)。从收集需求到顶层设计,再到讨论利弊,每一个环节都要积极主动、并以合乎逻辑的方式推动讨论。
Facebook希望候选人在算法上有出色的表现。他们会寻找小错误,连可以优化的点也不放过,比如,遍历了两次数组而不是一次(这不是错误但是需要优化)。你要尽量做到最好,任何时候都不要自满。其他方面包括做测试运行,讨论极端情况如何处理,想办法优化,同时还要在白板上快速做记录。要求不多吧?(哈哈)从积极一面来说,我觉得所有的问题都能找到一个既优美又简洁的解决方案,既不难想出,也不难写。
我后来找招聘人员沟通,表达了我的困惑。我很确定自己会拿到offer,但面试反馈却出乎意料。我从来没有想到系统设计会有这么大的价值。幸运的是,他们又给我安排了两次面试,一次是系统设计,一次是编码方面的。于是我又飞赴伦敦,因为要参加另一家公司的面试,同时正好也能参加Facebook的面试。说实话,这五个月来我面了那么多场,很多结果都不理想,相当疲惫。
这两次面试是我最后一批面试了,我只想快点结束。不过这一次,我对于系统设计有了更深刻的理解,关于系统设计的流程也更加清晰了。我先参加了编码面试,非常顺利。而系统设计面试中要解决的问题,与一个非常流行的移动应用中的某个功能有关。这次我们更加详细地讨论了设计,进行了量化分析,如服务器中需要的系统数量、数据库大小等。这次我真的是全力以赴,我和面试官讨论得很愉快。
Tip:系统设计面试的重点是:收集需求、定义协议、高层设计、数据库模式、数据大小估计、组件设计和权衡。
两周后,面试结果出来了,顺利通过!我获得了Facebook工程部的职位,职级E4。(我最初申请的Facebook AR/VR团队的职位已经招到人了)。我想,之所以如此重视系统设计,是因为E4工程师除了要会编程,还要会设计。
我真没想到换工作会这么难,我非常能理解那些正在求职过程中苦苦挣扎的人的心情。事情的发展并不总是期待的那样,面试也有偶然性或运气的成分。《薄伽梵歌》中的一句梵语,让我在那些困难时刻很好地保持了清醒。
"你只有工作的权利,但成果不属于你。不要仅仅把结果当成你的动机,也不要让你的依恋变得无所作为。"(就是“但行好事,莫问前程”的意思吧)
祝各位好运!
译者:张茉茉