Skip to content

范式转换的历史节奏

每一次都是同一个故事

软件工程的历史是一连串范式转换。每一次都走过同样的路:旧范式在某个压力点上暴露出系统性的不适应,新范式在边缘地带萌芽,经历一段主流否认它的抵抗期,然后在某个临界点上迅速重新定义整个行业对"什么是好的软件"的理解。

结构化编程取代了 goto 语句的自由。面向对象重新定义了代码组织的基本单元。敏捷方法论颠覆了瀑布模型对确定性的执念。微服务架构解构了单体应用的整体性假设。每一次转换,被重新定义的不仅是技术实践,更是工程文化中那些"不言自明"的默认假设。

回溯这些转换,三个结构性特征反复出现。

第一,引发范式转换的,是旧范式无法处理的复杂性压力。结构化编程不是因为 Dijkstra 写了一篇论文就取代了 goto——是因为程序规模增长到了人类无法用非结构化方式管理控制流的地步。面向对象的兴起同理——代码复用和模块化的需求已经超出了过程式编程的承载能力,语言设计的优雅与否只是表层因素。真正的推手是压力,技术只是回应压力的方式。

第二,每次转换中真正改变的是"正确性"的定义。在 goto 时代,"能跑就行"是正确的。结构化编程之后,"逻辑清晰且可追踪"成为正确的标准。面向对象之后,"职责划分合理"被纳入正确性的范畴。敏捷之后,"能响应变化"成为正确性的维度之一。每一次范式转换都在"正确"这个词上叠加了新的含义,而旧含义并不消失——它们下沉为默认前提。

第三,抵抗期的论点也如出一辙。"goto 才是最灵活的控制流"——没错,但灵活性不是在那个场景下的核心约束。"瀑布模型更可预测"——没错,但可预测性建立在需求不变的假设上,而这个假设已经不成立。抵抗者的论点通常在技术层面是正确的,但在战略层面是错误的。他们精确地回答了一个已经不再重要的问题。

当前这一次的特殊性

LLM 带来的范式转换遵循同样的结构,但有一点根本不同:系统的核心组件第一次从确定性变为概率性。

之前的每一次范式转换,无论多么剧烈,都没有动摇一个底层假设:给定相同的输入,程序产生相同的输出。结构化编程、面向对象、函数式编程、微服务——它们改变了代码的组织方式、系统的边界划分、团队的协作模式,但从未改变"程序行为是确定性的"这个地基。即便是分布式系统引入的最终一致性,那也是状态的暂时不一致,不是计算本身的不确定性。

LLM 改变了这个前提。第一章论证过,自回归生成的本质是概率空间中的条件采样。相同的输入不保证相同的输出,而且不同的输出可能都是"合理"的。这是语义层面的不确定性,没法简单归到实现层面的噪声上。

这意味着当前的范式转换比之前任何一次都更深层。它改变的是"程序"这个概念的基本语义——比代码组织方式的变革深了一个层次。

抵抗期长什么样

按照历史规律,当前正处于抵抗期。抵抗的表现形式和以往一样:用旧范式的标准来评判新范式的产物。

最典型的表现是试图把 LLM 变成确定性函数。把 temperature 设到 0,用极其严格的输出约束,添加大量的验证和重试逻辑——这些做法的潜台词是"不确定性是一个需要被消除的 bug"。第二章论证过,不确定性是本质属性。试图消除它,就像试图让市场不波动一样,代价通常高于收益。

质量保障领域也一样:用传统软件测试的框架来衡量 LLM 系统的质量。断言精确匹配、追求 100% 的回归通过率、把任何输出变化都视为缺陷——这套标准建立在确定性假设之上,在概率性系统中不仅不适用,而且会引导出错误的工程决策。第六章讨论的统计性测试方法,正是对这种旧标准的替代。

更隐蔽的一种:框架崇拜的变体。用 LangChain 或类似框架的抽象来思考 LLM 应用的结构,而不是从问题本身的结构出发。面向对象早期也有过类似的倾向——用继承层次来模拟一切。两者的共同错误是把工具的抽象误认为问题的结构。

什么将被重新定义

如果历史规律成立,当抵抗期结束、新范式被广泛接受时,以下概念将被重新定义:

"正确性"将从"输出与预期精确匹配"扩展为"输出在可接受的分布范围内"。确定性正确是概率性正确的一种极端情况——输出分布退化为单点。

"测试"将从"验证确定性行为"扩展为"验证统计性质"。一个 LLM 系统的测试套件看起来更像假设检验而非断言列表。这个方向在第六章已经展开讨论。

"接口契约"将从"类型签名"扩展为"类型签名加概率性行为规格"。第四章讨论的 Pydantic 模型和 JSON Schema 是这个方向的早期形态——它们约束了输出的结构,但还没有约束输出的分布特征。

"调试"将从"追踪确定性执行路径"转变为"分析输出分布的异常"。一个 LLM 系统的"bug"不一定是某次输出错了,而可能是输出分布偏移了。

这些重新定义,都是从"核心组件是概率性的"这个事实推出来的。基础假设一变,建立在旧假设上的概念体系就得跟着重建。这个重建过程可能需要十年甚至更长时间,但方向是确定的——因为压力点是真实的,而这个规律一直成立。

什么不会改变

但历史还揭示了另一条规律:每一次范式转换中,某些深层原则不仅没有失效,反而在新的条件下变得更重要。

关注点分离不会过时。无论组件是确定性的还是概率性的,系统的可理解性都依赖于清晰的职责边界。

约束传播不会过时。事实上,当核心组件变为概率性的,显式约束的价值反而上升了——因为你不能再依赖确定性行为来隐式地保证系统状态的一致性。第四章论证的类型系统作为约束工具,在新范式下的重要性只会增加。

"Strategy 大于 Analysis"不会过时。在不确定性更高的环境下,战略判断的杠杆效应更大,战术层面的精细调优能弥补的空间更小。

变化的部分需要学习,不变的部分需要坚守。