本文转载自:知乎用户 Rorschach
Rorschach也在我们的Leap.ai求职群里,希望加群的请留言
Rorschach,Machine Learning Engineering Manager @ Opendoor.com
机器学习调包侠,此前就职于北京微软,是Bing Ads的Tech Lead。知乎红人。
【编者注】
下面这篇文章由我写给正在准备面试 Opendoor 的工程师和数据科学职位的应聘者的材料改写扩展而来。 据我了解我司的面试在旧金山的创业公司里也还是挺有代表性的。 考虑到过了我司面试的同学一般也会拿着一堆 FLAGUAP, Robinhood, Affirm, Lyft 等等等等的其他公司offer来谈合同,所以达到本文要求的同学应该大概律能刷到个不错的工作。
公司的面试流程一般包括下面几种类型的面试,下面我会把每轮面试会分成『面试过程』,『准备和注意事项』,『FAQ』三部分逐个讲解。 我会根据大家提出的问题逐渐扩展 FAQ 部分。
  • 电话面试/远程编码面试 (Technical Phone Interview)
  • Onsite 面试
    a. 结对编程 (Pair Programming)
    b. 结对数据分析建模 (Pair Data Science Programming)
    c. 软件系统设计 (System Design)
电话面试
面试者首先会简单自我介绍下,名字叫什么,做什么项目,在公司工作多久了等等。 之后很快进入编码环节。
这轮的考察内容通常都是几道不太难的算法题(最多leetcode medium吧)。 写代码一般都是用个在线的协同编辑工具,比较流行的是CoderPad。 尽量用你最熟悉的编程语言回答问题,做好准备详细解释你的代码,尤其是碰上你的面试官不熟悉你用的语言的情况。 这轮电面的目标是了解你是如何思考并且解决问题的,所以如果对任何东西不确定的话请尽可能奔放的提出各种问题澄清理解。 一边写代码一边说,解释清楚你代码背后的逻辑和你正在做的和接下来要做的事情。
面试的最后五分钟是留给你的, 我们希望你能多多提问。 不妨提前拉个单子列一下你对对方公司最感兴趣的事情。 这是个蛮好的互相了解的机会,我们很乐意分享我们团队的情况,以及我们正在解决的问题。
如何准备呢?
  • 大量练习回答类似的问题。 没错我说的就是刷题……一些很好的资源包括:LeetCode, HackerRank, CareerCup, InterviewBit.
    注意: 不要过度刷题,因为初创公司一般都不会特别在意你解题本身的娴熟程度, 也不会问太难的题。 (起码我没太见过有人叫写 DP 的)
  • 练习在相似的环境下回答问题。即使你是个很有经验的工程师了,面试的环境也会和你正常工作的情况很不一样。 练习在时间压力下解决问题,用简单的 coderpad 这类编辑器写代码体验下没有全套 IDE 的感觉,试着一边写东西一边不停的说话。
  • 复习下基础知识。 基本的数据结构,算法等等内容。 你应该起码能轻松的跟对方聊聊 big-O 复杂度。
FAQ
1)Q:我用什么编程语言好?

A:用你最能打的语言回答问题。 如果你什么都写得一样好, 那用 Python 之类比较『高级』的『动态』语言面试会略占一点点便宜。 相比起 C++之类语言你可能犯的错误会少很多, 比起 Java 或者 C# 来又没有那么啰嗦。 但是面试者也会根据你用什么语言写调整预期。 同样是30分钟解决问题,用 Java 写的会比用 Python 的评价稍微高一点。
2)Q:最后五分钟我应该问什么问题呢?

A:自由发挥。一般来说问对方团队的情况总是很安全的(多少人,都是什么背景的等等)。 问问团队正在做什么项目也不错,公司的工作方式企业文化这些也都可以聊聊。
结对编程面试 (Pair Programming)
现在很多创业公司已经不太喜欢考纸上或者白板上编程了。多数情况都是直接上机编程,然后更激进一点的(比如 Opendoor)会考察结对编程。 面试一般会用专门的结对编程工作台, 你和你的面试者坐在一起解决问题。 面试者会扮演观察者(observer)的角色,而你来扮演驾驶员(driver)的角色。 对方会解释问题,然后在你编程的过程里提供很多建议,并且有时候会修改问题的需求。
建议尽可能用自己的笔记本来面试,保证你的电脑上安装有你最喜欢最熟悉的开发环境。 面试的公司通常也可以提供电脑,但是往往不如你自己的顺手。
结对编程一般只会做一道题,会比你电面上碰到的题目更难更复杂一些。 有时候是算法问题,有时候是写个简单系统。尽管问题有时候会非常的开放, 最好还是希望你能在面试结束的时候提供一个能从头到尾运行的程序。
面试的注意事项
  • 时间管理:你只有一个小时的时间,要注意好好规划。 不要直接闷头写暴力解法。花点时间想想尽可能理想的解决方案。 但是如果想不出来完美快速的方法, 用比较基本的方式开始再在此这个基础上改善也是不错的稳扎稳打型思路。 能运行但是比较慢的答案,永远比完美的但是没写完的答案好。
  • 表达能力是关键:结对编程考察的不仅是写代码的能力。 要记得我们在模拟你们两个人一起工作的情形。 相信你一定也不想你工作的同事把你晾在一边围观你一声不吭写完一整段代码然后双击运行666吧?结对编程应该是一个你来我往的交互过程。 先澄清目标, 然后在纸上写写画画你的整个解决方案,等到你和你的面试者对方案都满意了再开工。
  • 别留 Bug:上机编程的好处就是提供了全套的真实开发环境。 你可以用你喜欢的任何工具保证代码质量。 你可以反复运行,当然更应该写几个 unit test。 每个人都会写出 bug,但是要确保你能发现并解决它们。 当然最棒的情况是你的面试者还没看出来 bug 你已经自己发现然后搞定了。
  • 模拟面试:对于没真有结对编程经验的同学来说,这个过程可能有点太过紧张。 找几个朋友和你试试看,就当是模拟面试。 然后如果你找不到能和你 pair 的人的话,搞个橡皮鸭也蛮好的。
FAQ
1)Q:为什么不用白板写?为什么一定要上机?

A:因为白板只能看看会不会做算法题, 好处是对于面试者的经验和能量需求比较低, 也就比较容易保证面试标准的一致性。 而实际上机 pairing 能阅读出多得多的东西。 我们可以很容易观察到你的
编程习惯(engineering practice)
,你对你
偏好工具的熟练度(craftsmanship)
,你的
代码风格(coding style)
, 你的
测试习惯 (unit test)
2)Q:我题做出来了/面试官的要求我都实现了/我程序能跑, 为啥还是杯具了?

A:因为很多来面试的同学,特别是我们中国出来的同学, 虽然编码能力不错但是往往很不注意沟通。 光闷头写 code 是不行的,
要尽量多和面试者交流你的想法
。 被动让面试者告诉你写这个测那个不可能拿 strong hire 的,
要尽量在理解了问题的基础上主动引导解决问题。 很多时候面试官对你的那些看起来是『找茬给我增加难度』的要求,其实是他等你主动跟他澄清,或者等你自己想起来要做但是实在等不到只好直接给提示。
3)Q: 这轮面试有什么窍门?

A:我们组里有个同事的
上机面试祖传秘诀
。 就是你在试图理解问题聊需求的时候,一边说一边想几个测试用例写成简单的 assertion。『如果输入是这个,这个函数的输出应该是这个对吧』。这样一方面给人你沟通能力很强很严谨的印象,顺便还写了几个 unit test。 这招使出来印象分往往暴涨。
结对数据分析建模 (Pair Data Science Programming)
如果你是面试数据科学家(Data Scientist),数据分析师(BI Analyst)或者 机器学习工程师(Machine Learning Engineer)职位的话,有些时候会有上机的数据分析面试。 过程和上面的结对编程差不多, 区别是可能不会让你写个简单系统或者做算法题,而是会给你个数据要求你做些数据分析或者用这个数据建个机器学习模型。
数据规模都不会很大,普通配置的笔记本都能轻松搞定。多数来面试的同学会用 R 或者Python。 当然也有用 Java 硬写分析的强者通过面试的。和其他面试一样,最重要的是到面试结束的时候应该有个清楚的结论,或者有个能跑能用的模型。
面试的注意事项
  • 工欲善其事必先利其器:如果觉得有需要,你可以随时查各种在线资源,用 google 也好 stackoverflow 也好都没关系。 但是面试时间宝贵,你对 R/dplyr 和 Python/Pandas/ScikitLearn 之类的工具熟练度越高你就越有优势。
  • 熟悉一般的数据分析流程
  1. 数据处理 (data munging):不要在数据输入上浪费时间。 你应该很熟悉如何用个 csv 之类文件建立数据表。 知道怎么做基本的 aggregation, filter, transformation, date parsing, string manipulation 等等操作。
  2. 数据验证(data validation/skepticism):真实世界的数据往往是很『脏』的。 工业界面试的一个特点就是会拿出包含各种常见错误的数据来看看你能不能有好的习惯做很多验证来保证数据正确性。 我甚至会主动加入不少噪声,制造一些空行之类的障碍。 有经验的分析师会明确的提出对数据的假设, 然后仔细验证这些假设。
  3. 数据可视化(data visualization):你应该能用最有效的方式呈现你分析的结果。 如何能尽量避免冗杂的信息,如何选择最明显最清楚的图像表格类型是分析师的基本功。
  4. 深入理解你用的模型:准备好跟人聊聊各种常见的统计机器学习模型。 你为什么选择用某个特定的模型来解决这个问题?你准备用什么样的 feature,选择什么样的 training target?你的选择有什么pros and cons?如果训练结果显示是情况 A,你会怎么改进模型,情况 BCD 呢?假设我们觉得你选择的模型是正确的,接下来三个星期里你会怎么改进它?三个月呢?
  • 了解你面试公司的商业模式:你不需要成为对方领域的行业专家(起码入职前你不需要)。 但是起码应该在常识的水平上理解公司处于什么行业, 这个行业的典型商业模式是什么样的。这些对于你选择分析的重点,和模型的优化目标很有帮助。
FAQ
1)Q:我挺有经验的,但是我之前一直在 Microsoft/Google 工作不太熟悉外面这些工具怎么办?

A:其实很多毕业就近大公司的同学都会面临这种只会用公司自己发明的轮子的问题。 建议面试之前花点时间刷几个项目。
Kaggle
是个很好的项目来源。
另外多投几个比较新的公司做做他们的 take home 也是个好办法。
(Airbnb 和 uber 的 takehome problem 就挺有意思)
2)Q:统计模型,数学方面要准备多深?要准备手推公式么?

A:这个很难一概而论。 要看公司寻找的是做哪方面事情的人。 一般来说对算法研究本身有需求的 researcher 类职位会对数学有高些的要求。 或者你本身是相关领域的 phd,面试者也会特意深入问一下你『预期』的强项。
系统设计面试(System Design)
根据你之前的工作经验,通常在工程师面试里会安排一到两轮系统设计面试。 其中有半轮会用来聊聊过去的项目经历,面试者希望了解的是你如何设计一个完整的系统,你是如何做出很多技术决定的。 通常面试者会选择某几个点深挖下项目细节好判断当时项目的深度。
其他时间的面试内容通常都会是设计某个具体的系统。 面试者会尽量创造一个彼此合作的环境,假设你刚刚加入公司即将担纲设计一个重要的系统, 而你的面试者是公司的资深成员帮助你了解项目。 这一轮面试首先是一次对话,所以不要怕提问题,别怕提出各种天马行空的思路,甚至激烈(但是态度礼貌谦和)的争论也是受欢迎的。
项目经历面试的注意事项
  • 项目经历面试请先大概总结项目要解决的问题:面试者和你来自不同的公司,很多你觉得已经反复思考过的尝试对方可能根本没有想过。 所以在切入你的设计和方案之前解释下项目的目标和面临的挑战对帮助对方理解非常有帮助。

  • 准备解释项目的各种限制(constraints):在项目过程里面不可避免的会因为你公司的环境对你的方案产生种种限制。 这些限制是如何影响你的设计的?你当时考虑了哪些 trade-off?项目需求和限制在执行过程种发生过变化么?你是如何调整设计适应这些变化的?
系统设计面试的注意事项
  • 尽量深刻理解系统需求:有些时候面试者会故意在描述问题时候模棱两可,语焉不详的目的是要考察你是否有能力主动地理解清楚系统的设计需求是什么样的。即使你问了几次面试者还是没解释清楚,也不要简单放弃。 解释清楚为什么需要问这些问题,并且这些问题的答案会如何影响你的设计。
  • 如何定义问题是关键的第一步:理解了问题描述之后,尽量精确地用自己的语言重复一下问题,确保你和面试者在要解决什么问题上达成一致。 之后开始讨论 trade-off 并且定义好项目的关键指标(metrics)。 选对这些方向性的东西,项目就成功了一半。
  • 尽量话唠:把思路讲出来。 别怕提出很傻的笨法子, 毕竟你可以有言在先『just think out loud a dumb simple solution』
  • 引导对话:不要把系统设计面试当成问答题。 想象你自己是个项目负责人,正在和项目经理开会。 面试者了解要解决的问题是什么,而你的任务是搞明白这个问题然后提出个系统设计把这个问题解决掉。 如果没有明确的解决方法, 想出一个解决问题的思路框架来也很不错。
FAQ
Q:英语不好怎么办?感觉自己没法跟母语是英语的同事一样侃侃而谈?

A:系统设计这个『对话』和其他的场合一样, 聊天并不是交流的全部。 你需要做到的是提高你交流的『带宽』。至于你传递信息的方式是靠嘴说,靠手写还是画图并没什么关系。 很多时候快速上手画个流程图比连比带划的说半天有效很多。 站着面试,一边听人讲需求一边就开始往白板上记录是个很好的习惯。
以上的面试经验同样适用于很多其他高速发展的科技创业公司,想去Dropbox, Robinhood, Petuum等公司面试?
Leap.ai帮你一网打尽!
点击【阅读原文】注册Leap.ai,看看你会match到哪些工作机会吧!
继续阅读
阅读原文