©作者 | 刘佑华
单位 | UCL毕业/爱奇艺工作
研究方向 | 推荐算法
个人背景
985本(专业电子信息,成绩10%),英国G5硕(专业机器学习,成绩distinction),四个项目(其实还有个很水的,但是太水了,简历上就没写),无论文,无实习,无竞赛。Leetcode刷了300+,每道题的基本所有做法都会,总共刷了3000遍左右吧(有些次数是水的,在观察/对比某些方法的平均时间、空间),这些题均可保证在5分钟内写出来(假如在面试中遇到的话,可以熟练写出来)。
校招结果
华为cbg消费者云服务15级,南京,26k*12+80k(保底年终),总包40w. (感觉可以再高一些,自己当时报价报低了,结果就按照我报价的下限给的)
携程,上海,23k*15 (+ 45k签字费)(硕士顶薪)(携程只有20k和23k两档, 最高档的一部分同学有签字费)。
爱奇艺,北京(硕士顶薪)。
Vivo,北京(地点随便挑),20k*15(sp。Vivo三档16k 20k 24k,感觉可以拿ssp,但是vivo只有一轮30分钟的技术面,感觉太简单了,没区分度。但是了解到有些ssp背景全方面不如我,而且我当时面试也是完美回答所有问题,但是没给ssp,最后选择的时候就直接把vivo pass掉了)。
阿里新零售事业群,杭州。面完了,拿了口头offer,还在等正式offer。
面经 & 吐槽
背景备注:因为学校那边事情比较多,大概到十月才结束,所以秋招准备不怎么充分(知识上和刷题上,都不够充分)。而且当时刚开始投递,了解到的公司也不算多,所以整个秋招投递数量也不算多。春招就开始步入正轨。
面经顺序备注:以下同一次校招中,公司之间没有严格按照时间顺序,公司内部有多次面试的话,按照时间顺序。总体按照先秋招再春招的时间顺序。
面经环节备注:整体按照轮次,时长,流程,自我评价/吐槽/面试官评价的顺序进行。
流程中的各个环节:
项目展开环节,因为都是根据个人项目和知识储备来展开的,每人的方向不同,我就不再详细介绍,没啥参考价值。
项目展开+基础知识:是指纯项目展开,再加上一些引申出来的基础知识,个人在准备时可以根据个人项目情况来针对性准备。这一块儿我主要写那些引申出来的基础知识,来给大家做参考。那些纯项目展开的部分(或者我认为不具有普适性的知识)我就不写了。会写的基础知识有,比如说我项目中用到了深度可分离卷积,那可能会引申出参数量运算量的推导,深度可分离能使参数量运算量下降的比例。
基础知识:是指和项目无关,可能是和岗位有关,比如说推荐算法岗相关的一些知识(我本人的项目基本没有纯推荐的)。也可能是作为一个算法工程师,人人都要掌握的基础知识,比如说传统机器学习的各种模型,深度学习的优化器,激活函数,损失函数,评价指标,你所用的编程语言的一些底层原理等等。
1. 字节跳动
秋招提前批一面:挂
时长:60分钟
流程:项目展开,做题(两道题:第一题:二分查找变形,查找有序数组中某个数的起始位置和末尾位置。第二题:礼物的最大价值(找到一个矩阵从左上角到右下角的最大/小和,简单的dp),传统机器学习基础(LR:sigmoid函数,损失函数,权重更新。集成学习:整体的原理(bagging,boosting),bagging的例子(随机森林),随机森林的原理(构建方式,随机性的体现,优点),boosting的例子(gbdt),gbdt的原理(构建方式,优点))。
自我评价:项目展开:这块儿回答的挺好。做题:第一题虽然不难,但没做出来,不熟练+紧张,只写了暴力解。第二题秒做出来。基础知识环节:LR回答的很好,集成学习那些准备不充分,确实答得不好。客观来说,确实应该挂。
吐槽:当时面试结束时面试官给我说,因为二面面试官临时有事儿,所以二面时间再约。结果过了两天没消息,我去问,通知我一面挂了。有一说一,确实答得不好,应该挂。但是面试官偏要搞那么一出,就很烦。或者说那二面面试官假如没有临时有事儿的话,那不就直接二面了吗?
秋招正式批笔试(第一次):挂
自我评价:内容记不得了,确实挺难的,确实不会,应该挂。
秋招正式批笔试(第二次):通过, 76/100,或者说3.2/4
题目:四道代码题(分值10 30 30 30):1. 简单的sort by key;2. Leetcode原题,hard,42/84/85中的一道(具体哪个我忘了);3. 竞赛题,给一个M*N的大矩形和n*1的小矩形,请问小矩形有多少种方法拼成大矩形。牛客上JZ10 矩形覆盖的无敌升级版;4. 题目忘了,思路是0-1背包问题+计算完全平方数的优化。
自我评价:运气好+实力强,能有这个结果真的很满意了(毕竟字节笔试公认的难),当时去牛客上看了一圈没有比我做的好的(估计这次笔试可以top,得瑟一下)。第二题那个hard,碰巧做过原题,直接秒了。第三题,确实没啥思路,骗了20%。第四题,0-1背包估计不少人能想到,因为条件负责度的要求,写到这里只能对0.6%。再加上优化计算完全平方数,才能全部ac。
秋招正式批一面:(通过)
时长:60分钟
流程:自我介绍,项目展开,基础知识(时间太久了,真的忘了,不好意思),做题(auc的python实现)。
自我评价:完美发挥,所有问题都逻辑清晰的回答上来了,和面试官也在友好的沟通,最后也相互分享了下对整个算法岗学习的看法。
秋招正式批二面:(挂)
时长:60分钟
流程:自我介绍,做题两道:第一题,概率题,两人抛硬币,出现三次正面朝上为A胜,出现三次背面朝上为B胜,计算A胜的概率。第二题,代码题,计算斐波那契数列。
自我评价+吐槽:纯属被搞了。自我介绍完之后就开始全程做题,没有问任何专业知识,同时面试官态度及其之差,不听我讲话,还多次打断,还抨击一面面试官和学术界大牛。具体表现如下,概率题我做出来了,五分钟不到,确实不是很熟练,但是五分钟也还好吧。最后他说我做的太慢,方法太笨(我反问他该用啥方法,说用排列组合分类讨论,我就是这样做的)。
第二题,我用空间优化(状态压缩)的DP来做(空间复杂度O(1),时间O(n)),他说方法太笨,让我写一种更快的。我不会,他也不提示,就硬尬着十分钟。然后我实在没思路,他说用快速幂+矩阵乘法,我还是不会。但是我说我会快速幂和矩阵乘法这两种方法,可以分别给他写一下,他说不需要,你只用给我这个题的结果。中间我多次想给他沟通,他都拒绝,说只要结果,然后就去干自己的事儿去了。我在调试过程中,根本没说我写完了,他偶尔看了一下电脑,以为我是输出结果,直接开喷,“你这个结果怎么是这样?!“, 我说我还在调试,他说“不能调试!”。
就这么尬了一个小时,最后他说“你是我面过的最差的,我们这儿没人写不出来这个的”。(我结束之后查了下他说的这种方法,算是半个竞赛解法了,很偏,正常情况写到空间为O(1)的dp就行了)。他除此之外还说,“一面问的那些模型啊,机器学习啊,深度学习啊,都没用,更新太快”。难道因为更新快,就不去尝试不去学习新东西了吗?还抨击这几年一些大牛的作品,比如efficentnet,都是垃圾。
2. 网易
秋招一面:挂
时长:60分钟
流程:自我介绍,项目展开(介绍alexnet的结构,神经网络剪枝的原理和具体实现),基础知识(tf中name space,variable space等的区别和联系,tf来做分布式训练(多GPU协作)的api)
自我评价:中等偏上的发挥,发挥不好的点在于对于剪枝的理解还没有很深入,对tf1.x的指令不熟悉(我用的tf2.x),没有当时就明确指出name space,variable space这些是1.x中独有的,2.x中没有。
吐槽:
a. 面试时间:约的是14.30面试,预约的是14.20面试开始,等了十分钟才通知我进房间。进了房间直接完全没音讯?给我发起视频面试,我秒点接受,没有接通。我又文字尝试沟通,并多次向他发出视频面试的请求,均没有任何回应。然后面试官直接退出房间。我还在想办法开始面试呢,收到通知:“因为您没有及时进入面试房间,面试推迟”。这能让我背锅?而且也不说推迟到什么时候?我等了一个小时,刚准备关电脑,又收到通知,面试开始,请赶紧进入房间。
b. 面试官水平太低:1. 让我介绍alexnet的结构,我说八层权重层,其中有五层卷积和三层全连接。她直接反问,“难道没有池化层吗?”。通常说层数都是指权重层,而且我也明确说明是权重层,池化层是权重层?2. 让我介绍剪枝的具体原理和实现,我按照论文给她讲,她不信。我报论文名字和作者(《Learning both Weights and Connections for Efficient Neural Networks》,song han),她还是不信。我说神经网络的表达性能过剩(这是常识),她也不信。她就硬抬杠。3. 问我tf的name space,variable space之间的区别,我因为用的tf2.x(这些在2.x中删除了),根本没见过,我当时还以为是我自己学艺不精,也直接说的不会。
3. 商汤
秋招补招一面:通过
时长:60分钟
流程:自我介绍,项目展开+基础知识(这里面牵扯到一些项目相关的基础知识,比如说大尺寸卷积核为什么能替换成小尺寸卷积核的堆叠(有效感知野尺寸相同),优点是什么(参数量更少,更多的非线性,等等)。soft-nms的具体实现,和传统nms相比的优点。一些CNN的创新点和具体实现,比如说mobilenet v1,v2的实现、优缺点,卷积层参数量运算量的计算等等),一道代码题(剑指offer45把数组排成最小的数,快排的变形)。
自我评价:还不错,只有一个地方(推导卷积层参数量运算量)发挥不好。因为好久没推了,当时也是第一次被问到,也有点紧张,不太熟练,结论没推全对,但是口述了原理。其他地方包括代码题都很熟练的回答上来了。
秋招补招二面:(挂)
时长:60分钟
流程:自我介绍,项目展开+基础知识(大尺寸卷积核为什么能替换成小尺寸卷积核的堆叠(有效感知野尺寸相同),优点是什么(参数量更少,更多的非线性,等等)。soft-nms的具体实现,和传统nms相比的优点。BN层的实现和作用,为什么能有这个作用),一道代码题(leetcode221 最大正方形)。
自我评价:个人发挥还不错,不过面试官水平非常有限。
吐槽:这面试官水平太菜了,就算是kpi面,面试官水平也不至于这么低吧。a. 和网易一样,这个面试官一直在对于剪枝的原理抬杠,我讲了原理,说了实验结果,还说了论文名字和作者,他就是不信。b. 这面试官连大尺寸卷积核替换成小尺寸卷积核的堆叠都不知道,而且也不认真听我介绍。我给他举了例子,比如说1个5*5换成2个3*3,我费了10多分钟的口舌之后,他恍然大悟,“哦~是换成两个3*3啊,我还以为是1个5*5换成1个3*3”。c. 面试官不知道bn层,我花了不少时间给他从头讲了bn层。d. 我代码题做的很快,不过我做完之后给他逐行解释并分析了复杂度,他问我你是不是做过这个题··…e. 面试结束之后,我反问他,请问我还可以在哪里更进一步。这老哥还挺实在,说“实在抱歉没给你提什么有价值的问题,也没给你什么有价值的建议”。
4. Vivo
秋招补招一面:(通过)
时长:30分钟
流程:自我介绍,基础知识(python:生成器/迭代器,is和==,sort底层原理。数据结构:树的前中后序遍历,二叉排序树)。
自我评价+吐槽:个人完美发挥,但是面试时间太短,自我介绍完之后就只剩十七八分钟了,真正问问题的环节就只有十五分钟左右。而且面试官也不知道问啥,很多地方我看面试官费力想问题,我直接把之前问的点展开讲。没问代码题,不知道是面试官不知道出啥,还是流程就不要求代码题,我还主动帮面试官想代码题(二叉树中序遍历的迭代和递归两种写法),面试官说不用写,哈哈哈。
秋招补招二面(HR面):通过
时长:20分钟左右
流程:自我介绍,HR面标准问题(最大的优点/缺点,预期工资,工作地,如何学习的,学校情况等等)。
5. BIGO
秋招补招一面:挂
时长:60分钟
流程:自我介绍,做题(三道题:第一题:900桶酒中有一桶有毒,小白鼠饮入有毒酒后七天发作,要在七天之后找出这桶酒,请问最少需要多少小白鼠。第二题:甲乙射箭,每人射中靶子的概率都是0.5,请问甲射出101箭,乙射出100箭,甲比乙射中多的概率。第三题:leetcode 面试题17.24 最大子矩阵)。
自我评价+吐槽:a. 约定面试时间之后十分钟面试官还没上线,我主动给hr打电话,hr说“面试官忘了,我现在去叫他“,这也太离谱了,哪怕是kpi,好歹也上心点儿啊。合着我不打电话,就不面试了呗。b. 不愧是KPI面,面试过程中这几个题很偏,也是纯技巧题,之前没做过原题的话就基本不可能做出来。第一题是二进制,那个900和7完全没用(513-1024之间,最后结果都是10,因为2^10=1024)。第二题可以通过列式子化简,直接得到结果,根本不用任何计算。第三题是个hard,也是hard里代码量很大的题了。这几个题虽然很偏,但是还是可以了解一下增加知识的。而且这面试官也不错,可以和他正常交流沟通,不像字节秋招二面那个(不理你+捣乱+喷人)。
6. 华为(offer)
笔试:通过,2.4/3
流程:三道代码题:第一题,具体忘了,反正题干很长,思路简单,但是很多限制条件,代码量不小。第二题,有一系列商品,满减优惠,选出达到满减优惠标准的最少金额。(0-1背包)。第三题,最大子序和的变形,难点在于联想到最大子序和。
总结+自我评价:这里单独说一下华为的笔试,因为华为笔试的代码题风格和其他公司完全不一样:其他公司是难,只要有思路之后就基本能全部ac。华为是复杂,但是核心思路不难。主要体现在两方面:
一面:通过
时间:60分钟
流程:自我介绍,项目展开,做题(时限30分钟。一道代码题,思路简单,但是功能复杂,代码量不小)
自我评价:发挥没啥问题,所有问题都回答上来了。
二面:通过
时间:60分钟
流程:自我介绍,项目展开(问的很少,而且问法不太专业),简单问了下学校情况,做题(时限30分钟。一道代码题,有上亿个11位电话号码,请输出重复的电话号码,把去重之后的号码降序输出),根据题目展开,问了问数据结构与算法。
自我评价+吐槽:除了代码题,其他也是完美发挥,都回答上来了。
1. 代码题是个争议点,我写了个暴力解,第一问的空间时间复杂度都是O(n),第二问直接在第一问基础上去重+快排。面试官让我空间优化到O(1),我想了想貌似不行。类似的题有leetcode26,136,137,260,287,442,448,分别根据各自题目条件可以用位运算,就地排序,多指针来优化。可是对于这个题的条件来说,都是不满足的,不能用这些方法来做。我最后反问面试官,我的暴力解该怎么优化,面试官很欠考虑的说了上述几个方法,但是很明显在这个题的条件下不适用,我尝试和面试官讲道理(给他说这几个方法各自应该怎么用(表示我会这些方法),但是都有各自的使用条件,在这个题不适用),但是他根本不听。所以我认为应该是他出这个题的时候,因为是自己现场出的,已知条件漏了。
2. 数据结构和算法。因为我说我是自学的,他就默认我一定学的不好(实际我学的挺好的),包括上面代码题的讨论环节,他根本没有认真听我阐述。他又问了我几个常见的数据结构(二叉树,二叉搜索树,红黑树,b树,b+树等等),我都回答的不错,但是感觉他还是抱有成见。
三面(业务主管面):通过
时间:60分钟
流程:自我介绍,领导介绍部门架构和业务,HR面问题(优缺点,工资,工作地,offer情况,学校情况)。
自我评价:这面其实没啥技术问题,而且基本都是boss在介绍,没我啥说话的份儿。这boss是个大boss(云服务下面一个三级部门的头,手下1000+人),很喜欢我,我对这个面试官也很钦佩,感觉温文尔雅,虽然有气场但是也和亲民。本来想投诉二面的代码题的,因为面试进程很愉快,并且这种部门大领导应该不在意这些细节,所以我也没再提那个代码题。谈待遇的环节,更是直说“我是华为为数不多的金牌面试官之一,权限很高,你尽管提要求,我尽量满足”,我说的25k-30k,说低了。最后定薪就按照这个下限给的。
7. 字节(两次机会)
春招正式批两个志愿:简历挂
吐槽:我寻思着我秋招简历都过了,不至于直接给我挂简历吧,至少给个笔试的机会吧,而且不至于两个志愿同时挂吧。结果联系了半天,终于知道了原因,也了解了字节校招的混乱:
春招正式批一面:通过
时长:60分钟
挂简历之后,我又联系了其他部门的hr,说明了情况,终于顺利拿到了面试机会。
流程:自我介绍,项目展开+基础知识(这里面牵扯到一些项目相关的基础知识,比如说大尺寸卷积核为什么能替换成小尺寸卷积核的堆叠(有效感知野尺寸相同),优点是什么(参数量更少,更多的非线性,等等)。soft-nms的具体实现,和传统nms相比的优点。一些CNN的创新点和具体实现,比如说mobilenet v1,v2的实现、优缺点,卷积层参数量运算量的计算等等),做题(nms的python实现)
自我评价:完美发挥,所有问题的逻辑清晰的回答上来了,代码题也很快的写完了。
春招正式批二面:(挂)
时长:60分钟
流程:自我介绍,基础知识(完全是推公式和写表达式,写常见的损失函数(MSE,CE,L1 loss, focal loss, smooth L1 loss), 推导LR的权重更新),做题(两道题:第一题,礼物的最大价值(找到一个矩阵从左上角到右下角的最大/小和,简单的dp)。第二题,全排列)。
自我评价:完美发挥,表达式都写出来了,同时解释了每个物理量的含义和各自的使用场景,权重更新也推出来了,最后两道代码题也秒ac。
吐槽:本来感觉我稳过,甚至都能sp起步了,结果通知我挂了,挂的原因是我有低头看笔记本的动作。我直接爆炸,原因如下:
一面:通过
时长:70分钟
流程:自我介绍,项目展开+基础知识,python基础(生成器/迭代器原理、作用、区别,生成器定义方式等。可变/不可变对象,联系深拷贝浅拷贝。Is和==的区别),做题(实现nms)。
自我评价:项目展开+基础知识这个板块有两处答得不好:一是有个团队项目我是负责人,面试官问了很多项目管理、分工相关的,之前没怎么准备这块儿。二是问了我个增加模型可解释性的底层原理很多技术细节(我做项目有用,简历也有写),不过这个方向总体比较小众,之前面试也没从来没被问的这么细,所以对很多细节准备不足(面试结束之后又详细看了下论文,确实收获不少)。除了这两点,其他地方基本都完美发挥。整体来说,这次面试表现一般。
二面:通过
时长:100分钟
流程:自我介绍,项目展开+基础知识,做题(两道。第一题,旋转数组找最大值。第二题,leetcode887 鸡蛋坠落,我做过的所有hard里思路最难的),HR面常规问题(优缺点, offer情况,学校情况等)。
自我评价+面试官评价+吐槽:这次是完美发挥,所有问题都逻辑清晰的回答上来了,包括最后一道hard的代码题(这个纯属运气好,面试前几天刚看了原题。如果没提前看,我不可能能当场做出来,因为实在太难了)。因为这次面试时间很长,加上自我感觉不错和挺想去美团的,就少见的最后反问环节问了面试官对我本次面试的评价,面试官说对我很满意,基础很扎实,技术挺好的,等着offer审批吧。
我就等啊等,等了一个月等到的是感谢信,我直接心态爆炸了。又去问二面面试官,想问下挂的理由和面试反馈,因为在面试过程中我自己感觉确实不错,也回答上来所有问题,面试官也对我进行了肯定。以下是面试官回复原文:“你好,非常感谢你对美团认可,也感谢能够抽出时间来参加本次美团校招面试。在面试过程中我和一面面试官都一致认为你的表现可圈可点。关于面试情况的建议,我个人认为我们都(包括我自己)可以在技术方面的持续提升。流程上,我们校招相关工作还在持续进行中,整体处理上需要一定时间,再次感谢你的积极主动,同时,也期待将来有机会能够再合作。”。
这里解释下,虽然很官方,但是肯定不是统一复制粘贴的,因为我向他询问的时候是按照面试反馈和审批流程为啥这么慢(为啥一个月后才挂我)这两点来问的,他回答也是按照这两点来回答的。然后我追问我因为什么原因被挂了,没有收到offer,这老哥就不回我了……哭!
一面:通过
时长:60分钟
流程:自我介绍,非算法岗必备的基础知识(计算机网络和操作系统),项目展开,基础知识(LR的预测函数,损失函数等)
自我评价+吐槽:自己发挥还行(除了计网和操作系统真没复习,其他都没啥问题),但是感觉像是kpi,没想到能过。像是kpi表现在两点:一是面试官很多问题在强行抬杠,后面会解释。二是竟然没代码题。
强行抬杠最有代表性的一点是:让我向一个不懂CNN的人介绍CNN。我按照以下顺序来介绍:名字的全程和来历(什么是卷积,怎么做卷积的),然后CNN的常见组件(卷积层,全连接层,池化层,等等)等等。介绍过程中被打断,说我介绍的太详细太细节了,一个不懂CNN的人听不懂也不感兴趣。那我又说那就只介绍名字的全程和来历(什么是卷积,怎么做卷积的(加权求和)),他接着问,那对方不知道加权求和呢?我到这里就差点笑了,加权求和不是中学生都知道吗。我忍着笑说,假如对方不知道加权求和,那么对方可能对这些技术细节不在意,更在意CNN的实际应用/使用场景,又开始介绍使用场景。结果面试官还是不满意,说我介绍的太笼统了,没技术细节……我直接放弃挣扎了。当时心想着,挂就挂吧,结果当天下午hr联系约二面,我真的惊了。
二面:(挂)
时长:60分钟
流程:自我介绍,对ai整体的看法(怎么看待计算机视觉领域前几年都在做gan,这几年都在做模型压缩这个趋势。怎么看待模型压缩现在主要的应用场景大多是计算机视觉。个人的职业规划),项目展开,基础知识(优化器(表达式+优缺点)。决策树的三种构建方式。boosting(xgboost和gbdt各自的原理,之间的区别和联系,优缺点)。Python底层原理(对象池)),做题(一道题,leetcode113/剑指34,都是一道题,二叉树中和为某个值的路径)。
自我评价+吐槽:个人完美发挥,所有问题均逻辑清晰的回答上来,代码题也秒ac。同时面试过程中面试官也多次对我肯定,表示我技术过硬,基础扎实。结果一天后hr通知我二面挂了?我直接爆炸,问hr面试反馈和失利原因,hr说他没收到反馈,帮我问一下,第二天给我说。第二天(周五),hr一直没消息,我主动联系hr,没有反复。下周一继续问,还是没有回复,这也太不礼貌太离谱了,好歹找个借口糊弄一下啊,或者最开始就说查不到面试反馈。这答应了又不了了之,属实爆炸。而且kpi的话,一面就挂我啊,一面属实像kpi,而且我确实回答的不好。我这二面无敌发挥,面试官也那么认可,完全没有挂我的理由。不过我对这面试官印象很好,挺帅的,谈吐也很棒,技术不论是细节和整体,都令我很佩服。
一面:(通过)
时长:60分钟
流程:自我介绍,项目展开+基础知识(focal loss的表达式,解决了什么问题。分别介绍fast rcnn和faster rcnn。模型压缩中剪枝、量化、权重共享这三种各自的原理、区别和联系、优缺点。增加模型可视化中LIME这种方法的原理),做题(代码实现随机抽样)。
自我评价:总体中规中矩,具体来说前半段莫名紧张,表述很不流利,感觉口吃比较严重。中后段开始就进入状态了,从介绍rcnn系列开始就不怎么紧张了,逻辑清晰的完美发挥。最后代码题做的不好,我只用了python自带的random来随机,据面试官介绍这个只是个最基础最简单粗暴的,面试最后向他请教了下该怎么做,回答是shuffle算法,又给我大致介绍了下原理。感觉这面试官真的很懂技术(表现在LIME那个论文他竟然也看过也有比较深入的理解。还有其他问题的考察方式,一听就是懂行的。),态度也很好。最后他直接说,“你基础挺扎实的,我对你挺满意的,我直接给你过了”,这也是唯一一次在面试结束之前明确告诉我面试通过的面试。
二面:反复横跳后取消,然后流程终止
吐槽:一面之后大概一周才收到二面邮件。然后第二天又收到邮件说,“因故本次面试取消,如有其他面试安排,会再和您联系。如果您有其他疑问请联系某某hr,电话:xxx,邮箱:xxx”。我给这个联系方式发了邮件,发了短信,打了电话,均无回应。我最开始以为是二面面试官临时有事,改时间了。结果第三天去官网一看,我流程终止了……KPI就KPI吧,直接挂我或者不了了之就完事儿了,偏要搞这一出左右横跳,又装模做样给个联系不上的联系方式。
11. 腾讯(一面过,二面取消)
一面:通过
时长:40分钟
流程:自我介绍,项目展开+基础知识(正则化,完整介绍ResNet那篇论文,常见评价指标,优化器等等)。
自我评价+吐槽:没有代码题。完美发挥,所有问题都逻辑清晰的回答上来了。主要的槽点在于,面试结束之前,面试官说对我很满意,开始问我最早啥时候可以入职实习。我一听就惊了,因为我投的是应届生岗位,而且我确认了那个面试邀约邮件上写的也是应届生正式岗,而且校招官网上也显是我所在的招聘流程是应届生,而不是实习生。并且我的毕业时间只符合应届生要求,不符合实习生毕业时间要求。我把这个情况给面试官反应,他的回答是“啊?真的吗?那我结束之后再去确认一下”,然后过了几天我就流程结束了。
有个小槽点是面试官看来没有亲自看过resnet那篇论文(《Deep Residual Learning for Image Recognition》)。在resnet那篇论文里,resnet通过residual block的shortcut connection解决的是(设计初衷)解决深层网络难还原identity mapping导致的模型退化问题,缓解梯度消失/爆炸只是连带作用(在resnet的后续研究的论文(《Identity Mappings in Deep Residual Networks》)里论证的)。而且resnet那篇论文里已经用bn层和实时监测梯度情况保证没有梯度消失爆炸的出现(同时也正因为这样,确认了梯度消失和爆炸不是导致模型退化的原因,才想到了恒等映射)。但是这面试官认为residual block的shortcut connection的设计初衷是为了解决梯度消失和爆炸。这说明他对模型退化和resnet的设计历程很不熟悉,同时这也是国内网上很多没有亲自看过论文的人的观点。不过整体面试流程和面试官态度都是挺棒的。
12. 阿里(面试全部通过,口头offer)
一面:(通过)
时长:35分钟(电话面)
流程:自我介绍,项目展开+基础知识,穿插着问了问个人情况。
自我评价:没代码题。整体发挥中等偏下,尤其是前半段,贼紧张,疯狂口吃,原因如下:一是第一次电话面,本来就对电话有点莫名恐惧。二是开始就说时间只有30多分钟,只有两分钟自我介绍。我没准备过短版本的自我介绍(我正常自我介绍是大概10-12分钟的),不知道该介绍哪些,就更紧张了。不过面试官很耐心在引导我平复下来。然后进入问答环节之后就好了不少,毕竟心里有底。
二面:(通过)
时长:45分钟(电话面)
流程:自我介绍,项目展开+基础知识(介绍mobilenet v1和v2,densenet,目标检测的一阶二阶啥意思,等等)。
自我评价+小吐槽:还是没代码题。完美发挥,每个问题都逻辑清晰的回答了,也不紧张(因为准备了下短版本的自我介绍,而且也不是第一次电话面了,大概流程了解了)。不过感觉这面试官水平有限,问的问题有点业余,我讲了半天他才懂,也没有很深入。
三面:(通过)
时长:55分钟(在线做题+电话面)
流程:做题(35分钟。题目是:给定数据集,当场实现任何一种分类器均可,但是要可以训练,预测,评估。不能调库),讲解自己的代码(5分钟),题目展开的基础知识(评价指标,为什么要归一化,不需要归一化的模型有哪些,为什么要样本均衡,怎么实现样本均衡等等)。
自我评价+面试官评价:这次补上了前两面没问的代码题,直接整个面试都是代码题为主。自我感觉发挥挺棒的,不算完美。对于“不需要归一化的模型有哪些”这个问题不太熟练,最后说了决策树和用决策树的集成学习(bagging的随机森林,boosting的gbdt,adaboost,xgboost等等),面试官问还有哪些,我就真不知道了。其他问题和代码题都回答的挺好的。面试官说代码风格很好(其实我就是逻辑清晰,定义了个class,然后各种功能都封装到class里的function里,又简单写了下输入输出格式的备注),基础知识扎实。
四面(HR/leader面):通过
时长:20分钟
流程:自我介绍,HR面常规问题(优缺点,工资,工作地,offer情况,学校情况等),又随便聊了聊,比如说部门情况之类的。
一面:挂
时长:60分钟
流程:自我介绍,项目展开+基础知识,做题(20+分钟。一道题,不是leetcode上的题,是个自己出的题,题目具体忘了,大概是给一个数组,按某个指定顺序排序)。
自我评价+小吐槽:除了代码题写的不算好,写的比较慢,而且很多边界情况考虑不周,其他问题都逻辑清晰的回答了。那个代码题,和面试官先交流了半天思路,因为leetcode上有一些类似的,用的方法有像dp,单调栈,多指针之类的,结果面试官一再提醒我说没那么难,就是最基本的思路。那我就开始写暴力解,思路很简单,但是很复杂,要考虑的边界情况很多。最后也没有写的很好。不过这面试官挺耐心的,也和我不断交流和积极引导。小吐槽:做代码题的时候,聊到了topK的解法,面试官竟然不知道时间复杂度O(n)的这种做法(快排的引申),他只会标准的快排。而且他最开始认为不可能优化到O(n),我给他讲了一会儿,他才懂。
挂的原因:标准KPI,因为当时给我约了面试时间之后,一直不给我发面试邀约邮件,我催了好几遍才发,然后面试邀约邮件不是那种官方的模板,而是zoom自带的,只有个面试时间和面试链接。面试前后在官网上都查不到面试记录,都显示还处于简历筛选的流程中。不过这个虽然是KPI,面试进程还是比较愉快,不像字节秋招二面那老哥直接人身攻击了。
14. 爱奇艺:offer
一面:通过
时长:60分钟
流程:自我介绍,项目展开+基础知识,做题(两道题。第一题忘了,不是hard,秒ac。第二题leetcode 329,二维的最长递增序列,hard)。
自我评价:除了最后一个代码题确实不会,其他完美发挥,都逻辑清晰的回答了。最后一个代码题,我只会一维的最长递增序列,给面试官讲了下思路(dp(时间复杂度O(n^2))和二分查找+单调栈(时间复杂度O(nlogn)))。二维这个按照一维的思路想了想,但是还是没ac。这个面试官特别好的现场手写了个答案,问我能不能看懂,然后交流了下思路,和这个代码的优化。补充一下,这面试官给我印象挺深刻的:男生,挺年轻的,长发飘飘,谈吐也逻辑清晰,技术扎实,也很温柔,像个文艺工作者。
二面:通过
时长:60分钟
流程:自我介绍,项目展开+基础知识,基础知识(FM那篇论文:表达式,优点在哪儿,和SVM的对比,和MF,SVD的对比等等。Wide&deep那篇论文:wide侧表达式和作用,deep侧表达式和作用,使用的优化器。介绍你认识的优化器,介绍你知道的正则化的方式,L1正则和L2正则各自的优点),做题(具体忘了,反正没有hard,当时也都秒ac了)。
自我评价:基本完美发挥,除了wide&deep用的优化器这个问题回答的不好,其他所有问题均逻辑清晰的回答上来了。Wide&deep用的优化器用的优化器是FTRL,我当时忘了。因为这个论文看的比较久了,只记住了最核心的那些(wide侧表达式和作用,deep侧表达式和作用),这个比较细节的点真的忘了。不过面试官很好,从这个问题引申到我对常见优化器的了解,包括正则化的了解,因为这个FTRL其实就是要便于产生稀疏解,方法类似于L1正则。
三面(HR面):通过
时长:20分钟
流程:自我介绍,HR面常规问题(优缺点,工资,工作地,offer情况,学校情况等)。
小吐槽下:前一天给我约后一天上午到现场面试,离谱。一是hr面不像技术面那么重要,而且就十几二十分钟,我个人角度有点理解不了有啥必要线下面试。二是我家不在本地,提前一天才说线下面试,这不太合理吧。不过hr看我立场坚定,就改成了线上面试。
吐槽下申请流程和提前批的审批流程:
申请流程:携程在正式批之前有个提前批/内推批,简历经过人工筛选之后有可能能免笔试,然后提前开始面试。首先说一下这个提前批/内推批资格的获取,提前批是需要满足一定条件(学校排名,雅思成绩等等)才能获取,不需要内推,说是满足条件之后一定能免笔试。内推批是只要有内推码都行,不过还要人工复核。这俩渠道的申请流程和或者面笔试的描述很不清晰,比如说提前批的满足条件的证明材料根本没有专门上传的地方,也没有说格式要求。然后也没有说这俩渠道是只能选一个报名还是两个都可以报名。我问了HR,HR说这个无所谓,只要有内推码就行,证明资料任意格式在附件那里上传就行了。我就感觉这也太草率了吧。
提前批的审批流程:我是提前批开始第一天就申请了,但是一直没动静。1. 甚至正式批都开始第一次笔试了,我也没收到笔试邀请,就离谱。第一次笔试结束之后几天,给我约一面,到头来还是没做笔试,但是这时间也太慢了。2. 内推群有个老哥,比我申请的晚,和我申请的一个岗位,还是个非985/211的非全日制的硕士,竟然都在正式批开始之前拿到了免笔试的资格(投完简历之后两个小时就收到了面试通知),在正式批开始前就开始面试了,挺离谱的。
一面:(通过)
时长:60分钟
流程:自我介绍,项目展开+基础知识(记不住了,不好意思),做题(也忘了,反正不难,也是秒杀了)。
自我评价:完美发挥,逻辑清晰的回答了所有问题,代码题也都秒杀了。
二面:通过
时长:60分钟
流程:自我介绍,项目展开+基础知识(DenseNet和ResNet的各自架构和二者间的联系),基础知识(评价指标:AUC的计算,和accuracy相比解决了哪些问题。TPR,FPR,precision的定义),做题(两道题。第一题,python实现auc。第二题,numpy的基础操作,把输入数据的对应列做一些运算,然后输出)。
自我评价:完美发挥,逻辑清晰的回答了所有问题,代码题也都秒杀了。
三面(HR面):通过
时长:15分钟
流程:自我介绍,HR面常规问题(优缺点,工资,工作地,offer情况,学校情况等)。
小吐槽下:二面过了之后,卡了两三周才约HR面,我一度以为我又要被kpi了。
笔试:通过
流程:选择,代码,简答
吐槽:oppo笔试是我见过的最奇葩最离谱最没诚意的笔试,具体表现在:代码题和简答题真是纯手写和画图,没有任何ide的,在文本框自行编辑。比如说代码题,特别简单,但是没有在线ide,而且说是可以跳出去用自己的ide,我刚跳出用自己的ide,结果被跳出警告了。而且代码题只有文字描述,没有实例,没有输入输出规范(输入格式、输入的边界情况、变量名、输出格式等都没有),这又在文本框编辑,也没有让考生注明自己用的语言,这真的可以判卷吗?真要判卷的话,改卷的人还得所有语言都懂,先花时间搞清楚代码语言。再就是内容部分,因为没有统一的输入输出规范,真的能判卷吗?
一面:(通过)
时长:60分钟
流程:自我介绍,项目展开+基础知识(卷积层需要的参数量和运算量的推导),做题(一道。标准的快排)。
自我评价:完美发挥,逻辑清晰的回答所有问题。这面试官小哥哥声音也很好听,人也很nice,技术也过硬。
二面:通过
时长:60分钟
流程:自我介绍,项目展开+基础知识,做题(一道。题目记不清了,反正挺简单的,貌似是个简单的dp)。
自我评价:完美发挥,逻辑清晰的回答所有问题。不过这面试官老哥,感觉技术不太行,很多地方我讲的时候他表情一脸懵,问题之间也没啥内在逻辑,也不够深入。
三面(HR面):(挂)
时长:25分钟
流程:自我介绍,介绍项目,HR面常规问题(优缺点,工资,工作地,offer情况,学校情况等)。
总结+吐槽:挂的原因应该是我说的offer情况和工资情况吓住他了,我要35-40w,oppo给不到这个价,就给我挂了。而且他感觉有点看不起英硕的感觉,感觉英硕都水,国内985都厉害。说实话,我的观点是到了对于硕士来说,不论国内国外,个人的差距远大于学校的差距。而且我也是个G5,学校名气也还行吧,当初也能保研985。反正oppo给我整体感觉都不太好,不太想去,挂就挂吧。
经验体会
算法岗就业情况:真的“灰飞烟灭”吗?
从前几年开始,每年校招算法岗都会有一个劝退的新名词出来,“神仙打架” -> “诸神黄昏” -> “灰飞烟灭”,无限传播焦虑。我当时刚开始准备校招的时候看到这些名词和各种劝退,也是非常焦虑+有些不坚定。但是在亲身经历之后,根本不是这样,不用过于焦虑。
1. 2021届校招算法岗真的很难吗?
不是的!好好把基础搞扎实,把该会的学会,真的就可以成为offer收割机,基本不存在能不能拿offer,而是offer的待遇问题了。
2. 2021届校招算法岗比之前难吗?
是的。从我了解到的情况来看,前几年真的不难,甚至太简单了。有不少人根本没有把应该掌握的掌握扎实就能拿到各种大厂offer,这两年只是慢慢回归正常难度而已。然后很多人还想像之前那样基础不扎实、水水就能过,结果发现碰壁了,就开始散播焦虑。
从我亲身经历和了解到的情况来看:
学习方式不同 + 岗位需求量不同 = 面试难度不同
学习方式不同:算法岗,只靠看书看视频看网课是远远不够的,需要大量的阅读论文。尤其是深度学习中模型的部分,不论是cv,nlp还是推荐,都主要靠阅读论文,现成的教材和视频很少,中文的教材和视频更少。但是像传统机器学习和深度学习的基础知识部分(激活函数,优化器等等),确实有一些很好的书籍和网课。并且学习路线也基本都是因人而异,因方向而异,要靠自己来筛选梳理自己需要学习的知识。所以说,算法岗学习过程中的难点,不仅仅在于知识本身的难度,还在于自己去筛选梳理学习资料的能力。
开发岗,不论是前端后端还是客户端,学习路线和各种学习资料(书籍、网课),上网一搜一大把,选定一个,然后就跟着别人制定好的路线按部就班跟着学就行了。所以说,开发岗学习过程中的难点,主要在于知识本身的难度。
岗位需求量不同:开发岗的需求量远大于算法岗。尤其是开发岗中的前端、测开、客户端等,这两年是常年招不满,甚至允许零基础转岗(对于这点,除了岗位需求量大的原因外,也有申请人数相对较少的原因)。
面试难度不同:综合以上两点,导致了算法岗和开发岗的面试难度不同。但是不论是哪个岗位,只要自己缕清自己需要学习的,按部就班的静下心去学,都没问题的。
学校认可度vs个人能力
基本只要是985/211的科班或相关专业,都能过简历关,往后就靠个人能力了。只要跨过简历关,学校认可度这种虚无缥缈的东西,不会给之后的面试流程带来什么实质性的影响。所以没必要妄自菲薄或者掉以轻心,好好把知识学扎实才是最重要的。
我遇到过清北复交/藤校/G5的在校招时因为基础不扎实而屡屡受挫,我也遇到过普通985/211/海外硕士,因为自己基础扎实而收割各种大厂offer。所以相比其他岗位,互联网行业的技术岗是一个最不看背景最看个人能力的岗位了,付出和努力基本都会被兑现,偷懒和懈怠基本都会被惩罚。
顺序:我个人建议是先剑指offer的那75道,然后hot100,最后再查缺补漏(查缺补漏的方式可以有同类型的,每日一题,按照题号顺序或者根据面试中被问到的)。
数量:按我这个顺序的话,200+比较稳,300+基本没问题。
作用:我认为刷题对于校招的帮助主要是面试,其次笔试。原因如下:笔试代码题:1. 重要性不够。因为笔试对于很多公司来说不是必须的(有的公司压根没笔试,有的公司的笔试成绩只做参考,没实际影响)。只要通过笔试,你的笔试成绩对后面的面试就没啥影响了。2. 个别题难度太高+基本不会有原题。现在有很多笔试题都是终极融合怪(很多medium或者hard题融合在一起)或者竞赛题(比hard还hard),所以这种情况再加上基本不会有原题,刷题可能帮助提升不大。只要把能做的做了,基本都能过笔试了。
反观面试代码题:1. 很重要。会直接影响你的面试结果及面试评级。2. 难度适中+很大概率遇到原题。所以多刷题对面试代码题的解决帮助很大。
对于数据结构与算法基础比较差,想快手上手代码题,完成校招笔试面试的考验的同学的话,其他刷题顺序方式(按题号,按类型,按难度)都有一些相对应的缺点:比如说完全按题号来做题的话,可能做的题目会缺乏代表性,有些题目可能是考察概率很低的过简单/过难/过偏的题。完全按类型来做的话,可能对于做过的类型,你会掌握很深入,但是笔试面试过程中往往不会考察这么深入。那在有限的时间里,你很难覆盖很多题型,所以假如笔试面试遇到没有做过的题型,可能就要gg。完全按难度的话也是同理,有可能做的题代表性不够,不是面试的高频考点。
我这种刷题顺序就很好的解决了上面这些的问题:以剑指offer和hot100为核心(这些都是最高频的代码题考点),能快速提高应试的代码能力。然后再拓展/查缺补漏,可以进一步提高数据结构与算法的能力。大概对应关系是这样的:
实习vs论文/竞赛vs基础知识
那些散播焦虑,散播“灰飞烟灭”的人的一个惯用说辞:假如没有大厂实习+顶会+竞赛前几,就只能当炮灰。其实根本不是这样!除了那几个ailab可能会挂简历,其他都没有问题,关键还是你个人基础知识的掌握。我和一些发了顶会的同学交流过,水平各异。因为这几年注水严重,具体论文要具体分析,不是有篇顶会就代表自己基础扎实有个完备的知识体系,更不代表不用准备校招也能收割offer。
我认为实习、论文、竞赛、项目,这些本身都不关键,关键是给面试官一个提问的切入点,也用事实告诉面试官说自己确实有ai领域相关的学习和实践。所以实习、论文、竞赛、项目,只要任意有几个可以证明能力的就行了。这里要补充一点的是,暑期实习倒是真的总体来说对就业挺有用的,正常情况下转正率很高(不过听说今年这届春招招的暑期实习太多了,转正率可能有所下降)。
早投递vs晚投递
有种说法是“越早投递越好,用面试来学习”,其实并不完全是这样,应该是自己做好准备之后再尽快投递。“早”不是无脑早,“用面试来学习”也不是无脑参加面试。因为现在各个公司都会把每次面试情况录入系统,你之后再次投递时,公司都会参考之前的面试情况。也就是说,多投递刷经验可以,但是尽量别太菜导致你被留下一个差评。或者说你选择一个你铁定不会去的公司来刷经验,这也是可以的。对于自己想去的公司,如果自己还没完全准备好,投递时间不差那一两周,不妨再多准备一两周再投递。假如你已经准备好了,那肯定是越早投递越好的。
秋招vs春招
还有个广为流传的观点是这样:“秋招是应届生的黄金季,岗位多,门槛低。假如秋招没拿到好offer,春招也没戏。因为春招岗位少,竞争大”。这句话也不完全对,要分开来看。对的点:秋招岗位多,春招岗位少。确实很多公司不会开设统一的春招,即使有春招的公司,岗位需求量也比不上秋招。但是春招比秋招难吗?春招比秋招竞争激烈吗?秋招没好offer,春招也没戏吗?
我不这么认为。我认为这两次校园招聘难度基本相同,都是只要好好构建自己的知识体系,基础打扎实就可以了。所谓“春招比秋招竞争激烈”的论据是那些考研党和出国党会加入春招,导致竞争者增多。数量多是多了,质量又如何呢?这些人的准备校招时间肯定远比一个从秋招就开始准备的同学差很多。而且算法岗基本都是硕士生,硕士生会轻易被一个考研失败的本科生给挤下去吗?假如你是本科生,同样都是本科生,你的准备时间比他们长那么多,而且他们没考研成功,说明他们也不比你强很多。别怕别焦虑,好好把自己的知识学好就没有任何问题的!
写在最后:面试真的有运气成分!如果你像我一样,准备充分并且回答上来所有问题还是失败了,别灰心!继续努力!广撒网!要坚信你的付出一定会得到回报!退一万步说,即使整个校招都不成功,也别灰心!校招只是个起点,之后的工作中只要努力,你一样还有无数机会去兑现你的付出!
实习内推
OPPO数据智能隐私计算团队|百度ACG智慧城市事业部|阿里巴巴达摩院决策智能实验室|元象唯思认知智能组|京东搜索检索团队|远鉴科技|腾讯天衍实验室|华为诺亚方舟实验室|上海人工智能实验室|澜舟科技|百度智能生活事业群组|中科院自动化所|浙江大学杭州国际科创中心|中国三星研究院|深透医疗|旷视研究院3D组|OpenMMLab|PayPal|百度视觉技术团队|360人工智能研究院|聆心智能|美团骑行算法团队|深圳瑞德林生物
清华大学李涓子教授课题组|日内瓦大学|香港大学|哥本哈根大学|代尔夫特理工大学|香港中文大学(深圳)|慕尼黑工业大学|香港中文大学(深圳)吴保元教授课题组|香港大学计算系NLP实验室|南洋理工大学|阿尔伯塔大学|北京大学智能计算与感知实验室|普林斯顿大学|麦吉尔大学智能自动化实验室|香港中文大学LaVi实验室|悉尼科技大学|北京大学段凌宇教授课题组|英属哥伦比亚大学|慕尼黑工业大学|宾州州立大学|香港科技大学|香港中文大学AIoT实验室|北京大学崔斌教授组|香港大学赵恒爽助理教授|澳门大学吴晓伟助理教授|香港大学韩锴课题组|悉尼科技大学|清华大学NLP实验室|北京大学智慧城市与大数据小组|北京大学林亦波老师课题组|阿姆斯特丹大学|苏黎世联邦理工学院|瑞典皇家理工学院|UIUC社会感知实验室|香港科技大学(广州)|上海财经大学语言智能实验室|普渡大学郭齐教授组|京都大学Ko Nishino教授组|香港理工大学石杰明老师组|澳门大学汪澎洋助理教授|澳门科技大学|香港中文大学(深圳)|佐治亚理工学院|达特茅斯学院|澳门科技大学何继光老师组|新加坡国立大学WING实验室|北京大学王选所VDIG组|纽约州立大学布法罗分校|亚利桑那州立大学|香港科技大学(广州)|哈尔滨工业大学(深圳)|杜克大学徐攀助理教授|美国埃默里大学|UIUC张令明老师组|加州大学Merced分校|清华大学NLP实验室|北京大学知识计算实验室|宾州州立大学 (PSU) |香港科技大学(广州)|西交利物浦大学|上海交通大学|香港中文大学(深圳)|香港中文大学王思博助理教授|华中科技大学
AI 求职是「PaperWeekly」旗下聚焦人工智能领域的招聘平台,涵盖高校硕博招生、博士后招募、企业校招、社招、实习和内推等。