# DB-Kernel Copilot 学习路线图

> 写给：只会 `if / while / int` 的零基础跨专业同学（英语专业大四）。
> 目标：考研浙大计算机 → 进大厂做数据库内核工程师。
> 总周期：**36 周（约 9 个月）**。

这份路线图只解决一个问题：**「我不知道从哪开始、不知道学什么、不知道学到什么程度、不知道先学什么后学什么。」**

看完它你应该能回答：**今天该做什么。**

---

## 0. 怎么用这份路线图

- 路线图是**单向链条**：第 N 阶段的过关标准没达到，**不要进第 N+1 阶段**。
- 每个阶段有 4 栏：`目标 / 学什么卡 / 过关标准 / 动手做什么`，外加结尾一张自检清单。
- 「卡」= `curriculum/` 目录下的一张课程卡（`.yaml` / `.md` 文件），用 `python3 start.py` 调出导师逐张学。
- 卡的名字形如 `00-bridge-from-if-while/01-struct-pointer-stl.md`，下文简写成 `00-bridge 01`。

---

## 1. 总览图：第 1 周 → 第 36 周

```
 周1──4       周5──8       周9──12       周13──────20        周21──24     周25──28     周29──32     周33──36
┌────────┐  ┌────────┐   ┌────────┐    ┌──────────────┐    ┌────────┐   ┌────────┐   ┌────────┐   ┌────────┐
│ 阶段1  │  │ 阶段2  │   │ 阶段3  │    │ 阶段4        │    │ 阶段5  │   │ 阶段6  │   │ 阶段7  │   │ 阶段8  │
│ C++基础│─▶│ SQL基础│──▶│ 工具链 │───▶│ CMU 15445    │───▶│MIT 6.824│▶│存储引擎│──▶│ TiDB   │──▶│ 实战   │
│        │  │        │   │        │    │ Lab1~3       │    │Lab1~2  │   │        │   │        │   │        │
└────────┘  └────────┘   └────────┘    └──────────────┘    └────────┘   └────────┘   └────────┘   └────────┘
   4周         4周           4周            8周                4周          4周          4周          4周
     │           │             │              │                  │           │            │            │
     ▼           ▼             ▼              ▼                  ▼           ▼            ▼            ▼
   能写       会写SQL       会gdb调试       BusTub三         理解Raft     画得出        画得出       提到1个
   链表       懂事务        会提PR          个Lab过          Lab1过      InnoDB图      TiDB图       merged PR
```

**一句话版**：先用 4 周把 C++ 读代码能力拉起来 → 4 周 SQL → 4 周工具链 → 8 周死磕 BusTub → 4 周 Raft → 4 周存储引擎 → 4 周 TiDB → 4 周开源实战。

---

## 2. 分阶段详细说明

### 第 1 阶段（第 1–4 周）：编程基础

- **目标**：能读懂 C++ 代码，能写简单的 `struct` 和函数。
- **学什么卡**：`00-bridge 01~08`
  - `01` struct / 指针 / STL 入门
  - `02` 智能指针 / 模板 / virtual / lambda（先建立印象，不强求精通）
  - `03` 类 / 构造析构
  - `04` 运算符重载
  - `05` 继承 / 多态
  - `06` STL 容器
  - `07` STL 算法
  - `08` 异常 / 命名空间 / static / const
- **过关标准**：
  - [ ] 能**手写**一个链表（带插入、删除、遍历），不查资料。
  - [ ] 能用 `vector + sort` 写一个学生成绩排序程序（按分数降序，同分按姓名）。
- **动手做什么**：把每张卡的伪代码**先在纸上写一遍**，再在电脑上敲一遍跑通。纸笔和键盘各一遍，缺一不可。

---

### 第 2 阶段（第 5–8 周）：SQL 和数据库基础

- **目标**：会写 SQL，理解表 / 索引 / 事务。
- **学什么卡**：`00-sql 01~15`（目录里现 12 张卡，按编号顺序学完即视为本阶段完成）
  - `01` first select → `04` where/orderby → `06` create index → `07` 事务 ACID → `08` 死锁 → `09` join → `10` MVCC 动手 → `11` 优化器动手 → `12` 2PC/WAL 动手。
- **过关标准**：
  - [ ] 能写出 `JOIN + GROUP BY + 子查询` 组合的 SQL。
  - [ ] 能用自己的话解释**脏读 / 不可重复读 / 幻读**的区别，并举出隔离级别例子。
- **动手做什么**：在 `sandboxes/sql-sandbox/` 里跑 SQL，每张卡里的 SQL 都亲手敲一遍、改参数看结果。

---

### 第 3 阶段（第 9–12 周）：工具链

- **目标**：会用 gdb 调试、会看火焰图、理解并发和锁。
- **学什么卡**：
  - `04-perf 01~04`（gdb 崩溃 / perf 火焰图 / 并发锁粒度 / lock manager 动手）
  - `01-git` 全部 7 张（init → commit → 分支合并 → 远程 → GitHub 认证 → fork/PR 工作流）
- **过关标准**：
  - [ ] 能用 gdb 定位一个段错误（找到出错的文件、行号、变量值）。
  - [ ] 能用 git 走完 fork → branch → commit → push → 提 PR 的完整流程。
- **动手做什么**：**故意写一个会崩溃的 C++ 程序**（比如空指针解引用、越界访问），用 gdb 调试并修复；在 `sandboxes/git-sandbox/` 里练完整 PR 流程。

---

### 第 4 阶段（第 13–20 周）：CMU 15445

- **目标**：完成 BusTub Lab1~3。
- **学什么卡**：`02-cmu15445` 全部
  - `00` overview → `01/01b` C++ 必备 → `02` 环境搭建 → `03` 架构 & Lab1 介绍 → `04/05` Lab1 LRU + Buffer Pool → `06/07/08` Lab2 B+ 树 → `09/10/11` Lab3 执行器 + 外排序。
- **过关标准**：
  - [ ] Lab1（LRU Replacer + Buffer Pool Manager）通过全部测试。
  - [ ] Lab2（B+ 树 insert / split / 查找）通过测试。
  - [ ] Lab3（执行器）通过测试。
- **动手做什么**：**实际做 BusTub 的 lab**，不是看答案。每写完一个模块跑一遍自动测试，红了就 gdb 定位。

> ⚠️ 这是全路线最硬的 8 周。卡住超过 2 天，回到阶段 1 重看相关卡，**不要硬啃源码**。

---

### 第 5 阶段（第 21–24 周）：MIT 6.824

- **目标**：理解 Raft，完成 Lab1~2。
- **学什么卡**：`03-mit6824` 全部
  - `00` overview → `01` Raft 概念 → `02` Lab2a 选举 → `03` Lab2b 日志复制 → `04` Raft 极简版（if/while/int 讲法）→ `05` Lab1 MapReduce 动手。
- **过关标准**：
  - [ ] 能**口述** Raft 的领导选举和日志复制流程（角色、任期、投票、提交）。
  - [ ] Lab1（MapReduce）通过测试。
- **动手做什么**：**实际做 6.824 的 lab**。先读 `04` 的极简讲法建立直觉，再写 Go 代码（不会 Go 就用阶段 1 的方法：纸笔伪代码 → 键盘）。

---

### 第 6 阶段（第 25–28 周）：存储引擎深入

- **目标**：理解 MySQL / InnoDB / RocksDB。
- **学什么卡**：`08-storage` 全部
  - `00` LSM tree → `01/01b` RocksDB + 源码 → `02/02b` InnoDB + 源码 → `03` MySQL → `04` mini-lsm 动手 → `08/09/10` MySQL 架构 / InnoDB 深入 / RocksDB 深入。
- **过关标准**：
  - [ ] 能**画出 InnoDB 架构图**（Buffer Pool、Redo Log、Undo Log、Change Buffer、B+ 树聚簇索引）。
  - [ ] 能**解释一条 `UPDATE` 语句的完整链路**（从解析到落盘，含 WAL、MVCC、刷脏）。
- **动手做什么**：跑 `04` 的迷你 LSM 代码，**修改 compaction / memtable 参数**，观察写放大、读延迟的变化，记下现象。

---

### 第 7 阶段（第 29–32 周）：TiDB 全栈

- **目标**：理解 TiDB 三层架构（TiDB / TiKV / PD），能读懂源码。
- **学什么卡**：`07-tidb` 全部
  - `00` 源码阅读 → `01` table reader 源码 → `02` 架构深入 → `03/04` parser / optimizer 动手 → `05` Percolator 事务 → `06` TiKV 存储引擎 → `07` PD 调度 → `08` mini-tidb 动手 → `09` 源码指南 → `10` 在线 DDL。
- **过关标准**：
  - [ ] 能**画出 TiDB 架构图**（SQL 层、TiKV、PD，以及它们之间的 RPC）。
  - [ ] 能**口述一条 `SELECT` 在 TiDB 里的链路**（parse → optimize → 下推到 TiKV → Coprocessor → 返回）。
- **动手做什么**：跑 `08` 的迷你 TiDB 代码，**给它加一个 `UPDATE` 功能**（从 parse 到存储走通）。

---

### 第 8 阶段（第 33–36 周）：实战

- **目标**：提 PR、参加比赛。
- **学什么卡**：`05-oss` + `06-miniob`
  - `05-oss` 找 issue → 选 → 复现 → 定位 → 草稿 PR → 自审 → 提交。
  - `06-miniob` 架构 → drop table 实现 → parser/executor 极简版。
- **过关标准**：
  - [ ] 给 **TiDB 或 OceanBase** 提 **1 个 PR**（被 review 即算，merged 更好）。
  - [ ] MiniOB 做到**复赛难度**（多表 + 索引 + 聚合）。
- **动手做什么**：**实际找 issue 提 PR**，不要只读不做。用 `oss-pipeline/find_good_first_issue.py` 帮你筛 good first issue。

---

## 3. 每周学习量建议

> 你是大四 + 备考 + 转专业，时间紧。下面是「能按时走完 36 周」的下限，不是上限。

| 项目 | 建议量 |
|------|--------|
| 工作日每天 | **3 小时**（1.5h 看卡 + 1.5h 动手） |
| 周末每天 | **6 小时**（上午看卡 + 下午动手） |
| 一周总时长 | **约 25–28 小时** |
| 一周过卡数 | **2–3 张**（lab 阶段降到 1–1.5 张） |
| 休息 | 每周至少 1 个完整休息日，防 burnout |

**各阶段节奏差异**：
- 阶段 1/2/3：偏「过卡」，2–3 张/周。
- 阶段 4/5（lab 期）：1 张卡可能要 2 周，**别按张数算，按测试通过算**。
- 阶段 8：不按卡算，按「PR 数 + 比赛进度」算。

**每天怎么安排（示例）**：
- 前 30 分钟：复习昨天卡的关键点（默写）。
- 中间 60–90 分钟：学新卡，纸笔伪代码先行。
- 后 60–90 分钟：电脑上敲代码 / 跑 lab / 跑 SQL。
- 睡前 10 分钟：在自检清单里勾掉今天达成的项。

---

## 4. 自检清单（每阶段结束后自问）

### 阶段 1 自检
- [ ] 我能不能不查资料，在白板上写出一个带头尾指针的链表？
- [ ] 指针和引用的区别，我能用一句话说清吗？
- [ ] vector 扩容会发生什么？我说得出来吗？

### 阶段 2 自检
- [ ] 给我两张表，我能不用搜索引擎写出 JOIN + GROUP BY 吗？
- [ ] 脏读 / 不可重复读 / 幻读，我能各举一个例子吗？
- [ ] 索引为什么能加速？B+ 树比 B 树好在哪？

### 阶段 3 自检
- [ ] gdb 里 `bt`、`print`、`break`、`next`、`step` 我都用过吗？
- [ ] 我能独立走完一次 fork→PR 流程吗？
- [ ] 互斥锁和读写锁的区别，我说得清吗？

### 阶段 4 自检
- [ ] LRU 和 Clock 替换算法的区别，我讲得清吗？
- [ ] B+ 树节点分裂时，键怎么上移？我能画图说明吗？
- [ ] Volcano 模型的 `Next` 接口是怎么拉数据的？

### 阶段 5 自检
- [ ] Raft 选举：什么时候触发？任期怎么变？我口述一遍。
- [ ] 日志复制：leader 收到写请求后到 commit 之间发生了什么？
- [ ] MapReduce 里 map 和 shuffle 各做什么？

### 阶段 6 自检
- [ ] InnoDB 一条 UPDATE 的链路，我从头讲到尾一遍。
- [ ] LSM 树为什么写快读慢？compaction 解决了什么？
- [ ] WAL 和 checkpoint 各解决什么问题？

### 阶段 7 自检
- [ ] TiDB / TiKV / PD 各自的职责，我列得出来吗？
- [ ] 一条 SELECT 在 TiDB 里下推到 TiKV 做了什么？
- [ ] Percolator 两阶段提交的流程，我讲一遍。

### 阶段 8 自检
- [ ] 我提的 PR 是真 issue 还是凑数？能讲清改动目的吗？
- [ ] MiniOB 我做到复赛难度了吗？
- [ ] 简历上有没有「能讲清楚的底层原理」这一条？

---

## 5. 常见错误提醒

> 这些坑几乎每个零基础同学都会踩，提前知道能省几周。

1. **不要跳过 C++ 基础直接看 BusTub 源码。**
   BusTub 是工业级 C++，没过阶段 1 就看 = 看天书，自信全毁。C++ 基础 4 周省不掉。

2. **不要只看概念不动手写代码。**
   「看懂了」和「能写出来」差一个太平洋。每张卡必须纸笔 + 键盘各一遍。

3. **不要在阶段 4 卡住时硬刚。**
   Lab 卡超过 2 天，回阶段 1/3 重看相关卡，或用导师 Agent 提问。死磕 1 周不如退半步。

4. **不要按时间表焦虑，要按过关标准走。**
   36 周是参考节奏。阶段 4 多花 2 周很正常，但**别在没过 LRU 时就跳去 B+ 树**。

5. **不要跳过 git 沙盒直接上 GitHub。**
   阶段 3 的 git 沙盒就是让你免费犯错的地方。在真仓库上反复 force push 会被拉黑。

6. **不要只学不输出。**
   每个阶段结束写一段「我能用大白话讲清什么」的笔记。讲不清 = 没学会。可用 `portfolio/feynman_checker.py` 帮你验。

7. **不要忽视考研公共课。**
   你目标是浙大计算机，数学一 + 408 + 政治/英语要并行。路线图只覆盖「数据库内核」这条专业课线，公共课自行排期。

8. **不要追求把所有卡都「精通」。**
   阶段 1 的 `02/09/10/11`（模板深入、move 语义、智能指针深入）先建立印象即可，精通留到阶段 4 用到了再回看。

9. **不要一个人闭门造车。**
   卡住时用 `portfolio/pair_coder.py` 或导师 Agent；学完一阶段用 `interview_simulator.py` 自测。

10. **不要等到阶段 8 才想简历。**
    从阶段 4 开始，每个 Lab 通过都是简历素材；阶段 6/7 的「迷你代码改造」可以写成博客。作品要边走边攒。

---

## 6. 今天就开始

如果今天是第 1 天，你现在该做的只有一件事：

```
cd /workspace/db-kernel-apprentice
python3 start.py
```

选阶段 1 的第一张卡：`00-bridge 01 struct-pointer-stl`。
拿出一张纸，把伪代码抄一遍。然后打开电脑，敲一遍。

36 周后见。
