2025 暑期面经整理
这段时间高强度面试,腾讯、字节、阿里和快手总共十几轮,最终幸运地拿下了腾讯的 Offer,今天得空整理一下面经
腾讯-WXG & 微信输入法
一面(处女面)
- 耗时:1h
- 自我介绍
- 做题: 四点正方形 (边界条件没想出来面试官一直在提示我 X﹏X)
- 做题: 二叉树球深度 用递归和迭代求树的最大深度,时间复杂度空间复杂度
- 问操作系统的进程线程区别
- 问 C 语言中 static 关键字
- 做题:
void AlignedMalloc(size_t size, int aligned)
和AlignedFree(void* data)
,抽象 - PS:做不出来面试官会提示,边界条件没考虑会让你再想想。面完感觉我还是太紧张了答都答不好,他说还有吗,我都想回句不知道。后面面试的时候得想好了再张嘴。八股还是准备的不充分
二面
- 耗时:45min
- 问项目,因为我的项目都是学习练手的项目,他问我你有觉得哪些地方做得不好,需要改进的/做的不够漂亮完美,还可以更好的
- 我讲 HTTP 协议解析时耗时很长,发现原因是大量的字符串创建操作,通过换成
string_view
来提高,还有时间轮如何处理长连接 - 面试官问我长连接该怎么设置,如果有永久连接该怎么处理
string
底层实现,短字符串优化,如果让我设计一个string
模板类,该怎么做。sizeof
字符串大小是多少,问我知不知道span
- 我讲原先的项目不支持 HTTP/1.0 协议,使得
ab
和webbench
无法正常工作 - 问我 HTTP/2 比 HTTP/1 好在哪
- 问了解 Protobuf 吗,有哪些平替
- 问如果定义了 1234 四个字段,但某一端没有 4,它会怎么处理数据,是丢掉还是怎么办?知道 Protobuf 是怎么压缩的吗?Protobuf 版本知道吗?
- 知道 ZooKeeper 吗?负载均衡的一致性哈希,如果一台机器挂了,它的流量会分到哪里?
- 我讲 HTTP 协议解析时耗时很长,发现原因是大量的字符串创建操作,通过换成
- (第二个项目是数据库相关)知道哪些数据库?我把当时想到的都说了,Redis,MySQL,PostgreSQL,MongoDB 啥的
- Redis 的数据结构
- 场景:面对面建群,用户向后台申请一个随机数,其他人都输入这个随机数,并且有一个时间窗口,比如 5 分钟。如何确保这个随机数 5 分钟内有效且唯一,如果用户可以主动释放呢
- 做题:给一个
string
,输出所有合法的 IP 地址,比如11111
有1.11.1.1
、11.1.1.1
等合法的地址 - 问表现:看不出来啥,书本知识掌握的挺不错
面委面
- 耗时:1h
- 总体来说比较折磨,其实和我准备不充分有很大关系,面试前两天光顾着看 ZooKeeper 去了。面试官先问的我的第一个 RPC 项目,问 epoll 的实现,我只说了红黑树链表这些,“多路IO复用”这个词当时就没想到,然后问 epoll 的 ET 和 LT,ET 能不能用阻塞,LT 能不能非阻塞,之前没考虑过把我问傻了;然后是 Reactor,我用的主从reactor,面试官问我能不能不用主 Reactor,全是从 Reactor 行不行,面的时候说留个全局队列把新连接放里面再消费,后面自己看的时候感觉面试官想让我往类似 Nginx 的形式上靠,然后还问了网络传输大小端是怎么回事之类的
- 结尾反问的时候我想让他评价一下我的表现,他反过来让我来个自我
HR 面
- 耗时:35 min
- HR 非常友好。先自我介绍,然后面试官让我讲讲本科为什么没有实习,我想分享哪些自己的有点,困难挫折啥的,我还夸了夸前几轮的面试官,职业规划是什么,顺带问了问我的家庭情况,整个过程非常舒服,一点压力没有
- 像优缺点之类的常见的问题还是得准备下,到面试的时候使劲说就行
字节-电商
一面
- 耗时:1h
- 自我介绍
- 挑一个最熟悉的来
- RPC 项目哪些模块,问了下时间轮超时模块,什么是 Reactor,负载均衡的一致性哈希有没有并发问题
- CMU 15445 的数据库和 MySQL 的区别,数据库一般有哪些模块
- MySQL 索引相关
- 一个 SQL 的题,问索引
- 做题,最长非重复子串
- PS:面试官感觉不太懂 C++相关的,业务做的多,但是我不了解业务的
二面(凉)
- 时间:2025/03/12 16:00
- 自我介绍
- ZooKeeper 服务注册原理和复杂均衡原理
- 如果 ZooKeeper 部分服务节点出现问题,客户端该如何调整避免请求到不可用节点
- 解释 HTTP 协议通信原理。TCP 和 UDP 什么区别,UDP 的特点,粘包拆包,有哪些网络劫持的方式(中间人攻击,DNS 劫持啥的)
- 数据库实验中的 Top-N 怎么做的
- 讲讲写时复制
- RPC项目中那个时间轮怎么实现的
- 如何使用 Linux 工抓取网络的请求包?如何查看服务器的 TCP 连接状态及并发请求数?如何在服务器上查找包含特定字符串(如 8080)的文件?如果要将文件中的 80 替换为 8080,该怎么做?在 Linux 中,如何回到命令行最前面
- Redis 支持哪些数据类型?实现过期的策略有哪些?Redis 系统扩容会发生哪些操作?
- MySQL 支持哪些引擎及各种特点?查询语句中,如何判断索引是否被执行?
- 列举一些稳定的排序算法
- 做题:0~9十个数随机排,重新排序,使得新的数刚好比原先的数高一点,比如
1 3 9 0 8 5 2 6 7 4
对应的输出是1 3 9 0 8 5 2 7 4 6
,刚好大了一点。做的时候没有考虑边界情况 - 反问
- 最后应该是岗位不匹配,给我挂了。过了不到一周又被数据库部门的捞了
字节-数据库
一面
- 耗时:53 min
- 自我介绍
- 问都是课程项目吗,项目中具体做了什么
- 第一个项目的目的和背景,该项目想要和市面上现有框架相比实现什么目标(?)
- 为什么使用协程,这是这一个方向的通用解决方法吗
- 三种负载均衡各自的优缺点,讲讲一致性哈希的实现原理
- 问那个数据库是什么名字
- Copy-On-Write Trie 是什么,目的是啥,有啥好处?(锁住根节点相当于锁住整颗树)
- HyperLogLog 的实现原理,为啥要自己实现(这是课程布置的实验啊)LRU-K 页面置换算法基本原理,用到了哪些数据结构
- 缓冲池如何插入数据,口述下已满和未满的情况
- 可扩展哈希是什么,用例子讲讲怎么扩容的(口述的时候感觉好抽象,没有图很不方便),有和其它的哈希做过对比吗(可扩展哈希就是个存数据的结构啊)
- 这个项目中 index 和数据文件有何关联(类似 InnoDB 那样存一起的)
- 解释一下 JOIN 的语意和分类
- 还有哪些解决问题的过程想要分享?
- 数据库优化实验中,是如何发现性能瓶颈的?
- 反问
二面
- 耗时:1h15min
- 自我介绍
- 共享屏幕打开编辑器,写个多态的代码,然后让我将头文件拆一下,拆了几个文件后用
g++
命令行编译运行一下。然后问链接了解吗?Debug 模式和 Release 模式的区别,Release 的优化做了哪些 - 问 RPC 项目,讲讲网络编程有哪些结构(从 socket 多线程讲到 IO 多路复用),问协程怎么实现的,汇编用的什么版本
- 问 CMU 实验,数据库的文件存成什么格式的文件,
SEQSCAN
怎么实现的,优化了解多少?SEQSCAN
和INDEXSCAN
啥区别 - 操作系统实验,讲下系统调用是啥,
mmap
怎么实现的,有什么作用 - 代码,写堆排序,写了老半天才写出来 😭,问我堆排序相比快排有哪些优点
- 我一边写代码他一边让我反问
阿里云-CDN
一面
- 耗时:1h18min
- 自我介绍
- 问我读博还是工作的想法(一头问号)问导师情况,问本组科研体系(啊???)为什么对深度学习方面没有特别热衷?实习时间和毕业论文准备情况,毕业论文题目是啥?平时处理图像用什么库和数据集?学校是否有发小论文的要求?本科阶段有相关研究经历吗?导师是怎么选的
- 是如何了解到 CDN 团队并决定投递的?(我也不晓得啊)你对 CDN 感兴趣的原因?CDN 有哪些难点,最感兴趣的是什么?
- 计算机网络有何机类?有没有研究过网络测量,优化算法等方面知识?最近关注了哪些网络领域的前沿动态?
- 学习过程中,有没有遇到过特别具有挑战性/印象深刻的计算机相关项目?
- 简历项目做的过程中遇到的问题。火焰图怎么做的,为什么要在 RPC 项目添加 ZooKeeper,口述如何设计 RPC 事件处理模型。HTTP2,HTTP3
- CMake 的历史和发展可以讲一下吗,干什么的(?)
- 服务程序在服务器上长时间运行后突然停止,该如何排查
- 详细介绍 HTTPS 的安全传输
- 如何发现并排查内存泄露,还知道哪些代码检查的工具。
- 做题:给一个有序的每行都是IP 地址 - 地名格式的文件,输入 IP 地址查到对应地名信息(简单二分)
- 反问。总的感觉不太对口,后面先面着再说吧
二面
- 耗时:1h13min
- 大约何时能参与实习,实习时长是多久? 已经进行了多少次面试?有心仪的公司吗?实习地点有什么要求吗?
- 介绍一下自己
- 操作系统实验
- 关于操作系统实验,具体工作内容能否展开说明一下?
- 操作系统实验中包含哪些基本原理?(文件系统、内存管理等)
- 了解的进程调度有哪些类型?
- 是否可以自定义按优先级进行调度的编程接口?
- 进程间互相交互的方式是什么?这个系统是否支持网络功能?
- 在该系统中,进程间通信的方式有哪些?
- 系统调用相关的机制是怎样的?
- 所有系统调用都使用相同的中断吗?
- 系统调用表中包含的内容有哪些?
- 触发系统调用的中断与定时器中断、键盘鼠标中断等是否一样?
- 系统中的中断向量表是什么?
- 缺页中断的原理是什么?
- 页表大小是多少?
- RPC 项目
- 主从reactor是如何工作的?
- 协程在你的模型中起到什么作用?
- 线程与协程之间的关系是什么样的?
- 这些协程之间的调度关系是怎样的?
- 当某个连接上有大量耗时的数据处理操作时,是否会阻塞其他连接?
- ET 模式是什么?
- 主要使用 C++ 编程
- 还有其他语言吗?
- 讲一下智能指针
- 你了解 Rust 编程语言吗?
- C++ 中是如何做类型转换的?
- 在 C++ 编程过程中,这些类型转换操作常用吗?
- 如何将子类转换成父类?
- 数据库实验,在数据库相关的工作中做了哪些事情?
- 日常使用中如何调用数据库的?
- 对于 Linux 系统的日常使用和开发工具熟悉到什么程度?
- GDB 调试多线程?
- 对 Redis 有何了解和使用经验?
- 是否介绍了团队情况?
- 对于AI了解程度如何?
- 这些实验和项目是独立完成还是与他人合作完成的?
快手
一面
- 耗时:55min
- 自我介绍
- 直接问 CMU 15-445 做了什么,挨个讲。LRU-K 算法怎么实现的,并发怎么样,为什么用互斥锁,有哪些锁,死锁条件,死锁检测方法有哪些,讲一下银行家算法。仔细扣可扩展哈希,怎么扩展的,怎么缩容的,并发能力怎么样,和其它哈希的对比
- (操作系统实验)讲讲什么是内中断,中断有哪些
- 做题
- $n$ 个节点的二叉树总共有多少种
- $[1,N]$ 范围内的 $N$ 个数,统计每个数出现的频次,要求时间复杂度 $O(N)$,空间复杂度 $O(1)$
总结
花了一个月的时间总共面了 11 轮,整体面下来,感觉各位面试官对基础知识的考察还是比较多的。至少我在简历上写的内容,都需要能自己说清楚,每个项目做了什么东西,也要能有条理口述出来,让面试官快速理解
基础知识的掌握还是很重要,像操作系统的概念、还有网络编程相关的内容都要好好看,好好抓。当然 C++ 的语言特性也要花一些时间看看,像 STL 还有智能指针这些的八股也要非常熟悉。当时腾讯在约一面打电话时,就开始问我了解哪些智能指针了
除了这些,项目也得打磨打磨,至少要有一些“自己做的”改进和优化,虽然说 WebServer 都烂大街了,但这个项目还是有价值的,我做的 tirpc 基本也就是 WebServer 那一套,要我现在推荐项目的话,我会推荐 sylar,这个项目确实比较难,可以不做,但可以看看它有实现哪些功能,参考着用到自己项目里,讲道理 sylar 这个项目如果完全搞懂了项目这块还是很稳的
然后就是数据库这些,建议把八股好好看看,Redis 和 MySQL 只要是开发,感觉都绕不过去。Redis 的数据结构,网络模型之类的都要清楚。MySQL 要把索引什么的搞懂,这块具体问了些什么可以看我上面写的面经。但愿别出场景题
至于学习资源,我推荐看 小林 Coding,相对来说内容还是比较全的,复习应该够用了。唯一不好的可能就是内容太多,赶时间可以直接看小林整理的面试题。除了小林外,JavaGuide 其实也不错,这两个对照着看感觉就差不多了
虽然只面了 4 家,已经能感觉到 C++ 就业面的狭窄。只有腾讯的是 C++ 后端开发,字节和阿里的都是有些偏门的方向,感觉进去了也不好转。私以为造成这种状况的原因还是因为 C++ 和具体业务的距离有些遥远,字节电商挂应该就是我没做过业务的工作。如果学 Java 那一套,SpringBoot、MySQL、Redis 还有消息队列那一套下来,肯定是要接触对应业务场景的,不过这些对于 C++ 来说都有些遥远。不管咋说,实习暂时是找到了,看看公司里面是啥情况。学习肯定是不会停的,现在想着是把 Golang 还有分布式之类的都要看看