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