写点什么

过冬存粮:算法工程师面试技能雷达

  • 2019-01-18
  • 本文字数:6080 字

    阅读完需:约 20 分钟

过冬存粮:算法工程师面试技能雷达

算法工程师是个非常热门的岗位,要想过五关斩六将获得心仪的 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 又有联系,但错过了那个时间节点,也就不考虑了。


可能不可抵抗力的因素在北京这个“寒冷”的冬天会更多一些,有没有解决之法?也是有的,大家没事多去北京西郊卧佛寺拜一拜可能会逆天改命。


现在可以把算法工程师面试的技能框图全部补全了。



北京的这个冬天有点“冷”,在文章结束前给身在寒冬的同学几点建议:


  1. 寒冬就应该广积粮,缓称王,猛攻自己的技能弱点,让自己更有实力迎接春天;

  2. 中高端职位永远不缺,真正合格的算法工程师永远是稀有物种,努力做金字塔中上部的那块砖;

  3. 好的 offer 永远是为平时注重积累的人准备的,突击准备也许会增加你的知识广度,但增加各方面技能的深度需要你无时无刻的积累和钻研,遇到问题多问为什么,多注重问题的细节。

  4. 最后祝看过这篇文章的同学都能认真准备,拿到满意的 offer。


原文链接:


https://zhuanlan.zhihu.com/p/54497063


https://zhuanlan.zhihu.com/p/54089811


2019-01-18 08:008104

评论

发布
暂无评论
发现更多内容

Ubuntu 日常系列:常用软件

TroyLiu

Linux ubuntu Ubuntu20.04

《精通比特币》学习笔记(第十一章)

棉花糖

区块链 学习 3月日更

腾讯高级工程师保姆级“Java成长手册”,层层递进,全是精华

Java架构追梦

Java 腾讯 面试 架构师

AI开发效率低,你可以试试华为NAIE AutoML

华为云开发者联盟

华为 AI 框架 AutoML NAIE平台

学以至用-从“0”到“1”设计千万级交易系统

ninetyhe

高可用 分布式系统 海量数据库的设计与实践 异步削峰

三步上线自己的在线监考系统

融云 RongCloud

一文搞懂PID控制算法

不脱发的程序猿

3月日更 PID 控制算法 智能控制 工业控制

阿里P7亲自教你!一线互联网大厂中高级Android面试真题收录!讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

集成融云 IMLib 时,如何实现一套类似于 IMKit 的用户信息管理机制

融云 RongCloud

一分钟了解EFT公链新一代超级DeFi公链——EGG超级公链

币圈那点事

区块链 公链 挖矿

Python 初学者必看:Python 异常处理集合

华为云开发者联盟

Python 异常 代码 程序 错误

【LeetCode】螺旋矩阵Java题解

Albert

算法 LeetCode 28天写作 3月日更

基于 SparkMLlib 智能课堂教学评价系统 - 系统实现(四)

大数据技术指南

大数据 spark 智能时代 28天写作 3月日更

解析分布式应用框架Ray架构源码

华为云开发者联盟

gRPC API 框架 ray 分布式应用框架

整理 自动备份MYSQL数据库shell脚本

edd

Navicat操作MySQL简易教程

Simon

MySQL navicat

阿里P7亲自讲解!整理几个重要的Android知识,最全Android知识总结

欢喜学安卓

android 程序员 面试 移动开发

恭喜自己2021金三银四收到的第五个Offer:字节跳动Java研发岗

比伯

Java 编程 架构 面试 程序人生

学无定法——知识反转效应

Justin

心理学 28天写作 游戏设计

Spring AOP 执行顺序 && Spring循环依赖(面试必问)

hepingfly

Java spring aop 循环依赖

有状态容器应用,从入门到实践

焱融科技

Kubernetes 容器 云原生 焱融科技 分布式存储

混合编程:如何用python11调用C++

华为云开发者联盟

c++ 编程 语言 python11 混合编程

数据营销“教父”宋星十年倾心之作,让数据真正赋能企业

博文视点Broadview

啥子叫递归哟!!!(阶乘)

依旧廖凯

28天写作 3月日更

翻译:《实用的Python编程》06_01_Iteration_protocol

codists

Python

用户行为分析模型实践(一)—— 路径分析模型

vivo互联网技术

大数据 数据分析 用户行为分析

在PostgreSQL中使用ltree处理层次结构数据

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

书单|互联网企业面试案头书之程序员软技能篇

博文视点Broadview

Elasticsearch Segments Merging 磁盘文件合并

escray

elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

镁信健康“互联网+医+药+险”模式能否打造出中国版联合健康?

E科讯

万物互联网络在企业中的价值和展望 | 趋势解读

物联网

过冬存粮:算法工程师面试技能雷达_文化 & 方法_王喆_InfoQ精选文章