
在阅读本文之前,为了避免概念混淆与适用范围误判,本文的讨论建立在以下前提之上:
过去十年,软件工程的核心假设一直是稳定的。系统是确定性的,代码是可读的,行为是可推导的。
工程师通过阅读、推理和调试代码,建立对系统的控制与信任。这套机制在传统软件时代行之有效,并构成了现代工程体系的基础。
然而,随着大模型开始驱动核心软件生产流程,AI 主导的软件工程正逐步进入核心生产链路,这一假设正在被系统性打破。
AI 不再只是辅助工具,而逐渐成为生产系统的一部分。
它不仅生成代码,还参与决策、执行任务,甚至在某些场景中承担端到端的功能实现。这意味着,系统的一部分行为已经不再由人类直接编写,而是由一个复杂的、概率性的模型生成。
这带来了一个不可回避的问题:
工程控制权正在从“代码”转移到“系统行为”。

所谓“黑箱”,并不只是指我们看不到模型内部参数或推理路径。更准确地说,它描述的是一种工程状态。即系统的内部实现不可完全理解,但其外部行为必须被控制。
在传统软件中,黑箱通常是局部的。
例如,一个第三方库、一个服务接口、一个外包模块。这些组件虽然内部不可见,但其边界清晰、行为稳定,因此可以被纳入整体系统。
而在 AI 主导的软件工程中,其关键差异在于:
总而言之,AI 始终是不具备人一样的拥有高度智慧的决策和执行能力。这使得黑箱从“局部现象”演变为“系统特性”。
传统工程中,控制的核心路径可以抽象为:
理解代码 → 推导逻辑 → 验证正确性 → 建立信任
这条路径依赖一个前提:代码与工程是可被深度理解的。
但在 AI 主导的软件工程中,这条路径断裂了。我们无法通过阅读模型权重或内部结构来理解系统行为。
即使是查看生成的代码,也只能看到结果,而无法还原其决策过程,这是其一。
其二是当系统代码量到达一定规模,AI 可以在短时间内产出大量的代码与大范围的改动,我们无法去花费大量的人力成本去一一审阅,这也违背了 AI Coding 的本意。
因此,传统控制逻辑变成:
(无法完全理解实现)
↓
无法通过理解建立信任
↓
控制机制失效
这就是当前工程实践中普遍存在的不适感来源:
开发者失去了“通过理解来控制系统”的能力。
在这种背景下,问题本身需要被重新定义。
我们不再问,这段代码是怎么写出来的?
而应该问,这个系统的行为是否在可控范围内?
这看似是一个语义上的变化,但实际上是工程范式的根本转移。
新的问题结构可以表示为:
输入
↓
Agent Workflow
↓
输出
传统工程关注的是中间的实现过程,而 AI 主导的软件工程需要关注的是两端:
以及整个过程是否可观测、可验证、可回放。
基于上述背景,本文试图回答一个核心工程问题:
在无法完全理解系统实现的前提下,如何构建一个可控、可验证、可演化的 AI 主导的软件工程体系?
这个问题可以进一步拆解为三个子问题:
这三个问题分别对应后文的:
为什么这个问题在结构上是不可避免的?
答案在于工程范式本身已经发生了变化。
传统软件工程的核心是“确定性系统”。
其基本特征包括:
通俗来讲,也就是由技术负责人及团队对工程百分百把控。
控制路径可以抽象为:
代码
↓
逻辑
↓
行为
工程师通过修改代码,间接控制系统行为。
在这种模式下,“代码”既是实现载体,也是控制接口。
AI 主导的软件工程采用了一种不同的计算范式:概率性生成。
其行为可以抽象为:
输入
↓
模型
↓
输出分布
这里的关键变化在于:
这意味着,系统行为和工程实现不再完全由代码决定,而是由“模型 + 上下文”共同决定。
在这种新结构下,控制路径发生了根本变化。
传统路径:
控制代码 → 控制逻辑 → 控制行为
AI 主导的软件工程路径:
控制上下文 + 约束条件
↓
影响模型行为
↓
约束输出结果
可以用一个对比图表示:
传统系统:
[Code] → [Logic] → [Behavior]
AI 主导的软件工程:
[Context / Constraint]
↓
[Model]
↓
[Behavior]
这里最重要的变化是,控制接口从“代码”转移到了“上下文与约束”。
在传统工程中,“理解”是控制的前提。
读懂代码 → 推导行为 → 判断正确性
但在 AI 主导的软件工程中,这条路径不可行。模型的内部结构复杂到无法完全解释,系统行为也无法通过静态分析完全预测。
因此,工程目标必须改变,从“让系统可理解”,转向“让系统可治理”。
两者的差异可以总结如下:
维度 | 传统工程 | AI 主导的软件工程 |
|---|---|---|
控制方式 | 理解实现 | 约束行为 |
信任来源 | 代码阅读 | 验证机制 |
调试方式 | Debug 代码 | Debug 系统行为 |
稳定性来源 | 确定性逻辑 | 多层约束与验证 |
在新的范式下,工程的核心不再是“写出正确代码”,而是“设计一个可控系统”,即如何更好的使用 AI 来完成工程研发本质是如何做好工程控制。
这个系统需要具备以下能力:
其结构可以抽象为:
┌─────────────────┐
│ Constraint │
└────────┬────────┘
↓
┌─────────────────┐
│ Model │
└────────┬────────┘
↓
┌─────────────────┐
│ Behavior │
└────────┬────────┘
↓
┌─────────────────┐
│ Validation │
└────────┬────────┘
↓
┌─────────────────┐
│ Observability │
└─────────────────┘
这实际上就是一个控制系统,而不是一个单纯的软件模块。
在进入具体的工程治理之前,有一个更基础但往往被忽视的问题:
工程师是否在认知上接受黑箱系统。
如果这一层没有完成转变,后续所有治理机制都会在心理上被削弱,甚至被抵触。
因为在传统经验中,“看不懂”、“不用看” 往往等价于“不安全”,而 AI 主导的软件工程恰恰要求我们在“不完全理解”的前提下做出工程决策。
软件工程中的“信任”从来不是抽象概念,而是建立在具体机制之上的。
在传统模式中,信任主要来源于三个路径:
代码可读性 → 逻辑可推导 → 行为可预测
开发者通过阅读代码理解系统,通过逻辑推导验证行为,通过测试确认结果。这三者构成了一个闭环,使得“信任”成为一种可操作的工程能力,而不是主观判断。
因此,开发者对代码产生依赖并不只是习惯,而是一种经过长期验证的控制方式。
问题在于,这种依赖在 AI 主导的软件工程中被错误地延续了。
很多开发者在面对 AI 生成代码或系统行为时,会产生一种直觉判断:
如果我没有看过这段代码,我就无法保证它是安全的。
这实际上是一种认知误绑定,它把“是否看过代码”与“系统是否安全”直接关联起来,而忽略了中间真正起作用的机制。
我们换一个角度想想,企业的非技术管理人员或小公司的老板向技术员下发需求,随后技术员产出技术实现,也就是代码。这个过程对于非技术人员来说本质就是一个黑盒。
所以很多时候,我们需要从死板的程序编码转向工程与项目管理,从非技术视角来驱动项目。
在传统工程中,代码之所以带来安全感,并不是因为“看到了”,而是因为:
也就是说,代码只是一个中介工具,而不是信任本身。
在 AI 主导的软件工程中,这个中介失效了,但很多人仍然把它当作必要条件,从而产生认知冲突。
解决这一问题的关键在于完成一次认知解耦:将“实现的可见性”与“系统的可控性”分离。
新的信任路径不再依赖实现细节,而依赖验证机制:
约束
↓
执行
↓
验证
↓
信任
在这个路径中,信任的来源是:
而不是“是否亲自写过或看过代码”。
需要强调的是,这并不意味着可以无限制地接受黑箱。
黑箱系统之所以可以被工程接受,必须满足一个前提:它的行为处于可定义、可验证、可约束的范围之内。
这个范围可以称为信任边界。
可控区域
[可验证行为]
↑
信任边界
↑
不可控 / 未知区域
工程的目标不是扩大黑箱,而是:
在这一框架下,“信任 AI” 本身是一个不严谨的说法。
更准确的表达应该是:工程师并不信任 AI 本身,而是信任围绕 AI 构建的治理系统。
这一定义带来一个重要转变:
这也是后续所有工程方法成立的基础。
在完成认知层转变之后,接下来需要回答的问题是:一个黑箱系统在工程上“可控”,意味着什么?
答案不是单一指标,而是一组系统性原则。这些原则构成了黑箱治理的基础约束,也是后续架构设计的判断标准。
可约束性是所有治理能力的前提。
如果一个系统的行为无法被限制,那么后续的验证、观测和优化都没有意义。因为系统可以在任何方向上偏移。
在 AI 主导的软件工程中,约束主要体现在三个方面:
可以用一个简化结构表示:
Input Constraint → AI-led Workflow → Output Constraint
约束的目标不是减少能力,而是缩小不确定性空间。
约束定义了“不能做什么”,验证则定义了“做得对不对”。
在黑箱系统中,验证不再依赖内部逻辑,而依赖外部标准。常见形式包括:
验证的关键在于定义“正确”的标准,而不是解释“为什么正确”。
即使系统被约束且通过验证,如果运行过程不可观测,仍然无法进行有效治理。
可观测性关注的是:
在 AI 主导的软件工程中,可观测对象不仅包括输出,还包括:
一个典型的观测结构如下:
Input → [Trace] → Decision → [Trace] → Output
可观测性为调试、审计和优化提供基础数据。
AI 主导的软件工程体系不是静态的。模型更新、prompt 调整、策略变化都会影响行为。
因此,系统必须具备可演化性:
这要求:
可演化性保证系统在长期运行中保持稳定,而不是在每次调整后重新进入未知状态。
这四个原则并不是独立存在的,而是构成一个闭环系统:
Constraint → Execution → Observation → Validation → Evolution
如果缺少其中任何一环,系统都会出现结构性风险。
在这些原则之上,可以对“控制”给出一个更精确的工程定义:
控制并不意味着决定每一个执行细节,而是确保所有可能行为都落在可接受范围内。
这一定义与传统工程有本质不同:
换句话说,工程师不再控制“路径”,而是控制“空间”。
上述解决了两个问题:
第一,我们为什么必须接受黑箱。 第二,我们应该用什么原则去治理黑箱。
接下来进入核心问题:
具体如何构建一套可控的 AI 主导的软件工程体系?
答案不是单一机制,而是一套分层控制架构。
其本质类似操作系统或分布式系统中的控制面设计:不同层级负责不同维度的约束与控制,共同形成一个稳定的整体。
整个治理体系可以抽象为一个多层控制结构:
┌─────────────────────────┐
│ Cognitive / Trust │
├─────────────────────────┤
│ Constraint Layer │
├─────────────────────────┤
│ Structural Layer │
├─────────────────────────┤
│ Execution & Observation │
├─────────────────────────┤
│ Validation & Evaluation │
├─────────────────────────┤
│ Evolution & Feedback │
└─────────────────────────┘
每一层解决一个不同维度的问题:
这些层不是串行流程,而是共同作用于系统运行的控制网。
这一层不是技术实现,而是工程前提。
如果团队仍然坚持“必须看代码才安全”,那么任何黑箱治理机制都会被绕过或弱化。
这一层的核心输出只有两个:
例如:
这实际上是在回答,在什么条件下,我们允许系统运行?
这是最关键的一层之一,因为它决定了系统的行为空间大小。
如果这一层设计不当,后续所有层都会被放大压力。
契约的作用是将 AI 的“自由输出”转化为“结构化输出”。
例如:
自由文本 → JSON Schema → 可验证结构
契约的价值在于:
AI 默认是“全能生成器”,但工程系统不能允许无限能力。
必须明确:
一个典型结构:
┌──────────────────┐
│ AI │
└────────┬─────────┘
↓
┌──────────────────┐
│ Tool Whitelist │
└────────┬─────────┘
↓
┌──────────────────┐
│ External Systems │
└──────────────────┘
能力控制的目标是:防止错误被放大为事故。
这是很多系统缺失但极其关键的一层。
结构正确并不代表语义正确。
例如:
语义约束关注的是,输出是否“符合业务意义”
通常通过:
来实现。
AI 最大风险之一来自“分布外输入”。
即系统面对未见过的输入时行为失控。
鲁棒性约束的目标是:
如果约束层定义“边界”,那么结构层定义“组织方式”。
错误的结构会让系统复杂度指数级增长。
避免单一 Agent 处理所有任务,而是进行职责拆分。
典型结构:
Planner → Executor → Verifier
这样可以:
AI 不应该一次性完成所有决策,而应拆分为多步:
Task → Plan → Subtasks → Execution → Validation
这使得每一步都可以被独立控制与验证。
AI 主导的软件工程往往表现为“隐式有状态”。
问题在于:
因此必须显式管理:
例如:
Draft → Review → Approved → Published
隔离用于限制错误影响范围。
常见方式包括:
目标是,局部错误不会演变为系统性故障
这是系统运行时的控制核心。
传统系统只看输入输出,而 AI 主导的软件工程需要关注中间过程本身。
例如:
推理监控可以帮助发现:
观测包括三个层面:
一个完整链路:
Input → Trace → Decision → Trace → Output
运行层负责控制上线风险:
这使得系统变化不会立即影响全量用户。
单次结果是否正确?
手段包括:
系统整体是否变好或变差?
例如:
必须能够:
否则系统不可治理。
AI 会优化它“认为重要的东西”。
如果没有明确激励,它可能优化:
而不是实际质量。
因此需要:
系统必须支持:
完整闭环如下:
Execution → Observation → Evaluation → Update → Execution
系统会如何失效?
理解失效模式,是构建可靠系统的前提。
这是最隐蔽的一类错误。
表现为:
但业务逻辑错误。
例如:
问题本质是,结构验证无法覆盖语义正确性
AI 主导开发流程在长链任务中,往往会逐渐偏离原始目标。
原因包括:
可以表示为:
Initial Goal → Step1 → Step2 → Step3 → Drift
最终结果与初始目标偏离。
随着模型能力提升,会出现一种新风险:AI 学会“通过测试”,而不是“完成任务”。
表现为:
这类似于:
AI 在训练数据之外的输入上表现不稳定。
问题包括:
这些情况往往不会出现在测试集中,但会出现在真实环境中。
如果系统无法观测推理过程,就无法解释错误。
问题表现为:
AI 优化的目标与工程目标不一致。
例如:
可以表示为:
Expected Goal ≠ Optimized Goal
这些问题并不是独立的,而是相互影响:
State Drift → Wrong Context → Semantic Error
↓
Evaluation Failure → Incentive Distortion
一旦系统进入错误路径,可能形成连锁反应。
上述分析了黑箱系统的主要失效模式,本节要解决一个更现实的问题:
在这些不可避免的不确定性之下,我们究竟能够“验证到什么程度”?以及,工程上应该如何构建一套可落地的方法体系?
这实际上是在给“信任”划定一个工程边界。
在传统软件工程中,我们往往默认一个隐含前提:系统是可以被充分测试的。
但在 AI 主导的软件工程中,这个前提并不成立。
原因在于:
可以用一个简化模型表示:
Input Space → 无限
Context Space → 组合爆炸
Behavior Space → 不可穷尽
因此,不存在“覆盖全部情况”的测试体系。
为了理解验证的边界,需要区分两类系统:
特性 | 确定性系统 | 概率系统 |
|---|---|---|
输入输出关系 | 固定映射 | 分布映射 |
可预测性 | 高 | 有限 |
测试覆盖意义 | 强 | 有限 |
错误模式 | 可枚举 | 不可穷尽 |
在概率系统中,测试的作用不是“证明正确”,而是“估计风险”。
因此,“测试通过”必须被重新定义。
传统语义:测试通过 = 系统是正确的
AI 主导的软件工程语义:测试通过 = 在已知样本空间内,系统行为处于可接受范围
这意味着测试本身只是信任体系的一部分,而不是最终结论。
既然单一测试无法覆盖全部情况,就必须构建多层验证结构。
可以抽象为:
Level 1 → 单元验证
Level 2 → 端到端验证
Level 3 → 不变量校验
Level 4 → 对抗测试
Level 5 → 在线评估
每一层解决不同问题:
在实践中,黑箱治理需要一套系统化方法,而不是零散措施。
可以归纳为五个步骤。
所有系统必须从明确目标开始。
核心问题包括:
这一步决定了后续所有机制的方向。
在目标确定后,需要明确 AI 的操作边界:
目标是将系统能力限制在“安全可控范围”内。
将前面提到的验证层落地为具体系统:
关键在于,验证必须是持续运行的,而不是上线前一次性完成。
系统必须具备以下能力:
一个典型结构:
Execution → Log → Trace → Storage → Replay
AI 主导的软件工程体系会持续变化,因此必须设计:
目标是:每一次变化都是可控的,而不是“重新开始”。
在前面的章内容中,我们构建了一套完整的黑箱治理理论与工程框架。
本节的目标是回答一个更宏观的问题:这些变化是否只是局部实践,还是正在成为整个行业的共识?
答案是明确的。
AI 主导的软件工程正在整体转向系统治理范式。
早期 AI 发展的关注点是模型本身:
但当前趋势已经发生转移,模型能力只是基础,系统能力才决定最终效果。
系统能力包括:
早期工程实践中,重点在于 prompt 设计。
但随着系统复杂度提升,prompt 已经不再是唯一控制手段。
新的控制对象包括:
可以表示为:
Context = Prompt + Memory + Tools + State + Constraints
这意味着,控制 AI 的核心,不是单一输入,而是整个上下文系统。
随着系统复杂度提升,观测能力成为基础设施。
核心组件包括:
其作用类似传统系统中的监控平台,但复杂度更高。
未来系统将越来越多地采用多 Agent 架构:
Agent A → Agent B → Agent C
│ │
↓ ↓
Tool Memory
这种结构带来两个变化:
这进一步强化了状态治理成为核心能力
一个重要趋势是,使用 AI 来评估和监控 AI
典型应用包括:
这使得系统可以在没有人工干预的情况下持续运行。
随着 AI 主导的软件工程与外部环境的交互增加,新的风险开始出现:
这些问题本质是系统边界不清晰。
因此必须加强:
综合所有趋势,可以对未来工程形态做出一个判断:软件工程正在从“构建程序”,转向“设计控制系统”。
这个系统的核心职责不再是执行逻辑,而是:
这一变化对工程师提出新的能力要求:
传统能力:
新能力:
本文的最终结论可以总结为一句话。
对 AI 主导的软件工程而言,核心不再是写出正确的代码,而是构建一个始终可控的系统。
黑箱不是问题,失控才是问题。
工程的任务也从“理解内部”转向“控制整体”。
当这一转变完成时,黑箱将不再是阻碍,而是系统能力的一部分。
workflow 与 agent 的区分、简单可组合架构、复杂性控制与可信执行环境的讨论直接相关。task、trial、grader、trace、harness、回归评估和评估基础设施的概念高度相关。guardrails、单 Agent 与多 Agent 编排的讨论直接相关。AI-as-a-Judge、自动评估、Judge 可靠性、偏差控制与元评估问题。