我在Facebook担任软件工程师已有一段时间了。在这段时间里,我获得了来自朋友和陌生人的不同询问,询问是否要在Facebook担任高级工程职位。这篇文章将解释可以帮助您在Facebook或任何其他FANG公司实现理想工作的过程。它将解释我在Facebook求职之前采取的步骤。
免责声明:这是我在接受Facebook采访之前亲自采取的方法。我在这里提到的大多数材料都是可选的。我经历了他们,因为我并不着急。我的目标不是在FANG公司找到工作,而是在过程中学习。
毫无疑问,技术面试会带来压力,但是稳健的流程可以帮助候选人缓解和管理压力水平。
大公司的面试过程包括一开始进行一次或两次电话面试。如果一切顺利,他们将邀请您进行最终的现场采访。现场访谈包含多个部分:1)行为部分2)编码部分3)系统/产品设计访谈。获得报价取决于所有这些采访的累积表现。为了节省时间,我不会在这里着重于行为方面的内容,因为网络上有大量的资源详细解释了该部分。
大型高科技公司不会对您决定在面试中使用的语言有所贬。
在进入Facebook之前,我主要使用Ruby,Javascript和Erlang进行编码。不过,在我的采访中,我决定使用与Ruby类似的Python。另一个原因是Python和Java在大型科技公司中众所周知。 Python语法非常简洁,这使其非常适合白板面试。为了刷新我对语言的了解,我花了几天时间阅读Python 3.7教程。这帮助我熟悉了Python 3语法和习惯用法。人们必须避免在编码面试中使用较少的主流语言,因为您的面试官可能不熟悉这些语言。无论如何,建议您不要用脚踢自己,而要坚持经典的面试语言。
我还花了几个小时阅读Python词汇表。这使我熟悉了Python社区中使用的术语。
引导项目是最难的部分。为了解决这个问题,建议制定一个每周计划。每周计划不如每日计划详细。他们让您看到全局并快速失败。在制定了每周计划之后,我提出了更详细的每日待办事项。
帮自己一个忙,记下您正在研究的主题。在这段时间里,您将涵盖许多不同的主题,而作为一个人类,您会忘记大多数主题,因此记笔记并不时地复习它们。您的笔记也是下次准备面试时的宝贵资源。这些笔记属于您,因此请随时发挥创造力并减少沉闷感。
《算法简介》是有关算法的入门级教科书。我上大学时曾读过它,但是我需要刷新记忆,所以我决定先学习它。请注意,您无需通过CLRS即可成功完成面试。我刚刚读了它,因为我记得在大学时喜欢它。
在大多数情况下,我坚持我的计划,但是那几天我落后了。如果发生这种情况,不要感到难过;请尽快注意并尝试调整您的计划。
学习了CLRS之后,我决定为解决问题做好准备。根据我以前的研究,可以帮助您从算法上思考的书籍之一是经典的《 Programming Pearls》。有人认为这本书陈旧而徒劳,但我不能不同意。如此小的书中蕴藏着许多宝贵的见解。很长一段时间以来,我在阅读列表中都有《 Programming Pearls》,但我没有机会阅读它。准备面试终于给了我阅读的机会。我根据以下计划进行了研究:
在学习CLRS或PP时,必须在每章末尾完成练习。这将帮助您巩固所学到的知识。
在学习了CLRS和PP之后,您应该对以下主题有很好的了解:
我学习的下一本书是“ Python编程面试的要素”。我选择EPIP而不是CTCI(破解编程面试)的原因是EPIP使用Python,并且在我看来,它有一系列更好的问题。
我最初的计划是每天学习一章。这包括解决该章中提出的所有问题。我每个问题的时间限制为一小时。如果我无法解决问题,我将在第二天再解决。如果第二天我在问题上无法取得进展,我会偷看一下答案。我会确保我理解的是解决方案,而不仅仅是记住它。
除了每天学习一章EPIP,我还开始阅读《设计数据密集型应用程序》(DDIA)。本书为您提供了许多有用的材料,这些材料在系统设计访谈中非常方便。我已经学习了本书的一半,并做了笔记。所以我刚结束了下半部分的工作,并回顾了上半部分的笔记:
大多数候选人花大量时间准备采访编码,而忽略了系统设计准备。学习DDIA使我走上了正确的系统设计面试轨道。
设计面试的另一个重要学习资源是“系统设计入门”。它教会了您设计大型系统的基础,还包括Anki抽认卡(免责声明:我没有使用抽认卡,因此不确定质量)。
为了准备进行系统设计面试,请查看您使用的任何系统和服务,并向自己提出以下问题:如果我要构建此系统,我将如何做?尝试提出该问题的答案。稍后,尝试验证您的答案,以确保您的解决方案可扩展。您还可以使用模拟面试使自己适应系统设计问题。我没有准备任何东西,但是我知道一些提供系统设计模拟面试的公司。
如前所述,DDIA和System Design Primer是研究下一个系统设计访谈的重要资源。
除了深入学习EPIP,还应尝试解决尽可能多的问题。您可以使用HackerRank或LeetCode。解决更多问题将训练您的思想,并使您为实际的编码面试做好准备。我的方法是从简单的问题开始,逐步找到中等问题,最后解决困难的问题。有些人倾向于从棘手的问题入手,但我不建议这样做。从简单的问题开始,将帮助您在进步时建立信心。确保您对每个问题进行时间排序,并且对单个问题的停留时间不长。
在FANG公司申请高级工程职位(> E4)是进入这些职位的最佳方法之一。这些公司大多数都有扎实的实习计划,几乎所有E3(入门级)职位都提供给返回的实习生。要获得成功的高级工程师面试,为自己定义一个目标,然后朝着这个目标努力。我在这篇文章中描述的是我为Facebook技术面试做准备的系统方法。您的旅程可能会有所不同,请随时根据自己的喜好调整我的计划。