计算机通用问题:对话式深研教程

一本讲”计算机领域反复出现的那批难题”的书。 每个主题回答四件事:问题的本质是什么、最早的人怎么解、后来怎么一步步改良、以及——当年是谁、怎么把这个问题的突破口找到的。 目标不是记住一堆方案,而是长出一双”看见问题结构”的眼睛:遇到一个从没见过的系统难题,你能立刻判断它属于哪一类、约束在哪、代价是什么。


先说清楚:这本书和”技术选型手册”的区别

市面上的技术书,大多按技术组织:讲 Redis、讲 Kafka、讲 Kubernetes、讲 MySQL。你学完知道”这个东西怎么用”,但换个没见过的新系统,还是抓瞎。

这本书按问题组织。因为我们发现了一个事实:

计算机领域真正难的问题,数量不多,而且反复出现。 缓存失效、一致性、分片不均、失败检测、资源争抢、复杂度失控……这些问题在操作系统、数据库、分布式系统、编译器、网络协议里,一遍又一遍地出现,只是换了个皮。

一旦你认出”这其实是 XX 问题的变体”,你的学习速度会有数量级的提升——因为你知道该去哪个方向找答案,知道哪些方案必然要付什么代价,知道别人踩过的坑长什么样。

所以这本书的每个主题,都在做同一件事:把一个具体的麻烦,抽象成一个可迁移的问题结构。


全书地图:一个问题金字塔

27 个主题不是平铺的,它们围着一个根本矛盾转:资源有限,而需求无限。围绕这个矛盾,全书分成六层。

                    ┌─────────────────────────┐
                    │  第六篇 元能力(顶层)      │
                    │  定义问题 / 找瓶颈 / 思维模型 │
                    │  决定你能不能"看见"问题       │
                    └───────────┬─────────────┘
                                │ 贯穿
   ┌────────────────────────────┼────────────────────────────┐
   │  第四篇 复杂度管理(横向)                                │
   │  抽象分层 · 模块化 · 命名 · 状态 · 并发                    │
   │  让复杂系统还能被人脑驾驭                                  │
   └────────────────────────────────────────────────────────┘
                                │ 承载
   ┌────────────────────────────┼────────────────────────────┐
   │  第三篇 不确定性(上层)                                  │
   │  失败检测 · 共识 · 隔离降级 · 可观测 · 事务                │
   │  工具在真实世界会坏,这是补丁                              │
   └────────────────────────────────────────────────────────┘
                                │ 依赖
   ┌────────────────────────────┼────────────────────────────┐
   │  第二篇 规模武器库(中层)                                │
   │  分治 · 索引 · 缓存 · 复制 · 异步解耦                      │
   │  为突破物理约束而造的工具                                  │
   └────────────────────────────────────────────────────────┘
                                │ 受制于
   ┌────────────────────────────────────────────────────────┐
   │  第一篇 物理约束(底层)                                  │
   │  时间vs空间 · 一致性vs性能 · 延迟vs吞吐 · 通用vs专用 · 精确vs近似 │
   │  这些是物理定律级别的权衡:无法消除,只能转移                 │
   └────────────────────────────────────────────────────────┘

第一篇 物理约束:无法消除的权衡

第二篇 规模武器库

第三篇 在不确定性中活下去

第四篇 复杂度的管理

第五篇 效率的追求

第六篇 元能力:怎么定义和突破问题


主题之间的关联(这是全书的筋脉)

单看每个主题是孤立的点,连起来才是网。下面这几条关联线,是理解全书的关键——你会发现很多主题是”前一个方案解决了旧问题、却引出了新问题”的产物。

关联线一:缓存 → 一致性问题 → 共识 缓存(08)通过”复制一份数据到近处”换速度,但它立刻引出一个新问题:副本和原数据不一致了怎么办。这条线一路走下去,就是复制与冗余(09)、一致性与性能的权衡(02),最终逼出共识算法(12)。“缓存”是问题的起点,“共识”是这条因果链的终点。

关联线二:分而治之 → 分区 → 分布式事务/共识 分而治之(06)把大问题拆小,但拆开之后”各部分之间怎么协调”就成了新难题:分区之间要一致、要事务、要容错。这条线把 06、09、12、15 串在一起。分治不是为了省事,是把”单机内的简单问题”换成了”跨机的协调问题”——你用复杂度换了规模。

关联线三:异步解耦 → 背压 → 调度与排队 异步解耦(10)用队列削峰,但队列会堆积,堆积之后要么丢弃、要么阻塞——这就是背压。背压怎么设计,直接落到调度与排队(23)、隔离与降级(13)。异步不是”把问题藏起来”,是”把同步的阻塞换成了异步的排队”,排队本身依然是问题。

关联线四:抽象 → 泄漏的抽象 → 可观测性 抽象与分层(16)把复杂藏起来,但抽象会泄漏(你迟早要关心底下的细节),而”什么时候泄漏、泄漏在哪”,只有靠可观测性(14)才能发现。抽象让你看不见问题,可观测性让你重新看得见——两者是一对平衡。

关联线五:时间-空间权衡 → 贯穿全书 时间与空间的权衡(01)是最底层的一条线,它几乎贯穿了所有中上层主题:索引用空间换时间(07)、缓存用空间换时间(08)、压缩用时间换空间(22)、近似算法用精度换时空(05)、预取用预测换等待(24)。学会在第一性原理层面认出”这本质是时空权衡的变体”,你就有了穿透力。

关联线六:定义问题 → 决定一切 最后四篇(25-28)是元能力层。前面所有主题,都是”别人已经定义好的问题”;而真实工作里最难的,往往是问题还没被定义清楚——你不知道该优化什么、瓶颈在哪、甚至不知道自己面对的是不是真问题。这一层决定了你能不能把前五篇用起来。


阅读顺序建议

  • 想建立完整认知:按顺序从 01 读到 28。底层约束 → 武器库 → 保障 → 复杂度 → 效率 → 元能力,这条线是因果递进的。
  • 想先解决眼前的麻烦:直接跳到对应主题。每个主题自包含,跳读不会断。
  • 想提升”定义问题”的能力:优先读第六篇(25-28),然后再回头看前五篇,会有完全不同的视角。
  • 想理解”方案为什么会演进”:重点看每章的”演进脉络”小节,那部分专门讲”最早的方案长什么样、遇到了什么、后来怎么改的、为什么这么改”。

关于思考题

每章末尾的思考题不是测验,是学习材料。参考答案写在后面,但请务必先自己想清楚再对答案——尤其是那些”如果让你重新设计一次,你会怎么做”的开放题,它们没有标准答案,价值全在你自己想的过程里。

有一类题会反复出现:“为什么这个方案在当时是对的,后来却不够用了?” 这类题的答案是全书最值钱的部分——因为技术方案没有”对错”,只有”在什么约束下成立”。理解一个方案为什么曾经正确,比记住它现在的样子重要得多。

开卷吧。