2018 后台开发 春招总结&面经分享
2018 春招总结 & 面经分享 (阿里/腾讯/网易/今日头条/微软)
本文篇幅较长,排版较烂,非战斗人员请尽快撤离。
总算是可以对2018-春招-暑期实习专场来一个完美收官了。
最终有幸收到了今日头条(后端研发),网易杭州研究院(C++开发)和腾讯(IEG 后台开发)的offer,当然还是选择投入向往已久的鹅厂的怀抱啦。
从三月初开始陆续投出简历,到收到一个接一个的提前批面试,等待的焦虑和复习加刷题的疲惫霸占了整个三月,情绪的起伏比美股的振幅还大。每天都是等着电话,盯着各种内推群,刷牛客网讨论区。
当然这长达两个月的战线于我个人的提升可以说是巨大的。从人生的第一面面阿里的紧张到结巴,到最后完全可以和面试官坐着侃侃而谈;期间一直坚持刷leetcode和《剑指offer》,对自己算法思维的巩固帮助也相当大;同时也在翻看回顾一些经典的书籍和博客,用手写记录并结合OneNote的方法整理所学,很多琐碎的知识点和模糊的技术细节,也在慢慢的填补和串联中愈发完整清晰;最后在内推群也认识了各路大佬,有很好的技术氛围(当然还有大佬们的互相鼓励),都给了我非常正面的影响。
依我鸡汤王的个性,一定要把这神奇的三/四月做一个详细总结,还有把整理好的面经一并分享出来。
方方面面的总结
- 因为这次暑期实习就是冲着各互联网大厂去的,所以只能说说各大厂的情况。首先竞争真的是非常非常激烈,我进的内推群有大把的985/211本硕,而且今年有很多留学生回国找实习,我见过的就有港大,UCLA,UIUC,佐治亚理工这类海外名校的学生回来和我们抢饭碗(应该有一部分是受川普政策的影响)。大部分人的面试过程都不算顺利,鲜有offer收割机,深刻感受了一把什么叫千军万马过独木桥。从面试的反馈来看:阿里是今年最难的,hc相对来说较少,内推开始的最早,投的人当然也是爆炸多,大部分人都跪在了一二面,流程的间隔也是非常长,我甚至见过中科大CS硕士内推算法岗,简历就被刷的(后来的消息大概是算法饱和,只社招不校招),还有全部技术面通过后被HR刷的,最后拿到offer的普遍经历了四到五轮的技术面+交叉面,总而言之阿里今年是真的蛮难的,只有几个扩张的部门招人较多。腾讯号称有3000hc,提前批很热闹,不少人拿了offer,正式批就更加热闹了,线路面试临近终止前还有不少部门在捞人,挂掉的也可能被捞起来,今年应该是腾讯的大年吧。其他厂的hc分布因公司而异,京东扩招,滴滴坑位少,头条野蛮生长中,面试难度高但是hc一直用不完,百度的流程和头条差不多,平均难度应该不及头条,还有很多独角兽也蛮值得一试的,Face++/商汤什么的就不用说了......从笔试/面试也很能体现一个公司的水平和风格,大厂的笔试题都很有难度和灵活度,面试官也普遍耐心专业,流程很规范很有效率。
- 在强大的搜索引擎面前,学习资源随手可得,带来的结果就是优秀本科生的平均水平不断提高,导致大厂的门槛也是水涨船高,再也不是顶个高文凭就能拿好offer的时代了,一切都得靠实力说话。关于面试,借用别人总结的一句话就是:“别人不知道的,你要知道;别人知道的,你要懂得更多,更深入。”对于本科生来说,需要展现的就是扎实无比的基础(包括但不限于:熟练运用一到两门编程语言+操作系统+网络+数据库+算法与数据结构,啃的越透越好),丰富的项目经历(科研项目/团队项目/个人项目/竞赛经历)和对技术的热情(对新技术的追求,比如分布式/机器学习/语言新特性等等等等),对于研究生,那自然是硕士阶段的研究成果和良好的工程水平(我本科,所以没有更多的评判的资格)。总结来说就是既要有深度,又要有广度,做一个T字型人才。身边也见过很多口口声声说要学技术,却不肯花时间又不愿意跳出舒适区的人。昨天在微博上看到一句话:“学习的苦是要主动去吃的,生活的苦是你躺着都会来的”,如果在二十几岁的时候就想着安逸,大概是对“年轻”这两个字最大的不敬吧,与诸君共勉。
- 还想说一下机会真的是靠自己争取的,我交流过好些人,有因为害怕自己能力不够,只投了寥寥几家公司;或者后知后觉的,4月才开始疯狂投简历的(很多大厂都已经截止网申了);还有明明拿到了面试资格却放飞自我没有好好准备的...天知道他们的上限在哪,凭实力错过了很多机遇。还有,即使被有些公司拒了,也还是有复活机会的,这时候就需要多关注一些论坛和内推群的资讯了,有些部门可能很缺人,尤其是那些新组建或者是业务飞速扩张的部门,大概率会有部门直推的机会,OK的简历可以直接送到部门leader或者GM面前,跳过正常的校招流程,即使之前内推失败都可以二战。互联网时代,资讯就是资源,这些都是可以把握的资源。
- 最后是心态!!!除非你强到令人发指,offer送上门的那种,那么一波接一波的笔试,一轮接一轮的面试,一个接一个的面试结果的短信通知,都可能让你心态爆炸。面试官的风格也可能不合你心意,让你不能很好的发挥最后match不到自己心仪的公司。尤其是需要赶现场面试的时候,往往要起一大早赶地铁,坐高铁,再赶地铁,面试结束又要匆匆赶回另一个城市,真的让人身心疲惫。现场面试的时候,你的身边也可能是各种上交复旦浙大华科等名校的学生(这个真的不要怂,再好的学校也有菜鸡,再普通的学校也有大佬,学校好坏只能代表高考的成败,进了大学如何发展靠的真的完完全全是自己,平台的劣势可以靠努力无限弥补)。所以一定要调整好心态,太累了就放空一个晚上,或者用你独有的减压方式。如果要户外跑注意防风,我已经流了5天的鼻涕了:(
以下是完整的面经分享。
面经分享
阿里内推一面 国际技术事业部 搜索引擎组:(35min 通过)
问项目 10min 难点在哪,如何优化,benchmark性能怎样
Linux常用命令知道哪些
GDB调试的命令晓得伐
STL常用容器有哪些,举例说说用法和使用场景
重载/重写/重定义的区别
TCP/IP三次握手,为什么三次不是两次或四次
socket函数调用过程,分TCP和UDP讲
栈和堆的区别
继承和多态(编译期多态和运行期多态)
new和malloc区别
new的重载
new能否从栈中申请内存(通过placement new传入栈指针起始地址)
线程和进程区别
一个进程下多线程能否支持多核
讲讲熟悉的几个设计模式
两道算法题:
- 链表中倒数第K个节点
- 数组中第K大个数
以上算法的时间复杂度
平常爱看哪些书
一面是个语气温柔的小哥哥,二面挂了之后我也给他发过邮件,很快就回复了并且给了我鼓励,给我留下了很好的印象。
阿里二面 视频面:(90min 挂)
自我介绍,主要是大学里技术方面的相关经历
B树和B+树的区别
B+树插入和删除的过程
C++怎么创建进程(用到哪些函数调用)
怎么获得线程id(STL里的std::thread和pthread)
怎么辨别当前进程是父进程不是子进程(通过getpid()判断)
以下是屏幕共享手写代码/写Linux命令:
Linux命令系列:
- 怎么编译.cc文件
- 怎么编译生成动态链接库
- 怎么只编译输出obj文件
- 怎么查看当前系统的资源状况
- 怎么查看当前磁盘状况
Linux命令这块,死的很惨。
以下屏幕共享开IDE写代码:
- 用两种不同方法写线程安全的sum函数,现场编译通过得到正确运行结果
- 100万数字,快速找到top k
然后继续提问
C++虚函数/多态实现机制
override和重写的区别
介绍一下三种智能指针(shared_ptr/unique_ptr/weak_ptr)
shared_ptr底层实现原理(主要是control block里面的东西)
了解哪些c++11特性
static变量与extern变量的区别
类内static变量何时创建,何时被销毁
展示两段自认为写得不错的代码(紧张的打开我的各种工程翻了两段,面试官不是很满意的样子)
平常怎么调试,怎么解决问题
有没有把自己的技术心得写成论文
有没有写过纯模块性质的类库
面了哪些公司,反馈如何
如果通过转正愿意留下吗
未来的学习计划
Q & A
二面面了我一个半小时,以为很有希望了,然后第三天查到被回绝,当头棒喝,难过一天。问了一下内推的学长,说面了我这么久还把我挂了,大概是面试官比较纠结,想救我一下,没救回来 :( ,Linux命令答得很不好,二面完之后就开始重新坚持用Ubuntu,然后把我以前买来没看的Linux相关的书重新拿出来啃了。
腾讯提前批一面 IEG 蓝鲸 分布式存储组:(30min 通过)
简单问项目
B树如何索引
数据库的分表分库了解吗
讲讲数据库事务的ACID
Python垃圾回收机制讲一下
args 和 *kwargs区别和本质讲一下
Python多线程的局限性
Linux相关的一些小问题 (我说不算很熟 没问啥)
epoll比select/poll优势,为什么快(从底层实现角度讲)
分布式CAP原理
一致性哈希性质 + 一致性哈希算法
TCP UDP区别
redis(直接说了解,但是不会)
最后就是激情Q & A,面试官又是一个温柔小哥哥,巨温柔,声音巨好听,我不会的东西他当场给我讲解,还说看了我的github,对我作了肯定,感动!
腾讯二/三面 IEG 蓝鲸 分布式存储组:(二面35min 过 / 三面50min 挂)
二三面问的都比较玄学,二面是一个很友善,有点小皮的面试官,全程“好滴好滴好滴”,三面是一个高冷的女大佬(惊)。两轮都没有问一些常见的基础题和技术内幕,二面主要是以一些开放题为主,三面主要是聊人生为主,所以就合起来写了。
我是物联网专业,所以问了一个场景题:
- 远程跟踪定位一个物品的具体过程,用到的设备和所有协议。
讲讲关于分布式存储,了解的一切
k-v数据库有哪些应用场景,对比一下优劣(我简历上有一个k-v数据库的项目)
项目里面怎么做性能优化,如何设计缓存
做项目的思路和步骤
除了简历上的,平时还有哪些项目
近期内有何项目方面的打算
聊校内经历,学习成绩如何,为什么想到要进实验室,怎么进的实验室,在校爱看哪些书(女大佬甚至还和我聊了三体,以及里面的角色....)
聊简历上的东西(项目经历,交流经历)
短期的学习规划/未来的职业规划/offer选择/工作城市选择/实习时间
三面后来和女大佬聊开了,感觉就要开启谈笑风生模式了,然后又提醒自己这是面试..面试..强行把自己拉了回来
(三面扯了超级多,包括长期的职业规划,对一份offer的评判标准,怎么看待一个公司是否有前景,如果技术遇到瓶颈怎么办,如果Leader和你有分歧怎么办,甚至还讨论了中年危机...…还有很多延伸出去的关于企业文化,技术与管理等等的讨论,完全随机应变无法准备…)
三面总监面涵盖很多HR面的内容。
其中的一半在一些测试你离职率,***考察你性格的问题上,其实是有答题技巧的,这个需要不断地面试去体会,其他方面的扩展就看你肚子里有多少墨水了吧,还有能不能把握住聊天的氛围和节奏。节奏!!!节奏很重要!!!
二面完面试官就主动加了我微信,直说很看好我,当时就飘了,开心的不行。当天下午就接到了三面,结果三面挂了,呵呵呵呵呵呵呵...情绪大滑坡。不过事后想了想,确实在很多点上,自己的回答不尽如人意,还是学生思维太重了吧,挂的应该...应该...
今日头条部门直推 一面 广告展示核心部门 (60min 挂)
怼项目半小时
问基础十分钟,题型都很常见,但是答得一般
最后半小时做算法:K best,没做出来!!!后来一查是ACM World Final的原题,卒!!
看了网上的解法,二分确实非常非常巧妙,再给我10个小时我也做不出来...
不开心,不写了!!
至此,是提前批的战况,全部翻车了,还好结果不怎么影响正式批,接下来开始转运。
今日头条正式批 一面(30min 过):
一顿自我介绍
介绍完毕面无表情的冷血女面试官直接一句:“那我们开始做题吧!”
- n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)
在面试官提醒下写出来了,用栈+栈底指针
然后开始问项目…blablabla
知道Linux有哪些IO模型吗?5种模型叭叭叭都说一遍
说一下异步编程中的事件循环
操作系统为什么要分内核态和用户态
为什么要有page ***,操作系统怎么设计的page ***
一面完毕,喝口水的功夫就有HR打电话来告知面试通过,让我停留在页面不要动,紧接着就是下一轮面试。
二面 (40min 过):
让我介绍项目 然后各种问,问的比较细
STL里resize和reserve的区别
网页手写代码:
- 撸一个std::lower_bound,不断优化,直到最坏复杂度也为O(logN)
听我继续吹项目
C++11新特性用过哪些
怎么实现线程池
线程池里用到哪些C++的新特性
怎么唤醒,调度线程
什么是LRU缓存
怎么设计的LRU缓存,详细说说
三面(30min 过):
一个看起来就很厉害的中年男子闪亮登场
听我吹项目,主要是(kv数据库)
介绍一遍B树,越详细越好
数据库中的WAL技术是个什么玩意
网页手写代码:
- 实现一个二叉树的持久化方案,可以伪代码,必须用指针
主要是序列化和反序列化的过程
(卡在指针的持久化存储,然后他不是很满意,说我应该做得出,只能把我的另一种不用指针的方案给他讲,才算勉强过)
-
实现二叉树的层序遍历
-
再按层换行输出一遍
Over
头条的面试是三轮连续的,面完一轮马上会有HR电话打来通知结果,效率非常高,这三轮面试从下午五点一直持续到晚上七点半,可以说是酣畅淋漓了。
腾讯 IEG 上海现场一面 (30min 过)
腾讯是真滴有钱啊,包了个五星级大酒店,大厅是等候区,面试官在房间里等您。本来安排的我14:00的面试,13:30就叫到我了,正准备午睡几分钟...
拉家常,然后简单问问简历上的经历
怼项目细节,核实简历真实性
关于项目性能优化的开放性问题:主要就是优化,优化,往死里优化。抛场景,然后给优化对策(这里花了大概15分钟,面试官看起来对性能要求很高,我也拼命转脑子,中途不满意的点他会吧唧嘴,听得我巨慌。最后看起来他是比较满意的,说了一句“很好”,我才放心...)
new/malloc的区别
析构函数的作用
堆和栈的区别
C++17里invoke替代方案实现(从设计模式角度)
std::bind的使用场景
std::future是干嘛用的
lambda的实质(从编译器层面说)
给了一段小代码,大致如下:
class A; void func(){ char buffer[1024]; A* ptr=new A; A* ptr2=new (buffer) A; }
以上两个指针之间的区别
以及:第一个指针离开作用域前要delete,那第二个指针是否必须delete?
Q & A
一面面试官长得有点像《寒战》里的梁家辉,差点出戏。但是看起来巨专业,一些“拟合”“维度”这样的词从他嘴里说出来的时候,非常sexy。
因为我学校在江苏,当天晚上还得赶回学校,Q & A环节的时候和面试官说明了一下,结果刚下楼就收到了面试官电话,说一面过了,总监正好在上海总部,让我现在过去接着面,可以说是很Nice了。
然后就风尘仆仆的赶往了上海腾讯大厦,不远,只有一站地铁。
二面 总监面 (45min 过)
继续问简历上的一些经历
怼项目细节
了解哪些kv数据库
讲讲项目的难点,参考了哪些资料,具体做了哪些优化
看过哪些c++方面的书
然后问了>里面一个重载new运算符的问题:
- 什么时候需要重载new,重载有什么坏处,我只记得书上说尽量不要重载,卒。
个人项目的benchmark性能测试结果如何
问了一丢丢读写锁的实现
项目里提到设计缓存来减少不必要的IO,讲一讲怎么设计缓存的
说说执行一个系统调用时,OS发生了哪些过程和调用,越详细越好
说说从执行一个IO调用写文件,到把数据真实写进磁盘的过程中,发生了哪些事情,越详细越好
以上两题其实很能体现技术的深度,感觉自己答得中规中矩吧。
IO中的DMA是怎么工作并且和OS交互的
TCP用了哪些措施保证其传输的可靠性
OS怎么实现用户态和内核态之间的切换的
内核态的函数调用和用户态的函数调用有何区别
Linux下如何确定文件在磁盘上的位置(从inode结构一直索引磁盘扇区号)
给一段代码:
class A; A a; a = a + 100;
如何实现类A支持以上操作。
先答了重载operator +号运算符,然后判断(a+100)是一个右值,这里我不确定,所以补充了还要重载一个右值版本的赋值运算符。
然后接着问,重载运算符应该是全局函数还是类内成员函数,两者有什么区别,或者分别有什么优劣。
最近在看哪些书
未来的发展方向和规划
Q & A
总监大大看起来相当年轻,自带一种大佬的气场,问的问题嘛也很专业同时很有针对性,最后还满脸慈祥的和我说:“ CSAPP是本好书,建议你回去把没看的章节好好再看看。”腾讯两轮的面试官都给我一种技术深度广度兼备的感觉,所以即使我有些问题答得一般,还是给了我很好的面试体验。
网易互联网 现场一面 (35min 过)
自我介绍
从头到尾讲一下简历上的两个项目
抠项目的实现细节
用过哪些图像处理方法(交流经历里有写到)
C++11有哪些新特性(一紧张,智能指针都漏说了)
什么是左值/右值
介绍一下std::future和std::promise
线程池里的线程如何调度
TCP状态机(11个状态间的转换)
TCP三次握手和四处挥手
讲讲流量窗口和拥塞控制
redis列表底层是如何实现的
了解哪些新技术
分布式方面,了解哪些东西
然后就给他先扯了一遍Raft算法,看面试官听的挺满意,趁热打铁接着再扯一遍一致性哈希
Q & A
现场二面 (30min 过)
手写最小堆的插入
开始怼项目,气氛很不友好,第一次有不想面下去的感觉。面试官一脸“就这样?”,我也一脸“就这样!”,在尴尬的气氛中结束。
二面完很难受,想直接背包走了,还是等了一会儿上前台一问,竟然还给我进了HR面,和HR小姐姐随意聊人生,然后直奔猪场食堂。
网易是最意外的,二面真的感觉自己全面崩盘,应该是一面答得好救了我自己吧,最后还是给我发了offer。嗯,猪场食堂体验不错。
微软苏州(Office 365) 三轮 每轮45min 应该是跪在第三面
本来就没抱什么大希望,所以以体验为主,但是微软爸爸真的是满分。早上签到之后在大厅等,会有HR小姐姐把你带上楼,然后大概六七个人一组,在一个conference room等候(后来才知道一屋子就我一个本科生,4个都是上交的研究生...瑟瑟发抖),桌子上会有丰富的零食和新鲜水果。然后陆续有面试官小哥哥来接你,到指定的interview room进行面试,形式主要就是白板/白纸coding,不会有偏题怪题,题型就是leetcode上的E/M难度的题,期间最主要的是思路的展现还有与面试官的互动,面试官会不断提示解法以及更优的解法,定下方案之后就是写代码,争取一遍bug free,最重要的还是和面试官的互动!!尽量不要冷场!!
一面
很年轻的小哥哥,先让我在白板上模拟了一下B树的插入删除,然后开始做题。
- ① 求一个乱序数组的逆序对(两个数,它们的index大小和value大小相反就是逆序对)
懵逼了一会儿,面试官提示用边分治边归并的思想,然后和他讨论了比较久,他也提示了我蛮多的,最后大概是时间问题没让我完整写,就讲了一遍思路。
- ② 字符串中每个单词顺序的翻转
比较简单,秒过。然让我写一些测试用例,同时改进代码的鲁棒性,修复小bug。
二面
同样年轻的小哥哥,而且一脸乐呵。先尬聊一会儿,然后还是老规矩开始做题。
- ① 字符串处理,一个Unix风格的路径,可能会包含edge case,比如"usr/bin/./../xxx",处理之后返回"usr/bin/xxx"
edge case主要是可能有多个斜杠什么的。思考之后,用栈模拟一下寻找路径的过程,很快就写完了,看了一遍代码没问题,下一题。
- ② 跳跃问题,一个数组,每个数字代表当前所能跳跃的最远步数,求能否到达最后一个元素。
leetcode原题,准备用dp做,但是面试官提示了一下更好的解法,然后想了一下其实只要找在数组里找0就行了,时间复杂度O(n),空间O(1)的,代码也是一遍没问题。面试官看时间还没到,给我加了一题,盛水问题,同样是leetcode原题,解了一半他说时间差不多了他满意了就乐呵呵的送我回conference room继续等了。
三面
三面是大佬,一个严肃的中年男子,看到我简历上参加过一个新国大的关于人脸识别的交流项目,问了我一些模式识别,概率论的问题....可惜我忘得差不多了,很难受,要么不会,要么只会个皮毛。
然后做了一道算法,二维矩阵,左到右,上到下都是升序,找目标元素的位置,题目比较简单。大佬比较严肃所以整个过程也没有积极沟通,面完就知道应该是GG了。
虽然最后挂了,但是体验真的是非常棒,和国内的互联网公司体验大不相同。到了饭点有小姐姐带去吃午饭,午饭也是很有份量,吃完还有一个简单的参观,看了大佬们的工位,内部的健身房,Xbox游戏厅什么的,然后HR小姐姐告知我3面表现的不太好,就开心的回去了,但是真的很满足,体验100分!信仰蓄满!