专业书籍精读

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 2B-Tree 基础 — 为什么磁盘数据库偏爱 B-TreePetrov · 2019
Ch 3文件格式 — 页、cell、slotted page:数据在磁盘上怎么摆Petrov · 2019
Ch 4实现 B-Tree — 分裂/合并、并发、页管理的工程细节Petrov · 2019
Ch 5事务处理与恢复 — WAL、页缓存、ARIES 恢复Petrov · 2019
Ch 6B-Tree 变体 — Copy-on-Write、惰性 B-Tree、FD-Tree、Bw-TreePetrov · 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、CRDTPetrov · 2019
Ch 12反熵与传播 — gossip、Merkle 树、读修复Petrov · 2019
Ch 13分布式事务 — 2PC/3PC、Percolator、CalvinPetrov · 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、CDCReis & Housley · 2022
Ch 6存储 — 对象存储、列式格式、warehouse / lakehouse 存储层Reis & Housley · 2022
Ch 7采集 — 批 vs 流采集、ETL vs ELTReis & 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/catchOusterhout · 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依赖管理 — 菱形依赖、语义化版本的局限、活在 HEADGoogle · 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