Write Little Proofs in Your Head
核心理念
在编写代码时,在脑海中" sketch a proof",证明你的代码将做你想让它做的事情。这是一个需要大量练习的技巧,但一旦熟练,你会发现代码在第一或第二次尝试时就能正常工作。
1. 单调性 (Monotonicity)
单调性是指代码"不回退"的特性。
- 检查点 (Checkpointing):记录已完成的步骤,崩溃后从最后状态恢复
- 日志文件系统:Write-ahead logs 是单调性的应用
- LSM 树 vs B 树:LSM 树是纯追加的,只增不减(压缩时除外)
- 不可变性:创建后不可修改的对象,可以完全忽略"对象可能在脚下变化"的所有场景
2. 前置/后置条件 (Pre-/Post-conditions)
- 前置条件:函数运行前必须为真的假设
- 后置条件:函数返回后必须为真的断言
- 明确定义后置条件是生成单元测试想法的好方法
- 添加断言来验证前后置条件,代码崩溃比不可预测的行为更安全
3. 不变量 (Invariants)
不变量是代码运行前、运行中、运行后都应该为真的事物。
"One of the oldest and most famous examples of an invariant is the accounting equation: debits must equal credits."
- 将代码分成原子"步骤",证明每一步都保持不变量
- 然后可以得出结论:不变量无论以何种顺序运行都会保持
- 使用监听器或生命周期方法确保关键点不变量为真
实践建议
- 在写代码时同时进行推理,而不是写完再验证
- 注意代码的单调性和不可变性特征
- 明确定义函数的约束条件
- 识别并维护关键不变量