知识卡片
结构化编程真正的价值是创造可证伪的程序单元
内容
[[结构化编程诞生于可推导性追求goto有害的真正原因]]描绘的欧几里得式形式化证明理想最终没有实现——没有几个程序员真的会为每个小函数写冗长的正确性证明,Dijkstra的梦想落空了。但科学证明法提供了另一条路:科学定律(如牛顿第二定律F=ma)从来不能被数学式地证明,只能被证伪——反复实验无法证明定律永远正确,但只要暂时无法证伪,我们就认为它当下足够正确;数学是把可证明的结论证明,科学则是把可证伪的结论证伪。Dijkstra那句”测试只能展示bug的存在,并不能证明不存在bug”正是这个思路的直接应用:一段程序能被测试证明其错误,却不能被证明其正确,测试的作用只是让我们得出”这段程序已经足够实现当前目标”的结论。但这种证伪法只对可证明的程序有效——如果程序里用了不受限制的goto,写再多测试也无法真正证明它的正确性,因为它根本不具备被递归分解成可证明单元的结构。因此结构化编程范式最有价值的地方,不是让程序被数学证明,而是赋予了我们创造可证伪程序单元的能力:先把程序递归分解成可证明的小函数,再写测试试图证伪这些函数,如果测试无法证伪,就认为它们足够正确。这正是为什么”功能性降解拆分”(把大问题拆成高级函数、再拆成低级函数,无限递归)至今仍是架构设计领域的最佳实践之一——软件开发从最小函数到最大组件的每个层面,本质上都是一门由证伪驱动的科学研究活动。
参考来源
- 位置:《架构整洁之道》第4章《结构化编程》"形式化证明没有发生""科学来救场""测试""本章小结"(源文件:_epub-src/text/part0011_split_002.html)
- 结论依据:原文说明形式化证明未能普及,转而用科学定律"可证伪不可证明"的类比解释测试的本质作用,并明确指出结构化编程最有价值之处是创造可证伪的程序单元,功能性降解拆分因此仍是架构设计最佳实践,直接支撑本卡片结论。
- 原始内容:测试只能展示Bug的存在,并不能证明不存在Bug……结构化编程范式中最有价值的地方就是,它赋予了我们创造可证伪程序单元的能力……在架构设计领域,功能性降解拆分仍是最佳实践之一。