算法工程师是个非常热门的岗位,要想过五关斩六将获得心仪的 offer,一份面试指南必不可少。在王喆的机器学习笔记(https://zhuanlan.zhihu.com/wangzhenotes )里,作者聊了聊算法工程师的面试技能雷达图,为了提高你的面试通过率,注重日常积累,不断扩大你各方面技能的深度和广度是必要的。
然而,经常参加面试的同学肯定有过这种感觉,即使面试过程非常顺畅,即使你本身是一个面霸,甚至 god like,也经常有失手的时候。所以很多同学把面试归结为一门“玄学”。那么算法工程师的面试真的是一门玄学吗?
今年是我作为算法工程师工作的第七个年头,期间拿到过 hulu,阿里巴巴,腾讯,美团以及一些 startup 的算法工程师 offer,也作为面试官面试过清北,海外,北邮,以及一些二本学校等不同背景的百余位 candidates,作为面试者和面试官的经验还比较丰富。所以希望自己的经验能对你有所帮助,也非常欢迎其他面试官能够多留言探讨自己的面试经验。
那我们直入主题,到底什么技能才是一名合格的算法工程师应该具备的技能呢?面试官又会如何验证你的这些技能呢?
算法工程师面试技能雷达图
虽然每个一个岗位都有 JD,但抛开具体的岗位要求,从稍高的角度角度看待这个问题,一名算法工程师的技术素质基本可以拆解成下面四个方面:知识、工具、逻辑、业务。当然广义来讲,这四项素质也适用于所有 IT 工程师。
我非常喜欢用雷达图来表示一个人的能力范围,可能小时候看圣斗士看多了,当时研究官方出的黄金圣斗士能力雷达图研究了半天,现在也没好到哪去,只不过变成了喜欢研究候选人的能力雷达图了。。下面画出了大数据行业几个相关职位的能力雷达图,大家可以初步体会一下。
简单来说,任何工程师都应该满足四项技能的最小要求,比如我曾经面试过一位计算广告算法工程师 candidate,这位同学发过一些计算广告相关的 paper 和专利,从 research 的角度是不错的人选,但当我想稍微验证一下他 coding 的能力时,他明确告诉我说他不愿意写代码。这就是不满足“工具”这项技能的最小要求,自然是不能通过面试的。
在最小要求的基础上,算法工程师的能力要求是相对全面的。其实所谓算法工程师,就是因为你不仅应该是一位合格的“工程师”,还应该再次基础上有算法的改进和实现的能力。除此之外,大数据工程师更注重大数据工具和平台的改进,研究员则在知识和逻辑层面相对突出。有些临时抱佛脚的同学喜欢恶补知识,不注重理解业务和模型本身的内在逻辑,是我经常见到的面试“悲剧”情况。
当然,只用四个词描述四个方面的能力还是过于形而上了,这里我们用一些具体的内容来描述一下算法工程师的四个技能点:
知识:主要是指你对 machine learning 相关知识和理论的储备
工具:将你的 machine learning 知识应用于实际业务的工具
逻辑:你的举一反三的能力,你解决问题的条理性,你发散思维的能力,你的聪明程度
业务:深入理解所在行业的商业模式,从业务中发现 motivation 并进而改进模型算法的能力
也许还不够具体,那我们再从一个实际例子中体会一下,比如我去面试“计算广告算法工程师”的职位,上面四项对应着哪些具体的能力呢?
知识:主流 CTR 模型以及预算控制,流量预估,bidding 策略等模型算法的原理和技术细节
工具:coding 能力,spark、flink、tensorflow、ps-lite 等模型训练、serving 相关工具
逻辑:算法题,模型之间的演化关系
业务:展示广告和搜索广告在构建模型时的区别联系,如何根据公司的 business model 制定模型的 objective
当然,上面只是让大家体会一下什么是这四项素质,真实的计算广告算法工程师面试中,你不一定要都掌握,也不一定局限于这些内容。如果你遇到一位资深的面试官,他不会预设一个框架往面试者身上套,而会从面试者简历出发检验面试者能不能达到这四项素质的标准。
那么问题又来了,面试官会如何在"限定的时间内"检验你这四项素质能不能达到"技术合格"的标准呢?
既然是限定的时间,面试官就不可能拿出一本西瓜书,从头问到尾,也不可能拿出一本葫芦书,从 100 道面试题中抽出 50 道给你来个马拉松问答。面试官要做的是在 1 个小时的时间内确认你能力的**“深度"和"广度”。 所以在这里面试官就像一个采样算法**,要从你脑子里采几个点,把你的能力雷达图描绘出来。
重点再重复一边,面试官会从“深度”和“广度”两个维度构建你的能力雷达图。
对于“深度”方面,有经验的面试官会从你已经做过的项目中挑出你最擅长的部分做层次式的递进。比如我在之前的回答(如何准备机器学习工程师的面试 ?https://www.zhihu.com/question/23259302/answer/527513387 )中举过的例子,
一位面试同学介绍自己实习时候用过 XGBoost 预测股票涨跌,那面试官可能会由浅入深依次考察下列问题:
GBDT 的原理(知识)
决策树节点分裂时是如何选择特征的?(知识)
写出 Gini Index 和 Information Gain 的公式并举例说明(知识)
分类树和回归树的区别是什么?(知识)
与 Random Forest 作比较,并以此介绍什么是模型的 Bias 和 Variance(知识)
XGBoost 的参数调优有哪些经验(工具)
XGBoost 的正则化是如何实现的(工具)
XGBoost 的并行化部分是如何实现的(工具)
为什么预测股票涨跌一般都会出现严重的过拟合现象(业务)
如果选用一种其他的模型替代 XGBoost 或者改进 XGBoost 你会怎么做,为什么?(业务+逻辑+知识)
这是一条由简历出发,由“知识”为切入点,不仅考察了“知识”的深度,而且还考察了“工具”、“业务”、“逻辑”深度的面试路径。
当然,如果你介绍的项目是实现了一种类似阿里 DIN 的 CTR 预估模型。那么问题路径可能是这样的:
softmax 函数的定义是什么?(知识)
神经网络为什么会产生梯度消失现象?(知识)
常见的激活函数有哪些?都有什么特点?(知识)
挑一种激活函数推导梯度下降的过程。(知识+逻辑)
Attention 机制什么?(知识)
阿里是如何将 attention 机制引入推荐模型的?(知识+业务)
DIN 是基于什么业务逻辑引入 attention 机制的?(业务)
DIN 中将用户和商品进行了 embedding,请讲清楚两项你知道的 embedding 方法。(知识)
你如何 serving 类似 DIN 这样的深度学习模型**(工具+业务)**
这条路径侧重于考查“知识”深度的路径。为了弥补其他方向考察的不足,面试官肯定还会问一个从工具或者业务出发的问题来确定你其他方面的深度。
因为面试官选择的是你最熟悉的领域深入下去,我们可以假设,如果一位面试者在最擅长的项目中都答不上一些细节性的问题,那几乎可以肯定你在任何其他领域的钻研都不够深入,你的技能雷达图的面积肯定是一个很小的面积。也有像我之前所提到的一些临时抱佛脚的面试者,也许知识方面达到了要求,但经不起面试官对“工具”和“逻辑”的考察,这也毫无疑问会“悲剧”。
如果面试者的能力深度达到了最低的要求,下一步面试官会确定你能力的广度,对于任何算法工程师,我都会随机 check 以下几个知识点:
NN,RNN,个别聚类算法,模型评估等知识的理解程度
spark 的调优经验,model serving 的主要方法,parameter server 的原理
GAN,LSTM,online learning 的基本理解
embedding 方法,attention 机制,multi task,reinforcement learning,online learning 的基本理解
对于广度的检查是比较随意的,个别答不上来无伤大雅,但如果超过一半以上的知识点都 miss 了,可能有点说不过去。因为我要知道你是一个关注前沿,喜欢学习的人,试想除了你自己做过的项目,其他知识了了,那我可以肯定你不是一个对技术有热情的人。很多面试官很看重“热情”这个属性,因为正是对技术的热情支撑你今后的学习,有些问题你可能不知道,你也要尽量用自己的理解去推导,去讨论。
好了,关于算法工程师面试中的能力雷达图讲完了,如果你嫌我太啰嗦,没关系,甩给你一张思维框图,你发给任何没看过这篇文章的人,也都会对我说的内容一目了然。
面试是一门玄学,如何逆天改命?
但经常参加面试的同学肯定有过这种感觉,即使面试过程非常顺畅,即使你本身是一个面霸,甚至 god like,也经常有失手的时候。所以很多同学把面试归结为一门“玄学”。面试是一门玄学,这句话有没有道理?面试到底“玄”在哪里?为什么“强”如作者(脸皮太厚了)参加了 10 余场大中小公司面试,也有两场没拿到 offer,原因是什么,是因为玄学吗?有什么方法能让你在玄之又玄的面试中逆天改命吗?我来尝试给大家一个解答。
一个前提
首先这里有一个前提,敢称面试为玄学的人必然是一个技能面积广阔的人。你室友面了五家公司,有一家没有给 offer,那可能是玄学导致的,你面了五家公司,一家都没给 offer,那是你的实力太弱,请回家继续苦练本事,扩大你的技能雷达图。
三个原因
在你实力足够的前提下,通常是三个方面的原因导致你无法得到 offer,这里面有主观的原因,也有客观的原因,甚至有不可抵抗力的因素,看看大家能不能找到属于你的那一条。
玄学之一:你可能不是面试官想一起工作的人。
站在面试官的角度,我经常把面试官给 candidate 通过的根本原因归结为一句话“找到了一个技术合格且愿意一起工作的人”。
所以面试通过要满足两个基本要求,一是**“技术合格”,二是“愿意一起工作”**二者缺一不可。所以在你技能合格的前提下,面试官愿不愿意与你一起工作就成了一个关键且略主观的问题。
但这看似草菅人命的标准其实是有背后的深刻逻辑的。往俗了说叫做看看 candidate 投不投缘,往大了说叫做符不符合公司文化,往实在了说,是要 check 你是不是能够顺利的与同事交流协作,得出合理的技术解决方案。
再进一步说,从工作和学习的区别的角度看,工作中知识的重要性其实是逐渐在降低的,软素质的要求逐渐在升高,你很有实力,但你传播实力的能力同样重要,就像 Facebook 总在强调的 impact,Hulu 在晋升 senior 时要考察的跨组合作,其实都在考察你的沟通能力。如果你在面试中连你未来的同事都聊不来,那你如何去跟别的组的同事协调呢?你甚至会跨 office 跟别的城市甚至别的国家的团队沟通,你又怎么能在复杂情况下一起解决问题?所以跟你的面试官聊得来是第一步。
为了验证你未来会不会是一个合适的同事,面试官通常会用抛出一些开放性的问题与你讨论,这个问题可能来自一些业界通用的问题,比如请你设计一个“千人千面”的电商主页商品类别排序模型;也许会来自一些生活中的算法,比如请你设计一个微信随机抢红包时生成红包金额的算法或机制;还有可能就来自面试官的工作实践,比如我在构建 CTR 模型的时候,遇到了严重的数据 bias 的问题,有没有什么办法解决。
这类题的特点很明显,非常开放和发散,开放到题目本身并不清楚。正是因为不清楚,所以面试官想要的效果是请你去主动提问题,我们一起去设计一个模型或系统来解决这个问题。在这样的前提下,有下面两类 candidate 可能会被我无情的拒掉:
面试过于被动,被面试官生硬的推着走。比如针对“微信抢红包”这个问题,有的面试者就一句话,“每次用一个随机数生成器生成一个红包金额不就行了”。如果是这样的话,你作为工程师的严谨性就荡然无存了。面试官为了让你继续下去,还要向你提问,比如你考虑过没有红包金额的总体分布问题?等等。而面试官期待的是这个问题被你推动着走下去。比如在问题不太清楚的前提下你应该反问面试官,每个红包的金额有没有上限和下限?需不需要考虑计算效率问题?我能否在红包产生时就预算好所有红包的金额等等。
思路受限,没有严谨性、开放性和创新性。在实际的工程问题中,解决一个问题不可能只有一个 solution,解决一个问题的 solution 也不可能是一句话能说清楚的。比如我想跟你讨论一下如何设计一个电商主页商品类别排序模型。看到这个问题,很多人会直接说我想用 DNN 建一个 CTR prediction 模型来排序。这当然可以,但最好请你抛出这个解决方案的时候严谨地系统地想一想这个问题,顺着工程实现的思路去跟面试官讨论下去,比如 1、都能得到哪些数据和 feature;2、数据量有多大,数据延迟有多大;3、objective 如何制定;4、结合具体业务,我能不能把商品类别当作一个 item 来对待,或者把类别内部的商品当作一个 item 来对待;5、我能否使用 learning to rank /ctr prediction/多分类模型来解决这个问题;6、采用什么模型架构更适合这个问题等等。在实际面试中,你可能无法想的这么细,但请体会这个意思,作为算法工程师,你应该足够严谨、开放、活跃、创新。
玄学之二:你的技能树无法精确满足当前 position 的要求
这个问题在社招的情况下尤为突出。很多资深的工程师说感觉面试表现不错,算法题最优解,设计题聊半天,面试官全程微笑,就是不发 offer。这样的情况绝大可能就是你的经验不能精确符合职位要求。
大家要注意“精确”二字。在有些情况下公司对面试者的工作经验的要求是精确到系统模块级别的。同样是计算广告算法工程师,我们团队可能就想招一个做 yield optimization 或者“预算控制”算法的,你说你搞 CTR 搞得风生水起,发了无数篇顶会,但你没搞过这个方向,不能即插即用,那只能对不起,作为同行为你点个赞,但 offer 没有。
前段时间还跟 facebook 一位前同事聊天,说他们就想招一个搞大规模并行机器学习平台的人。那你说你是做 ranking 的,你用 tensorflow 或者 mxnet 用的飞起,但没实现或者修改过源码,没自己搭建过 parameter server,那也只能对不起,点赞奉上,offer 没有。
针对这类问题有没有解决之道?其实是有几点大家可以注意的,在找工作之前还是要尽可能的多读几遍 JD,找到那些跟一般 JD 有区别的,或者 JD 上明确写的“最好有 XXX 经验”,看与自己的经验是否匹配;有条件的 candidate 可以多跟猎头或者对方 hr 沟通一下,甚至能够找到内推渠道的同学可以找团队的成员了解一下内幕消息,都是很有必要的。
玄学之三:不可抵抗力
上篇文章作者说到参加过十几场面试,但还是有两个公司没有给 offer,一个是 eBay 美国总部,一个是百度某算法部门。eBay 挂掉的原因是当时英语实在太差了,设计题和开放题答得很差,没有跟面试官更有效的互动;百度的原因就是不可抵抗力,大约记得是 15 年底的时候,已经拿到口头 offer 了,但突然因为某事件全 baidu 的校招和社招 offer 都暂时停止了,这就属于不可抵抗力因素了。虽然后来跟 baidu 又有联系,但错过了那个时间节点,也就不考虑了。
可能不可抵抗力的因素在北京这个“寒冷”的冬天会更多一些,有没有解决之法?也是有的,大家没事多去北京西郊卧佛寺拜一拜可能会逆天改命。
现在可以把算法工程师面试的技能框图全部补全了。
北京的这个冬天有点“冷”,在文章结束前给身在寒冬的同学几点建议:
寒冬就应该广积粮,缓称王,猛攻自己的技能弱点,让自己更有实力迎接春天;
中高端职位永远不缺,真正合格的算法工程师永远是稀有物种,努力做金字塔中上部的那块砖;
好的 offer 永远是为平时注重积累的人准备的,突击准备也许会增加你的知识广度,但增加各方面技能的深度需要你无时无刻的积累和钻研,遇到问题多问为什么,多注重问题的细节。
最后祝看过这篇文章的同学都能认真准备,拿到满意的 offer。
原文链接:
https://zhuanlan.zhihu.com/p/54497063
https://zhuanlan.zhihu.com/p/54089811
评论