阅读主题
BEYOND CRUD 在线书稿
从数据语义、代码设计到交互、运行与演进
从一个字段、一段抽象和一次用户操作出发,理解软件中的隐藏假设,以及每种设计选择带来的责任与代价。
持续写作中 · 从引言和第一章开始

READING PATH
从值的含义,到代码的组织与运行。
沿着 10 个部分,逐步展开设计中的取舍。
时间不是一个 datetime / ID 不只是数据库主键 / 金额、精度与舍入 / 字符串、编码与“长度” / Null、空值与默认值 / 单位、坐标与本地化表示 / 校验:合法输入不等于有效操作
模块边界与依赖方向 / 重复、复用与耦合 / 抽象与封装:应该隐藏什么 / 扩展点:灵活性带来的责任 / 第三方依赖与替换成本 / 可变性、副作用与可推理性 / 资源的所有权与生命周期
状态与状态机 / 界面状态、事实与用户反馈 / 编辑、保存与撤销 / 修改与删除:数据变化意味着什么 / 权限与归属:谁能操作这份数据 / 查询、分页与快照
异步:任务何时开始,结果交给谁 / 取消、过时结果与任务生命周期 / 错误、异常与未知结果 / 超时与等待边界 / 重试:恢复动作也有代价 / 幂等与去重:重复请求的业务效果
竞态条件与业务不变量 / 事务、原子性与隔离 / 锁:保护什么,保护到哪里 / 乐观并发控制:拒绝过时的写入
顺序、因果与时钟 / 一致性:读者能看到什么 / 缓存:副本的新鲜度与失效 / 消息:交付、处理与确认 / 离线、同步与冲突 / 部分成功、补偿与对账
兼容性:函数、组件与协议的承诺 / 数据格式与存量数据的演进 / 配置、灰度与回退 / 重构、替换与渐进迁移
性能:测量、瓶颈与优化证据 / 初始化、加载与预计算 / 内存、数据布局与处理粒度 / 容量、排队与背压
测试:怎样验证一项保证 / 故障、交错与恢复验证 / 如何知道系统发生了什么
综合实践:一个编辑器怎样可靠保存 / 综合实践:文件上传与资源生命周期 / 综合实践:一次购买如何完成 / 结语:从假设到保证