知乎ID:SleepyBag
本文由「海边的拾遗者」公众号编辑首发”
前言
2021届秋招基本结束了,而我有幸在灰飞烟灭的一年里,拿到了几个想要的算法岗意向书,也算没有辜负这两年来的努力。目前拿到 offer 或者意向书的公司有:字节广告系统,快手风控部门,猿辅导 NLP,百度的算法岗,上海农商银行的数据岗。所以在这里大概说一下我的面试经验,供大家参考。下面是正文。
个人情况
华东师范大学硕士
一篇一作AAAI,谢谢我的导师
腾讯公司实习经历,NLP相关工作
leetcode刷题 700+,编程题基本都能秒掉
在这里也欢迎各位从事推荐及NLP的小伙伴加入我们,一起交流学习,一起进步。
如下仅为部分面经,墙裂欢迎各互联网大佬来撩。
下面首先是我想告诉所有人的东西。不管你要投哪家公司,你都必须知道下面这些内容。
首先最最最最最最最重要的一点:一定要早投!一定要早投!一定要早投!
今年秋招似乎开始的比往年都要早很多,七月的时候字节就开始了提前批招聘。那个时候大部分人还没有准备好,而且有的人还在实习,比如说我。因此很多人在那个时候选择了观望。其实本来我也没打算投的,但是突然有字节实习的小伙伴问我要不要内推,我就顺便投了一手。
说实话,面字节的时候,我还在实习,完全没有复习准备任何内容,面试表现我自认为也不是很好。但是我还是很快拿到了意向书。
而后来投算法岗的,有些比我强很多的朋友,不仅被投的岗位拒绝,还被不同的部门反复拉出来鞭尸...实在是让我很庆幸自己投的早,谢谢那个内推我的朋友。
所以希望之后找工作的小伙伴,一定要早点投递,机会属于果断出手的人。不要总想着“我还没有准备好”,因为你永远不可能真的准备好,不如趁着大佬们还没反应过来,赶紧抢一个offer。
简历要写好
我在面试滴滴的时候,被面试官指出了我的简历的几个问题,觉得他说的很好,所以也想在这里提醒一下大家关于写简历的一些重要的事情。其实也就两点:
简历上显眼的东西一定要会。这似乎是个很简单的事情,但是其实很多人没有做好。大部分人喜欢把比较最耀眼的经历放在最显眼的地方。但是最耀眼的不一定是你最擅长的。有的经历可能过去的时候比较久,有的东西可能是队友把你带出来的,等等。这些经历如果被写在最显眼的地方,面试官很可能会一开始就主动问你,而你被问到的时候,如果不能很好地答出来,那就变成了一个单纯的减分项,不如不写。当然,比起不写,更好的选择是你好好准备一下如何讲述你的这段经历,接下来你的每次面试都会受益。
你会的东西一定要写在简历上。我的简历一开始就存在这个问题。我很熟悉传统机器学习模型,但是没有相关的实践经历,所以我没有写在简历上。后来发现,我如果不主动把自己的这方面能力写在简历上,那么面试官在面试的时候可能就不会将话题切入这个方向。把握面试的话题方向在面试过程中是相当重要的。如果你不能用自己的简历引导面试官提问你擅长的方向,那么面试官就只能问一下他熟悉的东西,那你的面试就很困难了。
编程很重要
有些公司,比如字节和百度的提前批是没有笔试的,但是编程题还是非常重要。尤其是有的面试官在面试的时候会直接先出一道编程题。对于这种面试官,如果你一开始编程题做得很顺利,让他对你产生好感,那你后面的面试就会顺利很多。
由于过于久远,编程题的题目我很多已经忘记了,但是我可以告诉大家的是,面试中的编程题范围没有超过剑指 offer 的难度。大家可以在 leetcode 上面找到剑指 offer 的专题,这些题目都理解了,面试也就不难了。这里我也想要说一下,大家刷题的时候,要优先打好基础,基础题目没有扎实的时候,不要浪费时间在太复杂的难题上。就我的面试经验来看,绝大多数公司的面试编程题都是基础题。leetcode 上有些题目会给你介绍一些艰深复杂的算法与数据结构,比如线段树,二分图匹配算法,或者寻找最长回文子串的马拉车算法。这些复杂的题目,在刷题过程中,不是你需要优先考虑的。如果你自认为简单题都理解地很深入了,学有余力,那你可以思考一下这些算法,不然的话不要浪费时间,多刷基础题才是正道。
总结起来,就是以下几点:
先刷剑指 offer
简单题能秒掉之前,不要怼难题
多刷,手感很重要
另外,编程题的解题过程也很重要。尤其是如果你觉得这道题你做不出来的时候,如何尽可能地让面试官觉得你至少思路清晰,是非常重要的。所以建议大家从以下几点注意自己答题过程:
不要闷头做题
不管是面试官写题目给你看,还是直接念给你听,都千万不要直接二话不说,闷头做题。因为:
你有可能理解错题意。如果做了半天发现题目根本没理解对,那你直接凉了,没什么好说的。
你需要让面试官知道你在思考。尤其是在你不会这道题的最优解的时候。
为此你需要做到:
确保自己理解题意。在读题的过程中思考深入一点。多问问题:我这么理解对吗?需要考虑 XXX 情况吗?一来理解题目对你解题很重要,二来可以让面试官觉得你这个人思考周全。
讲述思路。有的时候,你写了半天的方法根本不是面试官想要的方法,有可能你的方法太简单,他看不上;也有可能你的方法太复杂,他的小脑瓜理解不了(这两种情况我在面试过程中都遇到过)。因此,在做题过程中,你每一步都需要先向面试官讲述你的思路:我认为这个问题可以转化成 XXX;这个可以用 XXX 结构解决;这个算法可以这样优化;等等等等。只要是你想到的,都需要先告诉面试官。他理解了,或者他好奇了,你写这些东西才有用。
写测试用例。面试不是刷题,刷题可以反复提交,让系统告诉你你没有通过测试。但是如果你在面试过程中需要面试官反复提示你有些 case 你这个程序过不去,那是很减分的。所以要在一开始先把程序的测试用例写好,在面试官质疑你之前先做测试。当然如果是白板编程,就得看你的造化了。
讲好你的经历
如果你有论文或者实习的话,那么所有的面试都会问你的论文和实习经历。这也是大家重点需要准备的。即使没有论文或者实习,只要是你写在简历的显眼地方的经历,都必须要了如指掌,要准备好。如果面试官问你简历上的东西而你没有回答好,这是非常减分的(你写了的你都不会,你不写的我还用问吗?)。
具体地,如果是论文或者实习,那你必须要明白以下几点:
这段经历表现了我的什么能力?
这篇论文/这段实习工作 解决了什么问题?(如果你讲半天方法论结果面试官根本不知道你到底要干嘛,结果可想而知。)
为什么要解决这个问题?(不要让别人觉得你的工作不重要。)
调研参考了什么方法?(如果是讲论文的话,最好讲一下你主要 follow 的工作以及别人的思路,不然面试官很可能不知道你的论文到底在改进什么。)
如何解决了这个问题?(这部分讲你自己的方法论,如果前面铺垫好了,这部分就是你表现的机会了。)
最后成果如何?(这里可以说一些具体的评价指标。)
然后可以按照这个顺序,把你的工作讲述出来。
如果是自己动手的小项目,可以换个重点,但还是一定要讲好故事:
这个项目是用来干嘛的?
这个项目涉及什么技术栈?
你在项目中担任的角色?(把你说重要一点,虽然我知道大部分人都不重要)
最后的成果如何?
然后下面就是我的具体面试经历了,很多公司的过程我已经忘记了,我尽量回忆一下:
具体面经分享
字节跳动
一面
自我介绍。一面是一个小哥,感觉他的面试很有风格。他搞了个题目列表,挨个问问题,场面很紧张。具体的题目我不太记得清了,我只能尽量回忆一下:
机器学习
交叉熵是什么?式子怎么写?
word2vec是什么?层次化softmax怎么做的?(没有答上来)
Python基础
面向对象概念
设计模式
单例是什么?(没有答上来)
面试过程比较紧凑,如果面试官是这种风格的话,面试的时候可能会比较紧张。不过也要提醒大家,面对这样的面试官,你不需要所有问题都绞尽脑汁地想要答出来,面试官其实也不会期望你能答出来所有问题。如果你都答出来,你就不是程序员,而是搜索引擎了。因此遇到不会的问题,不需要浪费时间。尽快地承认自己不会,然后尽量快地把话题导入进入自己擅长的领域,才是上策。
最后一道编程题:有一些任务,任务之间存在依赖关系,每个任务都需要给定量的时间,要完成其中的某个任务,至少需要多少时间?
做完,结束。
二面
一面结束十几分钟,二面就开始了。
二面是一个小姐姐,这一面我印象里不是很难,我运气比较好,小姐姐一开始给了我一道编程题,我直接秒掉了,后面的题目就没有问很难的。轻松结束。
这里还有个小插曲,本来我不知道二面会紧接着一面(一面面试官虽然说了但是我没有理解),然后正在玩手机的我突然看见一个人进了面试页面,吓了一跳...
三面
三面在二面半周后。
三面是个leader。气场比较强。先问了我的论文,然后主要是问深度学习方面的东西。我也只能尽力回忆一下:
交叉熵是什么?式子怎么写?(没错,一面问过)
卷积网络了解吗?
池化操作是什么?
max-pooling的反向传播怎么做?(这里有个悬案,我回答之后,他说我回答的不对。但是我下来搜索了一下,我说的并没有错。可能是我没有把意思表达正确)
三面过程中的压力还是很大的。感觉自己答得不是很好,而且leader说我并没有把我的论文讲明白。所以以为自己凉掉了。没想到一周后就拿到了意向书。字节的效率还是很高的(字节的流程真的是我面过所有的公司里面最快的)。HR 小姐姐也很温柔,体验真的超级好呜呜呜,感动。
快手
快手我一开始投了数据科学家,然后简历直接被拒掉了...然后我改投NLP岗之后,拿到了意向书,运气还是比较好的。
类似我还投了美团的北斗,也是直接给我简历给拒掉了...但是美团这边我没有好运气,北斗卡了我的简历两个月,一直没法改投。当时因为没有很想去美团,也不是很在意,没有找HR帮我释放简历。没想到美团今年涨薪这么多...真的是造化弄人啊。
快手的流程是比较慢的。一共只有两轮面试,没有 HR 面(模范公司,不知道为什么有些公司要一轮一轮面个没完,最后还要来个 HR 把你刷掉)。一面与二面之间间隔了大概一周,二面与意向书之间相差了大概两周。HR 小姐姐给我打电话的时候,笑着说“你可能已经忘了吧”...没错,我确实已经快忘了。所以说面快手的同学,面完之后如果没有消息,请不要着急,耐心等待。
一面
几乎没有印象了。叫我讲了讲 BERT,其他的已经忘记了。
编程题很简单,二分法求平方根。
我的编程题写得很快,他也没准备其他的题目,所以临时问了一道概率题:
概率题:扔一枚硬币,扔多少次会出现正面?求期望。
这道题比较简单,很容易可以想到答案是2。这道题还有一种扩展,可以问扔多少次会出现两次连续正面,或者三次,四次等等,我的朋友被问到过。大家可以准备一下这个问题。
二面
二面是在一周之后。
二面没有问我编程题。面试官看起来有点老学究的气质。开口果然跟其他的面试官不一样。这个面试官问的问题比较深入,他会针对你的回答不断追问,需要你对问题有比较好的理解。因此我对这次面试的题目记得还是比较清楚的:
LSTM 和 RNN 的区别?为什么能解决梯度消失的问题?
梯度消失问题是如何产生的?
LSTM cell 设计与残差块的区别是什么?残差就能解决梯度消失的问题,为什么 LSTM 不直接设计为简单的残差块?(因为 LSTM 还需要对历史信息进行递减,所以需要加个遗忘门)
交叉熵,KL 散度和 JS 散度的区别?(JS 散度我当时已经忘记是什么东西了,因此我只讲了交叉熵与 KL 散度的关系)
过拟合问题是如何产生的?什么样的场景会产生过拟合?(模型能力过强,数据量较少,模型表达能力相对数据的信息量来说太强)
如何解决过拟合问题?(我回答了正则化,于是有了下面的问题)
L1正则化和L2正则化有什么区别?
为什么现在都用L2正则,很少用L1正则?
面试过程除了梯度消失问题的产生这个问题我跟面试官纠结了很久之外,其他部分还算比较顺利。面试之后两周左右,我收到了 HR 小姐姐的电话,告诉我拿到了意向书。
猿辅导
猿辅导的面试风格比较独特,有很难的编程题。如果有同学很想去猿辅导的话,编程题需要做深入一点。所以关于猿辅导,我记得的也就只有他的编程题了hhhh。希望对大家有帮助。
另外猿辅导的流程非常慢。快手跟猿辅导比起来还是小巫见大巫。每一面结束之后都是很长时间没有反馈的状态,然后过很久之后,才会有下面的流程。大家面猿辅导的话,要耐心等待,不要着急。
一面
算法题:n 个结点,能组成多少种二叉树?(卡特兰数问题,我直接动态规划解了,数学方法我不会)。
算法题:给你一些数字(可能有重复)和一个目标数字,输出所有求和等于目标数字的集合,不能有重复。
二面
二面问了我一道非常非常诡异的题目。
算法题:有一个升序数组,其中两个数字被交换了。现在要找到数组中的一个特定数字,应该怎么做?
这道题目,我在当时只写了一个并不能返回正确答案的程序。而我现在还是不知道真正的解法,在其他地方也没有搜到这个题目。如果有朋友知道这道题的最优解法,请联系我。
百度
百度的面试很快,一天面完了三场。但是offer很慢,过去了一个多月才电话告诉我有了offer。可能是因为有大佬拒掉了,所以轮到我备胎上位了吧。所以说还是不要放弃希望,泡池子也有上位的机会。
一面
Recall / Precision是什么?
AUC 指标怎么理解,它评估的是什么的概率?
讲讲BERT?
编程题:最大回文子串。
讲讲决策树?(我在面试的前几天刚刚动手实现了 CART,运气太好了)
决策树的子树划分指标?
决策树为什么容易过拟合?
二面
很扯的一次面试,面试官看起来很忙。叫我自己说说自己的优点和劣势。然后就结束了,结束了...全程十分钟,刷新了我的最短面试记录。
三面
问了一道编程题:二分法求平方根。前面是不是有公司问过?没错,问过。一模一样的题目。
我很快写出来了,但是这次被面试官指出来有情况没考虑,比如说:
我的程序不能算小于1的数字(快手的面试我是考虑了的。所以还是不能着急啊)
由于浮点数的精度问题,我用 “上界 - 下界 < epsilon” 判定程序中止,所以程序可能会无限循环(这一点我确实没有想到过)。
所以说做题不要贪快,越是这种简单题,越要多考虑考虑,尽量稳妥周全一些比较好。
上海农商银行
因为这家银行的面试不涉及什么技术问题,本来不打算写这个的。不过又想到也有需要提醒大家的几点,所以还是说一说吧。
我不知道为什么这家银行要搞提前批面试。我面了他的提前批面试,然后直接拿了offer,然后直接当天就要求我签两方了。两方有一万的违约金,而这个时候很多互联网公司还没开始面试...我当然直接拒绝了。然后后来他们又在一两个月后开始搞面试,招人还是一样的多。所以上海农商银行不要太早投,没有什么用。早投了反而让你两难。
面试很简单,不涉及什么技术。都是一些泛泛而谈的问题,谈谈你对大数据的看法,之类的。轻松水过。
似乎会卡学历(毕竟面试这么简单,也起不到筛选作用...)。
卡四六级分数。这似乎是银行的共性。如果有同学想去银行工作,那就先快去把四六级过了。
总结
总的来说,面试能问到的问题还是比较有套路的。比如说如果你也是搞 NLP 的,那么几乎所有的公司都会问你 BERT,LSTM。所以面试之前看看面经还是有用的,至少你要明白你面试的这个领域,目前最火的东西是哪些。然后针对这些内容,比如说 NLP 的 BERT,可以有针对性地准备一下自己的讲述内容。具体地,你可以从以下几个方面准备:
在这个模型之前,有什么类似方法?(每次讲 BERT,我一定会从 word2vec 与 ELMo 讲起)
之前的模型有什么缺点?这个模型解决了什么问题?(ELMo 不够好吗?为什么要有 BERT?)
这个模型的设计思路?
这个模型 work 的关键是什么?(BERT 效果好的原因是他的结构太优秀了吗?不,主要是因为谷歌有数据)
我之前在组会的时候讲过 BERT 模型的发展脉络以及设计思路,因此面试官问到 BERT 的时候,我基本都可以答得还不错。可以感受得到,按照这个套路讲下来,得到的效果还是不错的。所以说对于一些大致可以预料到的问题,大家可以做一点提前准备,不止是准备一些标准答案,最好还要有一些自己的见解,提升一下自己讲故事的能力。
我的面试经验就这么多了。可能具体的题目说的比较少,但是我觉得这些东西在牛客上有太多了。但是我自己在秋招过程中并没有看过其他任何人分享的面经题目,所有遇到的题目都是按照我自己的看法思考回答的。整个秋招经历下来,答不上来的题目有不少,但是一般也不会影响我整体的面试情况。所以我认为可能很多人无法上岸的问题并不在此,因此就写了一些我认为可能更有帮助的内容。希望可以让大家有一点不一样的收获。
最后祝学弟学妹们求职顺利,也祝现在还未上岸的同学朋友们尽早找到自己心仪的工作!欢迎大家来交流~