计科专业回馈牛客(主要为游戏服务器开发方向)
先说一下自己啥情况。其实严格来说是本科二批,但是是一本的分数线的计算机科学专业。
秋招情况投递公司情况(由于tap4fun转正了,所以投得公司很少,按照时间顺序以下):
offer: tap4fun游戏服务器(实习转正),疯狂游戏 游戏服务器,bilibili 音视频服务器开发,网易互娱 游戏研发,字节跳动游戏服务器。
简历未过:猿辅导
笔试放弃:多益网络,西山居,叠纸。
笔试挂:完美世界游戏服务器,百度C++开发(由于两天面了两次面试而且还都没睡着,笔试时候直接睡着了)。
面试放弃:搜狐畅游,腾讯QQ音乐后端(因为拿了字节就不去面了)
一面挂:Funplus
二面挂:米哈游,吉比特。
题主是从4月份开始找的暑期实习开始的。因为平时上课没有那么认真听讲吧(其实可能也只是期末爆肝几天看完书,然后分数还算高)。所以对一些名词的概念都有些印象。这个很重要,必须要快速读一遍书才行,不然是看不懂书的。
最开始找的方向是C++服务器开发,所以先看了看C++ prime这本书。然后配合牛客上的那本面经,就一直刷。看到不会就弄懂看到不会就弄懂,一般是要完全弄懂背后原理直到无法深挖下去才行。后来发现就C++好像不大行,于是再刷题巩固了数据结构+算法,然后操作系统+计算机网络(只能说基础很重要做服务器这块)。
不过我是没有刷过leetcode的,因为以前是有在学校OJ上刷题的,所以这个就省了,但是我觉得如果就刷leetcode肯定是比刷OJ效率高很多的。代码能力肯定要加强才行,不过leetcode是应试的最好手段了吧。
然后就是找实习了。这段时间是最难的,因为刷题会发现10题9题不会。然后又本着一定要深挖原理的思想,就弄的一题答案可能就那么多,但是会让知识点膨胀到爆。
以下为面经部分:因为没录音,所以就凭着印象记下来的,有些时间久远点的就忘记很多了有记起来的时候会进行补充,但是应该对大伙还是有帮助。
以下为找实习的情况:
offer:tap4fun
挂了的:吉比特(三面),好未来(一面),广联达(笔试),米哈游(笔试),华大(简历挂),莉莉丝(简历挂),欢聚集团(简历挂),元戎(简历挂),拼多多(简历挂),西山居(笔试Ak,然后挂),虎牙直播(简历挂),网易雷火(笔试挂),远景(简历挂),斗鱼(简历挂)
放弃面试的(因为获得offer了,以为不能毁约):网易互娱游戏研发实习生,深信服。
吉比特游戏研发
一面过,二面hr面过,当我以为我稳了之后,开始和朋友吹b后,并且感叹找工作这么简单的时候,第二天短信通知恭喜你xxx通过了hr面,然后加面,然后据说一起加面的都挂了。
以下是面经:
好未来
笔试ak了,一面挂,以下为面经:
1、Linux文本去重的命令。
2、Linux查看cpu占用率的命令。
3、Linux ps命令。
4、MySql 读写分离。
5、MySql索引建立了能干嘛。
6、MySql B+树介绍
7、MySql索引建立的原则
8、Redis了解吗?说一下有多少种类型(不会,不知道)。
9、C++ 友元是什么。
10、给了个项目场景,忘记了,后来一直展开这个。有点难,我没想法。
总体来说这家公司的面试我回答的很糟糕。MySql这个东西我本来就不大懂,所以就很难受的挂了。
Tap4Fun
也是我最后去实习的公司,是一家非常好的公司,网络上那些负面消息啥的起码我没遇到,公司965周六周日实习生比正式员工多很多,进公司第一天还请大伙吃了一顿大餐,我导师也是好人,身边小伙伴也都是很好,教我很多东西,hr也很专业,反正水平是有的一家公司,走的时候也请大伙吃饭,很看好将来的发展好吧。
这个面经就不准备给大伙看了,因为我觉得不太好,和吉比特一面难度差不多。
然后我就等着去实习了。其实期间还有网易互娱的面试和深信服的面试,因为我以为拿了offer就得去所以就放弃了。
实习期:
在Tap4Fun我是用Golang写了个游戏服务器,关键是必须要懂为什么要这样用,为什么用这个,这个方案有什么替代方案,其他方案优缺点,反正我是都了解了我才最终去用的。包括后来服务器基本完成后,我也是将Go语言各种特性学习了一遍,有gpm模型,go的gc方法,无缓冲管道有/无缓冲管道(如何实现管道),协程进程线程。然后就进行实习答辩,答辩完过了一天就通知,可以转正了,获得offer,把我开心坏了,我第一份正式offer就有这么高的工资,我直接躺下好吧,回家一直和朋友吹逼,我本来想就去这个公司的,因为这公司真的很好。
最后我们一组的大伙基本都去大厂了。有小米,米哈游啥的。
秋招:
我其实拿到offer后,就基本上不看面试题了,我听导师的话,看重构这本书,看游戏开发的方法,因为我是打算就去工作了。看了看服务器架构方法,非对称加密,对称加密,然后des,ras加密的流程,就多看书就好了。
我投简历就面笔试了,可能是因为简历上附带了游戏效果链接?
FunPlus一面:
时间有点久远,问了我30分钟。
项目介绍
1、Golang gpm模型。
2、protobuf的各种实现。
3、实现压缩算法的方法。
4、protobuf和json和xml之间的比较。
5、为什么protobuf解析速度快。
6、grpc。
7、怎么实现rpc。
8、推荐让人用Go,你要怎么推荐。
9、算法题:有两段数字,两段各自有序。然后找一个数字。就比如说 4 5 6 1 2 3,找4。
我只能先写个On的,然后和他说我知道有二分法的方法,可以到Logn,但是就给我这些时间我写不出来。的确需要刷leetcode才行啊!!原题概率太大了。
然后就直到现在也没消息。
疯狂游戏
很好的一家公司,做小而精的游戏,我后来一直觉得我应该就去这了。而且好像还对我挺看重的?技术栈我也喜欢Golang,给的钱也多,我第一次感觉钱只是数字的时候。
笔试AK。
一面:
一个很友善的小哥。
1、项目介绍。
2、粘包。
3、CPU超线程。
4、MySql 为什么B+树。
5、MySql索引。
6、LRU是什么,怎么实现的LRU,到具体细节。
7、排行榜怎么实现。
7、、场景题。感觉不是纯背可以解决的,我觉得像是项目中遇到的问题,让我想方案,然后我思考了挺久,想出来了,小哥说我的做法是业内的做法,我很震惊。然后就又开始不停出这种东西,我就一直想。前前后后面了一个多小时。
过了2分钟后,hr和我说过了,下一面是CTO面我。
二面:
非常博学的人,很强,广度高到离谱好吧。
硬件部分
1、CPU架构有哪些,你说说看。
2、4nm制成是指什么东西。
然后又是一个硬件的,我听都没听过,直接忘记。
编译原理
3、问我编译型语言和解释型语言的区别(正好研究过,狂说)。
4、C++编译器有哪些,区别在哪,只知道gcc和g++和他们的区别。
5、问了什么名词,蒙蔽。
6、蒙蔽。
计算机网络,自底向上。
物理层:
巴拉巴拉,一大堆。我没懂。我感觉那个时候口胡了很多,他有点不满意。
数据链路层:
很多东西,各种协议,实现的方法啥的。还有差错校验方法好像??
网络层:
ICMP作用,遇到错误怎么解决,报文格式。
各种协议,蒙蔽。
传输层:
TCP,UDP区别。
然后一堆协议。。。蒙蔽
应用层:
HTTP,https各种字段,和区别。
cdn协议。
还有很多名词忘记了。
算法:
基本上数据结构这本书看完,而且读的比较好就行。比较吃平时有没有认真读书。
这个公司我记得太少了因为太多了而且一直处于震惊,但是还是答了一大部分把,最后过了。这二面很吃你在校有没有认真读书,而且读完会不会深入。我每次反正只能答出来一点。
然后过了3分钟hr就通知我过了。
然后hr面了。然后又几分钟后又通知我过了。
然后晚上笔试百度,我记忆中,我把选择还是填空做完后,然后第一题A了后就睡着了好像。很艹。
然后第二天早上ceo面,几分钟自我介绍完,就结束了,然后就过了。
然后谈薪。就结束了。
然后还没9月,我就拿到了这份offer,我得瑟了好久,因为钱实在很多,很震惊。就基本上宣布全面放弃投递简历了,而且也拒那些工资更低的公司了。所以就只投了一些8月份投得公司。
吉比特:
这公司给挺多钱的,学长很多在里面,不过我感觉如果我拿了也会去疯狂游戏。
一面过,二面挂(和之前得总监一个人)
和实习时候面经差不多。这公司好像是有题库一样。不过把三面的问题有些推到一面问了,还要手撕代码了。一般是写个智能指针。acm获奖选手可以考虑,好像这个加分很多。
米哈游:
选择题很难我感觉很少人能对,笔试A ,1.8题/2题。然后自认为应用题写了个比较好的方案。
一面电话面狂问基础以下不按顺序,我最后记得答了20题左右,但是一共也就40分钟:
1、多态
2、虚函数怎么实现
3、虚函数表在哪
4、虚函数怎么做替换的
5、纯虚函数作用
6、为什么析构函数用虚函数
7、构造函数用虚函数会咋样。
8、快排思想
9、算一下快排复杂度,计算过程。
10、堆排
11、算一下复杂度。
12、归并
13、算一下复杂度。
14、函数后加const
15、time_wait
16、tcp四次挥手过程
17、为什么三次握手
.。。。还有几题忘记了,反正很多但是很简单,不过你往深的都能说。
二面:
给你四道算法题。我做了3题半吧,因为有一题不是最优解吧,最后一题是问我gcd怎么实现的,我直接搓出来了,然后他问我怎么推的gcd,我说忘记怎么推导了。
过了两周原神手机上线那天挂了。
网易互娱:
一面:
一面分为俩面试官搓代码的和问你题的。搓代码的还行,问我问题的面试官水平真滴不行,我只能说鱼龙混杂吧,很多次很想和他争论,而且不大听我说。会打断,体验巨差。
先让你搓代码,然后问你的节奏,1小时30分钟总共。以下不分顺序。
搓代码过了,然后一号面试官离开了房间,进来了二号面试官。
1、虚函数实现。
2、为什么析构函数一定要设置成虚函数。(我说了理由,然后说不一定要设置成虚函数,因为有些类在设计结构的时候不可能有子类了,这个时候不设置也行,然后就和我说怎么可能能确定啊?和我巴拉巴拉说了好多,我就说那编译器为啥不直接设置成虚函数咯?反正就这个时候开始了)
3、让我口述二叉搜索树,然后我说了遵循左边节点比根结点小,右边比根大,然后递归下去去构造树。但是遇到有序的时候会变成链。他就不知道什么是链,怎么变成链,我就解释有序都会偏向一侧,查找速度就是on了,就变成链表了,他就狂说反正也不听。就离谱,还说让我口述代码,我漏了一个就说,我们程序员要严谨。太离谱了。
4、然后问我计算机怎么表示小数,我说了IEEE标准+python方法+定点小数的实现。然后他说不对,是科学计数法。。。。太离谱了。
5、然后问我快排。我说了思想,还说了取中法和退化成冒泡,还有C++sort的实现方法。然后他就说你这个快排不太理解啊,我有点生气了,直接和他说我搓一个吧,然后2分钟后搓完给他看了。
6、二叉树前序后序中序遍历。我也懒得说,我直接说,我搓给你看就行了。然后搓完了。
剩下就不说了,这个面试官太艹了,我觉得和其他互娱得技术差太多了,这面经实在没用。如果有打分10分的话,我肯定给3分。
二面:
面试官直接迟到40分钟,我发邮件询问为啥啊,啥情况啊。然后和我说忘了我,然后过了一会到了。然后上来就是一个不好意思,看出来是交接的问题不是他的问题。而且应该是没准备题,所以问的很奇怪。
不过问的问题很有水平。都是项目中会遇到得问题。
1、大端小端。
2、粘包问题怎么解决的,具体实现。我这里说了Go 和C#的方法,以及C# windows上默认是小端。
3、自己写协议怎么设计,我答TLV格式的协议。
4、出了一个题问我,如果我写了一个函数,返回对象是一个指针,但是别人调用的时候忘记delete这个指针了,我要怎么做让别人不delete这个指针,还不会内存泄漏。我思考了一会说我可能go语言defer可以实现,然后说了思路。
5、然后让我在C++ 里面实现go语言的defer。(很难受,我答不出来,他循序渐进的给了好多提示很辜负面试官呀,最后我说我指定不行了,他说lamda表达式可以实现我才有点头绪,但是还是不行。)
6、然后出了一些协作开发时候会遇到的问题,比如说重复定义全局变量咋办,别人在这个文件里面定义了a,我也在这定义了a,我要怎么让这两个人语义都是清晰的。就比如说,我想让我文件里的变量,让别人用的时候是用我这个,别人在他的文件里面用的时候也是我这个变量。还有一种情况,我想让别人自己用自己的变量。我反正挺蒙的,而且还是只能用C写。我说static可以解决一种情况。或者写个文件,专门存全部人的全局变量。然后他说不够优雅,然后我就说可能没有更好的想法了。
7、如果C++ 类中有很多指针,在构造函数的时候对这些指针进行new初始化,但是new报错了,这对象肯定是不能用的,但是之前的对象已经申请了。我要怎么在new出现错误后,把之前已经申请的对象回收掉。我说开个标记数组,如果成了的话,就标记一下,如果遇到异常我就回退回去,把标记数组里面对象清空。然后就被否定了,说写的很丑,不行。
和大伙的面经差很多,而且都是场景题,这肯定不会出现重复的,怪的很。所以我也懒得写了。
8、后面还问了CPU局部性原理+CPU流水预测这种基础了。感觉也就这个可能会重复了。
我问校招生到底要懂什么才行,然后后面推荐我看深入理解计算机系统,给了我很多建议,是一个很好的面试官。
过了一个月收到offer。
BiliBili:
面试官人很好,面试体验很棒,据说如果进的话是我的leader?,我很想去这家公司。
一面电话面:
1、介绍项目(很久)。
2、redis了解多少。
3、跳表介绍一下。扩展说了做排行榜的时候用过,然后深入说了细节。
4、一些计算机网络的基础。TCP/UDP,然后TCP 头结构好像。忘记了。
5、time_wait做了啥。就离谱,我之前记得这个作用,然后当时忘记了,只能回答一个2msl的作用,然后说一下占用端口啥的,不然能说好多。
6、红黑树和avl树差别。
7、红黑树特性。
8、红黑树查找速度。
9、让我介绍一下我各个奖都做了什么。
10、反问:希望知道游戏服务器和音视频服务器的差别。因为我投成这岗位了,面试官可能也比较照顾我给我说了很多音视频开发的,还说如果实在不想做开发可以让算法的来面我一下,我就说就开发就行了。
二面:
1、自我介绍。
2、项目介绍流程,网络模型,消息结构,链接结构,工作池啥的。挺多
2、我的项目要是玩家掉线,要怎么重连,我解释了帧同步和状态同步的区别,以及各自的重连方法。
3、拆包封包流程,为什么要做这步,什么导致了粘包。
4、avl树是什么结构,让我说一下怎么插入,插入后怎么旋转。
5、旋转根据什么旋的。
6、close_wait是什么情况出现。
7、大量出现close_wait怎么办。
8、给建议,说服务器开发,底子要好,以后要改底层架构,需要基础扎实才行。
过了3-4天就接到hr电话说过了。
字节跳动:
这也是我最后去的公司,感觉这里刚刚发展起来可能更有挑战性?我也不知道我会不会后悔,或者加班到死。我这里就简单的发一些比较不常见的题吧,毕竟是我之后去的公司。
一面:
1、MySql数据库扩表方案,三种,预留字段,写成kv的形式再进行,行转列。例如 uid,key,value的表。然后进行行转列即可。还有看服务器开发大佬们常用的方法,写个新表,写三个触发器,然后闲暇时间将原表的内容插入新表,然后改名字就好了。
之后都是常规题,手撕代码比较难,没做出来。
二面:
1、问了碰撞检测的方法。答了挺多种方法的,物理碰撞,对固定的物体进行预处理,做双线性插值判断是否碰撞,对活物做AOI,或者四叉树算法。
2、数据库优化注册流程。
3、卡帧怎么处理。
4、怎么断线重连的。
5、帧同步实现方法。
三面:
1、Go的GC怎么做到并发的。(答了三色标记,和STW,分为清除和标记期,然后判断在扫描期结束后,对新对象进行标灰色,之后再re_scan就好了。)
2、让你设计一个varint。emmm不大行。
其实还有挺多的,一共三面合起来面了快3小时了,但是我觉得都是比较有新意的题,能和面试官很开心的讨论。
#面经##校招##吉比特##米哈游##网易互娱##疯狂游戏##C++工程师#