一个“普通人”的秋招算法岗上岸心得
一直想写点东西总结一下自己的秋招历程,觉得在一定程度上应该能代表很多"普通人"的秋招经历。但是由于各种原因(主要是自己懒),从去年11月秋招大致结束,一直拖到现在都没有写。最近在好友的鼓励下,终于下定决心,克服懒散,提笔记录下这段艰难但也颇有意义的经历,希望能给师弟师妹们一些信心,同时少走一些弯路。另外题目中写"普通人"是因为自觉在各方面都不出彩,加引号是为了免去一些闲话,如果你看完全文还是觉得我有冒犯,那我在这里先道个歉。
先介绍下自己的背景:西北某211本硕,方向为计算机视觉(CV),没有论文,没有实习,做过几个实验室和学校的项目,一个天池比赛前20。最终拿到四个offer,美团、字节、小米、旷视,均为SP。我相信一定有很多像我这样普普通通的人,感觉自己各方面都比较一般,没有比较好的论文、项目,比赛名次也不是特别高,编程也没那么牛,一边看着网上的各种算法岗劝退言论,一边心慌慌地纠结要不要继续找算法岗。我写这篇帖子的目的就是希望能给大家一些信心,如果你觉得自己做过一些相关的项目、比赛,有一定的基础,肯花时间好好准备找工作的相关事宜,那我建议你可以下决心了。
一:秋招总结
1:心态:
秋招对大部分人来说都是一段非常难熬的经历,本身自己就已经是顶着很大的压力在求职,还要面对很多外界因素带来的影响,时常会给自己的心态带来非常大的波动。本来我在这一部分写了很大一段回忆自己遇到的一些搞心态的事情,但仔细想了想还是删了,以后有机会单独写一帖吐槽求职路上的奇葩经历,这里就写一些可能会影响到自己心态的方方面面,大家可以注意一下。
1)面试被拒:这应该是最常见的压力来源了,而且随着被拒的次数越来越多,压力也会成倍增加,对个人心态考验非常大。对我们这样的普通人来说,前期面试被拒再正常不过了,这时候一方面是要总结好失败的经验,另一方面也要寻找合理的宣泄途径,跟好朋友吐槽、打两把游戏等都是很有效的方法。
2)周边环境:我们一般都是和同届同学一起找工作,有些同学比较优秀,很快就拿到offer,这时候也有可能会对我们的心态有些影响。不过这是没有必要的,你直接去跟他取经就好了,能拿到offer大概率是有可取之处的,我当时就跟一个同学学到了很多东西。当然也不排除有些人拿到offer后在朋友圈装逼、散布焦虑情绪,这种我建议屏蔽或拉黑,同时也希望大家拿到offer后能低调一些,以己度人。
3)网络言论:每年在网上都会出现一个词来形容每年的算法岗状态,19年是"诸神黄昏",20年是"灰飞烟灭",不知道今年会是什么。但无论怎么说,都改变不了大部分人最终拿到offer的事实。这种问题其实挺唬人的,四月起这么个问题,大家都刚开始找工作没啥经验,碰壁了就去吐槽,造成一种算法岗无望的景象。但如果你十一月问这么个问题,很多回答应该就成了如何通过不断投简历、面试最终上岸某家公司,其实我身边的同学、朋友大部分也都是9月之后拿到了"定稿"的offer,10月、11月的也多的是,所以大家一定要稳住,尽量不要受到这种言论的影响。
其实在秋招中感受到痛苦是一件再正常不过的事情,但我也不敢跟你说:"心态要好,不要在乎那些事情",虽然这是对的,但经历过那种压力和痛苦就会知道完全做到这样几乎是不可能的,就跟世界上没有圣人一样。我给大家的建议就是首先要做好承受这一切的准备,秋招几乎不可能是一帆风顺的;另外当压力到来的时候,一方面要先做好总结,另一方面也要找到合理的宣泄方式,不要让一次的失利影响你太久。恐惧、失落、时常进行的自我怀疑,这都是秋招中的常态。一边痛苦,一边反思,在秋招中这是提高自己最快的方法。
2:刷题:
这是一个老生常谈的话题了,在互联网只要是技术岗,笔试面试都要撕题。我本人是从2020年2月中旬开始准备的,期间一共刷了400道题,总体感觉下来能应对几乎所有的笔试、面试场景了,印象里面试过程中碰到的题目全都撕出来了,笔试大概能通过80%的样子。接下来会说一些自己的小心得。
首先声明,我没有参加过编程比赛,本科学过C,学过基础的数据结构和算法知识,读研之后大部分时间使用python,整个刷题和笔、面试也都是使用python完成,可以说在刷题方面也是一个非常普通的人。
1)如果你像我上面说的一样,对刷题需要的算法(排序、链表、二叉树、图、动态规划等)没有过一个系统的学习,那我强烈推荐你去看左程云(左神)的算法课,个人感觉左神的课在深度和广度上都能覆盖整个秋招的范围。首先,如果你没有很好的算法基础,左神的课能让你对算法建立一个系统的认识,对基础的算法有很好的理解;另外,左神也会做很多扩展性的算法介绍,这些你可能没听过,但是不要紧,至少之后你在LeetCode评论区看到的时候不会一脸懵逼,知道这是个什么东西,大概解决了什么问题,然后再慢慢研究。总之,左神的课非常长也非常良心,希望大家能坚持看完(基础班我记得接近30小时),你一定会大有收获。再次对左神表示respect!
2)有了基础之后,接下来就是刷题。我建议大家先按照类别刷,比如链表相关的做个十几道,有个比较深入的理解,然后再去做二叉树、排序等,这样按照大类做下来之后,你就不会对题目感到陌生和惶恐了,看到题之后知道这大概是个什么事。然后我建议把《剑指offer》刷两遍,剑指非常经典,LeetCode也有剑指专题,很方便。之后就比较随意了,可以先把热题TOP100刷一遍,如果有时间也可以按照顺序再刷个两百道,感兴趣的话去参加周赛也挺好的(我没有参加过)。另外,牛客上也有大佬整理了每个公司出过的题目汇总,这也是不错的选择。对于出现频率非常高的题目,一定要多刷几遍,确保碰到就能秒了。
总之,在刷题这一块我一直有两个看法,一是如果你现在对秋招很迷茫很惶恐,不知道该准备些什么,那你就刷题去吧,至少这肯定是不会错的,另外就是在你有时间的基础上,刷的题目越多越好。根据我对周边同学的了解,最好是能刷到200道以上的题目,这样在面试中底气也会更足。
3:基础知识
基础知识是考验基本功的,包括机器学习和深度学习里面的一些基础的问题。这部分可能会问的比较广,需要系统地学习和整理。
这里推荐两本书:李航老师的《统计学习方法》和周志华老师的《机器学习》(西瓜书)。建议大家可以先深入地读一下《统计学习方法》,李航老师写的非常精炼,也比较"好懂",碰到不懂的可以去看看西瓜书,两本配合食用效果更佳。知乎、博客上也有很多大佬们更通俗的解释,可以加深理解。《深度学习》(花书)也是非常好的一本书,但是太厚了,很难读完。建议当成工具书,碰到问题可以去专门的章节翻阅,可能会有意想不到的收获。在这个过程中最好准备一个笔记本,将公式的推导以及一些算法的流程和重点记录下来,能巩固记忆,查阅起来很方便,面试前也可以拿出来翻一翻。推荐大家用活页本,内容增添起来很方便。
除了看书以外,总结和整理也是至关重要的。有的问题你可能理解了,但是表达出来没那么专业,不够味。因此这部分我建议大家先去网上搜集一下面经,把里面提到过的问题都整理出来,然后自己总结出一个合理的答案,形成文档,以后碰到就这么回答就行了,这也就是网上有些人说的"八股文"。如果面试碰到了没有见过的问题,就把它加入到你的文档中去,确保以后碰到能够对答如流。我在后边也会把我整个秋招过程中碰到的比较常见的问题列出来,供大家参考。
总结一下,基础知识部分主要是学习+整理,当你的面试数量达到一定程度之后,这部分就几乎不是问题了。记住,一定要整理成文档,一定要整理成文档,一定要整理成文档!
4:论文/项目/比赛
这部分主要是个人的一些经历,是体现"个人价值"最重要的部分,也是简历上面试官着重会进行提问的。这部分因人而异差别很大,因此我只说一些小建议。
1)论文:首先强调一点,没有论文也是可以上岸的,没有论文也是可以上岸的,没有论文也是可以上岸的!我身边的同学,以及秋招中认识的朋友,很多也是没有论文的,但最后都能拿到比较满意的offer。不少人在论坛上说"没论文简历都过不了",这绝对是缺乏数据支撑的。简历没过很大程度上是因为简历写的不好,或者部门不匹配。前者需要好好地琢磨一下简历的逻辑、布局,后者的话就找准方向多投就行了,肯定会有捞你的。如果有论文的话要想办法把自己论文的贡献点讲清楚,这部分我没有实践过,就不班门弄斧了。
2)项目:这一部分很多人有这样一种疑问:"我项目做的很弱,就做了这点东西都不好意思讲出来"。其实这是很正常的,永远记住,大部分人都是普通人,岗位很多,不可能只招天才。你做的再一般,那也是完成了一个项目,也有项目背景、创新点、应用场景,也是能在某个场景下解决了某个问题,这其实就够了。只要你真的对项目投入了精力,对其有比较好的理解,一定是有可取之处的,证明你解决问题的能力是很不错的。接下来你需要做的就是如何把项目给面试官讲好,这里我还是建议大家像写演讲稿一样把你要将的东西整理成文档,不要只在大脑里凭空想,一定要写在文档里,先去找同学讲一遍,然后面试的时候发现某个地方讲的不够好,回来再继续改进,慢慢地就能将项目讲好了。记住,一定要自信!
3)比赛:这部分和项目比较类似,面试官比较感兴趣的是你解决问题的思路、采用的方法以及相比其他参赛者的方法的优势。和上述一样,最好是整理成文档,把比赛题目、算法设计思路、具体采用的方法以及最后和其他方法的对比和反思都写一下,面试的时候按照写好的逻辑来讲。比赛这里,优胜参赛者的解决方法也是比较重要的一点,面试中经常会问到,一定要去论坛把前几名的方法都大致看一遍,大致了解一下。
5:简历
简历是给面试官的第一印象,写一份好简历是求职过程中非常重要的开端。在这里也给大家几个小建议,大家写的时候可以注意一下。
1) 模板:简历模板尽量简约一些,不要花里胡哨的那种;
2) 照片:建议大家去比较专业的照相馆拍一组证件照,西服领带搞起来,这样看起来正式一些。
3) 项目介绍:这部分是简历最重要的地方,一定要仔细琢磨,每句话的存在都要有意义,都要体现项目中最"精彩"的部分,切忌废话连篇。另外,每个点的介绍都要胸有成竹,确保面试官问起来的时候能够对答如流,配合第四条中整理的文档食用效果更佳。
二:一些公司的面经
我大概是从五月底开始投简历的,从所记录的面经中挑了些比较有意义的供大家参考。同时我也给出了我对自己面试过程的评价,但不能代表所有人,大家尽量多去讨论区看一看,这个差异还是很大的。
1:美团
一面:
- 1) 自我介绍;
- 2) 项目介绍,上线、落地情况;
- 3) 介绍下LR,思想,LR里的最大似然是怎么回事;
- 4) 代码题:给出一个函数rand1,随机生成0和1,写一个函数randN,均匀生成0-N-1;
- 5) 代码题,计算根号N,精确到小数点后m位,二分法,梯度下降法。
二面:
- 1) 自我介绍
- 2) 计算机网络、操作系统学过没;
- 3) 多进程、多线程讲一下,内存占用方式,为什么线程是共享内存的;
- 4) 讲下项目,传统方法是怎么做的,有啥优点,是怎么部署的,几个人完成的,数据是怎么采集的,规模有多大;
- 5) 讲下比赛,几个人完成的,怎么分工的;
- 6) 有没有碰到过拟合,过拟合的标志是什么,怎么解决;
- 7) L1正则化为什么能缓解过拟合;
- 8) 有没有发论文;
- 9) 包含百万、上亿特征的数据在深度学习中怎么处理;
- 10) 降维方法有哪些,PCA是怎么做的,还知道其他的吗;
- 11) LR和神经网络有什么区别;
- 12) 代码题:字符串中长度为len的连续字串中,出现次数最多的字串;
- 13) 数学题:四个人过河,每次最多两人,有多少种过河方法。四人过河时间分别为1,2,5,10(分钟),问最快需要多久。AB,A回,CD,B回,AB,共17分钟。
三面:
- 1) 自我介绍
- 2) 比赛介绍,比赛的任务,前几名的团队都是怎么做的,你们的亮点在哪里;
- 3) 挑一个项目介绍;
- 4) 目前的offer;
- 5) 职业规划里最看重什么;
- 6) 反问。
HR面:(通过)
- 1) 本科和研究生期间比较骄傲的一件事情,比较遗憾的事情;
- 2) 为什么没有选择深造;
- 3) 最近最有挫败感的事情;
- 4) 对美团的了解;
- 5) 职业规划,工作城市的选择;
- 6) 对自己不满意的地方;
- 7) 反问。
2:字节
提前批一面:
- 1) 自我介绍;
- 2) 问项目,检测里改进了哪些点,GAN是用来干什么的,怎么用的;
- 3) 方向相关的一些知识;
- 4) 其他相关论文里用到的一些方法;
- 5) 撕题:手写nms。
提前批二面:
- 1) 自我介绍;
- 2) 介绍项目,面试官好像是做检测的,主要问了问检测的项目;
- 3) 检测任务有什么衡量指标(mAp),实现原理是什么;
- 4) 分类里用到的交叉熵公式是什么;
- 5) 讲了讲比赛里用到的一些点;
- 6) pytorch里function和module有什么区别;
- 7) pytorch里dataset、dataloader、sampler有什么区别;
- 8) python里的生成器是什么;
- 9) 撕题:LeetCode4:两个有序数组的中位数;
(三面挂了,没有记录。之后又到了三面,又挂了,提前批结束,共六面。)
正式批一面:(挂)
- 1) 自我介绍
- 2) 项目相关;
- 3) 生成对抗网络是怎么用的;
- 4) CRNN的思想,CTC的思想,CTC中有没有训练参数;
- 5) 姿态估计相关项目;
- 6) TCP/UDP的区别,计算机网络,分布式,数据库,多进程和多线程;
- 7) 概率题:在一个圆里随机取n个点,它们在同一个半圆的概率是多少?
正式批一面:(被捞)
- 1) 自我介绍;
- 2) 先写个题,LeetCode33:搜索旋转排序数组;
- 3) 项目介绍;
- 4) 进程和线程的区别;
- 5) 逻辑回归的损失函数是什么,怎么得到的,为什么不能用MSE,sigmoid求导是什么;
- 6) ResNet的设计理念,InceptionNet的设计理念;
- 7) 如何防止过拟合;
- 8) BN层的作用,Dropout的作用。
正式批二面:
- 1) L1和L2哪个能使参数分布趋于稀疏,为什么;
- 2) 特征选择的方式;
- 3) 连续特征离散化的好处;
- 4) 偏差和方差的理解;
- 5) 过拟合和欠拟合;
- 6) BN和LN的区别;
- 7) PCA的处理过程;
- 8) 栈空间和堆空间的区别;
- 9) BP的过程,CNN中前向传播和后向传播的过程;
- 10) 代码题:LeetCode138:复制带随机指针的链表
- 11) 代码题:LeetCode543:二叉树的直径
正式批三面:(通过)
- 1) 自我介绍;
- 2) random7生成random10,调用次数的期望是多少,怎么算的;
- 3) 代码题:LeetCode146.LRU缓存机制,并发式怎么处理,数据量特别大,需要进行分布式存储怎么处理;
- 4) 反问。
3:小米
一面:
- 1) 自我介绍;
- 2) 生成对抗网络在哪里用到的,起什么作用;
- 3) 损失函数是什么;
- 4) 知识蒸馏是怎么做的;
- 5) Focal Loss的计算式;
- 6) 代码题:排序数组中某个值出现的次数。
二面:(通过)
- 1. 自我介绍;
- 2. 讲一下项目中的难点以及是如何解决的;
- 3. 代码题:面试题01.07.旋转矩阵;
- 4. 对工作地点有什么想法;
- 5. 为什么没出去实习;
- 6. 反问。
4:旷视
一面:
- 1) 自我介绍
- 2) 天池比赛项目;
- 3) focal loss的设计,落地情况;
- 4) 相关方向算法介绍;
- 5) crnn相关,gan相关;
- 6) bn层的原理,要解决什么问题,还有什么norm方法;
- 7) dropout原理,bn和dropout能不能一起用;
- 8) 代码:给定一个序列,求其连续子序列和大于某个值的最小长度。
二面:
- 1) 自我介绍;
- 2) 项目介绍;
- 3) 熟悉哪些检测网络,介绍一下思想;
- 4) CTC Loss的动态规划求解过程;
- 5) Softmax公式,溢出怎么处理;
- 6) N个城市之间建一个仓库,使得距离所有城市的距离和最小;K个仓库呢;
- 7) 一个车辆围着圆圈跑,有一分钟每圈和两分钟每圈两种状态,在P点有30%的概率进行状态切换,问无数圈之后在P点等到车的时间的期望;
旷视三面(线下面的,当时忘了记录,只能记住一点点了):
- 1) 相关方向的学习历程;
- 2) 降低网络复杂度但不影响精度的方法;
- 3) 反问;
HR面(同上):
- 1) 意向城市;
- 2) 意向部门;
5:腾讯
一面:(挂)
- 1) 自我介绍
- 2) 项目的应用范围
- 3) BN的原理,要解决的问题,公式,训练测试中的区别
- 4) 卷积层和BN的融合知道吗?
- 5) 如果让模型速度提高一倍,有什么解决方案?
- 6) 代码:数组中第K大的数。Partation的时间复杂度
6:大华
一面:
- 1) 部门介绍
- 2) YOLOV3和YOLOV2的主要区别,loss上哪里不同,smoothL1 loss的好处,Yolo里是向上取整还是向下取整
- 3) mean pooling和max pooling反向传播的不同
- 4) LSTM的反向传播,公式
- 5) Pytorch中bn层在训练和测试中有什么不同,怎么实现的
- 6) 可分离卷积的思想,参数量计算
- 7) Pix2pix和cycleGan的区别
二面:
- 1) 浮点数的二进制存储方式;
- 2) 如何将浮点数的每一位二进制打印出来;
- 3) 方差和协方差的理解;
- 4) 伯努利分布和二项分布的区别;
- 5) FFT和DFT的区别;
- 6) 数字图像处理中,卷积(convolution)和互相关(cross-correlation)的关系;
- 7) Python中类方法和静态方法的区别;
- 8) Linux下查看内存占用(top),buffers和cache的区别;
7:商汤
一面:
- 1) 自我介绍
- 2) 项目介绍,蒸馏方法是怎么用的;
- 3) 对我们的开源项目提意见;
- 4) Focal Loss解释;
- 5) 凸函数的性质;
- 6) 如何评价两个分布的相似度,KL散度怎么计算;
- 7) Auto-Encoder是什么,都用在什么任务上;
- 8) Distribute用过没,优点是啥。
二面:
- 1) 自我介绍;
- 2) 介绍下项目中检测相关的部分;
- 3) 检测里为什么选择refineDet;
- 4) Conv和BN融合后点数掉的太多怎么办;
- 5) Anchor-free的优势在哪里;
- 6) Focal loss在什么情况下有用,什么情况下不起作用;
- 7) 实现sigmoid函数,怎么防止溢出,误差分析。
8:海康
一面:
- 1) 自我介绍;
- 2) 项目介绍,数据集是怎么选择的,图像大小大是多少;
- 3) 比赛介绍;
- 4) 快排思想,最差时间复杂度;
- 5) 反问。
二面:
- 1) 自我介绍;
- 2) 代码题:IOU计算;
- 3) 代码题:LeetCode123.买卖股票的最佳时机 III
- 4) 项目介绍;
- 5) Faster RCNN和SSD的区别;
- 6) Focal Loss的使用场景;
- 7) 反问。
三:基础知识整理
- 1) 如何解决过拟合;
- 2) L1和L2的区别;
- 3) 梯度消失和梯度爆炸的原因;
- 4) 什么是Dropout,训练和测试的区别;
- 5) Batchnorm层的作用及公式;
- 6) 为什么LR要用Sigmoid函数;
- 7) relu6函数的好处;
- 8) smoothL1损失函数的好处;
- 9) Yolo2和3的区别;
- 10)Pytorch中bn层在训练和测试中有什么不同,怎么实现的;
- 11)双线性差值的操作过程;
- 12)bn和dropout同时使用产生的问题;
- 13)BN+CONV融合公式及作用;
- 14)BN的反向传播;
- 15)深度学习中的几种归一化方法及不同(BN、LN、IN、GN)
- 16)LSTM公式及反向传播过程;
- 17)感受野的定义;
- 18)分布式学习;
- 19)SVM的介绍和推导;
- 20)衡量分布之间差异的指标;
- 21)ROC曲线和AUC。
四:数学题整理
- 1) 扔硬币,扔到正反都出现过停止,次数的期望;
- 2) 扑克牌放回取牌,A-K加大小王全部都拿到后停,次数的期望;
- 3) 每个人给A投票的概率是0.51,给B投的概率是0.49,问一亿人投票时A获选的概率;
- 4) 斗地主有人拿到2张王的概率在;
- 5) k个满足独立同分布的均匀随机变量的最小值的期望;
- 6) 一个骰子平均扔多少回才能把六个数字都扔出来至少一次;
- 7) 用一个骰子生成1到7的随机数。
五:其他的一些小tips
- 1) 内推一定要找靠谱的人,不要随便找一个内推码就填上了;
- 2) 投递的时候要先了解下部门的hc,hc的数量在很大程度上决定了你的求职难度,可以多考虑下扩招的部门;
- 3) 综合考量多方面的信息来源,不要根据某一个帖子中的信息做决定,包括本帖;
- 4) 简历一定要多投;
- 5) 进入八、九月份你会非常非常忙碌,最好通过日历记录下每天的笔、面试日程,windows自带的日历就很好用;
- 6) 多加些群,可以得到很多信息,但要注意甄别;
- 7) 自我介绍也写成文档,反问环节也可以提前准备;
- 8) 多刷牛客,多看面经;
- 9) 拿到一个offer之后一定不能停止秋招,一个offer的风险非常大;
- 10) 想到再加。
六:写在最后
算法岗的秋招并不是洪水猛兽,也不是只有少数人才能得到的岗位,只要你有一定的项目基础,有坚定的信心和踏实的努力,并且能坚持到秋招的最后时刻,一定可以拿到满意的offer。道路是曲折的,前途是光明的,师弟师妹们冲鸭!
#面经##校招##小米##美团##字节跳动#