# 拿下腾讯天美offer的春招经历
大家好,我是小林哥。
前段时间,有位读者跟我发消息说,他拿了这三个实习的 offer。
不知道你们惊呆没,我是当场惊呆了,感觉这三个闭着眼选都没问题,这个问题就好像是选北大还是清华,就是这么朴实无华。
后面他选择了去天美,原因是他本身对游戏兴趣就很强烈,他学习编程的起因也是源于游戏,他对游戏的热爱是从小就有的了。
看到这,大家很想看这位读者的经历吧?
小林有先见之明,所以今天邀请了这位读者来分享他的校招经历和学习经验。
不多 BB 了,直接发车!
# 基本信息
Hello,这里是伞兵一号。
本人是一个小菜鸡,双非,软件工程专业。
本科一直在ACM实验室,但是面试结束之前都没有拿过牌(没打过现场赛)。
自己由兴趣做了两个项目,一个是大一时候做的 Unity3D 的一个 FPS 游戏,还有一个是 CV+AI 的一个项目。
本次春招靠运气拿到了几家不错的 offer。
字节跳动今日头条后端。
腾讯天美服务器后台开发。
阿里阿里云C++研发。
Momenta Deep Learning。
大疆自动驾驶测试开发。
当然,也不是一帆风顺,面挂了有:
- 微软苏州 SDE(被调剂,相当于挂)
- 网易雷火笔试
# 春招经历
# 三月
都说金三银四,但是因为我觉得自己太菜,三月份我不敢投任何一家,3/20 号微软截至投递,因为我对 WLB 的追求,微软一直是我的 DreamOffer。
所以我在 3/19 投出了我的第一份简历,可以看到,简历上实际上大部分是用来充数的,项目的话除去上面两个项目其余都是课程设计,奖项也因为本人太菜和本次 ACM 赛季的延迟,含金量不是很高,所以我当时投出去内心是十分坎坷的。
幸运的是收到了微软的笔试通知,3/27 参加了笔试,拿到了满分,到这里三月份就结束了。
# 四月
4/1, 下午投了网易雷火,晚上就笔试,我把自己作死了。
具体是怎么回事呢,大概是我看到一道 dp 可写,但是我没写,我觉得最后一题那个数电模拟题比较有意思,我就去写那个了,但是一直 TLE,最后 2.5 道题耻辱退场,成功把自己玩死了。
4/8, 收到了微软的面试邀请,此时我对于除去 C++ 之外所谓的八股文完全没有看过,但是听说微软那边主要注重于算法。
我也没有专门去准备「八股文」,就这样,我开始了人生中的第一场面试,第一场面试体验非常好,一直聊项目。
最后写算法因为紧张还听错题目了,发现听错之后面试官非常 nice 的说,没事,就当作是你写了两个题。
4/16,微软终面,面试很顺利,后面面试官问我,如果以你的FPS项目为基础,设计一个多人对战服务器,怎么设计,并且面试官和我说:「如果这个问题你能答上来,我觉得今天面试结果还是非常不错的」。
我之前也没仔细看过这方面,就凭借着多年游戏经验答了,我答了传包协议和原因,具体设计,面对高负载采用主从模式容灾 + 分布式处理,采用类似于帧同步的方式。
面试官认同了我的方案,说我说的是一种非常经典的游戏服务器设计方案,面试结束之后我去问了在腾讯搞游戏的学长,他说我说的都在点子上。
我这时候以为大约有 5 成把握了,而且很奇怪,面完之后我就不想面其他家了,一直在等消息,那段时间很焦虑,学不进东西。
4/26,转折点来了,我那批面试的人,微软发了第一批(也是唯一一批)offer,没有我,这时候我开始慌了,开始去准备简历投其他公司。
4/27-4/30,投了BAT、Momenta、大疆。
大疆 4/27 当晚直接面试,Momenta 也约当晚,但是以为那周考试,我推到 4/30 面试。
两家面试都很顺利,4/30 当天收到了 momenta 约我 5/6 二面的通知。
# 五月
5/1,收到了腾讯通知 5/6 面试一面(如果不加班的话,为什么5/1通知呢,如果加班的话,为什么 5/6 面试呢)。
五一小长假大概过了一遍小林的「图解网络」和挑着看了看「图解系统」。
5/6,下午 Momenta 终面之后腾讯一面,也蛮顺利的,面完腾讯一个小时后通知晚上二面,二面是一位 old-fashion 的工程师,用 c 写了算法。字节也约了 5/8 一面。
5/7,腾讯约 5/8 三面,大疆发了 offer。
5/8,上午字节一面很顺利,中午约了 5/10 二面,阿里这时候也约了当天晚上一面,下午腾讯三面聊的很开心,面试官非常认可我项目的解决方案,之后开始聊游戏设计和游戏服务器技术的发展,聊的很投机,三面结束后几分钟,官网显示到了HR面试阶段。
过了一会约了我HR面,当天晚上阿里一面,问的很难,我大概凭借经验答上了 60% 左右,我以为我挂了,过了十分钟左右打过来直接二面,二面相对顺利。
5/10,下午字节二面结束之后直接三面,聊的都很不错,然后直接HR面,不得不说,效率是真的高啊。Momenta 发了o ffer。
5/12,字节发 offer 了,阿里约我第二天三面,晚上腾讯给了口头offer。
5/13,阿里三面,本来是钉钉面试,因为网络问题变成了电话面试,聊了项目,给面试官介绍了 ACM 比赛(面试官问我,说我本科在 ACM 实验室搞算法,为什么连SVM的实现也不了解,所以我介绍了 ACM 比赛。
5/14,坐上了去银川的火车,坐了十个小时,第一次去参加ICPC线下赛,运气好,拿了银牌(银川赛站相对其他赛站含金量要低)。
5/17,在回来的路上收到了阿里约HR面的电话,(因为火车进山了,打了三次才约成时间,麻烦人家了。
5/19,腾讯发了offer,阿里HR面,面完之后当晚发了offer。
至此,我的春招结束了。
总结一下吧,能拿到这些 offer,运气也占很大一部分。
面试中项目占了很大一部分时间,和面试官聊的也很开心,也得到了许多很棒的改进建议,充分的认识到了自己的不足。
其实这么多场面试下来,我觉得更多的不是像考官-考生这样的关系,更多的像是两个「技术宅」在聊天,都感觉到大家非常友善,互相交流技术,面试体验一级棒。
# 学习经历
记得当时在知乎上看到这样一个问题:「你为什么选择计算机专业?」
我在这里选一部分我当时的回答。
一句话,源于游戏。
小时候家里在山村里,爸爸到城里去工作,家里一般只有我和我妈妈,我哥家有一台小霸王游戏机,我就几乎天天都想跑去他家顶蘑菇,玩雪人兄弟,魂斗罗。两个小孩玩的也蛮高兴的。
后来应该是我爸妈看到了电视上小霸王「学习机」的广告,以为真的能「学习」,就给我也买了一台。结果到手之后发现不太对劲,就和我说每周只能礼拜五玩一个小时。
六岁时候我搬到了城里,这台游戏机又继续陪伴了我大约三年的时间,那时都手柄很劣质,大概十块钱还是五块钱一个,经常十字键就搓断了,只剩一个摇杆,我就那张卫生纸垫在上面继续玩,经常把我大拇指的皮搓破。。。
每次在外面受了伤或者去医院看完病回来,疼的不行的时候我妈就和我说:“去吧,打开游戏机玩会”。
每次打开游戏我的疼痛就瞬间荡然无存。
慢慢的,我也学皮了,学会了偷偷打游戏,好几次我妈摸了摸电视屁股,然后我就遭了打。。
到后来小霸王挂了,家里买了台世嘉 MD2,当时的第一感觉只有震撼。
“这上面的画质太好了,游戏也比「黄卡」游戏机上的好玩”。
还有一个经常和朋友们交换的密码本。
不过「黑卡」游戏机的卡带太贵了,记得当时买的一款国内的游戏是 40 元,带纸盒和说明书。
这对于当时一周 5 块钱零花的我来说是要攒两个月左右的。
形成鲜明对比的就是之前的「黄卡」,几乎都是 x in 1,不过这也给我带来了好游戏值得花钱的感觉。
沙丘魔堡,幽游白书,光明力量,战斧,炸弹人,Super Off Road 等等,好游戏太多太多了。
另外有个小插曲就是我小学一年级的时候得了过敏性紫癜,住院了。
有两个东西让我印象深刻。
一个是我妈妈送给我的一本书《小熊开店记》,还有一个就是我爸爸的朋友送给我的电子积木玩具,这两样东西也是对我数学和电路的启蒙吧。
初中的时候,通过盗版 cod 接触到了主机游戏这一块儿,和好朋友边玩边赞叹这他妈就是艺术。
当时顶着 800x600 的分辨率和全低画质打完了cod9,从此开始研究硬件,天天心心念念着我那份 1200 块极致性价比装机单。
100 多块钱买了根三星 2G 内存条发现电脑滴滴的响,商家又给我换了一条蓝魔,插上能用了,我的电脑也升级为了 4G 内存,装机的梦想也是高考完了才实现。
12 年接触到了 steam,也第一次买了正版游戏,省吃俭用一年花 240 买了盒装的cod8。
大概是 13 年吧,有一天好哥们拿着本 ivon horton 写的《C语言入门经典》神秘兮兮的和我说:
“咱们玩了这么久的游戏,要不要写个游戏玩玩”。
就这样,初中时候接触到了 c 语言,算是知道了这么个东西(初中课上vb没好好学)。
从此立下了改变中国游戏局面的志向,进入了这一个大坑。
“我们总想着改变世界,其实不被这个世界所改变已是奢求”
中考之后我去了一个垃圾省重点,好哥们去了省内三大高中之一。
高中期间他继续阅读 C++ 入门,我看完那本 C 之后也就没写过代码。
高考我发挥失常,他发挥正常,他去了某 985 学 CS,我到了双非学SE。(我们两个学校的名字也挺有意思的,我经常和他说我们是兄弟院校)
这里插一句,到现在实际上挺感慨的,性能不错的电脑也有了,也用奖学金买了 switch 和 PS,可是玩游戏的时间却越来越少了。
到了大学,一开始自己捣鼓了几个月 unity,做出来个 FPS 游戏,自己通过 youtube 和官方文档好不容易把重力系统捣鼓出来,又加了加技能,特殊弹药和 BOSS 战,虽然啥也不懂,但是慢慢捣鼓出来,很开心。
后面听说了 ACM 比赛,开始自学刘汝佳老师的《算法竞赛入门经典》(所谓的「入门经典」,我到现在还没刷完),之后进入了 ACM 实验室,进入了天坑。
算法的学习,如同吉老师说的,现在 ACM 算法竞赛和实际工作需求的偏差越来越大。
我个人 ACM 的学习过程是相对曲折的,因为我们是自己找题训练,在学完基础的算法过后,有一段时间进入了迷茫期,不知道学什么,怎么学,现在的话有譬如 acwing 这样的网站可以系统性的针对算法竞赛进行一个学习,我认为是很不错的。
就我本次春招找工作中遇到的算法题来说,总体难度不是很高,如果你有 ACM 经验的话当然更好,但是没有搞过 ACM 也没有关系,掌握基本的算法思想如二分,分治,普通的动态规划,DFS/BFS和基础的数据结构如树,栈,队列,堆,链表即可。
我个人的话是在 leetcode 上刷了 100 多道题目左右,难度分布大概 4Easy-4Medium-2Hard 这样子,如果没有 ACM 经验的话推荐刷 300 多道应该也差不多,重点在于掌握思想,而不是去死记硬背。
有 ACM 经验的我也建议大概刷一下 leetcode,相较于 ACM 比赛还是有一点差别的(当然,大佬除外)。
面试题中思维题居多,想锻炼思维的话也可以到 codeforces 上刷一些题目,推荐 DIV3 的所有题目和 DIV2 的前三道题,非常锻炼思维能力。
学习方面的话,专业课均分保持在 90+,因为考试相对简单。
我认为,计算机基础是最重要的,什么语言无所谓,语言只是一个工具,只要对计算机足够了解,学任何东西都会快速上手。
从那时开始买书,我在实验室的工位也慢慢垒起了一座小书山。
这是我大二时候的座位。
阅读经典书籍,让我受益良多,特别是黑皮书系列,yyds!
我印象深刻的是《计算机组成原理:硬件/软件接口》书中说的计算机系统结构的八个伟大思想:
正如 David Wheeler 所言:
All problems in computer science can be solved by another level of indirection
“计算机科学中遇到的所有问题都可通过增加一层抽象来解决”
后面学习不论是计算机网络,还是操作系统,都对这几个思想印象深刻,感觉都是这几个思想的具体化实现,类似于 cache 或者 Redis 这样的技术,我认为实际上就是利用了加速大概率事件,和存储器层次的思想去进行设计和加速。
在选择专业方向分流的时候,我觉得,程序员多少应该学习底层(只是本人的拙见),我选择了有 x86 汇编,arm 汇编的方向,我认为这些属于程序员的内功。
尤其是 C++ 程序员,要对汇编和内存有具体了解,看到代码,我们要具有通过编译器视角,CPU 视角去看代码的能力,所谓的「知其然,知其所以然」。
如同侯捷老师所言:「学习需要明师。但是明师可遇不可求,所以退而求其次你需要好书,并尽早建立自修的基础。迷时师渡,悟了自渡,寻好书看好书,就是你的自渡法门。」
我在学习过程由衷的觉得机械工业出版社出版的多本经典书籍让我受益良多,比如龙书《编译原理》,上文提到的《计算机组成原理:硬件/软件接口》,还有《计算机网络自顶向下方法》《现代操作系统》《汇编语言基于x86处理器》等等,都是经典中的经典。
还有 effective 三部曲,《代码大全》《深度探索C++对象模型》《STL源码解析》等好书,无一不让人读起来大呼过瘾(当然我还没全读完,最近准备去补一下 CSAPP,英语版好贵啊!)
英语对于程序员来说也是重中之重,有很多时候要去外网求解,比如 stackoverflow 上和暴躁老哥激情对喷,到 github 上和大家同性交友等等。
不过我学习英语的道路比较畸形,小时候上了几年补习班背了几千词,之后再也没有背过英语。
后面英语的提升就是通过看视频和玩游戏和老外聊天,友(激)好(情)交(对)流(喷)来学习……
# 一点建议
小林哥让我给在校生一点学习建议,但我也是在校生,谈不上能有什么资历给大家建议,只能说给大家分享一点经验吧。
如果您是刚入学的大一大二的学生,那么我建议您要着重计算机基础知识的学习,语言只是表达思想的工具,对于计算机的理解会帮助您去理解学习语言。
同时也要****注重实践,多去写代码,学会使用 Debugger 去调试,选择一个现代的 IDE,可以帮助您去更好的学习,如 JetBrains/VisualStudio 等,这些学生都可以去申请免费试用,可以去申请 GitHubStudentPack。
学习 Linux 也可以使用 WSL 去学习,相对安装 Linux 系统来说要简单许多,同时也不要忘记了学习代码风格,代码风格太差会影响你找 BUG 的能力和耗费的精力,也有可能造成一行代码报五个错的奇葩情况。
还要学会如何使用搜索引擎,查找文档可以去 Microsoft Document、IBM Knowledge Center、cppreference 等,找具体问题可以去 Github 和 StackOverflow 等,学会如何提问也是一种很重要的东西。
对语言不必要求什么都学,我认为到毕业时会使用一门 OOP 语言和一门脚本语言即可,语言实际上是一种触类旁通的东西,重点在于思维的培养。
要去大胆的做一些自己当前能力之外的项目,在学习完基本的软件工程学的基础上,或者说只要你了解了面向对象思维和基本的设计原则如「高内聚,低耦合」。
去做一些自己真正感兴趣的事情,自己去设计这个软件的架构和实现,所谓实践出真知,不要惧怕做有挑战性的项目,Just do it(干就完了)。
对于未定义行为(undefined behavior)不必耗费太多精力(如++i+++i+++i
这样的毒瘤题目。
如果您和我一样是大三大四的同学,正在找工作或者准备找工作,那么我推荐您大致看一下面试经验,复习「八股文」,实际上我建议您结合之前的学习去理解,很多东西是上文提到的八大思想的具体实现。
以我个人为例,我在学习「八股文」期间,很多东西是去理解,把他挂载到之前的一个知识点上,面试开始前几个小时去大致看一下具体细节,在理解的基础上,您可以和面试官款款而谈。
对于「八股文」,我们要尽量融会贯通,建立起完整的计算机体系知识结构,这样学习起来会事半功倍。
对于算法的训练,如同上文,刷一刷 leetcode,总结一下算法思想,再加上适当的练习即可。
对于自己写的项目,大致回想一下有哪些技术难点或者有趣的地方,能够具体从想法的出现,解决的方案,中途的问题,后续的测试,未来的发展方向做讲解即可。
# 总结
说了这么多,总结一下。
实际上回顾我这一段时间的学习生活,其实都源自与对于计算机的兴趣,其实很多时候不像是在学习,更多像是在玩,在我的眼中,计算机是个很有意思的东西,不论是自己去组装台式机,还是去写代码,更多的是基于兴趣的学习和实践,我认为实践在这门学科中和学习知识是同等重要的。
我始终认为,计算机基础知识是一切的基础,具体语言,各种工具只是「外功」,但是计算机基础知识就是「内功」,只重视外功的招式,而不注意内功的修行,是不可能成为高手的。
最后以我很喜欢的侯捷老师的一句话做结尾:
“万丈高楼平地起,勿在浮沙筑高台”
实习只是开始,今后还望能继续进步,与君共勉。
本文只是个人观点,只能给大家提供我的学习历程和思考角度,并不代表这样就是对的,我也只是一个在慢慢摸索的菜鸡罢了,也受我本人狭隘眼界的局限性,还请大家见谅。
十分感谢小林哥给我这个机会能够和大家进行经验交流与分享。
在这里祝看到这篇文章的您,万事胜意。
最新的图解文章都在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。