授权转载自北美求职君
微信号:Beimeiqiuzhijun
今年1月6号公司毫无征兆的大裁员,整个Data组被裁,于是再次踏上找工作的道路,3月4号正式签下卖身契,结束今年的找工季。由于去年没有抽中h1b,比较着急在抽签之前签了offer,结果就是近两个月的时间里疯狂的投了200多份简历,聊了五十多家公司,搞了近百场面试。拿到了Servicenow, Hulu, Yelp以及湾区一家Startup的Data Scientist offer,最后从了ServiceNow。趁着最近记忆还鲜活,唠叨一下自己这两个月面试的心得体会,希望能够帮助有需要的同学。
简单介绍一下背景,本科是BJTU的信息与计算科学专业,MS是Georgia Tech的Computational Science and Engineering专业,毕业后在一家Startup做Data Scientist,裁员的时候刚好干满一年。
之前工作主要集中在两个方面,一是客户与产品分析(customer conversion / churn analysis, product analysis),二是数据分析产品的研发。这次找工目标是Data Scientist,另外也有面过Machine Learning Engineer, Software Engineer。面过的公司里面以high tech公司为主,少部分是传统行业的公司。
Data Scientist面试的基本流程包括了一到两轮电话面试,Homework Assignment,onsite interview(通常四到六轮面试)。电话面试主要是聊聊简历,问问机器学习概率统计,写写代码。Homework Assignment通常是给一个简化但与实际工作相关的问题,根据给出的数据进行建模、分析、完成报告。onsite interview里每一轮面试的侧重点都会有所不同,但是基本上是电话面试的扩展版。
面试内容可以归纳为简历,机器学习,概率统计,算法与coding,开放性问题五个方面。
由于目前数据行业从业人员背景千差万别,所以不同背景的面试官关注的点可以能不一样,有的侧重于具体的技术细节,有的更看重business impact,所以在准备简历的时候,最好能保证两个方面都照顾到。在聊简历到过程中,常被问到这些问题:一,为什么用某一种方法及与之相关的各种技术细节;二,如果有机会重新做这个项目,有什么可以改进提高的地方等等。
聊简历的终极奥义是引导面试官聊你最熟悉的内容,引导面试官问你想让他问的问题(能体现你的水平与思考的)。总的来说,简历从写到聊水很深,有机会单独再详细说。但是最基本的要求,必须熟悉简历上的每一句话,每一个关键字,了解每一个技术点。
机器学习是Data Scientist面试中非常非常重要的一个部分,因为这是Data Scientist看家吃饭的技能,所以机器学习的面试结果会很大程度上左右最终面试结果。一般公司会从广度,深度,经验三个角度进行考察。
从广度上讲,应该对机器学习各个方面(regression, classification, clustering, etc)的算法都有所涉猎,不要求精通,但是至少能够用几句话描述出算法是在怎样的假设下用怎样的步骤解决了怎样的问题,有什么优缺点。
从深度上讲,一方面,能完整的掌握几种机器学习的算法。不仅仅知道算法是干什么的,更要知道与之相关的数学推理、技术细节。比如Naive Bayes怎么利用Naive Assumption简化,比如AUC为什么对于数据不平衡问题不敏感等等。另一方面,能够对算法进行横向比较。比如什么情况下Random Forests 比Gradient Boosting好,什么情况下不如GBM,为什么会这样。
从经验上讲,侧重的是考察与实际项目有关但是在课堂或教科书里一般不会涉及的内容。比如如何进行feature engineering,如果数据量比feature量少怎么办,如何解决imbalanced data classification的问题,如果模型的performance没有达到预期应该怎么办等等。
面试中概率有关的都是一些很经典的问题,比如红白球取某种球的概率,计算条件概率,根据贝叶斯公式计算概率等。
统计相关的概念也经常会被问到,比如什么是p值,置信区间,最大似然估计,中心极限定理,大数定律等。如果职位对统计的要求较高,也会涉及一些统计检验方法,比如如何判断两组数是否来自同一分布。AB test也是一个统计的考察点。
Data Scientist对于算法和coding的要求相对较低,不需要像Software Engineer那样要求bug free。能搞定leetcode medium难度,明白时间及空间复杂度,知道基本的数据结构,就能应付绝大多数Data Scientist的面试。与data相关的题目被问到的几率相对较高,比如find median from data stream, median of two sorted array等。另外,简化版的k-means, tf-idf等机器学习的算法也有被要求过现场写代码。
此外,SQL基本是必考内容,从各种不同的join,再到一些高级技巧都所涉及,基本上过一遍w3school就能解决绝大部分SQL题。
我把开放性问题分为三类,一是实际问题的case study,二是“之前的经历中有没有遇到过xxx问题”,三是behavior questions。
Case study简单来说是对面试官提出的一个工作过程中可能会遇到的问题,要求进行分析建模。这个问题可能是偏技术的,如设计一个推荐系统,开发一个数据有关的功能,也可能是与公司产品、客户、运营有关的business问题,如怎样进行客户流失分析等。我个人的回答思路是首先明确问题并将其转换成建模问题,然后确定需要什么样的数据,之后进行feature的构建及选择,模型评估方法的选择,模型的构建与测试评估,最后谈一下结果的delivery。
“有没有遇到过xxx问题”也是一类经常被问的问题。这需要注意在工作过程中的积累,平时多思考。如果真的遇到不熟悉的问题也不要慌。这类问题典型的有:有没有遇到过数据不足的情况;有没有缺少可信的labeled data或者数据质量突变的情况;如果数据量太大不能放到内存或者一张硬盘中应该怎么处理等等。
Software Engineer面试中很少会涉及到behavior questions,大家都上来直接做题过招。但是Data Scientist面试中这是非常常见的,估计是因为Data Scientist工作中经常需要同时与技术和非技术的同事打交道。除了怎么进行团队合作,遇到意见不一致怎么处理,怎么进行日常交流等常见behavior questions之外,诸如如何向没有数据背景或者没有技术背景的同事解释模型,在business objective不明确或无法实现的情况下如何进行交流沟通这种与日常工作紧密结合的问题也会被问到。
以上就是我的一些小小经验分享,希望能够帮助有需要的同学。将来如果有机会,希望能再开贴详细说说上述的每一步。最后归纳一点我自己的心得体会:
拿面试看简历,拿Onsite看实力,拿Offer看沟通。
往期精彩回顾