读论文:Programming as Theory Building

2026-08-251 出链1 引用

编程的本质是构建关于程序如何满足需求的理论,理论丢失是软件退化的根源

https://pages.cs.wisc.edu/~remzi/Naur.pdf

  • 是什么(What):
    • 编程的本质不是生产代码制品,而是构建一个关于“程序如何满足需求”的理论(theory)。理论存在于程序员和团队的头脑中,代码只是理论的部分外化;理论一旦丢失,软件就会退化。
  • 为什么(Why):
    • 需求世界复杂且持续变化,程序必须能适应环境。而理论——程序行为与世界的关系、决策依据、对变化的适应能力——无法被完整记录成文档,只能由人持有。因此软件维护的本质,是维持团队对系统的理论。
  • 怎么做(How):
    • 以“理论构建”为视角重新组织工程实践:Clean Code、架构、文档、测试、DDD、设计模式、图表,作用都是帮助团队表达、传递和更新理论;维护时保持团队连续性、重视心智模型交接;用“是否帮助团队共享理论”来评价任何工程实践。

核心问题(问题演化):

  1. 编程到底是什么:生产代码制品,还是构建理论?
  2. 为什么程序即使代码一行未变,也会在维护中退化?
  3. 理论能否被完整记录下来?若不能,工程实践该如何应对?
  4. 如何评价一个工程实践是否有价值?

设计思想(核心抽象):

  1. theory 的概念与内容:理论是程序员持有的、关于程序如何满足需求、程序行为与世界如何对应的知识,包含决策依据和对变化的适应能力。
  2. 理论的持有者是团队而非文档:代码、文档只是理论的部分外化,完整理论只能存在于人的头脑中。
  3. 三种编程观:论文区分 theory-building(理论构建)、rationalist 理性主义(把编程看作产出文档与制品)、craft 技艺观(把编程看作手艺),并论证 theory-building 才是本质。
  4. 程序退化机制:人员更替 → 理论丢失 → 后续维护只能靠猜 → 程序退化,即使代码本身没有变化。
  5. 理论的不可表达性:理论无法被穷尽地写成文档;失去理论的人无法靠阅读制品重建它。

工程取舍(为什么这样设计):

  1. 为什么不能只靠文档:理论不可穷尽,文档只是部分外化,永远落后于真实的决策与取舍。
  2. 为什么维护依赖团队连续性:理论由人持有和传递,人员流动是最快的理论流失渠道,交接心智模型比交接代码更重要。
  3. 为什么实践中会出现形式主义:当实践脱离了“共享理论”的目的,只追求流程、指标、产出物,实践就退化为形式主义。
  4. 复杂度如何破坏理论的可持有性:复杂度让 theory 无法被完整持有、传递和更新,控制复杂度就是保护理论(呼应 系统理论 的结论)。

启发点(关键洞察):

  1. 软件维护的本质是维护团队对系统的理解,而非维护代码。
  2. 评价工程实践的标尺:是否帮助团队构建、表达、验证、传递系统理论
  3. 写代码时考虑理论可传递性:让接手者能重建同样的心智模型。
  4. 接手代码的首要任务是重建理论,而不是只读代码。
  5. 好软件不是只有好代码,而是有一套可被团队持续理解和演进的系统理论,参见 系统理论

评论