Write Little Proofs in Your Head

⭐⭐⭐⭐ | 2026-03-20 | Get Nerve Blog

核心理念

在编写代码时,在脑海中" 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."
  • 将代码分成原子"步骤",证明每一步都保持不变量
  • 然后可以得出结论:不变量无论以何种顺序运行都会保持
  • 使用监听器或生命周期方法确保关键点不变量为真

实践建议

  • 在写代码时同时进行推理,而不是写完再验证
  • 注意代码的单调性和不可变性特征
  • 明确定义函数的约束条件
  • 识别并维护关键不变量
← 原文链接