当前位置: 首页 > 编程日记 > 正文

Facebook面经全披露,我是怎么拿到机器学习工程师offer的?

作者 | Rahul Agarwal

翻译 | Katie,责编 | 晋兆雨

出品 | AI科技大本营

头图 | 付费下载于视觉中国

去年八月,我正在接受面试。那时,我已经分别接受Google India和Amazon India的机器学习和数据科学职位面试。然后我的上级建议我申请Facebook伦敦的职位。最后我成功了。我与LinkedIn上的一名招聘人员联系,后者向我介绍了另一位招聘人员,几天后我就开始担任机器学习工程师的工作。

现在,在招聘机器学习工程师方面,Facebook的流程大为不同。他们进行编码回合,系统设计和机器学习设计面试,以选择未来的员工。现在,就我作为数据科学家的经验而言,对机器学习设计面试感觉还不错,但其它面试仍然让我感到恐惧。最近,我刚在第一轮考试中未能通过Google的机器学习软件工程师面试,因为我没有准备好应对数据结构问题。

后来,当我准备Facebook编程岗位面试时,我意识到我对此已经有所了解,并且根本没有为编程面试做准备。

在这篇文章中,我将概述我对所有这些不同采访的方法,以及对于像Facebook这样的大型公司中的机器学习工程师角色感兴趣的人,如何逐步进行整个过程。

因此,一旦我与招聘人员取得联系,下一步便是电话面试。

电话面试

这是一次非常基本的数据结构面试,是一种基本的常规面试。我想Facebook只是想给你更多的时间为下次面试做准备,还要看看是否值得致电你参加现场面试。对我来说,这次采访通过视频通话进行了45分钟。面试官首先向我介绍了他在Facebook上的个人信息,然后在前10分钟左右询问了我的个人信息。

然后,给了我2个非常基本的数组和基于字典的问题让我解决。面试者共享了一个coderpad链接,我必须在该链接上以我选择的任何语言(不是Pseudocode)来解决这些问题,并且没有任何代码格式选项。这些问题也被问及基于时间的约束和基于空间的约束。面试的过程中我遇到了O(n³)等糟糕的运行时间,面试官问我是否可以做得更好,并在需要时给出提示。

因为不允许我分享确切的问题,所以我只想为你分享一些难度相当但不相同的公共Leetcode问题,以便你可以理解难度级别并相应地进行练习。

  1. 单调数组:如果数组是单调递增或单调递减的,则为单调数组。当且仅当给定数组A为单调时,才返回true。

  2. 有效回文:给定一个字符串,仅考虑字母数字字符并忽略大小写,确定它是否是回文。

我这次面试的安排?

这只是我进行的第二次数据结构面试,我希望第一次面试之后先不完全展露自己。因此,我首先使用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的简要介绍中的一些可比较的问题(不是相同的问题):

  1. 复数乘法:给定两个表示两个复数的字符串。需要返回一个表示其乘法的字符串。

  2. 排序矩阵中的第K个最小元素:给定一个n x n矩阵,其中每个行和列均按升序排序,请在矩阵中找到第k个最小元素。

面试官还给了我选择在我自己携带的笔记本电脑上编程的选项,因为招聘人员已经告诉我有关在白板/笔记本电脑上编程的选项。但是请记住,它们不允许使用任何代码格式和IDE。我只有一个基本的编辑器来编写代码。

我的编程面试计划?

与电话面试计划相同,但是更广泛的Leetcoding。我记得我在一天的3-4小时左右的这些编码回合中连续30天做了Leetcode。我过去常常花很少的时间来解决中级问题,而只花很少的时间来解决硬性问题。

第2轮现场编码

直到这次,我仍处于数据结构阶段,准备好面试官要扔给我的一切。我的心态是-“可能发生的最糟糕的情况是什么?”,所以我继续坚持下去。Facebook的人真的很好,因为他们在每次面试之前和之后都准备茶点,并注意不要过度延长面试时间。很多事实都表明,每次采访都在恰好需要的时间开始,每次采访之间有15分钟的休息时间。

再有一些可比较的(不是相同的)难于解决的问题,以及来自Leetcode的简短描述:

  1. 基于API的问题基于时间的键值存储:创建一个键值存储类,该类支持两种操作-设置和获取。

  2. 合并k个排序列表:给您一个由k个链表列表组成的数组,每个链表以升序排序。将所有链表合并到一个排序的链表中并返回它。

我在此编程面试中的目标是能够解决面试官在40分钟内提出的两个问题。但是,这是一次艰难的面试,而我大部分时间都花在了第二个难题上。虽然面试官只给出了一些提示,但可以引导我朝着正确的数据结构和算法发展。最后,我能够完全解决问题1和问题2大部分内容。

给面试者的提示是调出你拥有的所有解决方案以及所涉及的时间复杂性,并且只有在双方都同意一个好的解决方案后才开始编写代码。

另外,通过这两次面试我发现,面试时与面试官交谈并解释你的方法确实很有帮助。他们有时会提供提示,有时会阻止你进入错误的思维方式。当你告诉面试官你遇到的难题,你就可以向面试官会发出你正在思考的方向的信号,这也使整个面试更具协作性,我认为这是面试官找到合适人选的方式。

到此为止,我对所有的白板编码和一般的面试压力都感到有些疲惫,并且由于它是在午餐时间左右,所以我与指定的同事或好友一起去了Facebook自助餐厅。你可以询问公司,这不涉及面试中的评分,因此你可以很开放地询问有关Facebook生活等方面的问题,你可以在Facebook自助餐厅享用各种美食。

系统设计

这是我所害怕的另一次面试。如你所见,我对大多数采访感到恐惧,因为这对我来说是一种不自然的面试形式。在系统设计面试中,你应该在白板上端到端创建服务。可以练习的一些示例问题是:

  • 你将如何设计Netflix?

  • 你将如何设计Youtube?

  • 你将如何设计Twitter / Facebook?

尽管这看起来令人生畏,但实际上在准备时确实是开放式的。因为没有错误的答案。

我喜欢进行这种面试的方式是:

  • 设计一个非常基本的系统,该系统类似于平台,并具有面试者要求的基本功能。对于大多数平台,它将涉及白板上用于服务器,客户端和数据库的绘图框。

  • 创建我想在系统中拥有的功能列表。例如,在社交网络中关注,或在Uber上预订出租车,或在阅读消息时在Whatsapp中双击,或在Twitter或FB新闻订阅中转发功能,等等。我们都已经看到了这些平台提供的功能,要列出功能列表并不难。

  • 在整个面试中为其添加功能,并扩展/更改最基本的设计。这可能涉及添加功能以及谈论扩展,处理边缘情况,谈论所涉及的数据结构和数据库,使用缓存等。

  • 根据我提供给他们的功能列表,询问访问者他们想要添加什么功能,从而继续添加功能并发展系统直至最后。

我对系统设计面试的计划?

互联网上有很多不错的资源可以为这次面试做准备,但是我想提及两个我认为非常有用的资源:

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科技大本营翻译,转载请注明出处

更多精彩推荐
  • 九问国产操作系统,九大掌门人首次同台激辩

  • 一文读懂机器学习“数据中毒”

  • 有了图分析,可解释的AI还远吗?

  • 程序员连续加班在餐厅泪崩,谁不是每逢上线必通宵!

  • 腾讯竟然是这样招人的,哈哈哈哈哈

相关文章:

内存性能参数详解(转载)

内存性能参数详解 先说说最有效提高你机器内存性能的几个参数:CL,TRP,TRCD CAS Latency “列地址选通脉冲潜伏期” BIOS中可能的其他描述为:tCL、CAS Latency Time、CAS Timing Delay,这个值一般是1.5~3之间&#xff0…

一些关于Hibernate延迟加载的误区

最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写 些东东在这里,希望对大家有所帮助。 首先是第一个误区:延迟加载只能作用于关联实体看到这…

Java单元测试与Jutil详解(一) 简介

1.什么是单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,Java里单元指一个类。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中…

反转!BAT编程吸金榜来了,AI程序员刷爆了......

从2017年开始,人工智能便波澜不断,无论是从BAT高调布局AI,还是从年薪80万招聘AI应届生,炽手可热形容AI工程师一点都不过分。百度推出“少帅计划”,针对30岁以下的深度学习科学家,开出100万以上年薪!阿里巴巴…

Windows启动文件

Windows启动文件 Files Used in the Windows 2000 Boot Process FileLocationBoot stageNtldr System partition root (C:/ )Preboot and bootBoot.iniSystem partition rootBootBootsect.dosSystem partition rootBoot (optional)Ntdetect.com System partition rootBootNtboo…

Sublime Text 3 个人使用总结

待更新 Sublime Text 3\Packages\FileHeader\template\header转载于:https://www.cnblogs.com/yourstars/p/6739965.html

破解出cmos密码(转载)

----CMOS (Award)密码简介与破解0--3法---- 计算机启动时,由存放在主板ROM中的bios将cmos数据调入内存中,以实现控制系统。 其中,Award主板上的一小块RAM用于存放CMOS数据,地址为00-7F的共128个字节中。 当中的字节 1c和1d存放的就…

NLP实战:利用Python理解、分析和生成文本 | 赠书

导读:本文内容参考自《自然语言处理实战:利用Python理解、分析和生成文本》一书,由Hobson Lane等人所著。本书是介绍自然语言处理(NLP)和深度学习的实战书。NLP已成为深度学习的核心应用领域,而深度学习是N…

Servlet入门 代码

1. 第一个Servlet程序 package com.allanlxf.serv.basic; import javax.servlet.*; import java.io.*; public class TimeServlet implements Servlet {private ServletConfig config;public TimeServlet(){System.out.println("TimeServlet()");}public void init(S…

统计学习方法:朴素贝叶斯

作者:桂。 时间:2017-04-20 18:31:37 链接:http://www.cnblogs.com/xingshansi/p/6740308.html 前言 本文为《统计学习方法》第四章:朴素贝叶斯(naive bayes),主要是借助先验知识统计估计&…

Windows自动启动程序的十大藏身之所(转载)

Windows自动启动程序的十大藏身之所 Windows启动时通常会有一大堆程序自动启动。不要以为管好了“开始→程序→启动”菜单就万事大吉,实际上,在Windows XP/2K中,让Windows自动启动程序的办法很多,下文告诉你最重要的两个文件夹和八…

警惕!银行风控模型或将“摇身一变”,成为风险缔造者

作者 | 祝世虎来源 | 现代金融风险管理头图 | CSDN下载自视觉中国2011年,美联储发布了《模型风险管理监督指南(SR11-7)》(《SRLetter 11-7: Supervisory Guidance on Model Risk Management》),该指南逐步成…

Spring注解注入

spring注入方式-----注解注入(1)操作:首先在要注入的类前面加上:Component(与后面三个是等价的)Repository(持久层),Service业务层,Controller和控制层应为不能自动识别某个类是否是持久层,业务…

zip 的压缩原理与实现

http://www.blueidea.com/bbs/newsdetail.asp?id1819267&page2&posts&Daysprune5&lp1无损数据压缩是一件奇妙的事情,想一想,一串任意的数据能够根据一定的规则转换成只有原来 1/2 - 1/5 长度的数据,并且能够按照相应的规则还…

上海交大发布 MedMNIST 医学图像分析数据集 新基准

来源 | HyperAI超神经责编 | 晋兆雨头图 | 付费下载于视觉中国内容概要:医学图像分析是一个非常复杂的跨学科领域,近日上海交通大学发布了 MedMNIST 数据集,有望促进医学图像分析的发展。关键词:医学图像分析 公开数据集令人头秃…

VS 2010中对WPF4有哪些多点触摸支持?

随着多点触摸输入和操作处理支持的引进, WPF 4提供了一个极棒的方式,可在Windows 7中使你的客户端应用大放光彩,新的特性包括:UIElement上的多点触摸操作、惯性(漫游(Pan)、缩放(Zoo…

业务组件架构的思考

在iOS开发中,我们接触比较多的是MVC架构,下面我们先来分析一下MVC架构。 1.MVC MVC是一种软件架构模式,在1978年由Trygve Reenskaug提出,它把软件系统分为三个基本部分:模型(Model)、视图&#…

强化学习:10种真实的奖励与惩罚应用

作者 | Patrycja翻译 | Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国在强化学习(Reinforcement Learning)中,对代理进行奖励和惩罚机制的培训。代理的正确行为会得到奖励,而错误的行为会受到惩罚…

PHP feof() 函数读文件的使用

(PHP 4, PHP 5) feof — 测试文件指针是否到了文件结束的位置 如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时而返回TRUE。默认的超时限制是 60 秒,可以使用 stream_set_timeout() 来改变这个值。 文件指针必须是有效的&a…

批处理解决“易语言难题”

为什么80%的码农都做不了架构师?>>> 发现还没有Win批处理的,也就是DOS,我来凑个热闹,哈哈~ maxos 汇总贴 APPLEUFO 原题链接 不罗嗦,上代码啦: echo off set c_title批处理…

\r与\n有何差别,编码的时候应该怎样使用

差别: \r: 全称:carriage return (carriage是“字车”的意思。打印机上的一个部件)简称:return缩写:rASCII码:13作用:把光标移动到当前行的最左边\n: 全称:new line别名…

深度学习中的注意力机制(一)

作者 | 蘑菇先生来源 | NewBeeNLP头图 | CSDN下载自视觉中国目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往…

Hibernate 异常org.hibernate.LazyInitializationException: could not initialize prox

Hibernate的Lazy初始化1:n关系时,必须保证是在同一个Session内部使用这个关系集合,不然Hiernate将抛出异常。 两种处理方法: 一、这是延时加载的问题,把有关联的所有pojo类,在hibernate.cfg.xml文件中。一般在many-to-…

XHTML基础问答

作者:阿捷 2004-6-26 1:43:36本文是2002年为硅谷动力网站翻译的稿件。当时xhtml1.0刚刚开始被设计师所接触,所以有下面这个基础问答。 HTML语言是我们建立网页的工具,从它出现发展到现在,规范不断完善,功能越来越强。…

958毕业,苦学Java,竟被二本毕业生吊打!网友:确实厉害!

最近收到一位中型公司 HR 的反馈,她说,我推荐的一个普通本二毕业生在校招面试中表现非凡,当时两个人争抢一个名额,他竟然完胜另一位 985 毕业生。普通本二毕业生对公司的技术提问对答如流,曾在小公司实习,做…

css布局中的居中问题

css布局中的居中问题 作者:阿捷 2004-7-5 14:35:49#sample{HEIGHT:240px;WIDTH:400px;BACKGROUND: url(http://www.w3cn.org/style/001/logo_w3cn_194x79.gif) #CCC no-repeat center;} 如何使DIV居中 主要的样式定义如下: body {TEXT-ALIGN: center;…

领域驱动设计_软件核心复杂性应对之道

领域驱动设计_软件核心复杂性应对之道转载于:https://www.cnblogs.com/MarvinGeng/archive/2013/02/21/2920968.html

谈谈Boost网络编程(2)—— 新系统的设计

写文章之前。我们一般会想要採用何种方式,是“开门见山”,还是”疑问式开头“。写代码也有些类似。在编码之前我们须要考虑系统总体方案,这也就是各种设计文档的作用。在设计新系统之初,我基本的目的是:保证高效率&…

64岁Python之父退休失败,正式加入微软搞开源

来源 | CSDN今天,64岁的Python 之父 Guido van Rossum 在 Twitter 上正式宣布,退休太无聊,如今加入了微软开发者部门。Guido van Rossum 去年宣布退出 Python 核心决策层事实上,近几年来,随着人工智能的飞速发展&#…

Java实现HTTP文件下载(转)

文章出自: http://www.360doc.com/content/12/1218/17/2718300_254818081.shtml 本人用这种方法解决了工作中遇到的问题,再次谢谢文章的作者. 序言 许多用户可能会遇到这样的情况:在网站上发现一个很好的资源,但是这个资源是分成了很多个文件存放的&…