腾讯后端开发面经(2024 校招)

腾讯 2024 后端开发岗位技术面试复盘,包含 WXG 与 IEG 两个事业群的面试经历对比,涵盖算法题、操作系统、网络、数据库与开放性问题。

腾讯后端开发面经(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)

  1. std::shared_ptr 的引用计数什么时候会增加?(拷贝构造、赋值、shared_from_this)
  2. std::move 和 std::forward 的区别?(前者是无条件右值转换,后者是条件完美转发)
  3. 虚函数表的内存布局?(单继承只有一个虚表指针,多继承有多个虚表指针)
  4. volatile 关键字的作用?为什么多线程编程中不建议使用?(防止编译器优化,但不保证原子性和内存顺序,应使用 std::atomic)

操作系统(10min)

  1. 进程和线程的区别?
  2. 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)

  1. TCP 三次握手的过程,每次握手发送的报文内容?
    • SYN (seq=x) → SYN-ACK (seq=y, ack=x+1) → ACK (seq=x+1, ack=y+1)
  2. TIME_WAIT 状态的作用?
    • 保证最后一个 ACK 能被对端收到;同时防止旧连接的报文干扰新连接(2MSL 等待)。
  3. TCP 和 UDP 在游戏场景下的选择?
    • 答:状态同步用 TCP(可靠),实时位置同步用 UDP(低延迟),腾讯很多游戏用 KCP(基于 UDP 的可靠传输协议)。
  4. HTTP/1.1 vs HTTP/2 vs HTTP/3?
    • HTTP/2:多路复用、头部压缩(HPACK)、服务器推送
    • HTTP/3:基于 QUIC(UDP),解决队头阻塞、0-RTT 握手

数据库(15min)

  1. MySQL InnoDB 的索引数据结构?(B+ 树)
  2. 联合索引 (a, b, c) 的生效情况?
    • 全值匹配、最左前缀 a、最左前缀 a,b
    • 失效:b,c(缺少 a)、a,c(跳过 b,c 不走索引)、范围查询后列失效
  3. MVCC 的实现原理?(Read View + undo log + 隐藏列 trx_id、roll_pointer)

三面(GM 面,45min)

三面是部门 GM(总经理)级别的面试,几乎没有技术细节,全是宏观问题。

开放性问题

  1. 你如何理解"技术驱动业务"?举一个例子。
    • 答:在实习中通过 A/B 测试框架优化推荐策略,将转化率提升 12%。
  2. 如果游戏服务器的延迟突然从 50ms 飙到 500ms,你会怎么排查?
    • 答:分层排查——网络层(ping、mtr)、系统层(CPU、内存、IO)、应用层(GC、锁竞争)、数据层(慢查询、锁等待)。
  3. 你对做游戏后台技术怎么看?跟你实习过的互联网行业有什么不同?
    • 答:游戏后台更强调实时性和一致性(虚拟道具不能出错),互联网更侧重高可用和可扩展。

产品思维

面试官突然问:你觉得《王者荣耀》的服务器最高峰一般出现在什么时候?为什么?

  • 猜周末晚上 8-10 点,因为有排位双倍积分活动和社交高峰。

HR 面(25min)

  1. 期望 base 地?(深圳/广州)
  2. 兴趣爱好?(答篮球,面试官说 IEG 很多球友)
  3. 对加班的看法?(坦诚回答:项目关键期可以接受,但希望有合理的节奏)

WXG vs IEG 面试对比

我还投递了 WXG(微信事业群),二面后挂掉。两边对比:

维度WXGIEG
算法难度⭐⭐⭐⭐⭐ Hard 题常见⭐⭐⭐⭐ Medium 为主
技术深度极深,追根究底广泛,面广
项目关注非常看重开源贡献看重实际工程经验
面试氛围压力面,连环追问较轻松,像聊天

WXG 挂掉的原因复盘:一道 Hard 动态规划没有最优解,且被追问 C++ 标准库源码细节时卡壳(std::unordered_map 的 rehash 触发条件具体数值)。


面试复盘与建议

腾讯面试的核心竞争力:

  1. C++ 基础扎实:腾讯后端大量使用 C++,对内存模型、STL 源码、多线程编程要求很高。
  2. 网络协议理解深入:TCP/IP 三层握手、QUIC/HTTP3、游戏场景下的网络优化是常考点。
  3. 产品思维:腾讯非常看重候选人对产品的理解,不仅仅是"写代码的机器"。

准备清单:

  • 《Effective C++》核心条款
  • 《TCP/IP 详解》卷一重点章节
  • LeetCode Hot 100 + 腾讯精选 50
  • 准备一个能聊 20 分钟的项目(讲清楚背景、你的角色、技术难点、量化结果)

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页