21级实习,游戏服务端开发/测试开发面经
为了准备面试我从牛客看了大量的面经,现在回馈给大家。
第一部分:我的背景
1.楼主背景:985硕士非CS科班,纯自学,21级,现在找暑期实习;
2.楼主方向:(C++)开发岗,具体方向不限。
3.楼主的项目是一个判题系统(oj),C/C++/go混用。注:这是我的个人项目,应用于学校同学间的算法题讨论,非公开;架构与技术难点参考github上多个开源oj。
4.自学内容为:算法与数据结构、操作系统(linux)、数据库(MySQL)、网络。语言为:主C/C++,且使用过go/python/js(这是因为我觉得C/C++写网站后端实在太麻烦了)
5.学习来源为书+视频(B站或公开课)+刷题。
力扣 https://leetcode-cn.com/u/blacksea3_nju/
牛客就发帖这个用户。
第二部分,多个公司的面经。
注意:第二部分正文≈6000字,看完耗时可能较长
1网易雷火:已offer
游戏服务端方向
笔试:4题,AC 2.73/4
一面 40min
0、自我介绍
1、概率题,给一个玩家男女比例,给一个男玩家的男女角色比例,给一个女玩家的男女角色比例,求女角色中的女玩家比例
2、strlcpy实现查错
3、判断题:给了一些表达式,判断哪些表达式可能是编译期求值的。涉及#define、const int、sizeof(一个struct)、template<>模板推导
4、给先序遍历和中序遍历,求后序遍历
5、C++多态有什么?静态多态和动态多态是什么
二面 40min
0、自我介绍
1、reactor和proactor的区别
2、同步IO和异步IO的区别、reactor和proactor中读取数据这一步是谁负责的
3、能不能kill发信号,信号和异步有什么关系,信号和多线程相关(有点记不清这个问题了)
4、MySQL事务
5、MySQL隔离级别,如何解决幻读
6、MySQL快照读
7、可重复读、读已提交区别,解决什么问题;可重复读是否解决了幻读
8、C++的类的复制拷贝要注意什么
9、C++智能指针相关
10、C++的cast
11、有什么要问的
三面 1h
1、项目主要技术点(proactor/reactor相关,多线程/多进程相关)
2、多线程同步问题,现在用了什么(条件变量+互斥锁)
3、有没有听过自旋锁
4、能不能不用锁(这里原子操作说的太模糊,面试官问我原子操作是什么保证的,应该是计算机的指令级别,我一开始说成内核了,后来又改回来)
5、父线程和工作线程如何通信,设立了什么队列,容量
6、网络编程:recv接受数据,当前包不全怎么办;如果因为延时,相同socket的多个TCP包非同时到达,怎么办。
7、能不能用UDP,UDP如何做到保证可靠性。
8、send返回值,如果一次写不下怎么办。
9、用MySQL有没有碰到过sql注入。
10、安全性:如何做到oj的安全性。
11、内存泄漏问题,C++有什么方法。
12、很大的代码框架,如何找内存泄漏。
13、是不是所有堆内存管理都是内核控制的。(这个没听懂具体是什么意思)
14、是一段代码,大概长这样
class C{ void f() {}; virtual void f2() {}; void ds(){ delete this; //这句话公共的 f(); //选项1 f2(); //选项2 printf(“%p”, this); //选项3 } }; C* c = new C(); c->ds();
分为三个问题:如果ds中只有delete this和f()会怎么样
如果只有delete this和f2()会怎么样
如果只有delete this和printf会怎么样
15、是否了解虚表
16、map和unordered_map区别,unordered_map如果散列冲突怎么办(链表和重散列)重散列如何实现删除元素
17、python/Go的内存管理(我就知道是自动管理的,别的不知☹)
18、为什么转CS,如何自学的。
19、还有什么问题要问的
HR面
1、有没有别的公司的面试,到了什么程度
2、平常是否玩游戏,玩多久;看直播多久;如何平衡游戏和学习
3、最令人自豪的事情
4、压力最大的时候
5、能实习多久
6、还有什么要问的
2腾讯,两个一面挂,一个二面挂,一个已完成
1 IEG 天美游戏开发一面挂
1h
1、 介绍项目难点。
1.1 追问:setrlimit 判断内存溢出原理
2 大概讲讲判题器架构(这是我的项目,自己做的oj)
3 判题器有时需要禁止用户乱输入:比如内部fork,如何实现。 其实我没实现:(
4 用到了socket,怎么用的,是否了解select,poll,epoll
5 C++如何实现函数名相同参数不同可以识别的。
6 C++动态多态如何实现,虚函数原理。
7 问我STL的sort是不是稳定排序。
7.1 追问:假如给一个不稳定排序的函数接口template<typename T>sort(vector<T>& v)
,怎么包装一下让他能稳定排序,不要自己写sort,不能修改内部函数。追问优化方案
8 给一个地图,有障碍物,有空地,有一个起始位置,有多个目的地,写程序获取最近的目的地,如果有好多个,随意输出一个。这个题目要分享屏幕,裸打,不运行。(就是BFS)
2 PCG,某个部门 数据方向 一面挂
1h
1、 自我介绍
2、 项目介绍,难点
2.1、追问:是否测试服务器负载,最大连接数。
2.2、 追问:如何提高并发。
3、 数据结构:解释一下平衡树和红黑树(我不知道平衡树就是AVL)
3.1、 面试官打断了,好像不满意,追问:红黑树插入一个节点要做的操作。
4、 数据库:给一个表:class 有学号,数学语文英语分数,给sql得出每个排名前三的
4.1、 追问:是否可以优化
5、 数据库:接着上面的问题,得出语文第三名
6、 有什么要问的
3 CDG,数据方向,二面挂
一面电话面,50分钟
1、自我介绍
2、C++ new/malloc区别
3、析构函数/构造函数能不能是虚函数
4、类有哪些默认成员函数,并追问:移动赋值和拷贝赋值区别
5、如果类中要动态分配内存,设计上需要注意什么
6、vector和list区别,应用;追问:如果有一些数据需要大量查询,用哪个容器;追问二分查找原理
7、map底层实现,介绍红黑树,我把它相对于平衡树优势也说了
8、TCP握手/挥手过程
9、select和epoll区别,仔细追问了各自的优势
10、问我有没有项目使用epoll
11、开放性问题:如何提高项目的并发
12、开放性问题:设计一个系统,存放大数据:例如有18亿用户,有唯一ID,有其他信息,如何操作它们
13、有什么要问的
二面视频面,1小时
1、自我介绍
2、C++ 类有哪些默认成员函数?
3、 C++ new/malloc区别?
4、堆和栈区别,包含数据结构和内存分配
5、浅复制和深复制的区别。
6、vector底层实现。
6.1 追问:vector删除一个元素,会发生什么
7、map底层实现。
8、map的遍历删除。
9、 描述几种排序算法
10、linux:如何删除某个文件的某一行?
10.1 追问. 有个文件有:a|b|c|d|e,如何输出c?
11、linux子目录怎么实现的
12、 线程同步方式
12.1 追问:pthread_mutex锁类型,还有什么锁同步方法?
12.2 追问:进程同步方式
12.3 追问:IPC方式
12.4 追问:共享内存如何同步
13 fork作用,有什么返回值
13.1 追问:fork后那些数据被复制到子进程
14、 linux网络服务端,需要哪些系统函数(指系统调用)?
15、recv如何判断读取完毕?
16、select和epoll的区别?
17、epoll有几种触发类型——边沿触发,电平触发,具体介绍
18、网络服务器设计模型?
18.1、追问:为什么要多线程,单线程不行吗?
19、MySQL,底层引擎区别,各自场景
20、聚类索引和非聚类索引区别。待查询
21、 事务(ACID),解释
22、隔离级别
23、有什么要问的
4 IEG北极光,游戏后台,已完成
一面前来了个笔试:笔试,设计一个链表(模板),实现它的一系列方法(可以参考:STL的list都实现了什么方法),再实现一个模板类(前面链表的派生类,内部额外实现reverse和sort方法),测试。花了两个半小时彻底地写完了。
一面: 1h
1.介绍项目架构(这个和我项目有关,有的描述也许不清楚)
1.1 多线程的作用
1.2 epoll和select区别
1.2.1 追问:epoll的两个触发
1.2.2 追问:recv怎么确保读完了
1.2.3 追问:如何设置非阻塞recv,
1.3 客户端是啥(就是问我的oj的客户端是什么,咋用,其实就是浏览器)
1.4 网站服务器是啥(就是问我是不是go的HTTP服务器)
1.5 MySQL数据库的表怎么设计的
1.6 go和cpp传输,用了啥数据格式
1.7 有没有碰到大小端的问题,我答没碰到,但是描述了大小端区别(实际上我好像碰到这个问题了,当时没反应过来)
2.linux/操作系统
2.1 ls -l 有啥(说到文件权限就OK了)
2.2 堆和栈的区别
2.2.1 追问:堆空间最大大概3G是什么意思(这个我说的不准确的噢)
2.2.2 追问:能不能改栈空间大小,怎么改
2.3 软链接和硬链接的区别
3.C++/C基础,问了一大堆问题
3.1 new和malloc区别
3.2 virtual干啥的,举例子
3.3 对着我的笔试代码问的:为什么模板类的实现写到cpp文件里面,链接时找不到方法实现?
3.4 C/C++编译流程
3.4.1 追问:预处理会做什么
3.5 函数重载overload/重写overwrite区别(没答上来,没反应过来)
3.5.1 面试官告诉我重载的含义,问我有没有用过,还问不同返回值类型,其他相同,能不能重载
3.5.2 再问:类中能不能出现xxxx func() const这种写法,const干啥的,能不能重载
3.6 C++11新特性(我说了auto,nullptr,array模板类,哈希表和对应的模板适配器)
4.其他
4.1 实习能不能留下来
4.2 实习多久
4.3 能留下来的话啥时候毕业到岗
二面:45min
1、项目介绍
2、看过哪些开源项目
3、如何自学
4、有什么想问的
三面:1h
1、项目介绍(就说了个名字,被打断了)
1.1、项目内存模型(没听懂☹),然后面试官开始详细问
1.2、多线程竞争同一块内存怎么做的
1.3、任务队列怎么用的
1.4、为什么用epoll,用的哪个模式,为什么,会有什么问题,举个有问题的场景
1.5、TCP多线程服务器是怎么和多进程判题器通信的,为什么选那种IPC方式(我说的有点儿遗漏,这里回答不好)
1.6、项目的应用价值
2、都学过哪些专业课,自学的吗
3、拿了哪些地方的offer,有哪些地方在面试,如何选择
4、如何看待游戏开发
5、实习时间
HR面:30min
1、拿了哪些地方的offer,有哪些地方在面试,如何选择
2、为什么要转CS
3、什么时候压力最大
4、实习多久
3美团 测试开发一面 50min
1、能实习多久(我这个部门要>=三个月呢)
2、介绍项目,包括项目应用,架构
2.1、项目难点(涉及多模块错误定位、多线程多进程竞争问题(死锁之类的问题))
3、网页上的搜索框中的搜索功能如何测试
4、HTTPS与HTTP的区别
5、是否了解Linux命令(我猜可能要问流文本编辑器,然而我恰好不擅长,我就说我不太会流文本编辑器,就不问了)
6、智力题:12个小球,外观一样,只有一个球偏重或偏轻;有一个天平,能用来称最多三次,天平没有砝码;问是否有方法称出是哪个小球质量不一致,并且搞清楚它是偏重还是偏轻。
7、javascript基础问题(我听到这个就说了我没有完整学过它,然后就没问)
8、网站前端用的什么框架,bootstrap的特点
9、有什么要问的
4字节 广告部门 测试开发
第一位面试官: 5分钟
询问了:对测试开发岗的理解,为什么选择测试而不是开发,可以的实习时间。
面试官提到了(业务)测试,(我当时并不了解)
面试官说问问别人要不要面试我,就下了
第二位面试官: 1小时
1、C++申请内存的方式有哪些?
2、 什么是指针和引用,有什么不同
3、封装,继承, 多态 概念
4、不申请额外空间,交互int a和int b的值
5、[4,6,7,1,2,3,5,10,11...],对数组进行奇偶排序,奇数在前,偶数在后,奇数和偶数内的元素相对位置需要跟原数组的位置保持不变(我先后给了三方法,面试官想要最后一个)
5.1、申请额外一个数组,扫描两遍
5.2、数组只扫描一遍(o(n)) 借助两个数组
5.3、限制不允许申请数组(就是空间复杂度O(1)),时间复杂度不限
6.有什么要问的
第三位面试官: 45分钟
0、自我介绍,为什么报测试开发岗。
1、HTTP协议基于什么协议。视频面试基于什么协议
2、TCP和UDP什么区别。
3、TCP如何检验差错?
4、数据库left join/right join/inner join/full join啥意思
5、题目:给一个非递减数组,找出某个元素的最后一个下标,没有的话返回-1。(可能有重复数字哦)
6、如何测试这个第5题函数,给测试方法和用例,实现一下测试
7、如何测试app的登陆界面:假如要输入邮箱和密码。
8、有什么要问的
第一位面试官:45min
到这里可以看出来了:一开始那位面试官是主管,一开始那个算简历面?
0、自我介绍,为什么报测试开发岗。
1、针对第二位面试官的问题:请问你理解的指针本质是什么,如果我说指针本质是一段内存,对不对?
2、针对第三位面试官:数据库看来很了解,请说一下索引底层怎么实现,应用场景
3、问我操作系统会不会(当时我还不怎么会噢,我就拿着我的项目描述了都学了关于操作系统的什么方面)
4、题目:int型数组A,对于任意下标ij,满足i>j,求A[i]-A[j]的最大值。(就是leetcode有个股票的那题的修改版本,相当于只允许买卖一次股票,且必须买卖一次股票)
4.1、现在要测试这个函数:怎么测试
5、有什么要问的
HR面试 45分钟
1.自我介绍。
2.聊天:疫情封路相关。
3.聊天:为什么转软件开发。
4.测试开发岗的理解
5.有什么要问的。
5阿里 中台测试开发
笔试 A: 1.15/2
特别注意:我发现阿里的笔试错误之后不告诉我具体错误类别(我的TLE和WA是一种报错,都叫通过0.00%的测试用例)。并且很多公司笔试都是这样!。
简历面 1h
1 介绍一个项目,1.1-1.8问题都是项目衍生出来的
1.1进程间如何通信
1.2为什么一定要一个多线程TCP服务器和一个多进程判题器
1.3线程和进程的区别
1.4 如何判断超时/超内存等错误
1.5 如何实现多语言判题
1.6 是否引入沙箱
1.7 如何测试:多线程/多进程的同步效果。(我大概提了提,和乐观锁很像,又引入坑)
1.7.1 乐观锁是什么,如何实现
1.7.1.1 数据库中,乐观锁需要加什么额外字段
1.7.2 悲观锁又是什么
1.7.3 CAS是什么,CAS相对于上锁来说好处在哪,CAS会有什么问题(最后这个我不知道,面试官说查一下ABA问题)
1.8 面试官给总结说:我刚开始项目简要功能都没介绍,建议一开始先就说清楚项目的主要功能,不要直接讲细节。
2 基础知识
2.0 计算机里面的浮点数为什么会有精度问题
2.1 数据库索引如何实现
2.1.1 为什么要B+树
2.2 开放问题:为什么要做软件测试
2.2.1 我如何对多线程TCP服务器进行的测试,用的什么软件,测试哪些指标
2.3 开放问题:测试开发是什么
2.4 开放问题:分布式系统是什么,为什么需要分布式
2.5 笔试题:第一题咋做的
3 其他问题
3.1 都用过哪些技术网站,举出三个例子
3.2 实习多久
3.3 有没有论文或者实验室项目(论文有是有,是我自己专业的emmmm,不是计算机科学/计算机工程等方向的)
一面 1h
1 自我介绍
1.1 项目难点(多模块同步,错误定位)
1.2 现在进行了什么测试(正确性测试、一部分压力测试)
1.3 还可以进行什么测试(数据库并发、前端部分、用户体验部分)
1.4 现在有一部分是手动测试,能不能全部改用Jmeter自动测试,能不能自己实现测试系统(其实就是问测试系统的实现方法,比如Jmeter内部怎么实现的)
1.5 项目细节问题1:判题的稳定性和正确性到达什么程度,如何保证
1.6 项目细节问题2:多线程同步/共享数据如何实现(共享:堆内存,现在同步方法:互斥锁,还可以同步方法:自旋锁、条件变量+某种锁(惊群效应)、读写锁)
1.7 项目细节问题3:是否碰到死锁,如何解决。(回答了死锁出现时的4个情况,可以通过避免某个解决,举例说明了去掉获取和等待的条件,但是有时会出现振荡问题(类似哲学家就餐问题))
2 其他问题
2.1如何自学的,描述一下自学方法。
2.2 每天学多久(如何平衡科研和计算机知识自学)
2.3 为什么要从事计算机行业
2.4 为什么不硕士就转计算机
2.5 有什么想问的。主要问这个部门里面的技术栈,了解到是java那一系的
二面 50min
好像全是非技术问题??
1、简单介绍一下发的论文(我硕士的一篇论文,用通俗易懂的话解释)
2、都做了什么,有什么创新点,自己有什么贡献
3、如何分配时间来自学
4、学习排名,本科和硕士
5、为什么硕士读现在的专业,以后要做什么,为什么又要转了。
6、使用github/gitee来做什么
6.1、追问:下一个项目版本主要解决什么问题(我这个说了太多细节的,面试官说不需要那么细节,就打断我了)
7、有什么想问的,我问这是什么面试,面试官说这是综合素质面试。
三面 1h(交叉面?)
1、自我介绍
2、项目介绍,用了什么架构
3、学习排名,本科和硕士
4、以后要做什么,为什么要转行。
接下来是多个技术问题/开放性问题
5、进程和线程的定义,区别
6、并发编程的优势和缺点
7、设计一个银行转账系统,表如何设计,业务逻辑是什么(除了正常的,我还提到看情况需要支持事务(引入回滚))
8、假如有1亿个请求到来,系统有什么问题(面试官告诉我这些是请求,不一定合法,说这是宽泛问题让我说的越多越好)。
(我实在不知道怎么说,就乱说一通,啥都说):
我提到了:系统级:全是合理请求会怎么怎么样、假如这是DDoS攻击会怎么怎么样、sql注入
数据库级别:后台对数据库的连接多(导致数据库性能下降(CPU占用高,磁盘IO多))、分表(水平分表)出现的必要性、并发下的问题(举了个例子,需要加事务,但是这里紧张了,具体例子描述(并发读写顺序举得不典型))
9、你觉得阿里的笔试难不难;有没有对没做出来的题目复盘。(个人柑橘leetcode medium-hard难度≈cf div2 5题时的 C题难度)
10、技术的倾向(以后工作想做什么类的技术),答后台开发(宽泛开发岗都可以),特地强调了测试开发是可以的,解释了测试开发的特点
11、有什么想问的。
四面 HR面 30min
就通常的那些问题,前面都有,不列了。