腾讯后端开发面经(2024 校招)
岗位:后端开发工程师(IEG 游戏技术中台)
背景:211 本科 + 港硕 CS,主语言 C++,一段腾讯日常实习
结果: offer,评级 T9(校招标准 offer)
时间线:9.1 投递 → 9.10 一面 → 9.17 二面 → 9.24 三面 → 10.8 HR 面 → 10.15 offer
一面(技术基础,1h)
腾讯的一面通常由小组内的资深工程师负责,偏重基础和编码能力。
算法题(30min)
LeetCode 215. 数组中的第 K 个最大元素
要求时间复杂度优于 $O(n \log n)$。我使用快速选择(Quickselect):
import random
from typing import List
def findKthLargest(nums: List[int], k: int) -> int:
def partition(left, right, pivot_idx):
pivot = nums[pivot_idx]
nums[pivot_idx], nums[right] = nums[right], nums[pivot_idx]
store_idx = left
for i in range(left, right):
if nums[i] < pivot:
nums[store_idx], nums[i] = nums[i], nums[store_idx]
store_idx += 1
nums[right], nums[store_idx] = nums[store_idx], nums[right]
return store_idx
def select(left, right, k_smallest):
if left == right:
return nums[left]
pivot_idx = random.randint(left, right)
pivot_idx = partition(left, right, pivot_idx)
if k_smallest == pivot_idx:
return nums[k_smallest]
elif k_smallest < pivot_idx:
return select(left, pivot_idx - 1, k_smallest)
else:
return select(pivot_idx + 1, right, k_smallest)
return select(0, len(nums) - 1, len(nums) - k)
追问:如果要找 Top K 个元素,而不是第 K 个,怎么做?(小顶堆维护 K 个元素,或者修改 Quickselect 记录分割点)
C++ 基础(20min)
std::shared_ptr的引用计数什么时候会增加?(拷贝构造、赋值、shared_from_this)std::move和std::forward的区别?(前者是无条件右值转换,后者是条件完美转发)- 虚函数表的内存布局?(单继承只有一个虚表指针,多继承有多个虚表指针)
volatile关键字的作用?为什么多线程编程中不建议使用?(防止编译器优化,但不保证原子性和内存顺序,应使用std::atomic)
操作系统(10min)
- 进程和线程的区别?
- Linux 的
fork()之后父子进程共享什么?(代码段、只读数据共享,堆栈独立;写时复制)
二面(项目 + 网络,1h)
二面面试官是后台架构组的 leader,问题范围更广。
算法题(20min)
LeetCode 3. 无重复字符的最长子串
滑动窗口模板题:
def lengthOfLongestSubstring(s: str) -> int:
char_set = set()
left = 0
max_len = 0
for right in range(len(s)):
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_len = max(max_len, right - left + 1)
return max_len
追问:如果字符串长度是 $10^8$,内存敏感场景下如何优化?(用数组代替 HashSet,ASCII 128/扩展 ASCII 256 个元素)
网络协议(25min)
- TCP 三次握手的过程,每次握手发送的报文内容?
- SYN (
seq=x) → SYN-ACK (seq=y, ack=x+1) → ACK (seq=x+1, ack=y+1)
- SYN (
- TIME_WAIT 状态的作用?
- 保证最后一个 ACK 能被对端收到;同时防止旧连接的报文干扰新连接(2MSL 等待)。
- TCP 和 UDP 在游戏场景下的选择?
- 答:状态同步用 TCP(可靠),实时位置同步用 UDP(低延迟),腾讯很多游戏用 KCP(基于 UDP 的可靠传输协议)。
- HTTP/1.1 vs HTTP/2 vs HTTP/3?
- HTTP/2:多路复用、头部压缩(HPACK)、服务器推送
- HTTP/3:基于 QUIC(UDP),解决队头阻塞、0-RTT 握手
数据库(15min)
- MySQL InnoDB 的索引数据结构?(B+ 树)
- 联合索引
(a, b, c)的生效情况?- 全值匹配、最左前缀
a、最左前缀a,b - 失效:
b,c(缺少a)、a,c(跳过b,c不走索引)、范围查询后列失效
- 全值匹配、最左前缀
- MVCC 的实现原理?(Read View + undo log + 隐藏列
trx_id、roll_pointer)
三面(GM 面,45min)
三面是部门 GM(总经理)级别的面试,几乎没有技术细节,全是宏观问题。
开放性问题
- 你如何理解"技术驱动业务"?举一个例子。
- 答:在实习中通过 A/B 测试框架优化推荐策略,将转化率提升 12%。
- 如果游戏服务器的延迟突然从 50ms 飙到 500ms,你会怎么排查?
- 答:分层排查——网络层(ping、mtr)、系统层(CPU、内存、IO)、应用层(GC、锁竞争)、数据层(慢查询、锁等待)。
- 你对做游戏后台技术怎么看?跟你实习过的互联网行业有什么不同?
- 答:游戏后台更强调实时性和一致性(虚拟道具不能出错),互联网更侧重高可用和可扩展。
产品思维
面试官突然问:你觉得《王者荣耀》的服务器最高峰一般出现在什么时候?为什么?
- 猜周末晚上 8-10 点,因为有排位双倍积分活动和社交高峰。
HR 面(25min)
- 期望 base 地?(深圳/广州)
- 兴趣爱好?(答篮球,面试官说 IEG 很多球友)
- 对加班的看法?(坦诚回答:项目关键期可以接受,但希望有合理的节奏)
WXG vs IEG 面试对比
我还投递了 WXG(微信事业群),二面后挂掉。两边对比:
| 维度 | WXG | IEG |
|---|---|---|
| 算法难度 | ⭐⭐⭐⭐⭐ Hard 题常见 | ⭐⭐⭐⭐ Medium 为主 |
| 技术深度 | 极深,追根究底 | 广泛,面广 |
| 项目关注 | 非常看重开源贡献 | 看重实际工程经验 |
| 面试氛围 | 压力面,连环追问 | 较轻松,像聊天 |
WXG 挂掉的原因复盘:一道 Hard 动态规划没有最优解,且被追问 C++ 标准库源码细节时卡壳(std::unordered_map 的 rehash 触发条件具体数值)。
面试复盘与建议
腾讯面试的核心竞争力:
- C++ 基础扎实:腾讯后端大量使用 C++,对内存模型、STL 源码、多线程编程要求很高。
- 网络协议理解深入:TCP/IP 三层握手、QUIC/HTTP3、游戏场景下的网络优化是常考点。
- 产品思维:腾讯非常看重候选人对产品的理解,不仅仅是"写代码的机器"。
准备清单:
- 《Effective C++》核心条款
- 《TCP/IP 详解》卷一重点章节
- LeetCode Hot 100 + 腾讯精选 50
- 准备一个能聊 20 分钟的项目(讲清楚背景、你的角色、技术难点、量化结果)
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。