春招面经

春招面经总结以及一些找工作的建议

Posted by Huper on April 17, 2020

这次面试准备得比较久,差不多从去年年底就开始了,中间也是折腾了不少。现在春招差不多到尾声了,offer也接了,虽然还有两家没面,但应该也不会去了,所以就先把面经整理一下。这次的面经,不会太关注面试技巧,因为这些知乎和牛客上已经烂大街了,反倒是会多写一点如何做选择的东西,辗转在好几家公司实习过之后,发现这些其实比想象中的重要。

总体来说,这次会写两部分感受:面经求职分析,重点在第二部分,涉及到如何选择单位,职位以及工作地等等,当然一切也只是个人拙见,仅供参考。

面经

这块就很快过一下,我春招期间面的几个厂,不会讲简历和面试如何准备了,就像之前说的,这块不是重点。格式为厂家(渠道-职位)

Hulu (统招-SWE)

学姐内推,电面挂,不到五分钟自我介绍直接做题,带权无向图,求遍历这个图中所有节点的最小代价(代价指的是走过路径长度的总和)。状态压缩dp,不过当时没想到,一开始直接理解成最小生成树自信写完代码,直接爆炸。

必应搜索 (散招-NLP&AutoML):

这个组是给Bing搜索做召回支持的,负责所有离线document的embedding生成,一共三面。

一面讲了我自己做的检索系统和实时分类的项目。然后做三道题二叉树层次遍历,有序矩阵查找,编辑距离。

二面讲了讲项目,做了道区间合并。

三面继续讲项目,讨论了对bert,词向量的理解。 然后做题,求逆序对个数(nlgn,线段树或树状数组),然后是leetcode629 (dp)。

个人觉得这次面试表现很好,而且和面试官也谈笑风生,但是两周后收到拒信。

腾讯地图 (散招-检索):

问项目,问实习经历,然后做了三个题。

验证二叉搜索树,一个概率生成问题,然后是个检索问题:二维空间上有数十亿的点,然后给出一个查询框,如何最快确定这个框中有多少点?框可以是矩形或者任意多边形。

腾讯视频 (散招-推荐系统):

HR一开始给我投到算法组了,面试基本就问一些nlp基础和之前实习的经历,然后做了道很常见的dp,我跟面试官反馈说想做推荐引擎部分,但是辗转过了好久引擎组才联系,那时候已经接了地图组的日常实习了,所以就没继续面了。

STCA (统招-未确定):

只面了两面。一面问了项目和基础:堆的底层实现,如何插入,c++基础相关(STL如何管理内存),bert的模型结构,crf暴力解码和维特比解码的时间复杂度。然后做题:n个升序数组,求第k大数。

二面差不多,然后做题,一个数组划分为两部分,使得两部分的和尽可能接近,并且长度相等。开始用动态规划写,写着写着发现转移方程不太对,赶紧改了个暴力回溯。

阿里云ECS (统招-推荐系统):

做了一道题,地铁最短线路和最短换乘,既考了设计也考了算法。总体就是最短路搜索和索引技术等等。

二面,交叉面和HR面都是问基础知识,了解情况,问问你的规划或者感兴趣的方向等等。

ESC是阿里云最基础以及占比最大的服务(但是好像不是最挣钱的服务),核心是虚拟化和大规模运维,但是这部分已经比较成熟了,面试官跟我说打算让我做一个针对ECS服务的推荐系统,帮助用户更好地选择服务。

阿里妈妈 (统招-搜索/推荐):

设计linux的文件系统,设计消息队列,hadoop shuffle过程讲解,c++基础(虚函数,vector内存分配规则,静态变量(是否线程安全),各种数据结构的优缺点),进程线程区别,局部性原理,系统调用和库函数调用。写了一道层次遍历二叉树就没下文了。感觉妈妈这个组招人本来就挑,招c++就更挑了,不过之后有个阿里搜索的组又给我打电话,不知道是不是和妈妈搜索利益相关的组,但是我没约面。

支付宝 (统招-搜索/推荐):

介绍自己的实习收获,vector和链表,new,malloc,allocator的区别,allocator如何管理内存,红黑树和哈希,vector如何扩容,哈希如何扩容,哈希扩容如何优化(二级结构,类似deque的存储结构),c++内存模型,virtule,inline什么时候不会被展开。网络编程,各种类型的锁以及使用场景,线程和进程以及各自的适用场景,介绍了下他们部门的业务。tensorflow内核都有什么模块。

做题:统计一个先递增后递减的数组中某个数出现的次数。没下文了,说是等系统开了接受推荐,但是当时系统上确认了阿里云,就放弃这个了。

Google (统招-SWE):

就做题,限于保密不能透漏,题目不是很难,在面试官的引导下写了出来,但是coding的细节出了不少问题,所以GG了。谷歌的面试核心是coding,自我介绍不到两分钟,面试官会引导你从暴力解法一步步走到最优解,如果刷题经验不错的话,一般可以想到最优解,对某些acm大神来说就更不在话下了。所以我觉得更重要的是bug free和coding基本功。并且google的简历筛选据说只要是计算机相关的都不怎么刷,但是需要看成绩单。

百度(统招-C++)

其实一直挺想去百度的,但是百度那边进度推进的很慢,并且我当时笔试做得不好,所以就没报什么希望,然后接了其他offer,然后过了两天百度就约面了,但是也不会去了。

一面:介绍项目,实习经验,百度很关心你做的c++相关的东西。然后做题,从一个字符串中找出某个16进制格式的子串,使得这个子串的十进制数值最大。十亿条站点访问数据,如何统计top100访问量的站点。

最后接了STCA的offer,主要原因是这次春招面试看到了很多自己的不足,想着还是找一个比较轻松的离学校近的实习,有时间多看会儿书,好好准备下秋招。

求职分析

这个问题变得具体一点实际上就是offer要怎么选择,再具体一点就是秋招offer怎么选择,虽然我自己还没有经历,但是通过之前的一些实习经历,还是有一点认识的。在做选择的时候,我觉得有三个倾向比较重要,就是:在职位上的倾向,在单位上的倾向,以及其他倾向,对不同人来说各个倾向的权重不同,所以这里没有先后顺序。

1. 单位 (部门) 选择

如何选择单位?BAT选哪个?外企还是国内?选百度的话会不会要晾凉了?去阿里和字节是不是要掉头发?这个部门是不是不太好?。。。对比单位无非就是这几个选项,那就一一来看就好了。

外企还是国内

外企:薪资竞争不足(国内办公),技术栈封闭(国内办公),但是不加班,节奏慢。

国内:技术更新快,成长快,薪资竞争大,加班。以及末尾淘汰制和裁员?

不绝对性:如果外企是去国外办公,薪资会有大幅提升。外企也有核心部门(msra,hulu等),国内也有边缘部门。很多外企即使是国内办公点的薪资也是第一梯队(hulu,爱彼迎)。有些国内厂加班也不多(百度,猿辅导)。外企也有裁员。

备注:如果想去外企的话,你的coding会非常非常重要,有些厂(hulu, google, 爱彼迎) 对应的要求非常高!

薪资相关问题

参考薪资等级选择,白菜,大小sp,大小ssp,特殊offer等等。不过不同厂的offer叫法不同(不过差不多就是这几个档次),薪资等级定位不同,比如你去字节,猿辅导hulu或者爱比迎,白菜价可以吊打阿里的白菜。秋招说的薪资一般都是总包,股票,期权等等全都算进去,实际价值会有波动,不过总体上没有大的影响。

根据我的观察,大部分情况下,如果薪资上有非常大的差异,很多同学还是比较倾向于选择高薪资的公司,当然这点是不考虑户口的影响。

如何选择公司和部门

选择公司及部门有两个点:

头牌导向型

这点很符合人之常情,我去一家公司就要去你最好的部门,目前这个大环境下(以后不知道),好的部门一半有以下特点:

  1. 数字营销,流量变现,广告,财主部门。(阿里妈妈,CDG,百度凤巢,字节广告部门)
  2. 技术强组,有很深厚的技术沉淀。(阿里云,头条inf,腾讯云,百度搜索)
  3. 头牌产品或者服务。(抖音,蚂蚁金服,微信,光子,天美)
  4. 各公司的ailab或者研究院。(一般做面像Research的算法研究,但是某些ailab也有非常强的工程能力,比如字节)

然后你需要对不同公司有清楚的定位,你可以自己造几个句子,比如:

  • 字节是一家专注于内容产品的公司,推荐技术是他们的招牌,他们家的产品很用心很负责,王牌产品(头条和抖音)在国内甚至国际都是相应领域的王牌。
  • 腾讯是国内的老牌社交产品霸主,微信坐拥全球第一DAU,另外他们家无论是收购的游戏公司还是代理的的游戏(总之除了自研游戏)都老赚钱了。
  • 阿里是国内的电商霸主,并且他们家云产品在国内起步最早,国际市场份额前三,被称为3a。
  • 百度是国内老牌互联网霸主,虽然最近几年却一直在状态下滑和流失人才,但是他们的技术底蕴雄厚,为国内不少创业公司输送了不少人才,堪称互联网界的黄埔军校。
  • 网易游戏是国内的老牌游戏公司,去他们家做🐶策划貌似不错(这里不指被裁员)?
  • 等等。。。

这样基本你就可以确定对某个公司比较好的部门是啥了,不过就像我说的,这也不是绝对的,并不是说头牌部门做的所有东西就比其他部门更有价值,也并不是说公司的头牌部门薪水就一定比其他部门高,不过体现在年终奖上多多少少会有点差异,但是这也是均衡的,体现在工作量上也会有相应的差异补偿。

个人喜好导向型

举些例子:

  • 你比较喜欢java开发,那去阿里你的提升可能会更大。
  • 你比较研究纯粹的数据库,可以试一下国内专注于分布式数据库公司PingCAP或者阿里的数据库引擎组。
  • 你比较喜欢做机器学习系统,可以试一下百度的Paddle或者MSRA的SRG。
  • 你比较喜欢做CV就去国内的CV独角兽。
  • 比较喜欢玩弄商业变现和流量增长那就去各大厂的广告部门。

加班问题

这个问题说实话我也没有太好的答案,只是觉得国内的很多厂都是差不多的,不同组可能有不少差异,这个可以跟内部人员(比较熟的)提前确认一下。并且加不加班和你自己的效率也有一定关系,不过国内可能普遍存在的问题是:你如果很快完成一个任务就会被很快分配另一个任务。

发展前景

  • 比如说字节马上要上市了,去字节会不会成为暴发户?

我理解的,你只是普通员工,不是投资者也不是元老员工,赚能赚到哪里去呢,当然不排除有某些大佬拿到了很大份额的期权。

  • 再比如说百度这趋势下去会不会凉?

凉不凉我不知道,我只知道百度出来不会有大厂不要。

  • 比如说这家初创公司目前前景不明,但是给的钱很多,要不要去?

这个我真不知道,一大难题。

最后如果你发现考虑了以上因素还是有多个选项,那你就需要结合第二点了。

2. 职位选择

其实关注过国外招聘的同学可能会发现这个问题应该是国内企业招聘特有的,国内的互联网企业的风气是把职业分得很细,但是国外那边招应届生大多数时候只有SWE这样的选项,包括我们这边说的算法工程师也会被算进去。不过这也不是绝对的,比如国内的外企现在也入乡随俗会把算法和工程分开。

算法还是工程:

首先明白一点,无论是做算法还是工程,只有优秀的人才能拿到高薪水,并不是那些自媒体吹的:算法工程师平均年薪50w。选择做算法还是做工程,对研究生或者本科生来说,我感觉主要看你自己的喜好,当然如果能match你在校的研究方向就最好了。

算法岗的招聘情况一般是:公司需要的人其实不多(对外宣称一般是海量HC,急需人才),但是投的人非常多,所以门槛也就越来越高,之前我面阿里一个部门的时候,面试官就跟我透漏算法一般是要用论文去卡人的。但是也不排除很多大牛虽然没有论文,却有非常扎实的数学基础、coding基础(比如有个区域赛牌子)或者很漂亮的一段实习经历,这一点也是算法岗比较青睐的。

工程岗的招聘情况是:某些特定的岗位招的人很多,主要是新业务或者服务开发(对内或者对外都有),近两年做中台的也比较多,这种岗位需要你的知识面很广泛。一些冷门岗位非常缺人,但是HC也比较少。这些冷门岗位一般是研发一些底层架构或者基础设施,这种岗位需要你对某个领域钻研非常深,比如数据库引擎。

我拿数据库来说吧,可能你去做服务端,需要了解各种数据库的使用以及其重要的实现机制(方便做上层的查询优化),但是如果你是做数据库引擎研发,那么你需要对数据库的所有部件(索引,存储,编译优化,查询性能)都了如指掌,甚至很多人都自己动手做过完整的数据库。当然这里说的是工作以后的内容,面试的时候面试官不会说你需要做过自己的数据库才会招你去做数据库引擎,更重视基础。

选择具体的岗位主要是看自己的喜好和相关专业知识的掌握情况,我会把岗位要求的技能分成两部分:基础技能和分化技能。分化技能决定的是某一类岗位需要具体打交道的技术。

一般来说无论是对算法还是工程来说,只要相应的基础技能过关,那么你就可以胜任分化后的工作,这也是为什么(校招)面试的时候面试官不是非常在意你和岗位列出来的要求是否足够匹配(当然完全匹配会更好),但是社招就不一样了。

算法分支:

算法工程师和纯Research的研究员,对研究生来说大部分是前者,面向组内业务做算法(推荐,nlp,cv,广告等等),需要有和产品绑定比较强的收益,目前来说推荐和广告可能是很多产品直接面向的可变现算法,所以这两个比较热门,大多数时候nlp和cv是作为推荐和广告里的特征来服务的。当然对于那些nlp或者cv核心的公司以及各ailab和研究院来说就不是这样啦。

技能(基础)

coding,数据结构,算法,概率论,线代,凸优化,机器学习,深度学习等等。。。

技能(分化)

理论:请自行调查相关的领域。

cv:请自行调查相关的领域。

nlp:请自行调查相关的领域。

推荐:请自行调查相关的领域。

搜索:请自行调查相关的领域。

图网络:请自行调查相关的领域。

数据挖掘:请自行调查相关的领域。

等等。。。

工程分支:

拿一个推荐系统来说,算法关心的是效果,而工程关心的是可用性和稳定性。现在很多同学觉得做工程就是做前后端,没什么吸引力,这是很常见的一个误区,工程的很多领域是很有挑战性的,算法上的优化一般可以服务某个具体的产品,即使是头条这种大多数产品都依赖推荐的公司,也很难做到把某个产品上的算法优化迁移到另一个产品上能带来同样的优化,因为就很玄学。而工程和架构上的优化往往是可以服务所有的上层应用。

技能(基础)

coding,数据结构,算法,网络,操作系统,数据库原理,等等。。。

技能(分化)

热门

前端:三大件,各种框架的使用。

服务端:各种框架/各种数据库/各种通讯库的使用,并发编程。

全栈:前端 + 服务端

大数据:大规模数据存储,查询,离线/实时处理工具的使用。

运维:进行高效的大规模集群管理。

主流系统:推荐系统,搜索引擎,广告系统(实时竞标引擎,DSP,DMP等)。

冷门

基础设施研发:存储,通讯,计算,资源管理/调度,分布式策略,云(ECS)等等。

存储:高效FS或分布式FS,数据库引擎开发。

消息及通信:RDMA,消息队列,RPC,socket框架等等。

计算设施:同步/异步计算框架,深度学习计算框架,离线/实时分布式计算框架等等。

分布式策略:存储,计算和通信同时是分布式系统的基础,需要一致性,容错性等策略。

数据库引擎(sql和nosql):事务数据库,文档数据库,KV数据库,内存/硬盘数据库,分布式数据库,图数据库,列数据库等。

云(仅指ECS部分,其他部分与基础设施重叠):自动化运维,弹性计算,虚拟化,容器等等。

资源管理/调度:虚拟机管理,容器管理,计算资源管理。

冷门系统:操作系统,分布式机器学习系统,高频交易系统等等

其他

图形开发相关:游戏引擎,各种图形学引擎,GIS,GPU编程等等。

注意的是,这些技能之间是有交叉的,很难给一个完美独立的划分。这里面随便抽出来一个都是很大的领域,不过大多数时候,还是前后端开发,需要的人最多,因为这两个东西是直接面向用户的。有些领域需要的人并不是很多,拿RPC来说,不是所有公司都需要自研RPC的,开源的东西就能满足,往往只有大厂才会招人自己做RPC。再到深度学习计算框架,这个国内基本也只有百度在投入大精力做(其他厂肯定也有人做,但是应该不是可以对标pytorch和tf的完整框架)。然后到更底层的分布式FS,这个就更没有公司做了,基本全都在用HDFS。

3. 其他选择

户口,感情,家庭,环境,等等,这部分我没有发言权,因为都是很主观的因素,follow your heart就好了。

这套经验是我自己通过这段时间的实习,调查以及面试经验总结的,纯手打,然后我自己也是最后决定了自己以后的职业选择方向,并且发现离目标还有不小的距离,所以最终决定暑期实习的offer接个不是很累的,好好学习一段时间,秋招再战。当然,小伙伴们如果觉得暑期实习的offer和自己最终的职业方向比较match,那完全可以选择暑期实习转正的路线。