原标题:Facebook面经全披露,我是怎么拿到机器学习工程师offer的?
作者 | Rahul Agarwal
翻译 | Katie, 责编 | 晋兆雨
头图 | 付费下载于视觉中国
去年八月,我正在接受面试。那时,我已经分别接受Google India和Amazon India的机器学习和数据科学职位面试。然后我的上级建议我申请Facebook伦敦的职位。最后我成功了。我与LinkedIn上的一名招聘人员联系,后者向我介绍了另一位招聘人员,几天后我就开始担任机器学习工程师的工作。
现在,在招聘机器学习工程师方面,Facebook的流程大为不同。 他们进行编码回合,系统设计和机器学习设计面试,以选择未来的员工。现在,就我作为数据科学家的经验而言,对机器学习设计面试感觉还不错,但其它面试仍然让我感到恐惧。最近,我刚在第一轮考试中未能通过Google的机器学习软件工程师面试,因为我没有准备好应对数据结构问题。
后来,当我准备Facebook编程岗位面试时,我意识到我对此已经有所了解,并且根本没有为编程面试做准备。
在这篇文章中, 我将概述我对所有这些不同采访的方法,以及对于像Facebook这样的大型公司中的机器学习工程师角色感兴趣的人,如何逐步进行整个过程。
因此,一旦我与招聘人员取得联系,下一步便是电话面试。
电话面试
这是一次非常基本的数据结构面试,是一种基本的常规面试。我想Facebook只是想给你更多的时间为下次面试做准备,还要看看是否值得致电你参加现场面试。对我来说,这次采访通过视频通话进行了45分钟。面试官首先向我介绍了他在Facebook上的个人信息,然后在前10分钟左右询问了我的个人信息。
然后,给了我2个 非常基本的数组和基于字典的问题让我解决。面试者共享了一个coderpad链接,我必须在该链接上以我选择的任何语言(不是Pseudocode)来解决这些问题,并且没有任何代码格式选项。这些问题也被问及基于时间的约束和基于空间的约束。面试的过程中我遇到了O(n3)等糟糕的运行时间,面试官问我是否可以做得更好,并在需要时给出提示。
因为不允许我分享确切的问题,所以我只想为你分享一些难度相当但不相同的公共Leetcode问题,以便你可以理解难度级别并相应地进行练习。单调数组:如果数组是单调递增或单调递减的,则为单调数组。当且仅当给定数组A为单调时,才返回true。有效回文:给定一个字符串,仅考虑字母数字字符并忽略大小写,确定它是否是回文。
我这次面试的安排?
这只是我进行的第二次数据结构面试,我希望第一次面试之后先不完全展露自己。因此,我首先 使用Gayle Laakmann McDowell撰写的《Cracking the Coding Interview》一书来理解数据结构的基础。
该书还包含许多准备技巧,因此你应该认真阅读。我喜欢这本书的最好的地方是,它与Thomas Cormen算法简介不同,非常简洁,并且为面试编码提供了适当的背景知识。
在2-3页中非常简洁地说明了每个数据结构,围绕该特定主题解决了一些问题,然后给出了一些实践问题。本书还以仅具有 最常问到的数据结构的方式对其进行了限制。例如,红黑 AVL树和树保留在高级部分中,而不是在树和图形章中,因为在有时间限制的采访设置中经常不经常询问它们。
我通过创建需要准备的主题列表来开始准备工作。可以准备更多主题,但这是这些面试的最低要求。数据结构: 数组,集合,堆栈/队列,哈希图/字典,树/二叉树,堆,图。算法 :分而治之,DP /存储,递归,二进制搜索,BFS / DFS,树遍历。
然后,我开始使用《破解编码面试书》来阅读有关它们的信息,并为他们解决了许多关于Leetcode的简单级别的问题和一些中等级别的问题。也有其他平台可以在线练习,但是我喜欢Leetcode,因为它设计合理,没有广告,并且解决方案基于类的编程结构。 它还提供了一种搜索各种主题以及难度的好方法。我还进行了许多关于Leetcode的模拟面试,只是为了练习。我做了大约一两个星期,每天花费大约3-4个小时。
我也开始在这段时间里审核UCSanDiego在Coursera上的Algorithms Specialization,这为我提供了一个关于本科大学教授的用于处理编码面试的内容的想法。
太长的可以不用看,只需记下你必须准备的主题,并针对每个主题练习许多简单的问题即可。也许还有一些中等程度的。
有一次,我完成了电话面试,招聘人员在短短的1天之内回复电话,解释现场面试的过程。现场面试将在伦敦进行,我对前往伦敦的前景感到非常兴奋,并且全程旅行报销。大约还有5轮,接下来我将要讨论。我花了两个月的时间进行面试,以便有时间做准备。无论如何,签证和整个过程所花费的时间要多得多。
到达伦敦后,我于面试当天9点左右从他们提供的酒店到达Facebook办公室。因为我很着急,所以通常在原定时间前一小时进行,我通常会尝试在时间上或之前进行面试(在我进行面试时更是如此)。我事先知道了当天的整个行程,因为我的招聘人员与我分享了行程。我也知道哪个采访会在什么时候发生,谁会接受。事实上,这是我宁愿拥有的最有条理的面试经历。
第一轮现场编程
我已经在数据科学领域工作了很长时间,以至于我将DS读为数据科学而不是数据结构。这次面试本质上是我的痛点。这是我在2个月的时间内学到的东西,而不是自己的全部经验。在这里,我将根据我的经验而不是我的全部经验和数据科学背景来进行评估。但是,正如招聘人员告诉我的那样,他们的流程非常固定,我必须经过这些面试才能获得机器学习工程师职位,所以我加入。
至于面试,它是按时开始的,和以前一样,面试者介绍了自己,然后很短时间进入我的个人介绍,然后直接跳入面试问题。
这次,问题变得有点困难,并且 花了很多时间来制定解决方案以及解决方案的时空复杂性。我被问到一个我可以很快解决的中等字符串问题,以及一个我花费了大部分时间的中级二进制搜索问题,但最终我得以解决。Leetcode的简要介绍中的一些可比较的问题(不是相同的问题): 复数乘法 :给定两个表示两个复数的字符串。需要返回一个表示其乘法的字符串。排序矩阵中的第K个最小元素 :给定一个n x n矩阵,其中每个行和列均按升序排序,请在矩阵中找到第k个最小元素。
面试官还给了我选择在我自己携带的笔记本电脑上编程的选项,因为招聘人员已经告诉我有关在白板/笔记本电脑上编程的选项。但是请记住, 它们不允许使用任何代码格式和IDE。我只有一个基本的编辑器来编写代码。
我的编程面试计划?
与电话面试计划相同,但是更广泛的Leetcoding。我记得我在一天的3-4小时左右的这些编码回合中连续30天做了Leetcode。我过去常常花很少的时间来解决中级问题,而只花很少的时间来解决硬性问题。
第2轮现场编码
直到这次,我仍处于数据结构阶段,准备好面试官要扔给我的一切。我的心态是-“可能发生的最糟糕的情况是什么?”,所以我继续坚持下去。Facebook的人真的很好,因为他们在每次面试之前和之后都准备茶点,并注意不要过度延长面试时间。很多事实都表明, 每次采访都在恰好需要的时间开始,每次采访之间有15分钟的休息时间。
再有一些可比较的(不是相同的)难于解决的问题,以及来自Leetcode的简短描述:基于API的问题基于时间的键值存储 :创建一个键值存储类,该类支持两种操作-设置和获取。合并k个排序列表 :给您一个由k个链表列表组成的数组,每个链表以升序排序。将所有链表合并到一个排序的链表中并返回它。
我在此编程面试中的目标是 能够解决面试官在40分钟内提出的两个问题。但是,这是一次艰难的面试,而我大部分时间都花在了第二个难题上。虽然面试官只给出了一些提示,但可以引导我朝着正确的数据结构和算法发展。最后,我能够完全解决问题1和问题2大部分内容。
给面试者的提示是调出你拥有的所有解决方案以及所涉及的时间复杂性,并且只有在双方都同意一个好的解决方案后才开始编写代码。
另外,通过这两次面试我发现,面试时与面试官交谈并解释你的方法确实很有帮助。 他们有时会提供提示,有时会阻止你进入错误的思维方式。当你告诉面试官你遇到的难题,你就可以向面试官会发出你正在思考的方向的信号,这也使整个面试更具协作性,我认为这是面试官找到合适人选的方式。
到此为止,我对所有的白板编码和一般的面试压力都感到有些疲惫,并且由于它是在午餐时间左右,所以我与指定的同事或好友一起去了Facebook自助餐厅。你可以询问公司,这不涉及面试中的评分,因此你可以很开放地询问有关Facebook生活等方面的问题,你可以在Facebook自助餐厅享用各种美食。
系统设计
这是我所害怕的另一次面试。如你所见,我对大多数采访感到恐惧,因为这对我来说是一种不自然的面试形式。在系统设计面试中,你应该在白板上端到端创建服务。可以练习的一些示例问题是:你将如何设计Netflix?你将如何设计Youtube?你将如何设计Twitter / Facebook?
尽管这看起来令人生畏,但实际上在准备时确实是开放式的。因为没有错误的答案。
我喜欢进行这种面试的方式是:设计一个非常基本的系统,该系统类似于平台,并具有面试者要求的基本功能。对于大多数平台,它将涉及白板上用于服务器,客户端和数据库的绘图框。在整个面试中为其添加功能,并扩展/更改最基本的设计。这可能涉及添加功能以及谈论扩展,处理边缘情况,谈论所涉及的数据结构和数据库,使用缓存等。根据我提供给他们的功能列表,询问访问者他们想要添加什么功能,从而继续添加功能并发展系统直至最后。
我对系统设计面试的计划?
互联网上有很多不错的资源可以为这次面试做准备,但是我想提及两个我认为非常有用的资源:
Donne Martin撰写的System Design Primer:这是准备进行系统设计的任何人都应该至少经历一次,但要多次学习的资源。这里要学习的最重要的主题是性能,可伸缩性,延迟,吞吐量,可用性,一致性,CDN,数据库,缓存,负载平衡等。
最受欢迎的服务上的各种系统设计的YouTube视频:我谈论的是大型网站-Netflix / Youtube / WhatsApp / Facebook / Gmail / Amazon等。 您可以在youtube上找到很多关于所有这些服务的系统设计的视频 。我绝对想喊出的一个YouTuber是Techdummies,我在所有这些大型平台上都观看了他们的视频。至少对我来说,谁真的以最简单的方式解释了概念。
我花了一个星期,从观看视频跳到阅读Donne Martin的资料库来回准备这次面试,我认为这是正确的方法。另外, 了解很多工程师会使用的术语也很有趣,因此这也是一种很好的学习体验。
最后,这次采访中最重要的是, 你需要在面试者的最少投入下推动讨论。有时候,面试官可能会要求特定的功能,你应该实施特定功能,但最终,它是你的系统, 你需要以最合乎逻辑的方式创建和添加所需的功能,以在本轮中取得成功。
表现
这次面试试图看看你如何处理困难的情况。而且,你可以通过吸收和组织过去的所有工作经验,遇到的问题和设计的解决方案来准备这次面试。你将需要收集所有散布不可能的情况或无法处理的情况的实例。
这次面试的最好方法就是做自己!
对我来说,这次面试就像是与面试官的讨论。他首先介绍了他在Facebook上所做的工作。然后,他向我询问了我正在从事的项目,我们对项目的机器学习部分进行了简短的讨论。
然后,这是一个非常普通的讨论,涉及在诸如“你在不感到引以为豪的工作经历中犯了什么错误?”之类的情况下我该如何解决或表现(不是我问的确切问题)。如果你在准备这次面试时回想起所有的好与坏经历并撰写小故事,这将对你有所帮助。
但是,重点仍然是诚实,是对以下问题的完全正常答案:“ 你是否与同事有分歧?”如果你的意见分歧为零,则可能为空。对你的回答要非常诚实,因为面试官可以通过你的行为很轻松地观察某人是否说谎。
就我的想法而言,这次面试进行得非常顺利。
机器学习系统设计
老实说,这是一次面试,我并没有为此做太多准备。在这次采访中,我期望创建一个端到端解决机器学习问题的系统。
在这次访问中,访问者只是评估 你将业务问题转换为机器学习系统的能力。因此,可能会给你一些问题陈述,例如开发一个使用机器学习创建新闻源的系统,或者创建一个系统来过滤不好的评论或说实话的任何机器学习系统。
然后,你需要在 讨论数据和数据收集,EDA,功能工程,模型评估,模型测试,将模型投入生产以及最终进行维护和反馈的各个方面时,端对端设计系统。
Facebook本身可以为这次采访做准备的一个很好的资源:介绍Facebook机器学习领域指南视频系列,这是我为这次采访所做的唯一准备。
多美好的一天
那一天真的很完美。面试后,我漫步到特拉法加广场(Trafalgar Square),看着人们表演各种花样和滑稽动作。然后步行回我的旅馆。
最后,这只是一次不错的面试经历,而我没想到的事情对我来说会很顺利。数据结构是我从未在大型组织中申请过机器学习角色的主要原因,但是当我读到它们时,我发现它们非常可行,并且如果可以花些时间可以学到一些东西。
因此,一年后,由于软件相关原因,我以软件工程师(MLE)的身份加入了Facebook London。希望这种经历进展顺利。
原文链接:https://hackernoon.com/how-i-got-a-job-at-facebook-as-a-machine-learning-engineer-rk2u3way
本文由AI科技大本营翻译,转载请注明出处