从 Shannon 到 AI Coding:信息、控制与系统的工程之美
引子
在技术史上,有些理论诞生时看起来离实践很远,但过了几十年,工程世界的演化反而把它们推到了舞台中央。系统论、控制论和信息论就是这样的例子。
这三套理论在中文语境里常被合称为”三论”。这个称呼本身有争议——钱学森后来批评过,认为把三者简单并列不够严谨,系统科学应当把控制与信息吸纳到更大的框架中去。不过,争议归争议,如果我们不纠缠于学科分类的精确性,而是把它们当作三种不同的观察复杂问题的方法论,那么它们在今天的 AI coding 实践中确实各有不可替代的解释力。
这篇文章不打算做思想史梳理。我想做的事情更具体:从工程角度说清楚,为什么一个现代软件工程师在使用 AI 辅助开发时,会自然地遇到这三套理论所关心的核心问题。而理解这些问题,能帮助我们更理性地看待 AI coding 的能力与局限。
第一章 三论各自在解决什么问题
让我们先回到每一套理论的原始关切。
系统论:部分如何组成整体
系统论的核心命题可以用一句话概括:整体不等于部分的简单相加。 它关心的是结构、边界、层级和关系——一组相互关联的部件,如何通过特定的组织方式涌现出单个部件所不具备的性质。
这个思想今天看来平淡无奇,但它在方法论上的意义很深:当你面对一个复杂对象时,不应该只看局部性能,而要看局部之间的关系和约束。一个由优秀零件组成的系统未必优秀,一个由普通零件组成的系统只要结构得当,可能运行得非常稳定。
控制论:运动中的系统如何不跑偏
控制论关心的不是静态结构,而是动态行为。用 Britannica 的经典概括来说,它研究的是:一个监测者如何把系统当前状态与某个标准进行比较,再由控制者根据偏差来调整系统行为。
这个定义里有四个关键角色:目标(参考值)、传感器(测量当前状态)、比较器(计算偏差)、执行器(实施修正)。恒温器是最简单的例子:设定温度是目标,温度计是传感器,温差是偏差,加热器是执行器。导弹制导、自动驾驶、工业过程控制,都是同一个逻辑的不同实现。
控制论不试图一次把事情做对。它假设系统一定会偏离,然后研究如何通过反馈持续地把偏差压回可接受的范围。
信息论:信号如何在噪声中保真
Shannon 在 1948 年发表的那篇论文,刻意把”意义”排除在理论核心之外。他关心的不是一条消息说了什么,而是一条消息在从信源到信宿的传输过程中,如何被编码、通过有噪信道传输、并尽可能正确地被解码。
Shannon 模型的几个环节——信源、编码器、信道、噪声、解码器、信宿——构成了一个非常普适的分析框架。它的核心洞见是:任何通信系统的可靠性,都受限于信道容量和噪声水平,而好的编码方案可以在物理极限内最大化传输的保真度。
把这三者摆在一起,它们的分工就清楚了:
| 理论 | 核心问题 |
|---|---|
| 系统论 | 部件如何组织成有效的整体? |
| 控制论 | 动态系统如何持续纠偏? |
| 信息论 | 信号在传输中如何保真? |
接下来,我要说明为什么 AI coding 恰好需要同时回答这三个问题。
第二章 AI Coding 为什么是一个复杂系统
理解 AI coding 的本质,首先要摆脱一个简单化的认知:它不只是”代码补全”。
Anthropic 的 Claude Code 文档把这类工具定义为 agentic coding tool——它不仅生成代码片段,还会读取代码库、编辑文件、运行命令、与开发工具集成。常见工作流包括理解陌生代码库、调试、重构、写测试、生成 Pull Request。换言之,现代 AI coding 工具的操作对象已经从”单个函数”升级到了”整个仓库”。
其次,AI coding 具有本质上的非确定性。OpenAI 的评测文档明确指出,生成式 AI 是可变的——同样的输入有时会得到不同的输出。这意味着传统软件测试方法并不足以覆盖这种架构,必须引入专门的评测框架(evals)来持续度量性能和稳定性。
最后,SWE-bench 等基准测试揭示了真实任务的复杂度。它把问题定义为”给定一个代码库和一个 issue,让模型去修改代码并通过仓库测试”。这些问题常常要求跨多个函数、类乃至文件进行协调,还要与执行环境交互、处理很长的上下文。
这三个特征——仓库级操作范围、非确定性波动、真实工程复杂度——叠加起来,使 AI coding 成为一个典型的复杂系统。它不是一个可以用输入输出函数完整描述的黑箱,而是一个由人、模型、工具、代码、测试、流程共同构成的动态整体。
第三章 系统论视角下的 AI Coding
从系统论的角度看 AI coding,最重要的认知转变是:决定产出质量的不是模型这个单点,而是整个系统的结构。
OpenAI 的 agent 指南把 agent 的基本形态概括为三个要素:模型、工具、指令。这三者需要协同工作。模型负责推理与决策,工具负责与外部系统交互,指令负责定义行为边界。它们之间的匹配程度决定了 agent 的实际效能。
在此之上,还有更高层次的系统设计问题:单 agent 还是多 agent?循环何时终止?何时移交(handoff)?何时触发防护机制(guardrail)?这些都属于编排(orchestration)层的决策。
系统论在这里提供了一个非常重要的警示:局部最优不等于整体最优。 一个能力极强的模型,如果放进一个没有明确边界、缺乏测试、没有审查流程的环境里,往往会快速产出表面正确但深层有害的结果——函数级代码可能很精致,但架构级一致性已经被破坏了。
反过来,一个中上水平的模型,放进目标明确、上下文清晰、测试完备、回滚方便的系统里,产出的可靠性反而更高。OpenAI 的 agent 指南建议先用最强模型建立性能基线,再逐步替换成更小模型以优化成本——这正是系统论思维的体现:模型是系统的一个可替换部件,而不是不可动摇的核心。
从系统论出发,工程师需要关心的问题包括:
- 系统的边界在哪里?哪些文件可改,哪些不可改?
- 各部件之间的接口是否清晰?模型、工具、指令之间是否有模糊地带?
- 知识如何在系统中沉淀?是停留在个人经验里,还是已经固化到文档和测试中?
- 故障如何暴露?有没有机制让错误在早期就变得可见?
这些问题看起来朴素,但它们决定了 AI coding 系统的真实产能上限。
第四章 信息论视角下的 AI Coding
如果系统论解决的是”结构”问题,那么信息论解决的是”传输”问题——更准确地说,是人的意图在传递给模型的过程中如何失真的问题。
这是一个非常值得仔细思考的类比。Shannon 模型中的六个环节可以这样对应到 AI coding 场景:
| Shannon 模型 | AI Coding 对应 |
|---|---|
| 信源 | 用户头脑中的需求 |
| 编码器 | 需求文档、prompt、示例、接口约定 |
| 信道 | 上下文窗口、工具调用、检索结果 |
| 噪声 | 模糊措辞、缺失约束、冲突文档、过长上下文 |
| 解码器 | 模型的内部表征与推理过程 |
| 信宿 | 生成的代码、改动和答复 |
这个类比当然不是 Shannon 原意的严格应用,但它有很强的解释力。它帮助我们理解为什么”你明明讲过了,模型还是做错”——问题往往不在解码端(模型智力不足),而在编码端(你的表述引入了歧义)或信道端(上下文组装引入了噪声)。
从信息论的角度,有三个工程启示值得重视。
第一,写 prompt 本质上是在做编码。 Anthropic 的最佳实践明确建议:清晰、直接、具体;把 prompt 给一个对任务没有背景的同事看,如果他会困惑,模型也会困惑。这不是修辞建议,而是编码质量要求。
第二,上下文的价值取决于信噪比,而不是绝对量。 Anthropic 建议编码任务一开始就提供完整上下文,但”完整”指的是”所有关键信息到位”,不是”所有能找到的材料都扔进去”。无组织的海量信息会降低信噪比,反而损害输出质量。
第三,文档在 AI 时代获得了新的工程角色。 传统开发中,很多知识以默会形式存在于工程师的经验中。LLM 无法继承默会知识,它依赖外显材料。因此,需求文档、设计文档、ADR、接口契约、样例输入输出不再只是”人看的说明书”,它们同时也是”模型读的编码协议”。
从信息论的角度看,一个工程团队在 AI coding 中的效能上限,很大程度上取决于它把隐性知识转化为显性、可机器消费的材料的能力。这一点的重要性在今天被严重低估了。
第五章 控制论视角下的 AI Coding
信息论帮助我们理解信号失真的问题,但信号即使传输完美,系统也不一定能稳定运行——因为模型本身是非确定性的。这时候就需要控制论。
控制论的核心逻辑很直接:定义目标 → 测量实际状态 → 计算偏差 → 执行修正。在 AI coding 中,这个回路对应的是:
- 定义正确性标准(测试用例、验收清单、评分标准)
- 让模型生成产物
- 通过自动化或人工手段检测产物是否符合标准
- 根据检测结果修正(再提示、补约束、换策略、人工介入)
OpenAI 的评测文档把这个过程说得很清楚:eval 的基本流程是定义目标、收集数据、定义指标、运行并比较、再迭代。另一篇关于测试 agent skills 的文章更进一步,把 eval 描述为”prompt → captured run → checks → score”,并强调要把 outcome、process、style、efficiency 分开检查。这几乎就是经典控制系统的工程化实现。
控制论视角带来的一个特别重要的工程认知是:TDD 在 AI 时代获得了新的合理性。
在纯人工编程时代,很多工程师不爱 TDD,是因为写实现已经够痛苦了,测试容易被当作拖慢速度的成本项。但 AI 改变了这个经济等式:当实现的边际成本因 LLM 而大幅下降时,验证的边际价值就相对大幅上升。TDD 本质上不是”先写测试”,而是”先把目标函数外显化”。用控制论的术语说,就是先设定参考值,再允许系统运行。
控制论还强调一点:反馈回路的速度决定了控制的精度。 反馈越快,偏差累积越少。在 AI coding 中,这意味着应该把反馈层层前置——lint 和类型检查在本地就做,单测在提交前就跑,契约测试和 smoke test 在 CI 中拦截,人工 review 作为最后一道防线。如果唯一的反馈点是”PR 合并后线上出事故”,那控制回路就太长了,偏差会在无形中放大到难以收拾的程度。
第六章 三论合一:可能性空间与收敛
把三个视角合在一起,我们可以获得一个更完整的认识框架:
AI coding 的真正操作对象,不是代码文本本身,而是一个由结构、信号和反馈共同塑造的”生成可能性空间”。
- 系统论决定这个空间的边界与拓扑——有哪些部件、哪些接口、哪些约束。
- 信息论决定空间内的信号质量——目标是否传达到位、约束是否完整、上下文是否干净。
- 控制论决定空间的收敛机制——当产出偏离目标时,系统如何检测到偏差并实施修正。
一个高能力的模型在一个边界模糊、信号嘈杂、缺乏反馈的系统中工作,就像一台高性能发动机装在一辆没有方向盘和仪表盘的车上——速度越快,偏离越远。反过来,一个结构清晰、信号干净、反馈密实的系统,即使搭载的模型算不上顶尖,也能在多数实际工作中产出稳定而可靠的结果。
SWE-bench 这类基准之所以有价值,恰恰是因为它测量的不只是”模型能否写出一段正确的代码”,而是”模型能否在复杂仓库中完成任务并通过既有测试”。后者是一个系统级的度量,不是模型级的度量。
第七章 工程启示与实践建议
把以上分析收敛为具体的工程实践,以下五点值得特别重视。
一、把测试驱动从技术习惯升级为系统基础设施。 不要只把测试理解为单元测试。验收清单、API 契约、边界样例、回归场景表,都是”先定义目标,再驱动生成”的方法。在控制论意义上,它们就是系统的参考值。
二、在设计阶段就为可测性和可观测性预留接口。 一个模块如果副作用太重、边界模糊、输入输出不可观察,那么无论搭配多强的 AI,也很难建立有效的控制回路。
三、把文档视为降低信息失真的工程手段。 需求文档、设计文档、ADR、接口契约不是形式主义的附属品,而是把默会知识外显化、降低编码歧义的核心工具。在 AI 参与开发的团队中,文档质量直接决定了人机协作的信噪比。
四、把反馈回路做短、做密。 能在本地检查的不等 CI,能在单测发现的不等集成联调,能在 eval 数据集中复现的不靠线上事故学习。控制论最忌讳的就是回路太长——长回路意味着偏差在暗处累积。
五、复盘时按三论分类定位问题。 遇到 AI coding 的失败,不要笼统归因为”模型不行”。有针对性地问:是系统结构问题(边界没划清、部件没协同)?还是信息问题(文档失真、上下文噪声太大)?还是反馈问题(测试没覆盖、trace 没监控)?分类越精确,改进越高效。
结语:三论作为工程思维的底层语法
回到文章开头的判断:有些理论诞生时离实践很远,但时代演化会把它们推到实践的中央。
在传统软件工程时代,工程师的核心身份是”实现者”——理解需求,亲手编码,调试发布。在 AI 参与开发的时代,工程师的身份正在演变为”系统的设计者与治理者”。他需要设计部件关系(系统论),需要管理语义传输的保真度(信息论),需要构建偏差检测与修正的闭环(控制论)。
这不是说编码能力不重要了,而是说编码能力被纳入了一个更高阶的能力层次。最终,优秀工程师的竞争力将体现在三个方面:
- 系统设计能力:知道如何布置部件、划定边界、定义接口。
- 信息架构能力:知道如何把隐性知识转化为模型能正确吸收的显性材料。
- 反馈工程能力:知道如何把测试、评测、审查、trace、监控组织成可持续纠偏的闭环。
如果用一句话来概括这篇文章的核心观点:
AI 时代的软件工程,本质上是在一个高能力、高波动的生成系统中,通过良好的系统结构、清晰的信息编码和密实的反馈回路,把”可能正确”持续压缩为”稳定正确”。
这是三论在 AI coding 时代焕发活力的根本原因——不是旧理论被硬套到了新场景,而是新场景的内在结构恰好与旧理论的核心命题高度吻合。从 Shannon 到 AI Coding,中间隔了七十多年,但工程之美的底层逻辑从未改变:面对复杂性与不确定性,好的工程永远是结构、信号与反馈的协奏。