Skip to content

BEYOND CRUD 在线书稿

软件系统的
隐藏复杂性

从数据语义、代码设计到交互、运行与演进

从一个字段、一段抽象和一次用户操作出发,理解软件中的隐藏假设,以及每种设计选择带来的责任与代价。

持续写作中 · 从引言和第一章开始

《软件系统的隐藏复杂性》书籍封面:剖开的软件模块与贯穿其中的橙色路径

READING PATH

把条件一个个加回来

从值的含义,到代码的组织与运行。
沿着 10 个部分,逐步展开设计中的取舍。

01

值的含义与表示

时间不是一个 datetime / ID 不只是数据库主键 / 金额、精度与舍入 / 字符串、编码与“长度” / Null、空值与默认值 / 单位、坐标与本地化表示 / 校验:合法输入不等于有效操作

7 章
02

代码组织与设计取舍

模块边界与依赖方向 / 重复、复用与耦合 / 抽象与封装:应该隐藏什么 / 扩展点:灵活性带来的责任 / 第三方依赖与替换成本 / 可变性、副作用与可推理性 / 资源的所有权与生命周期

7 章
03

状态、交互与数据变化

状态与状态机 / 界面状态、事实与用户反馈 / 编辑、保存与撤销 / 修改与删除:数据变化意味着什么 / 权限与归属:谁能操作这份数据 / 查询、分页与快照

6 章
04

异步、失败与重复执行

异步:任务何时开始,结果交给谁 / 取消、过时结果与任务生命周期 / 错误、异常与未知结果 / 超时与等待边界 / 重试:恢复动作也有代价 / 幂等与去重:重复请求的业务效果

6 章
05

并发与共同约束

竞态条件与业务不变量 / 事务、原子性与隔离 / 锁:保护什么,保护到哪里 / 乐观并发控制:拒绝过时的写入

4 章
06

副本、通信与跨边界协作

顺序、因果与时钟 / 一致性:读者能看到什么 / 缓存:副本的新鲜度与失效 / 消息:交付、处理与确认 / 离线、同步与冲突 / 部分成功、补偿与对账

6 章
07

兼容、演进与技术替换

兼容性:函数、组件与协议的承诺 / 数据格式与存量数据的演进 / 配置、灰度与回退 / 重构、替换与渐进迁移

4 章
08

性能与有限资源

性能:测量、瓶颈与优化证据 / 初始化、加载与预计算 / 内存、数据布局与处理粒度 / 容量、排队与背压

4 章
09

验证、故障与运行证据

测试:怎样验证一项保证 / 故障、交错与恢复验证 / 如何知道系统发生了什么

3 章
10

把设计组合成完整应用

综合实践:一个编辑器怎样可靠保存 / 综合实践:文件上传与资源生命周期 / 综合实践:一次购买如何完成 / 结语:从假设到保证

3 章 + 结语
《软件系统的隐藏复杂性》在写代码之前,先把问题说清楚。