来源项目:jwasham/coding-interview-university
统计数据:⭐ 346,592 Stars · 🍴 82,874 Forks · CC-BY-SA-4.0 开源协议
作者:John Washam —— 一位从"不懂二叉树"到入职 Amazon SDE 的非科班工程师
博客配套项目:本博客同步包含 coding-interview-university 速查表仓库
一、项目起源:一个"非科班"的逆袭故事
1.1 作者背景
在开始分析这份学习计划之前,有必要先认识它的创建者——John Washam。
John Washam 并没有计算机科学学位。他的编程启蒙来自大学的一门 C++ 课程,但毕业后从事的工作与算法面试要求相去甚远。当他决定冲击 Google 等顶级科技公司时,面临一个残酷的现实:他连 Big-O 是什么都不知道,不理解 stack 和 heap 的区别,不懂二叉树遍历,连图的数据结构都没接触过。
更让人意外的是,他在 2016 年接受采访时透露,自己曾经为准备 Google 面试全职学习了 8 个月,但最终并未成功入职 Google。然而,这 8 个月的积累让他在随后面对 Amazon 的面试时表现得游刃有余——他最终拿到了 Amazon SDE 的 Offer。
这正是这个项目的核心哲学:以 Amazon 为目标,而不是 Google;以实际胜任为目标,而不是死磕最难的题目。
1.2 为什么这个项目如此火爆?
这份学习计划在 GitHub 上狂揽 34.6 万星,位列全球 Star 数最多的仓库之一。这个数字背后有几层原因:
| 驱动因素 | 分析 |
|---|---|
| 需求普遍性 | 几乎每个开发者都要面对技术面试,这是一份"刚需"资源 |
| 创始人背书 | 真实的"学渣逆袭"故事,具有强大的说服力和情感共鸣 |
| 内容质量 | 不是碎片化的题库,而是一套完整的、经过验证的学习体系 |
| 社区效应 | 支持 16 种语言的完整翻译,形成了全球性的学习社区 |
| 开源持续迭代 | 2016 年创建至今仍保持活跃更新(最近更新:2026-05-12) |
二、项目核心定位:不是"题库",是"CS 自学路线图"
2.1 定位澄清
很多开发者误以为这是一份"LeetCode 刷题指南",但事实恰恰相反。作者在 README 开篇就明确指出:
"A complete computer science study plan to become a software engineer."
它的目标是覆盖大学 CS 课程约 75% 的核心内容,让你在技术面试中不仅能做题,还能理解为什么这样做。这与突击刷题有着本质区别。
2.2 覆盖的知识版图
┌────────────────────────────────────────────────────────────────┐
│ 知识版图全景 │
├──────────────────┬───────────────────┬────────────────────────┤
│ 基础数据结构 │ 算法与复杂度 │ 系统设计 │
│ ───────────── │ ────────────── │ ─────────────── │
│ · Arrays │ · Big-O 分析 │ · 可扩展性原则 │
│ · Linked Lists │ · Sorting (7种+) │ · 分布式系统基础 │
│ · Stack/Queue │ · Recursion │ · 数据库设计 │
│ · Hash Tables │ · DP │ · API 设计 │
│ · Trees (BST等) │ · Graph Algorithms│ │
│ · Heaps │ · Greedy │ │
│ · Tries │ │ │
├──────────────────┼───────────────────┼────────────────────────┤
│ 高级主题 │ CS 底层知识 │ 求职技能 │
│ ───────────── │ ────────────── │ ─────────────── │
│ · NP-Complete │ · 冯诺依曼架构 │ · 简历撰写 │
│ · Bit Manipul. │ · CPU/L1-L3 Cache │ · 模拟面试平台 │
│ · Unicode │ · LRU Cache │ · 行为面试问题 │
│ · Networking │ · 进程/线程/锁 │ · 向面试官提问 │
│ · 格雷码/密码学 │ · 冯诺依曼瓶颈 │ │
└──────────────────┴───────────────────┴────────────────────────┘
三、核心数据结构:每个都要手写实现
3.1 为什么强调手写实现?
这是该项目区别于普通刷题的最大特色:所有核心数据结构都要求手写实现,而不只是调用语言内置 API。
以 Hash Table 为例,作者要求你实现以下方法:
# Hash Table 需实现的核心方法
class HashTable:
def hash(self, key) # 哈希函数设计
def add(self, key, value) # 添加键值对
def exists(self, key) # 检查键是否存在
def get(self, key) # 获取值
def remove(self, key) # 删除键值对
这个要求背后有一个深刻的认知逻辑:当你能手写一个 Hash Table 时,你才能真正理解它内部发生了什么——哈希冲突如何解决、扩容何时触发、负载因子如何影响性能。
3.2 核心数据结构清单与复杂度一览
| 数据结构 | 核心操作复杂度 | 面试常考点 |
|---|---|---|
| Array | 末尾操作 O(1),随机访问 O(1),插入/删除 O(n) | 动态数组扩容 |
| Linked List | 头部操作 O(1),尾部 O(n),查找 O(n) | 反转、环检测、合并 |
| Stack | Push/Pop O(1) | 括号匹配、表达式求值、DFS |
| Queue | Enqueue/Dequeue O(1) | BFS、生产者消费者 |
| Hash Table | 平均 O(1),最坏 O(n) | 哈希碰撞、扩容策略 |
| BST | 查找/插入/删除 O(log n) | 遍历、平衡、红黑树 |
| Binary Heap | 插入/删除 O(log n),取最大 O(1) | Top-K、优先级队列 |
| Trie | 插入/查找 O(m),m=字符串长度 | 前缀搜索、自动补全 |
| Graph | BFS/DFS O(V+E) | 最短路径、拓扑排序 |
3.3 排序算法:不学 Bubble Sort 的理由
作者在排序部分给出了一个反直觉的建议:不要学习 Bubble Sort(除非 n ≤ 16)。
这个建议基于两个考量:
- 面试实用性:Bubble Sort 在工业级面试中几乎不会出现
- 认知效率:把时间花在 Insertion Sort(稳定、适合小规模数据)和 Mergesort(分治思想的完美体现)上更有价值
排序算法综合对比:
| 算法 | 平均 | 最坏 | 空间 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|
| Mergesort | O(n log n) | O(n log n) | O(n) | ✅ 稳定 | 外部排序、链表 |
| Quicksort | O(n log n) | O(n²) | O(log n) | ❌ 不稳定 | 数组快速排序 |
| Heapsort | O(n log n) | O(n log n) | O(1) | ❌ 不稳定 | 内存受限场景 |
| Insertion Sort | O(n²) | O(n²) | O(1) | ✅ 稳定 | 小规模/近似有序 |
| Selection Sort | O(n²) | O(n²) | O(1) | ❌ 不稳定 | 交换代价高时 |
四、算法核心:图论与动态规划
4.1 图的四种表示方式
┌─────────────────────────────────────────────┐
│ 图的四种表示方式 │
├─────────────────────────────────────────────┤
│ ① 对象+指针 直观但复杂,内存开销大 │
│ ② 邻接矩阵 O(1) 查询边存在,空间 O(V²) │
│ ③ 邻接表 空间 O(V+E),查询效率中等 │
│ ④ 邻接映射 稀疏图最优,Python dict 实现 │
└─────────────────────────────────────────────┘
4.2 必须掌握的图算法
Graph DFS/BFS
├── 递归版 DFS(回溯思想)
├── 迭代版 DFS(显式栈)
└── BFS(队列,层序遍历)
单源最短路径
├── BFS(无权图)
└── Dijkstra(带权图,非负权重)
最小生成树
├── Prim 算法
└── Kruskal 算法
其他核心算法
├── 环检测(DFS 回边法)
├── 拓扑排序(Kahn 算法 / DFS 入度法)
├── 二部图检测(BFS 着色)
└── 强连通分量(Tarjan / Kosaraju)
4.3 动态规划:从入门到精通
动态规划是面试中最难的知识点之一,也是区分候选人水平的关键。项目给出了 DP 的系统化学习路径:
DP 解题四步法:
Step 1: 定义子问题(Subproblem)
Step 2: 猜递推关系(Recurrence)
Step 3: 识别子问题依赖(DAG)
Step 4: 确定计算顺序 + 优化空间
经典 DP 问题分类:
| 类别 | 代表问题 |
|---|---|
| 线性 DP | 爬楼梯、编辑距离、LIS |
| 区间 DP | 矩阵链乘法、戳气球 |
| 树形 DP | 二叉树最大路径和 |
| 状态压缩 DP | 旅行商问题(TSP) |
| 概率 DP | 掷骰子期望 |
五、面试方法论:学练结合的核心原则
5.1 最关键的避坑建议
项目列出了作者亲身踩过的四大坑:
⚠️ 坑 1:你不会记住所有内容 学完一个知识点后,如果不复习,两周后就会忘记 80%。解决方案:使用闪卡(Flashcards)持续复习。
⚠️ 坑 2:光学不练 很多人在"学习模式"里待太久,看了大量视频和文章,但一道题都没做。正确做法:学完一个知识点,立刻做 2-3 道相关题目。
⚠️ 坑 3:只看不写 看别人解题和自己动手写是两回事。面试考察的是你独立编码的能力,而不是你"能看懂"的能力。
⚠️ 坑 4:不会提问 遇到不会的题,不要直接看答案。先尝试 15-20 分钟,列出思路,然后带着具体问题去查资料。
5.2 编程题练习平台推荐
| 平台 | 特色 | 适合阶段 |
|---|---|---|
| LeetCode | 题库最全,分类清晰 | 全程必备 |
| HackerRank | 模块化学习路径 | 入门阶段 |
| TopCoder | 算法竞赛风格 | 提升阶段 |
| interviewing.io | 匿名与 FAANG 工程师模拟面试 | 冲刺阶段 |
| Pramp | 同行互练,双向反馈 | 全程可用 |
| AlgoExpert | Google 工程师创办 | 面试冲刺 |
5.3 每日学习计划模板
作者给出了他自己的每日作息参考(每天 8-12 小时):
08:00 - 起床,洗漱,早餐
08:30 - 11:30 学习新内容(视频/书籍)
11:30 - 12:30 午饭 + 休息
12:30 - 14:30 做相关编程题
14:30 - 15:00 闪卡复习
15:00 - 17:00 继续学习 + 做题
17:00 - 18:00 晚饭 + 散步
18:00 - 20:00 系统学习/项目练习
20:00 - 21:00 闪卡全天复习
21:00 - 22:00 轻松阅读/休息
22:00 - 就寝
六、系统性知识盲区:为什么 SDE 也要懂这些?
6.1 进程、线程与锁
┌──────────────────────────────────────────────────────┐
│ 进程 vs 线程 vs 协程 │
├──────────────────────────────────────────────────────┤
│ 进程 Process │
│ ├── 独立地址空间,隔离性好 │
│ ├── 进程间通信(IPC):pipe, socket, message queue │
│ └── 创建/切换开销大 │
├──────────────────────────────────────────────────────┤
│ 线程 Thread │
│ ├── 共享进程地址空间,轻量级 │
│ ├── 线程间通信:共享内存(需同步) │
│ ├── 用户态线程 vs 内核态线程 │
│ └── 创建开销小,切换快 │
├──────────────────────────────────────────────────────┤
│ 协程 Coroutine │
│ ├── 用户态协作式多任务 │
│ ├── 切换开销极低(无内核介入) │
│ └── Go goroutine / Python asyncio 即为此类 │
└──────────────────────────────────────────────────────┘
6.2 死锁的四个必要条件(破坏任一即可预防)
面试中常考死锁分析,需要记住经典的 Coffman 条件:
死锁四条件(必须同时满足):
① 互斥条件:资源一次只能被一个线程持有
② 持有并等待:线程持有资源的同时等待其他资源
③ 不可抢占:资源不能被强制从持有者手中夺走
④ 循环等待:形成线程-资源环形依赖链
预防策略:
· 破坏① → 使用资源锁替代互斥锁
· 破坏② → 获取资源前一次性申请全部所需资源
· 破坏③ → 允许抢占(如 try_lock)
· 破坏④ → 按固定顺序获取锁
6.3 CPU 缓存与 LRU
CPU 缓存层次结构:
L1 Cache:内核私有,~32KB,延迟 ~1ns
L2 Cache:内核私有,~256KB,延迟 ~3ns
L3 Cache:共享,~8MB,延迟 ~12ns
主存(RAM):延迟 ~100ns
LRU Cache 实现思路:
· 数据结构:HashMap + 双向链表
· get(key):O(1),将节点移到链表头部
· put(key, val):O(1),容量满时删除链表尾部
· Python 实现:collections.OrderedDict 或手写
七、推荐书籍与学习资源
7.1 核心教材推荐
| 书籍 | 语言 | 难度 | 推荐指数 |
|---|---|---|---|
| Algorithms, 4th Ed (Sedgewick) | Java | ⭐⭐⭐ 中 | ⭐⭐⭐⭐⭐ |
| Introduction to Algorithms (CLRS) | 伪代码 | ⭐⭐⭐⭐ 难 | ⭐⭐⭐⭐ |
| Data Structures and Algorithms in Java | Java | ⭐⭐⭐ 中 | ⭐⭐⭐⭐ |
| Algorithms in C | C | ⭐⭐⭐⭐ 难 | ⭐⭐⭐⭐ |
7.2 面试专项书籍
| 书籍 | 特点 | 适合人群 |
|---|---|---|
| Cracking the Coding Interview | 经典中的经典,189 道题 | 所有人必读 |
| Programming Interviews Exposed | 入门友好 | 初学者热身 |
| Elements of Programming Interviews | 难度较高 | 时间充裕者 |
| Coding Interview Patterns | 101 道高频题,1000+ 图解 | Python 使用者 |
7.3 视频学习资源
算法类:
├── Harvard CS50(基础入门)
├── Coursera Sedgewick 算法课(系统学习)
└── Michael Sambol(每个算法 2-5 分钟精讲)
系统设计类:
├── Gaurav Sen(系统设计 YouTuber)
└── Exponent(综合面试平台)
八、全球社区与影响力分析
8.1 惊人的社区规模
┌────────────────────────────────────────────────────┐
│ GitHub 影响力关键指标 │
├────────────────────────────────────────────────────┤
│ ⭐ Stars: 346,592 (全球前 30) │
│ 🍴 Forks: 82,874 │
│ 👀 Watch: 346,592 │
│ 📡 Subscribers: 8,548 │
│ 📝 Commits: 2,511 (持续迭代 10 年) │
│ 📄 Issues: 109 (活跃社区) │
│ 📅 创建时间: 2016-06-06 │
│ 🔄 最新更新: 2026-05-12 │
└────────────────────────────────────────────────────┘
8.2 国际化覆盖
该项目已支持 16 种语言的完整翻译,正在翻译的有 13 种。这种规模的开源本地化在技术教育类仓库中极为罕见。
✅ 已完成完整翻译:
简体中文 | 繁體中文 | 日本語 | Español | Deutsch
Русский | Português | Tiếng Việt | Polski | Bahasa Indonesia
🔄 翻译进行中:
Français | 한국어 | العربية | हिन्दी | עברית | ภาษาไทย
九、项目局限性:这份计划不包含什么?
作者坦诚列出了不涵盖的内容:
❌ 不涵盖:
· 前端开发(HTML/CSS/JavaScript/React)
· 全栈开发
· App 开发(iOS/Android)
· 机器学习/深度学习
· 数据库 SQL 高级查询
· 运维 / DevOps / Docker / Kubernetes
· 系统编程(Linux 内核、驱动开发)
⚠️ 可选但有价值:
· 系统设计(4 年以上经验推荐)
· 编译器原理
· Vim / Emacs 高级用法
· 密码学与压缩算法
· A* / FFT / Bloom Filter / HyperLogLog
· 平衡搜索树(AVL、红黑树、B树)
十、总结:为什么这个项目值得学习?
10.1 核心价值
┌─────────────────────────────────────────────────────┐
│ coding-interview-university 核心价值 │
├─────────────────────────────────────────────────────┤
│ │
│ 📍 不是题库,是路线图 │
│ → 强调系统性认知,而非碎片化刷题 │
│ │
│ 📍 不是速成,是积累 │
│ → 作者每天 8-12 小时,持续数月 │
│ │
│ 📍 不是记忆,是理解 │
│ → 所有数据结构手写实现,知其然更知其所以然 │
│ │
│ 📍 不是孤军,是社区 │
│ → 34.6 万星 + 16 种语言 + 持续 10 年迭代 │
│ │
└─────────────────────────────────────────────────────┘
10.2 我的评价
从一名开发者的视角来看,这份计划的真正价值不在于它罗列了多少道题,而在于它传递的两种思维方式:
- 深度优先 + 持续迭代:选定一个主题,把它彻底弄懂(手写实现),而不是浅尝辄止地"过一遍"
- 学练一体化:学习的目的不是"看过",而是"能独立写出来"——这正是面试考核的本质
如果你正在准备软件工程师的技术面试,或者想系统性地补全自己的 CS 基础知识,这份计划仍然是目前 GitHub 上最值得参考的自学路线图之一。
参考链接
- 原文仓库:github.com/jwasham/cod…
- CS 路线图:roadmap.sh/computer-sc…
- Anki 闪卡下载:jwasham's Anki Deck
相关阅读
- 本博客配套分析:AV1 环路滤波器源码深度剖析
- 本博客配套分析:LFVC 光场视频压缩论文解读
本文首发于 CSDN,遵循 CC-BY-SA-4.0 协议转载
Last updated: 2026-05-12