专业书籍精读
Books Deep-Read — BigCat's Bookshelf
> 一章一图 · 提纯精读 · 读完这页 ≈ 读懂这一章
DDIA — Designing Data-Intensive Applications
— Martin Kleppmann · 2017
Part I · 数据系统的基石
Ch 1
可靠·可扩展·可维护 — 先立三把尺子,用负载参数和响应时间百分位把「系统好不好」量化成可谈的东西
Kleppmann · 2017
Ch 2
数据模型与查询语言 — 关系 / 文档 / 图各擅长什么,声明式查询为何胜过命令式
Kleppmann · 2017
Ch 3
存储与检索 — 数据库底层怎么存怎么找:LSM-tree vs B-tree,行存 OLTP vs 列存分析
Kleppmann · 2017
Ch 4
编码与演化 — 数据怎么序列化、schema 怎么在不停机下前后兼容地演化
Kleppmann · 2017
Part II · 分布式数据
Ch 5
复制 — 同一份数据放多台机器:单主 / 多主 / 无主,与复制滞后的一致性坑
Kleppmann · 2017
Ch 6
分区 — 一份数据太大切成片:按范围还是按哈希,热点与再平衡
Kleppmann · 2017
Ch 7
事务 — ACID 到底保证了什么,弱隔离放行哪些并发异常,写偏斜为何是最该记的坑
Kleppmann · 2017
Ch 8
分布式系统的麻烦 — 部分失效、不可靠时钟、网络停顿,为什么分布式这么难
Kleppmann · 2017
Ch 9
一致性与共识 — 线性一致、全序广播与共识,CAP 之后真正该知道的
Kleppmann · 2017
Part III · 派生数据
Ch 10
批处理 — MapReduce 的「分头数再汇总」,靠一次分布式排序把海量数据算成派生结果,输入不可变所以算错就重来
Kleppmann · 2017
Ch 11
流处理 — 把数据当永不结束的事件流来一条算一条,靠可回放的日志(Kafka)与流表二象性把数据库里外翻转,难点在事件时间与水位
Kleppmann · 2017
Ch 12
数据系统的未来 — 把数据库拆开、用一条有序事件流重新组装,正确性靠端到端而非底层事务
Kleppmann · 2017
Continuous Delivery
— Humble & Farley · 2010
Part I · 基础
Ch 1
软件交付的难题 — 手工部署与发布日地狱,把发布做成一条可重复的流水线
Humble & Farley · 2010
Ch 2
配置管理 — 一切纳入版本控制,同一份制品部署到所有环境,机器一律不许手工改
Humble & Farley · 2010
Ch 3
持续集成 — 每天并回主干、红了全队停线,CI 是一种实践不是一个工具
Humble & Farley · 2010
Ch 4
实施测试策略 — 用四象限把测试摊开:能重复的交给机器,靠好奇心的留给人
Humble & Farley · 2010
Part II · 部署流水线
Ch 5
部署流水线剖析 — 从提交到生产的一条自动化关卡:只构建一次,红了就停线
Humble & Farley · 2010
Ch 7
提交阶段 — 十分钟内给出一个可信的红或绿:这条预算管的是人,不是机器
Humble & Farley · 2010
Ch 8
自动化验收测试 — 把「验什么」和「怎么点」分层拆开,端到端测试才养得起
Humble & Farley · 2010
Ch 10
部署与发布 — 蓝绿与金丝雀把上线拆成可撤回的小步;真正的墙不是代码,是数据
Humble & Farley · 2010
Part III · 交付生态
Ch 11
管理基础设施与环境 — 机器只能由自动化按版本库里的定义来建和改,手工改过一次就再也复制不出来
Humble & Farley · 2010
Ch 12
管理数据 — 代码能换回上一版,数据不能;靠非破坏性迁移和新旧并存的兼容窗口把发布变回可撤销
Humble & Farley · 2010
Ch 13
组件与依赖 — 拆组件是为了把构建拉回十分钟,代价是丢掉「一次提交、一次全量验证」,得靠钉死版本和集成流水线买回来
Humble & Farley · 2010
SRE — Site Reliability Engineering
— Google · 2016
Ch 1
引论 — 请软件工程师来设计运维团队,再用 50% 工程时间下限和错误预算把它钉住
Google · 2016
Ch 3
拥抱风险 — 100% 是错的目标;把 1 减去 SLO 的那截当成能花的预算,有余额就发、烧光就冻结
Google · 2016
Ch 4
服务质量目标 — 先挑对该量的东西再谈几个 9;一条 SLO 要写清在哪测、算哪段窗口,还得少到你敢用它拍板
Google · 2016
Ch 5
消除琐务 — 判据不是烦不烦,而是它会不会随规模线性长大;50% 是上限,超了要退回开发团队
Google · 2016
Ch 6
监控分布式系统 — 四个黄金信号是最小充分集;告警只报症状,处置机械的那种根本不该叫人
Google · 2016
Ch 8
发布工程 — 发得快只是结果,能原样重来才是地基;配置也得有自己的版本号和回滚
Google · 2016
Ch 9
简单性 — 可靠性的上限是你还读得懂多少;代码是负债,最理想的改动是负行数
Google · 2016
Ch 12
有效排障 — 排障是手艺不是天赋;先止血再破案,从中间折半,然后问「力气花在哪」
Google · 2016
Ch 15
事后复盘文化 — 不追人只追条件,因为你要的信息只在当事人嘴里;产出不是文档,是一串被跟到关掉的改动
Google · 2016
Ch 21
处理过载 — 容量别用 QPS 量;扛不住时主动少接一点,产出反而稳在上限上
Google · 2016
Ch 22
应对级联失效 — 失败会自己繁殖;修好起因也回不来,得亲手把回路掐停
Google · 2016
Ch 23
管理关键状态 — 心跳加超时不是绕开了共识,而是写错了的共识;这种东西请用现成的
Google · 2016
Ch 25
数据处理管线 — 管线的敌人不是数据量,是「按点开工」本身:空转的谷、挤爆的峰、看不出死活的中间态
Google · 2016
Ch 26
数据完整性 — 你以为副本在保护数据,其实副本只是把误删同步得更快;保命的是三道防线
Google · 2016
Accelerate
— Forsgren, Humble, Kim · 2018
Ch 1
加速 — 快与稳不是取舍,是同一批团队的同一件事;改进别爬等级,先找自己最弱的那一环
Forsgren et al. · 2018
Ch 2
测量效能 — 别数「干了多少」,改数四个互相牵制的结果,让谁都没法牺牲一侧去刷另一侧
Forsgren et al. · 2018
Ch 3
测量并改变文化 — 别问文化怎么样,看一条坏消息能不能走到该看见它的人手里
Forsgren et al. · 2018
Ch 4
技术实践 — 持续交付不是买流水线,是让主干随时可发;而自动化测试谁写,比写没写更能拉开差距
Forsgren et al. · 2018
Ch 5
架构 — 别争单体还是微服务,只问两句:能不能独立测、能不能独立发
Forsgren et al. · 2018
Ch 6
把安全融入交付 — 安全不是发布前那道门,而是把路铺好:让做对的事比绕开更省事
Forsgren et al. · 2018
Ch 9
让工作可持续 — 别问团队累不累,问上次上线是周几几点;倦怠是环境的输出,不是人不够强
Forsgren et al. · 2018
Ch 11
领导者与管理者 — 变革型领导如何放大技术实践的效果
Forsgren et al. · 2018
Database Internals
— Alex Petrov · 2019
Part I · 存储引擎
Ch 1
引论与概览 — DBMS 架构、行存 vs 列存、内存 vs 磁盘
Petrov · 2019
Ch 2
B-Tree 基础 — 为什么磁盘数据库偏爱 B-Tree
Petrov · 2019
Ch 3
文件格式 — 页、cell、slotted page:数据在磁盘上怎么摆
Petrov · 2019
Ch 4
实现 B-Tree — 分裂/合并、并发、页管理的工程细节
Petrov · 2019
Ch 5
事务处理与恢复 — WAL、页缓存、ARIES 恢复
Petrov · 2019
Ch 6
B-Tree 变体 — Copy-on-Write、惰性 B-Tree、FD-Tree、Bw-Tree
Petrov · 2019
Ch 7
日志结构存储 — LSM-Tree:写优化存储怎么工作
Petrov · 2019
Part II · 分布式系统
Ch 8
引论与概览 — 分布式系统的基本难题与抽象
Petrov · 2019
Ch 9
故障检测 — 怎么判断一个节点挂了(心跳、φ-accrual)
Petrov · 2019
Ch 10
领导者选举 — 选主算法与脑裂防护
Petrov · 2019
Ch 11
复制与一致性 — 一致性模型谱系、quorum、CRDT
Petrov · 2019
Ch 12
反熵与传播 — gossip、Merkle 树、读修复
Petrov · 2019
Ch 13
分布式事务 — 2PC/3PC、Percolator、Calvin
Petrov · 2019
Ch 14
共识 — Paxos、Raft、Zab、拜占庭共识
Petrov · 2019
Fundamentals of Data Engineering
— Reis & Housley · 2022
Part I · 基础与构件
Ch 1
何谓数据工程 — 数据工程师到底做什么,与数据科学的边界
Reis & Housley · 2022
Ch 2
数据工程生命周期 — 采集 / 存储 / 转换 / 服务 + 底层横切关注点
Reis & Housley · 2022
Ch 3
设计好的数据架构 — 架构原则与权衡,lakehouse / warehouse 之争
Reis & Housley · 2022
Ch 4
全生命周期选型 — 自建 vs 托管、开源 vs 云、成本
Reis & Housley · 2022
Part II · 生命周期详解
Ch 5
源系统数据生成 — 数据从哪来:数据库、API、CDC
Reis & Housley · 2022
Ch 6
存储 — 对象存储、列式格式、warehouse / lakehouse 存储层
Reis & Housley · 2022
Ch 7
采集 — 批 vs 流采集、ETL vs ELT
Reis & Housley · 2022
Ch 8
查询、建模与转换 — SQL / 查询引擎、数据建模、dbt 式转换
Reis & Housley · 2022
Ch 9
为分析与 ML 服务数据 — BI、分析、特征供给
Reis & Housley · 2022
Part III · 安全与未来
Ch 10
安全与隐私 — 数据工程师的安全责任
Reis & Housley · 2022
A Philosophy of Software Design
— John Ousterhout · 2021
Ch 1
引论:一切都是复杂度 — 软件设计的根本目标就是压住复杂度
Ousterhout · 2021
Ch 2
复杂度的本质 — 三种症状:变更放大、认知负担、未知的未知
Ousterhout · 2021
Ch 3
光能跑还不够 — 战术 vs 战略编程:「先能跑」会复利式还债
Ousterhout · 2021
Ch 4
模块要「深」 — 接口要小、实现可以厚,浅模块是复杂度之源
Ousterhout · 2021
Ch 5
信息隐藏与泄漏 — 什么该藏、什么算泄漏,为什么时序分解是陷阱
Ousterhout · 2021
Ch 6
通用模块更深 — 略微通用的接口反而更简单、更好用
Ousterhout · 2021
Ch 7
不同层,不同抽象 — 直通方法与装饰器泛滥是层次设计失败的信号
Ousterhout · 2021
Ch 8
把复杂度向下沉 — 宁可模块内部难写,也别让调用方难用
Ousterhout · 2021
Ch 9
合还是分 — 何时该合并、何时该拆分:判据不是行数
Ousterhout · 2021
Ch 10
把错误定义掉 — 让异常情况在语义上不存在,而非到处 try/catch
Ousterhout · 2021
Ch 11
设计两次 — 第一版方案几乎从不是最好的,逼自己出第二套
Ousterhout · 2021
Ch 13
注释写「不明显」的东西 — 好注释补充代码说不出的信息,而非复述代码
Ousterhout · 2021
Ch 14
命名 — 名字是最小单位的抽象,含糊的名字预示设计有问题
Ousterhout · 2021
Ch 18
代码应当一目了然 — 「显而易见」是读者判定的,不是作者
Ousterhout · 2021
Ch 20
为性能而设计 — 简洁与快通常同向;何时才该为性能牺牲清晰
Ousterhout · 2021
Software Engineering at Google
— Winters, Manshreck, Wright · 2020
Part I · 论题
Ch 1
何谓软件工程 — 编程是写代码,工程是让代码在时间与规模下仍可维护;Hyrum 定律
Google · 2020
Part III · 流程
Ch 8
风格指南与规则 — 规则为什么存在、怎么定、怎么自动执行
Google · 2020
Ch 9
代码评审 — Google 的评审流程与它真正的收益(不只是找 bug)
Google · 2020
Ch 10
文档 — 把文档当代码来维护
Google · 2020
Ch 11
测试总览 — 为什么写测试、测试规模分类与收益模型
Google · 2020
Ch 12
单元测试 — 可维护的单测:测行为不测实现
Google · 2020
Ch 13
测试替身 — mock / stub / fake 的取舍与滥用代价
Google · 2020
Ch 14
更大范围的测试 — 集成 / 端到端测试怎么做才不脆
Google · 2020
Ch 15
废弃 — 怎么体面地下线一个被广泛依赖的系统
Google · 2020
Part IV · 工具
Ch 16
版本控制与分支管理 — 为什么 Google 选单体仓 + 主干开发
Google · 2020
Ch 18
构建系统与构建哲学 — 基于制品的构建、可复现与远端缓存(Bazel 之道)
Google · 2020
Ch 20
静态分析 — 让静态分析在开发流里真正被接受的条件
Google · 2020
Ch 21
依赖管理 — 菱形依赖、语义化版本的局限、活在 HEAD
Google · 2020
Ch 22
大规模变更 — 怎么在几百万文件上安全地做一次全局改动
Google · 2020
Ch 23
持续集成 — CI 在超大规模下的形态与取舍
Google · 2020
Ch 24
持续交付 — 小步、频繁、可回滚:把发布做成非事件
Google · 2020
Ch 25
计算即服务 — 从 Borg 到托管计算:把机器当抽象资源
Google · 2020
Fundamentals of Software Architecture
— Richards & Ford · 2020
Ch 1
引论 — 架构到底是什么、架构师做什么,为什么没有标准定义
Richards & Ford · 2020
Part I · 基础
Ch 2
架构思维 — 架构与设计的边界、广度胜过深度、权衡思维
Richards & Ford · 2020
Ch 3
模块化 — 内聚与耦合怎么量:连接度、抽象度、与主序列的距离
Richards & Ford · 2020
Ch 4
架构特征定义 — 「-ility」们到底指什么,隐式 vs 显式特征
Richards & Ford · 2020
Ch 5
识别架构特征 — 从领域关切与需求里挖出关键特征(最多挑几个)
Richards & Ford · 2020
Ch 6
度量与治理架构特征 — 让特征可测量、用适应度函数持续守护
Richards & Ford · 2020
Ch 7
架构特征的作用域 — 架构量子:特征的边界不等于整个系统
Richards & Ford · 2020
Ch 8
组件化思维 — 组件怎么划分、粒度多大、与领域怎么对齐
Richards & Ford · 2020
Part II · 架构风格
Ch 10
分层架构 — 最常见的单体分层:优点、隔离层与「污水池」反模式
Richards & Ford · 2020
Ch 11
管道架构 — 管道与过滤器:ETL 与数据处理的经典骨架
Richards & Ford · 2020
Ch 12
微内核架构 — 核心系统 + 插件:产品型软件的常用形态
Richards & Ford · 2020
Ch 13
基于服务的架构 — 粗粒度服务 + 共享库:微服务的务实折中
Richards & Ford · 2020
Ch 14
事件驱动架构 — 中介 vs 代理拓扑、异步的威力与代价
Richards & Ford · 2020
Ch 15
空间架构 — 用内存网格去掉数据库瓶颈,应对极端并发
Richards & Ford · 2020
Ch 17
微服务架构 — 边界上下文、粒度陷阱、数据隔离与通信
Richards & Ford · 2020
Ch 18
如何选择架构风格 — 按架构特征反推风格的决策路径
Richards & Ford · 2020
Part III · 技术
Ch 19
架构决策 — ADR:把决策与理由固化下来
Richards & Ford · 2020
Ch 20
分析架构风险 — 风险矩阵、风险风暴与持续评估
Richards & Ford · 2020