System Design Primer 拆解:27.5 万星的系统设计面试教材,怎么练才有效
posts posts 2026-04-28T03:10:00+08:00System Design Primer 是 GitHub 27.5 万星、CC BY 4.0 协议的系统设计学习仓库:一份概念索引、8 道系统设计题(6 道附 Python 代码)、6 道面向对象设计题、3 套 Anki 闪卡。本文拆解它的真实结构,并按官方备考时间线给出练习路径。技术笔记系统设计, 面试, 分布式系统System Design Primer 拆解:27.5 万星的系统设计面试教材,怎么练才有效
判断:System Design Primer 真正提供的不是「面试题库」,而是三样东西的组合——一张把负载均衡、缓存、分片、CAP 这些散落概念串起来的地图,一套按官方四步框架展开的带解答例题,再加一组用间隔重复对抗遗忘的 Anki 闪卡。它解决的问题是:系统设计面试没有标准教材,资料散落在博客、论文和各家工程博客里,而面试考察的又恰恰是把这些零散知识组织成一次 45 分钟对话的能力。理解这个定位,才知道该怎么练——直接从头读到尾是效率最低的用法。
适用读者:准备系统设计面试的工程师,以及想借面试压力系统补一遍分布式基础概念的开发者
前置知识:了解数据库、网络、操作系统的基本概念;不需要分布式系统实战经验
目录
- 一、项目概览
- 二、仓库里到底有什么:三层内容
- 三、概念索引:从性能与可扩展性到通信协议
- 四、带解答的面试题:8 道系统设计与 6 道面向对象设计
- 五、任务流案例:走一遍 Pastebin 题
- 六、Anki 闪卡与电子书
- 七、翻译与阅读方式
- 八、按备考时间线制定学习计划
- 九、自测题
- 十、练习
- 十一、常见问题
- 十二、适用边界与采用顺序
- 十三、总结与延伸阅读
项目概览
| 项目 | 信息 |
|---|---|
| 仓库 | donnemartin/system-design-primer |
| 星标 | 274,986 |
| 分叉 | 46,224 |
| 主语言 | Python(题解示例代码;主体内容是 Markdown) |
| 许可证 | CC BY 4.0(GitHub 因 LICENSE.txt 非标准格式显示为 Other) |
| 最近推送 | 2026-03-20 |
| 数据快照 | 2026-09-11,取自 GitHub API |
作者 Donne Martin 是前 Facebook 工程师,仓库创建于 2017 年 2 月,至今仍不定期有维护提交(最近一次在 2026 年 3 月)。这是 GitHub 上星标数排名最靠前的一批仓库之一,也是系统设计主题下的事实标准入门材料。
仓库里到底有什么:三层内容
读这个仓库之前,先分清它的三层内容——混在一起读是低效的根源:
| 层 | 内容 | 位置 | 用法 |
|---|---|---|---|
| 概念索引 | 20+ 个系统设计主题条目,每个讲权衡(trade-offs)与替代方案 | 主 README「Index of system design topics」 | 当参考书查,不必顺序通读 |
| 带解答的题 | 8 道系统设计题 + 6 道面向对象设计题,按四步框架展开,6 道附 Python 代码 | solutions/ 目录 | 动手练,先自己写再看解答 |
| 记忆工具 | 3 套 Anki 闪卡 + 粗略估算速查表(2 的幂、延迟数字) | resources/flash_cards/、附录 | 通勤和碎片时间复习 |
三层之外还有两个容易被忽略的宝藏:附录里的 Real world architectures(按技术组件归类的架构资料,MapReduce、Cassandra、Kafka 这类)和 Company architectures(按公司归类,Twitter、Netflix、Pinterest 等),再往下还有 Company engineering blogs(各公司工程博客清单)。准备某家公司的面试时,直接去这几个清单里找对应公司的材料,比泛读概念有效得多。
概念索引:从性能与可扩展性到通信协议
概念索引是仓库的正文主体,覆盖以下主题(每个主题都按「它解决什么问题 → 有哪些方案 → 各方案的缺点」组织,多数附架构图):
- 基础权衡:性能 vs 可扩展性、延迟 vs 吞吐、可用性 vs 一致性(CAP 定理)、一致性模式(弱/最终/强)、可用性模式(fail-over、主从/主主复制、几个 9 的数字账)
- 基础设施组件:DNS、CDN(push 与 pull 两种)、负载均衡(四层与七层)、反向代理
- 应用与数据层:应用层与微服务、服务发现;关系型数据库的复制、联邦(federation)、分片(sharding)、反规范化、SQL 调优;NoSQL 四类(键值、文档、宽列、图数据库)与 SQL/NoSQL 选型
- 缓存与异步:缓存的五个层次、四种更新策略(cache-aside、write-through、write-behind、refresh-ahead);消息队列、任务队列与背压(back pressure)
- 通信:HTTP、TCP 与 UDP、RPC 与 REST 的对比
- 安全:授权、认证等基础话题
附录部分是面试现场直接能用的速查材料:2 的幂表(一个估算字节量的速算工具)、每个程序员该知道的延迟数字、以及上面提到的真实架构与工程博客清单。
一个阅读建议:这个索引的价值在权衡分析,不在结论。比如负载均衡一节真正要带走的是「四层负载均衡看 IP 和端口、开销小;七层看应用内容、能做更智能的路由但更贵」,而不是「要用负载均衡」这句话。面试里能讲清权衡的候选人,远多于只会报组件名的。
带解答的面试题:8 道系统设计与 6 道面向对象设计
solutions/ 目录收录了 14 道带完整解答的题目,全部遵循同一套官方四步框架:
- Outline use cases, constraints, and assumptions——圈定需求范围,列出约束与假设
- Create a high level design——画出高层架构
- Design core components——逐个用例细化核心组件
- Scale the design——扩展设计,处理瓶颈
框架之外还有一节 Back-of-the-envelope calculations(粗略估算):用 2 的幂表和延迟数字快速算出存储量、QPS,这类估算在真实面试里经常是分水岭。
8 道系统设计题(每道都有独立题解文档和架构图):
| 题目 | 题解位置 | 附带代码 |
|---|---|---|
| 设计 Pastebin.com(或 Bit.ly) | solutions/system_design/pastebin/ | pastebin.py |
| 设计 Twitter 时间线与搜索(或 Facebook 信息流与搜索) | solutions/system_design/twitter/ | — |
| 设计一个 Web 爬虫 | solutions/system_design/web_crawler/ | MapReduce 版爬虫 |
| 设计 Mint.com | solutions/system_design/mint/ | MapReduce 聚合 |
| 设计社交网络的数据结构 | solutions/system_design/social_graph/ | 数据结构片段 |
| 设计搜索引擎的键值存储 | solutions/system_design/query_cache/ | 查询缓存片段 |
| 设计 Amazon 的品类销量排行 | solutions/system_design/sales_rank/ | MapReduce 排行 |
| 设计扩展到百万用户的 AWS 系统 | solutions/system_design/scaling_aws/ | —(按步骤展开的架构演进课) |
注意题解的两点事实:6 道附带可运行的 Python 示例代码,「这个仓库不涉及代码实现」的说法并不成立——爬虫的 MapReduce 实现、社交网络的图结构都写到了代码层面;Twitter 题解没有代码,它的价值在于那张从单机到分片的演进架构图。
6 道面向对象设计题(作者标注此节 under development):设计哈希表、设计 LRU 缓存、设计呼叫中心、设计一副牌、设计停车场、设计聊天服务器。每道题都有 Jupyter Notebook 形式的代码解答(solutions/object_oriented_design/)。OOD 面试在国内大厂出现频率低于系统设计,但在北美面试和初级岗位中常见。
23 道附录练习题:主 README 末尾的「Additional system design interview questions」列了约 23 道无完整解答、只配外部参考链接的题目——设计 Dropbox 式文件同步、设计 Google 文档、设计 WhatsApp 聊天应用、设计短链接服务(TinyURL)、设计 API 限流器、设计股票交易所等。这些题适合自测:能独立讲出方案再去看参考链接对答案。
任务流案例:走一遍 Pastebin 题
拿最经典的 Pastebin 题(设计一个类似 Pastebin.com 或 Bit.ly 的文本粘贴/短链接服务)演示这四步框架怎么用。
Step 1,圈定用例和约束。题解先砍需求:纳入「输入一段文本、得到随机生成的链接」「输入链接查看原文」「统计页面访问量」「删除过期粘贴」几个用例,把用户注册登录、编辑文档、自定义短链划到范围外;然后做粗略估算——假设每月 1000 万次写入、读写比 10:1,按单条粘贴 1.27 KB 算出每月新增 12.7 GB、三年约 450 GB,平均 4 次写/秒、40 次读/秒。这套「砍范围 + 算数字」的开场在真实面试里同样适用:面试官给一道模糊的题,第一件事就是问清边界。
Step 2,画高层设计。客户端 → 负载均衡 → Web 服务器 → 数据库的最小闭环,一张图讲清数据怎么流动。
Step 3,逐个用例细化。核心分歧点在存储选型:题解用关系数据库当一张大哈希表(短链 → 粘贴路径),同时讨论了换 S3 对象存储或 NoSQL 键值存储的权衡;写入路径由 Write API 生成 7 字符短码、查库查重、冲突就重新生成;数据层给出 pastes 表结构——shortlink 主键保证唯一性,created_at 记录创建时间,过期粘贴靠扫描早于当前时间的记录来删除。配套的 pastebin.py 是一个 mrjob 练习骨架(mrjob 是 Python 的 MapReduce 库):按月统计每个短链的访问量,mapper 和 reducer 留白给读者补全。
Step 4,扩展。题解先立了一条规矩——不要从初始设计直接跳到最终答案,正确姿势是压测 → profile 找瓶颈 → 针对性解决 → 循环。落到本题:加内存缓存接住热门内容的读流量,只读副本兜底缓存未命中;每月 12.7 GB 的写入量单库就能应付,真不够再按联邦、分片、反规范化、SQL 调优的顺序上手段。
Additional talking points 收尾:NoSQL 选型理由、缓存策略、异步与微服务、通信方式、安全和延迟数字——这一节把题解和前面的概念索引交叉链接起来,正好是复习的锚点。
这个流程走完大约需要一两个小时。走三到四道题之后,四步框架会内化成条件反射,这也是本仓库最值得投入时间的部分。
Anki 闪卡与电子书
resources/flash_cards/ 下有 3 个 Anki 牌组(.apkg 文件):
- System Design.apkg——核心概念复习
- System Design Exercises.apkg——面试解题思维训练
- OO Design.apkg——面向对象设计专项
姊妹仓库 donnemartin/interactive-coding-challenges(算法面试主题)里还有第 4 个 Coding.apkg,两个仓库共用同一套闪卡体系。
Anki 的原理是间隔重复(spaced repetition):在快遗忘的时间点安排复习,用最少的时间维持记忆。系统设计概念适合这种方式的原因很实际——CAP、一致性哈希这类知识点零散、平时不常用、又要求面试时脱口而出。把闪卡放在通勤路上刷,把大块时间留给做题,是这套材料设计者预期的分工。
仓库根目录还提供 generate-epub.sh,可以把主文档打包成 EPUB 电子书,偏好阅读器场景的用户可以自己生成。
翻译与阅读方式
翻译的真实状态(据 TRANSLATIONS.md,2026-09-11 快照):
- 已合入主仓库:3 种——日语(
README-ja.md)、简体中文(README-zh-Hans.md)、繁体中文(README-zh-TW.md) - 进行中:韩语、俄语,维护者正在翻译
- 停滞等待新维护者:阿拉伯语、法语、德语、西班牙语等 14 种
网上流传的「支持 15+ 语言」指的是这个清单的历史累计,实际合入主干的只有上面 3 种。对中文读者有个好消息:不只是主文档,pastebin/、twitter/ 等题解目录里也附带 README-zh-Hans.md 中文版,可以整条链路用中文读完。
三种打开方式:
# 方式一:本地克隆后用编辑器或浏览器阅读
git clone https://github.com/donnemartin/system-design-primer.git
cd system-design-primer方式二:直接在 GitHub 网页上读 README.md,遇到感兴趣的题点进 solutions/ 对应目录。
方式三:在 Anki 中导入 resources/flash_cards/ 下的 .apkg 文件,用碎片时间刷卡。
建议中英对照读:中文翻译偶有滞后,概念术语(consistency、partition tolerance 这类)最终都要能听懂英文原词,面试和后续读论文都用得上。
按备考时间线制定学习计划
仓库官方的 Study guide 不按「初级/中级/高级」分读者,而是按备考时间给三档建议——这更符合实际情况,因为决定覆盖面的变量是剩余时间,不是职级:
| 任务 | 短时间线 | 中时间线 | 长时间线 |
|---|---|---|---|
| 通读 System design topics,建立整体认知 | ✅ | ✅ | ✅ |
| 读目标公司的工程博客(Company engineering blogs 清单) | ✅ | ✅ | ✅ |
| 浏览真实架构案例(Real world architectures 清单) | ✅ | ✅ | ✅ |
| 复习四步解题框架 | ✅ | ✅ | ✅ |
| 练习带解答的系统设计题 | 练几道 | 练多道 | 练大部分 |
| 练习 OOD 题 | 练几道 | 练多道 | 练大部分 |
| 过一遍附录练习题清单 | 部分 | 多数 | 全部 |
短时间线求广度,中时间线求广度加一定深度,长时间线求广度加更深深度。
官方对「要不要全学完」的回答值得记下:不需要。面试考什么取决于你的经验年限、技术背景、目标岗位和运气;经验越丰富,面试官的期望越高,架构师岗比初级岗要讲得更深。正确姿势是在各主题都有一层基础认知后,挑几个领域扎下去。
把它落到周计划上(以每天 1-2 小时、约 4 周备考为例):第 1 周通读概念索引建立地图 + 开始每天刷 Anki;第 2-3 周按四步框架练习题解,先自己写再对照,重点吃透 Pastebin、Twitter、Web 爬虫三道覆盖面最广的题;第 4 周做附录题自测 + 找人对练口头表达。
自测题
- 这个仓库的三层内容分别是什么?各自该怎么用?
- 官方四步解题框架是哪四步?为什么第一步是圈定用例和约束而不是画架构图?
- 负载均衡、缓存、分片在大规模系统中各自解决什么问题?
- 缓存的四种更新策略(cache-aside、write-through、write-behind、refresh-ahead)的核心区别是什么?
- 只剩两周备考,官方 Study guide 建议你怎么取舍?
参考答案
题 1:概念索引(当参考书查权衡分析)、带解答的题目(动手练四步框架)、记忆工具(Anki 闪卡与附录速查表)。混在一起顺序通读效率最低。
题 2:圈定用例、约束和假设 → 高层设计 → 细化核心组件 → 扩展设计。第一步先做是因为真实面试的题目是模糊的,不先砍范围和算数字,后面的设计就没有依据,也容易在细节里耗光时间。
题 3:负载均衡解决流量分发和单点故障;缓存解决读压力(减少对数据库的直接访问);分片解决单库的写容量和存储上限。
题 4:区别在「谁来维护缓存与数据库的一致性、接受什么程度的过期」。cache-aside 由应用先读缓存、未命中再查库回填;write-through 同步写缓存和数据库;write-behind 先写缓存、异步批量落库(快但可能丢数据);refresh-ahead 预测性地提前刷新即将过期的数据。
题 5:短时间线求广度——通读概念索引、读目标公司工程博客、复习四步框架、练几道带解答的题,Anki 闪卡用碎片时间维持概念记忆;不在单一主题上扎太深。
练习
练习一:限时模拟 Pastebin 题
- 先读题解前 30 行,只记住题目要求,不要往下看
- 计时 45 分钟,按四步框架独立写出自己的方案(白板或纸笔,模拟真实条件)
- 对照
solutions/system_design/pastebin/README.md找差距:范围砍得是否果断、估算是否做了、瓶颈分析是否有依据 - 把差距记下来,隔三天再做一遍同一道题
练习二:用附录练习题做盲测
- 从「Additional system design interview questions」清单里挑一道没见过的题(比如设计 API 限流器)
- 限时 45 分钟独立设计
- 完成后再读题目配的参考链接,对照修正
- 能讲清方案再换下一道;讲不清,回到概念索引补对应主题
练习三:建立并跑通 Anki 复习循环
- 安装 Anki,导入
resources/flash_cards/下三个 .apkg 牌组 - 连续两周每天刷完每日额度(通常 10-20 分钟)
- 第两周结束时检查:哪些卡片反复忘——那是你概念索引里没读懂的部分,回头精读对应小节
常见问题
Q:只读这个仓库够应对面试吗?
不够。它给的是知识框架和练习材料,但系统设计面试考口头表达和互动推进,这两样只能靠对练。找朋友互相出题、或用 Exponent(原名 Pramp,后改名)这类模拟面试平台练口述,是读文档替代不了的环节。
Q:需要多少准备时间?
取决于备考时间线和基础。全职在职的状态下,按每天 1-2 小时算,4 周可以把概念索引过一遍、吃透三到四道带解答的题;时间充裕的话按上面 Study guide 的中/长时间线扩展覆盖面。
Q:需要 Python 基础吗?
概念部分不需要任何编程语言知识。题解里的示例代码用 Python 写(如 pastebin.py、爬虫的 MapReduce 实现),读懂它们需要基本的 Python 阅读能力,但跳过代码不影响概念学习和四步框架练习。
Q:内容会不会过时?
概念层(CAP、缓存策略、分片这些)十年内都不会过时,这也是它能积累 27 万星的原因。真实架构清单里的部分链接较旧,个别案例(如 Twitter 的某些架构细节)反映的是当年的系统,读的时候当作「这类问题的一个已知解法」,而不是当前生产环境的现状。
适用边界与采用顺序
适合立即开始用的人:
- 4-12 周内有系统设计面试的工程师——按 Study guide 时间线执行,重心放在做题
- 转岗后端/架构方向的开发者——概念索引是比论文和专著平缓得多的第一级台阶
可以缓一缓的人:
- 已经能独立设计百万用户级系统的资深工程师——它的概念部分对你太浅,直接翻附录的架构清单和工程博客清单更有价值
不适合的场景:
- 想要「代码级」学习分布式系统实现——题解代码是示意性的 Python 片段,不是可上生产的实现;要跑代码应该去 MIT 6.824 这类课程
- 想要最新的大模型时代系统设计(LLM 网关、向量数据库架构)——仓库对这些新主题基本没有覆盖
采用顺序建议:第 1 天克隆仓库、导入 Anki、通读概念索引的前五个主题;第 1 周内限时做第一道题(推荐 Pastebin,覆盖面最广);之后按备考时间线推进,把附录的架构清单和工程博客清单留到面试前两周针对性阅读。
总结与延伸阅读
System Design Primer 用 27 万颗星证明了一件事:系统设计面试准备缺的不是资料,而是一条把概念、例题、记忆工具组织起来的路径。它的四步框架、6 份带代码的题解和按时间线分档的 Study guide,是目前这条路径上最完整的开源实现。剩下的部分——口头表达的流畅、估算的手感、权衡的直觉——只能靠你自己一道题一道题练出来。
延伸阅读:
- MIT 6.824: Distributed Systems——想真正动手实现分布式系统(Raft、MapReduce 等),这门课是标准下一步
- Designing Data-Intensive Applications(Martin Kleppmann,O’Reilly)——把本仓库的概念索引往深处推两层的必读书
- donnemartin/interactive-coding-challenges——同一作者的姊妹仓库,算法面试主题,含第 4 套 Anki 牌组
版本与生态数据截至 2026-09-11:Stars、Forks、最近推送取自 GitHub API;翻译状态出自仓库 TRANSLATIONS.md;题解清单、Anki 牌组、Study guide 口径出自主 README 原文;题解代码清单逐一核对自 solutions/ 目录。查最新星标与推送看仓库主页,翻译进展看 TRANSLATIONS.md。
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。