2021我的互联网秋招算法岗总结,从零到八家大厂SSP
(原文链接:2021我的互联网秋招算法岗总结,从零到八家大厂SSP offer)
一晃接近三个月过去了,秋招也到了尾声,之前一直忙于写毕业论文,现在在这里想总结一些自己求职互联网大厂算法岗的面经和心得,希望帮助后来的学弟学妹们收获自己心仪的offer。
今年的算法岗求职较往年竞争也更加激烈,可以预见以后进大厂的算法岗会变得越来越难,比如美团北斗去年的准入门槛是一篇CCF A,而今年直接提升到了两篇CCF A,难度提高了一倍,加之疫情的影响,我认识的很多手握顶会的本科学弟们以及海外的同学们也加入到了找工作的大军中,因此今年算法岗的竞争堪称史上巅峰,真的是八仙过海,各显神通。不过,找工作不仅需要实力,运气和方法也缺一不可,下面我就谈谈我自己的心路历程。 背景
本人Top2硕士在读,非计算机科班,两篇论文在投,投递岗位的方向主要为推荐/广告/机器学习,在整个秋招的过程中参加了9家大厂面试,阿里、百度、京东、美团、拼多多、快手、小红书、平安。最后侥幸获得了7家公司的offer,其中8家ssp,1家sp,薪资待遇 40+W-80+W不等。可能很多人会觉得我应该有多家大厂的实习,但其实我并没有,由于父母的工作受到了疫情的影响,导致我今年从疫情开始到7月初一直都在家里帮父母的忙,从而错过了暑期实习,看到周围的同学都拿到了大厂实习的offer,当时的我只感觉自己的秋招应该和互联网无缘了。每个人的秋招只有一次,如果不奋力一搏,又怎会知道最终的结果。抱着这个念头,我在7月初就赶紧放下了父母的工作,全身心的备战秋招。在这里,我就要讲一讲我的方法了,大部分互联网公司算法岗基本是三轮技术面+一轮HR面,技术面每轮的面试时间大致是一个小时,主要考察coding能力、基础知识和项目/竞赛。由于时间的不足,在这三个方向上我做了时间的分配,我的复习顺序是基础知识->项目/竞赛->coding能力。
1.基础知识
除了极少数公司会在一上来就要求你做一道编程题以外,大部分互联网公司都会在你的自我介绍和论文之后开始进行基础知识的考察,因此它的重要性不言而喻。基础知识的复习有两种途径,一是看书,二是看视频,这取决于你对哪一种途径接受知识的速度更快。我选择的是看书,一是因为视频不一定讲得面面俱到,二是视频质量如果不过关,很有可能某些细节的讲述是错误的。以推荐/广告岗位为例,我主要看如下书籍。- 周志华的西瓜书《机器学习》
- 李航老师的《统计机器学习》第二版
- DL圣经《深度学习》,又名花书。
- 《百面机器学习》
- 《概率论与数理统计》、《线性代数》、《凸优化》
- 推荐/广告:《深度学习推荐系统》、《计算广告》等
其次,基础知识的复习也很容易会遗忘,面对这个问题,我一般会将高频考点的知识写在ipad中,然后每晚会去复习一遍,如下图所示。例如KMP算法,我会在ipad上注明它的时间复杂度,对于next数组我会记录它的思想以及数组中的值是如何计算的,下次复习起来就会非常方便。
这样一个月下来,基础知识应该就可以烂熟于心了,这一段的复习就可以告一段落了。
2.项目/竞赛
项目/竞赛一般会在基础知识之后进行考察,这些一定要提前准备好,写在简历里的项目一定是要自己亲自做过的,因为一旦面试官问到了项目中某一个部分的代码是如何实现而你又回答不上来的话,在他心里对你的印象就会非常减分,并且会怀疑候选人的诚信问题。所以,我的方法是将之前做过的项目重新再做一遍,包括代码部分。这一块看似会花费大量时间,实则并没有那么长。具体来说,我会先将做过的项目重新梳理一遍,画出整个项目的流程图,然后再逐行复习自己的代码。等代码复习完之后,再删掉重新写一遍,这一步骤因人而异,取决于你的记忆能力。竞赛方面,常用的竞赛模型如GBDT、XGBoost、LightGBM、FFM、DeepFFM等一定要了解。最后,如果你的论文或项目与面试官所做的方向非常的match,你通过这一面的概率也将会大很多。
3.coding能力
代码能力是计算机专业学生的基础能力,求职技术方向的同学,无论是测试、开发或算法,互联网公司在这一块的考察都是重中之重。一般而言,大厂在每一轮的技术面中,至少会出一道编程题,多的会直接上三道编程题让你做(我就遇到了...),难度主要集中在easy和medium,少数丧心病狂(褒义词)的面试官会出hard题。而考察范围已是圈内公开的秘密,就在《剑指offer》和Leetcode上,因此刷题成为了大家求职路上必须要迈过的一道坎,这个坎没有人可以帮到你,只有靠你自己。我在硕士阶段也没有刻意的去刷过题,只有本科时刷过洛谷,下面是我Leetcode账号上提交次数的统计:我是从8月初开始集中在Leetcode上刷题,一直刷到了10月份,《剑指offer》也是在Leetcode上刷的,平均每个月刷题数是300。可能很多人都觉得300道根本不可能完成,确实,如果你按照Leecode官方的题号顺序去刷根本不可能,但如果是按照题目类型(标签)去刷,每天刷10道,一个月也就完成了300道。一开始可能会很慢,但基本上每个类型的题目当你刷够20道以后,都可以总结出该类题目的代码模板,所以前期会慢一点,越往后则会发现刷题速度越来越快,可以理解为先苦后甜。而对于刷题的方法,可以分为三轮进行:
a.第一轮:优先效率。当一道题花了十五分钟去思考也没有思路时,则果断选择直接看答案。
b.第二轮:培养思路。你需要对以前做过的每一道题都要有一个大致的映像,并且知道解题的方法是什么。这一轮其实最难度过,因为人对事物的遗忘是有规律的,而我们需要想办法客服这个规律。在这里推荐一下我的方法。我在刷完每一道题之后,会在ipad上注明题号以及题目名称,然后将该题的解题思路写下来,最后还会重写一遍代码,下图为我在ipad上记录旋转排序数组的特点、思路以及对应的代码。这样,以天和周为单位不断地复习之前的题目,就可以做到以后遇见它们时可以迅速反映出是用什么方法解决这道题的。
c.第三轮:完善思路。当我们顺利度过了第二轮之后,第三轮则需要学习每道题目的多种解法,比如TopK问题可以用快排变形/堆/二叉查找树/计数排序四种方法解决。在我的面试过程中,有些面试官会在你AC一道题后还会要求写出最优解,这往往决定你的面评是否能达到较高级别,也就是能否拿到sp以上级别的offer,并且一道题如果学会了多种解法,也会让你加深对这道题的理解。因此,我建议大家要学会用多种解法解决一道题,并且要培养出能快速AC的能力。
对于时间紧迫的小伙伴来说,在达不到刷两百道题又想拿到大厂offer的同学,我们也可以通过走一些捷径来减少自己无效时间的浪费,从而最大化提高自己的代码能力。具体来说,我们可以购买一些大牛精讲的算法课程,虽然市面上的算法课琳琅满目,但真正对找工作实用高效且讲述通俗易懂的课程少之又少。在我七月份以前,我基本上白天除了忙于父母的工作以外,到了晚上都会花费两个小时的时间去看自己在网上购买的算法视频课程,目的是为了给自己打下数据结构与算法的基础。一个好的算法视频课相比于书籍最大的优势就是视频传授的知识点更加直观,我们可以当作看电视剧一样去看它,一方面可以降低自己对于学习的阻力,另一方面还可以高效的学习这些迫切的知识。对于看书感觉痛苦的同学,就可以像我一样选择观看视频,那么至于选择看免费课程还是收费课程,我的建议是选择一个收费但价格可以接受的算法课去学习,原因之一是免费的课程往往知识点讲述非常冗余,且大家对于免费的课程缺乏学习的动力,这样反而会耽误找工作;另一个原因是学习成果往往需要人们付出才能收获,有人选择花费金钱以最高的效率获得,有人选择花费更多的时间去获得,那在我看来,秋招阶段最宝贵的还是时间,毕竟每个人这一辈子只有一次秋招的机会,这等同于高考!
对比了一下市面上动辄大几千甚至上万的课程(具体机构名我就不说了),我最终还是选择了牛客的左神算法课,首先他的这门算法课分成了入门、提升、中级和高级四个班,对于一般的互联网中小厂来说,将入门和提升两个课程学完并且知识点全部吃透,完全可以通过代码题的考察,而对于想要面像腾讯、字节、美团和拼多多等大厂来说,就有必要学习一下中级和高级班了,首先这些公司的笔试众所周知,难度很大,其次面试中考察medium和hard的频率也比其它公司要高,除此之外,一轮面试中出2-3道代码题在近两年也不在罕见。我的目标是BAT、TMD这类公司,因此我一开始只购买了前两门课程,在学完并且感觉不错的前提下,我才又购买了剩下的两门课程,而每门课程在使用优惠券后购买只需要 200-300元,这对于我来说还是比较划算的。作为牛客的忠实粉丝,我也很荣幸地为大家争取到了专属的购课优惠码,每门课打五折,相当于优惠了200-300元,如果是本来就想要买左神算法课的同学可以用我的优惠码,四个班的课程大家可以根据自己的实际情况选择,比白嫖的好处是有专门的老师进行答疑,还有课后作业和直播讲解等等。
下面附上课程链接,在购买的时候优惠码会自动生效哦~
入门班,适合零基础算法小白或基础非常薄弱的同学,课程链接:
提升班,适合有简单算法基础,但是还达不到校招水平要求的同学,课程链接: https://www.nowcoder.com/courses/cover/live/512?coupon=ALOVscQ
中级班,适合想要备战秋招和准备找实习,想快速获得offer的同学,课程链接:
https://www.nowcoder.com/courses/cover/live/501?coupon=AnHCzG0
高级班,适合想要冲刺BAT、TMD等互联网大厂的同学,课程链接:
https://www.nowcoder.com/courses/cover/live/493?coupon=AJ6oKJm
面试投递
在完成了基础知识->项目/竞赛->coding能力的复习后,时间节点也移动到了八月中下旬,这时很多公司的秋招正式批即将开始。由于我错过了提前批的投递,而提前批往往都没有笔试,所以正式批只能先参加笔试再进行面试。经过血与泪的磨练后,在这里给大家的建议是,有提前批投提前批,无提前批投特殊计划,重要的事情说三百遍。原因有两点:1、提前批的竞争压力小,投的人少,先拿到offer的概率很大;2、正式批的笔试题一般有一定难度,且刷人主要看AC题目的数量,比较残酷。而且据我身边同学的例子,有很多人笔试完之后公司就杳无音信了,要问就是在筛选,实际上你已经妥妥变成了备胎(有恋爱经验的人都懂),然后在公司的池子里欢快的游动。除此之外,若感觉自己还没有准备好,则可以等待几天再投递,但千万不要错过提前批的截止时间。所以提前批的面试能把握的还是尽量要把握,哪怕你觉得自己只准备了60%,但万一成功了呢?因为面试通过这个事情,实力与运气都需要, 在你的实力和别人差距不大的情况下,实力不够,也可以运气来凑不是吗。
完整面经
以下面经均为各个公司的正式批。京东
一面:
1、介绍论文、项目,很详细。包括每一个环节是怎么实现的,损失函数是如何设计的,模型是如何训练的等等。2、代码题:Leetcode 713:乘积小于k的子数组;Leetcode 297:二叉树的序列化和反序列化。
3、GBDT、XGBoost、LigthGBM的区别与联系。
4、送入LR前,如何处理数据(特征工程)。
二面:
1、介绍论文、项目,很详细。2、Transformer中的Scaled Dot-Product Attention为什么要缩放(两点)。
3、Transformer中的Position Embedding是怎么实现的?为什么?
4、bagging和boosting与偏差和方差的关系以及原因。
5、如何解决数据不平衡的问题。
6、假设检验的两类错误。
7、MSE、MAE与贝叶斯估计的区别。
8、为什么快排比堆排快?
9、口述算法题:对一个商品的价格、数量、购买人数进行分次排序,不改变之前的排序结果。
三面:
由于一、二面表现好,三面直接过了。美团
一面:
1、介绍论文和项目,很详细。2、代码题:面试题17.24:最大子矩阵;Leetcode 695:岛屿的最大面积。
3、介绍一下DSSM。
4、开放题:关于双塔模型的应用。
二面:
1、介绍论文和项目,以及论文中的涉及到的baseline模型。2、代码题:面试题01.08:零矩阵,写出两种解法。
3、XGBoost 如果损失函数没有二阶导,该怎么办。
4、聊天+反问。
三面:
1、介绍论文和项目,非常详细。2、介绍实习,说说实习印象中最深的点。
3、开放题:部门中的某个应用场景你会怎么解决。
4、职业规划,个人希望做的方向。
拼多多
一面:
1、介绍论文和项目。2、AUC是如何实现的,它对均匀正负样本采样是否敏感,并用代码实现。
3、BERT与ALBERT的区别。
4、介绍一下DKN模型。
二面:
1、介绍论文和项目。2、过拟合如何解决+具体方法追问。
3、代码题:Leetcode 42:接雨水。
4、知识图谱表示学习有哪些模型。
5、聊天+反问。
阿里
一面:
1、介绍论文和项目。2、代码题:Leetcode 382:链表随机节点,并口述蓄水池采样算法的推导。
3、概率题:将一根木棍分成三段,求这三段构成三角形的概率。
4、开放题:一个超级大文件,每一行有一个 ip 地址,内存有限,如何找出其中重复次数最多的 ip 地址。
二面:
1、介绍论文和项目。2、论文后续可能提升的点以及想法探讨。
3、说一说Graph Embedding和GNN的区别。
4、代码题:Leetcode 23:合并K个升序链表。
5、聊天+反问。
三面:
1、介绍论文和项目。2、介绍一下最能体现自己工程能力的项目。
3、如何提高推荐线上的性能。
4、强化学习在推荐中的应用及探讨。
快手
一面:
1、详细介绍论文和项目。2、两个均匀分布相加是什么分布。
3、代码题:Leetcode377:组合总和IV;Leetcode315:计算右侧小于当前元素的个数。
二面:
1、介绍论文和项目,很细。2、激活函数有哪些?ReLU是为了解决什么问题设计的?
3、决策树是怎么样进行划分的,决策树的损失函数。
4、朴素贝叶斯公式是怎么得到的,推导一下。
5、FM如何降低时间复杂度,以及与FFM的区别?
6、代码题:Leetcode394:字符串解码。
三面:
1、自我介绍,项目和论文。2、工业界常用的推荐系统模型有哪些?
3、推荐系统中特征的Embedding的表示方法有哪些?
4、解释一下你的模型为什么会有效果,模型的可解释性?
5、聊天+反问。
小红书
一面:
1、介绍论文和项目。2、代码题:Leetcode435:无重叠区间。
3、介绍Adaboost,Adaboost的权值和RF比较。
4、线性回归为什么用均方差。
5、介绍KMeans,K值的选择和初始点。
二面:
1、介绍论文和项目,很细。2、GCN公式推导一遍。
3、GBDT和XGboost区别(具体点),为什么GBDT用负梯度当做残差,详述Xgboost原理及其公式。
4、牛顿法原理及其公式,与拟牛顿法的区别。
5、代码题:Leetcode477:汉明距离总和。
总结
首先,每个人只有一次秋招的机会,我们应该拿出当年高考时候的状态,哪怕只有一丝机会,我们都要拼尽自己的全力,你永远不知道自己的极限在哪里,所以即使还没有拿到心仪的offer也请不要放弃,很多公司十月、十一月还在招聘候选人,而我周围也有同学没有拿到满意的offer,现在还在面试中。即便是秋招已经结束了,我们也可以在来年的春招奋力一搏,还是那句话,千万不要放弃,因为你很有可能放弃的是本该属于自己的机会! 目前秋招的补录已经陆续开启,包括腾讯、百度、拼多多等公司,有人会问补录和春招哪个更简单,在我看来,补录会更简单一点,首先补录避免了秋招大部分神仙打架的局面,也遇不到春招考研失败的大军,二八定律在哪都有效,这说明很多公司给20%的人发去了80%的offer,而每个人最终只能接一个offer,因此补录最容易拿到大厂的offer,君不见很多补录上岸BAT中的一家大有人在,所以秋招还没有拿到满意offer的同学千万不要灰心,还是要保证每天刷题的习惯,而如果中间颓废了一段时间,很多知识点和代码题都忘记了,我们也可以寻找一些方法快速将知识点拾起来,比如翻看之前的笔记,或者购买牛客左神的算法课让自己找到之前写算法的感觉,这都是非常有必要的。
最后,我想谈一谈自己对于面试的看法。无论是竞赛、论文还是大厂实习,这些都是为了方便你拿到面试的资格,哪怕你三者都没有,但只要公司愿意向你发起面试,你都应该好好努力。而最终是否能顺利拿到offer以及offer的等级,主要还是取决于你的面评,一个非常好的面评是帮助你拿下大厂sp以上offer至关重要的因素,因此切忌面试紧张,如果你紧张,可以心中默念欧米豆腐。
祝愿大家都能拿到自己心仪的offer! 听说评论后的童鞋,运气都会爆棚哦ヽ(✿゚▽゚)ノ
#面经##校招##春招##实习##内推##算法工程师#