从疫情到求职寒冬,我的算法求职经历
共 5513字,需浏览 12分钟
·
2021-02-05 21:27
《从杉数到滴滴》系列又来啦
概况
10月底开始面试滴滴的社招岗位,11月17日停止工作,11月24日被通知offer被撕,12月3日通过快手面试,又过了两周入职,差不多经过了一个多月的时间,这中间一共收到了这么几家公司(精确到部门)的面试邀请。
字节跳动tiktok推荐算法工程师
字节跳动抖音推荐算法工程师
腾讯游戏AI算法工程师(应用研究岗位)
快手商业化广告算法工程师
百度上层排序组搜索推荐算法工程师
正仁量化投资公司研究员(quant)
以上均为实习。最终快手,百度和正仁量化通过了面试。加上之前的滴滴国际化算法工程师社招岗位,一共经历了7个部门的面试。这些公司有互联网也有金融,面试的风格虽然大部分受制于面试官,但公司的文化,部门的核心程度,部门所做的工作,都影响着面试的氛围和难度。因此希望通过几个部门的面试题对比,能够让大家更好地了解目前找实习的难度,并希望更多对此感兴趣,但对前景迷茫的朋友,能够更有方向,拿到自己喜欢的offer。
注意:所有的面试题均有一些小小的改动(有的是改了问法,有的是改了细节,有的则是模糊处理等等),但大体上不影响对比和理解。同时不推荐大家去背面试题(除了leetcode),因为很多面试官会有换题,考察面试者能力也有千奇百怪的考法。
01
字节跳动tiktok/抖音推荐算法工程师
字节跳动的推荐算法不用多说,绝对是核心中的核心。他们家面试有三轮,每一轮都会有代码能力的考察。我们放一些题目具体来分析。
tiktok
叙述集成学习的好处
叙述gbdt与随机森林的区别与联系
叙述xgb可以调整的参数
叙述非均衡问题的可能的处理方案
代码题:给你一个数组,在这个数组中找出不重合的两段,让这两段的子段和之差最大,返回最大差
叙述推荐系统的协同过滤算法的原理
叙述描述向量相似性的可能方案
是否了解Spark与Flink?
代码题:给定一个正方形的中心点,给定平面上的其他点,给定一个整数K,找到一个合理的,边长最小的正方形,可以涵盖最少K个点。
叙述word2vec的原理
叙述常见的降维方案
叙述过拟合的定义与神经网络降低过拟合的可能的解决方案
是否了解梯度下降法相关的优化方法
代码题:一个m长有序数组,一个n长有序数组,找它们的中位数。
问如果一个推荐系统给一个视频错误了添加了流量,有什么可以纠正的方法?
抖音
聊简历
代码题:大数乘法,要求复杂度O(n log n)。
我们就不回答这些题了,大概的描述和公司的对比才是这一篇文章的主要内容。想看对题目的解释和分析,可以看一下我的知乎live。
对于这些题目,我们可以把它们分为三块:机器学习基础知识,深度学习基础知识,代码题。
机器学习基础知识
1-4,11,13(题号就辛苦大家按顺序数一下!)考查机器学习的基础知识。对于算法工程师而言,机器学习基础知识是重中之重。算法工程师在大厂中,是真的需要灵活运用各种模型,写各种Python和C++/Java,并且进行分析的。在一些深度学习组更是需要时常跟进顶会paper。
深度学习基础知识
6,7,10,12考察对深度学习的了解,这需要结合部门的业务来看。推荐,尤其是抖音/tiktok的推荐,都是极度依赖深度学习模型的,因此面试官希望面试者具备这方面的了解。
代码题
5,9,14,包括抖音的2是Leetcode中的题目,leetcode是一个刷题社区,也是互联网大厂考察算法与数据结构,代码能力的题库。一般我们会使用社区中,leetcode标记的难度(easy,medium,hard)来判断面试的难度。刷过leetcode的可以看出来,这四个题有2个是hard,有一个是ACM竞赛难度(大数乘法的最快算法是快速傅立叶变换),对于算法面试来说已经是地狱难度了。
场景题
15是场景题,也可以认为是业务面。
字节跳动(Bytedance)的面试难度,个人认为在国内可以排前三(有句话说得好,叫通过Google面试不一定能通过字节面试)。面试tiktok部门的时候在三面被刷,面试抖音部门的时候更是一面直接被刷(所以面经也只有两个题呜呜呜)。
02
腾讯游戏AI算法工程师(应用研究岗位)
腾讯游戏也是腾讯一个相对核心的部门,因此内部的工程师也是具备很强的算法与工程能力的。
聊简历
类似字节,问决策树的构造,GBDT,XGB等常见模型。
叙述一下强化学习的基本原理,并列举一些Value-based的算法。
叙述一下继承和多态的概念与区别。
叙述一下反射的含义。
代码题:Leetcode 戳气球。
这里很有特点的题目就是3-5。
3考察了强化学习的一些细节。这是因为游戏部门有很多算法是依赖强化学习的。
4-5考察对软件开发的基础知识的了解,也是我面别的部门的时候没有遇到过的情况。这是因为腾讯游戏部门的工程师很多时候会算法开发一起做。
另外,6也是一道hard。
我因为没有太深入研究过强化学习,开发那一块也做得少,因此这一块回答的一塌糊涂。可能因为这个,尽管代码题我背出来了,但一面结束之后也就没下文了。
03
快手商业化广告算法工程师
快手面试有两轮,每一轮都有代码能力的考察。快手商业化是一个近两年快手开始重视的部门。虽然不是最核心的(最核心肯定还是快手短视频推荐什么的),但是也是一个业务量很大,严重依赖深度学习的部门。
聊简历
机器学习基础:gbdt,xgb,常见评判指标等。
是否了解sigmoid函数,求它的导数和简便表达。
cross-entropy是什么?用在什么场景?
了解CNN吗?感觉它和一般的ANN相比设计思路差别在哪里?
矩阵分解的基本思路?
代码题:拓扑排序。
代码题:二叉搜索树中找第K大。
代码题:找一棵树中,两个节点的公共祖先。
代码题:反转链表。
总体的考察点和字节跳动很像:机器学习,深度学习(3-6),代码能力。但是区别在于快手的关注点更加集中于业界常使用的一些知识点上。对于代码题的考察也聚焦于常见的算法与数据结构的简单应用,难度适中但考察的面广。我个人不太喜欢刷偏难怪的东西,因此很对我胃口,当然最后也就通过了面试。
04
百度上层排序组搜索推荐算法工程师
百度面试也是三轮,但是第三轮是经理面(总监面),前两轮有对代码能力的考察。百度作为老牌BAT之一,近两年倒是不止一次的被人吐槽过业务下滑,但是他们家的原始技术的积累和成熟度,说是国内顶尖肯定还是没问题的。
聊简历
机器学习基础:lr,svm(硬间隔与软间隔),gbdt,xgb,它们如何做并行化的?
叙述优化中共轭梯度法和牛顿法的原理。
word2vec原理?
介绍一下LSTM和GRU的设计思路与对比。
叙述Attention,Transformer和Bert的原理。
代码题:Leetcode 编辑距离,交叉链表。
总体来说百度的面试难度介于快手和字节之间。代码题为1个hard和1个medium,但对基础知识的考察比较严谨和细节。另外百度这一个部门的面试题,可能学nlp的人看到会狂喜,这是因为百度搜索应对的绝大部分场景都是自然语言,自然需要很多自然语言处理方向的知识,通过面试题5,6,以及代码题的编辑距离,其实都能看出来这一点。
不过这里要感谢的是三轮面试的面试官都是比较nice的人,聊完我们加了微信,也问了一些nlp相关的问题,补充项目的方法等等。我没有学过nlp的东西,因此回答基本上都比较一知半解,对深度学习训练遇到的常见问题更是毫无思路。虽然二面的小哥和我说“在项目经验这一块上,你不能加分”,但可能看在我其他问题回答的还行,所以还是给我通过了面试。
05
滴滴国际化算法工程师(社招面试)
滴滴我一共经过了四轮面试(2轮技术面,2轮业务面),如果加上HR面,那么就是六轮面试……u1s1,虽然他们家HR撕了我的offer,但是他们的leader和同事还是比较友好的。滴滴国际化部门是一个新的部门,也会做拼车,顺风车等滴滴核心业务,但总体的数据量还比较初期,因此算是一个中规中矩的算法岗位。
聊简历
机器学习基础:决策树,随机森林,xgb,lgb,gbdt,svm(核函数,正定性等),sgd。
代码题:四则运算表达式解析
代码题:Dijsktra算法
叙述Adam的原理,用到了物理的什么概念?
叙述CNN中卷积和池化的原理。
叙述Python中tuple,list,set,dict的区别。
是否了解在线学习?举出它的核心思路。
讨论深度学习中“双下降”曲线的出现原因。
叙述MapReduce的原理。
是否了解Kafka?
叙述Spark中RDD的设计原理?
场景题:青桔单车的地区分配和人力调动问题。
到了社招面试的阶段,可以看出对基础知识的要求相比较实习面试要高了一个层次,考察更加灵活,同时也有增添对深度学习(5,6),分布式(10,11,12)和Python(7)的考察(尽管部门用不到深度学习)。同时加了专门的业务面,考察一个人对一个具体业务的设计思路。这很多时候是希望面试者已经具备了在某一些业务上的深入了解,并且希望在入职之后,能够很快上手,并且完成核心任务。换句话说,如果实习生是进去学习的话,那么正式岗就是进去扛大旗的。我几乎没有工作经验,所以业务基础几乎为0,这也使得在最后谈薪资的时候,没有比较明显的竞争力。
06
正仁量化投资公司研究员(quant)
量化投资属于金融行业。不同于传统的金融业务,基金等,量化投资(quant)是相对比较tech,比较需要理工科思维的一个岗位。对于这一家公司,大家可以在百度搜索,在此非常感谢他们提供面试机会,并给我这个小白详细介绍了他们做的事情和对应的背景。
quant没有相关的题库,面经,是因为相比较互联网来说,招聘更加自由,且没有硬性对leetcode的考察。比方说他们正在做一个降维,就会直接把这个主题丢给面试者,希望面试者和他们讨论一个方案。当然quant正式岗还是很卷的岗位,对应的面经也和互联网技术面试差别很大,这里我们就不详细介绍了。
07
对比与面试准备技巧
回头看这么几家公司的面经,有各自的特点,但也有很多共通的地方。
关于Leetcode
互联网公司考察leetcode几乎已经成为了一个共识,大部分情况下算法工程师考察的难度都是medium,但是对于相对核心的组,考察hard的可能性也存在。不过这个也取决于面试官的认知,有的面试官就很不喜欢leetcode,但又很希望考察代码能力,那么就有可能通过考察Python,开发基础知识,或者简单的算法与数据结构模版题来达到这个目的。就我个人的面试经验来看,字节跳动的面试官更有可能在leetcode上出偏难怪的题目,因此对于他们家来说,面试之前多刷leetcode就是一件很有必要的事情。
关于算法面试的知识储备
对于算法工程师来说,基本上面试题可以拆分为机器学习基础,深度学习基础,业务能力,代码基础这几块。对于一些更加特殊的部门(比如说腾讯游戏,菜鸟物流等),还有可能会考察到强化学习,运筹优化等。其实脉脉,牛客网中已经有了很多的面经,但需要强调一句话:务必结合业务来判断考察的知识点。像xgb,gbdt等考点绝对是高频中的高频,这是因为对于比较传统的问题(用户增长,风控等),以gbdt为代表的树模型占有绝对的王者地位。具体的面试考察点我在我的知乎live中也有给大家总结。
关于学习方法与学习资料
勤学习和拓宽视野是一个算法工程师必备的能力。事实上这里的面试题,有很多我都不能够很好的答出来,但是这里我依然推荐大家勇敢和自信的向面试官表达自己的观点。实际的工作场景中,主动沟通和随和是让工作这一件事情变得愉快的非常重要的品质,因此这一点其实能给面试官非常积极的暗示。不过这一件事情也是有好有坏的,推荐主动表达不代表推荐胡说八道,因此最好大家保持对这一个行业的兴趣,多寻找相关行业的学习资料。诸如Datawhale,李宏毅课程,天池,Kaggle等都是很好的开源资料。我的专栏就更不用说了(滑稽)
关于“内卷”带来的竞争压力
最后一点是关于竞争压力的问题。对于应届生面试(工作经验1年及以下)或者实习生面试,面试官的考察中几乎不会涉及到业务面。更进一步地说,对于项目经验相关的问题,面试官都会相对比较宽容,除非他们部门完完全全不缺人。但也不要轻视“聊简历”这三个字,因为简历造假或者浮夸是招聘中极为常见的现象,所以是否对简历项目有很好的掌握和理解,也是面试官需要重点考察的一个部分。但是如果是传统的社招面试,则业务面是一个很关键的部分,毕竟如果没有几年的工作经验,其实公司招聘一个人就很难保证这个人有足够的经验去快速上手并承担公司的业务。
08
小结
衷心希望世界和平