AI软件工程
需求、实现、测试、审查与长期交付
沿着对象与状态理解本章
先写出要守住的行为,再用会失败的反例证明确实需要修改。测试通过必须绑定被测代码版本;之后再改文件,旧绿色结果不再证明当前交付。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
测试是找反例,不是给代码盖绿章
为什么“测试都通过”仍可能交付错东西?
测试只能验证它实际检查的行为和版本。一条只断言“不报错”的测试无法证明排除规则正确。好的测试围绕需求构造能击中错误的输入;代码修改以后,旧绿色结果也不再自动属于新版本。
输入与适用条件:构造的文件筛选任务;通配符语义须由需求明确,不在动画里偷偷改变“匹配文件名”与“匹配完整路径”的规则。
1 / 6 · 明确需求
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
不先说匹配对象与目录语义,无法判断哪个输出才正确。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
减少返工和虚假完成,而非让审查循环无限增长。
怎样实现
围绕可观察行为、反例和当前版本组织验证。
可能的代价与误解
测试与实现共用同一错误假设、只测顺利路径、频繁审查无实际修复。
如何判断是否做对
故意引入一处已知错误,测试应失败;恢复后再通过。
先定义可验证的完成
AI软件工程不是生成尽可能多的代码,而是让需求、实现与证据对齐。SWE-agent研究操作接口,长期Harness研究跨会话推进,传统测试与Review提供质量基础,三者不能互相替代。[S130][S132][S133]
原创exclude完成标准:嵌套路径有效,旧顶层行为不变,非法配置明确报错,相关测试通过,没有无关接口变化。“看起来专业”容易奖励抽象堆叠;“所有测试通过”若测试太弱,也可能是假完成。
最小充分修改
理解目标→找证据→复现→确定边界→修改→验证→交付,是实用思路而非固定审批制度。简单任务可连续完成,复杂任务在证据不足时展开。最小充分不是机械最少行数,而是满足目标且风险合理的改动。[S136][S137]
原创例子:路径基准不一致,可以调用前规范化,也可以匹配器内部规范化。选择取决于职责、调用者和兼容性,不是为了统一而新建全局框架。减少无关格式调整有助于审查,但真正阻碍正确性的结构问题不能回避。
测试行为,不迎合实现
单元测试便于定位,集成测试验证边界,端到端测试验证用户路径。测试金字塔是成本与反馈原则,不是固定数量配方。[S138]
对exclude,单元测规范化,集成测配置和文件列表,端到端测产物。还要验证不应排除的文件,避免“全部过滤”通过片面断言。测试记录需关联代码版本;补丁A通过后加B,旧结果不自动覆盖新版本。
CI稳定执行检查与反馈,不证明所有未测行为正确。Agent不应为绿色状态删除不理解的测试,除非需求确实改变且证据充分。[S139]
Review不追求无穷完美
Google标准强调改善整体代码健康度,并区分重要问题与个人偏好。Review应关注设计、功能、复杂性和测试,而非无限阻止不完美但合理的进展。[S136][S137]
原创流程可以允许审查者直接修正小而明确的问题,再验证;跨模块或目标歧义再交回处理。独立Review的价值在于发现新重要问题,不在于多一次角色名称。没有新证据的反复审查可能只增加延迟。
长任务需要交接产物
早期长任务Harness案例使用初始化与增量开发职责,配合进度、功能清单和版本历史。后续实验探索规划、生成、评估组合,并随模型能力调整上下文重置策略。这些都是有条件案例,不是每个项目必须用同样文件名和角色。[S130][S131][S142]
原创最小交接包括当前可运行状态、已完成与未完成需求、决策理由、验证证据和下一步。一个小Bug不需要先建数百条验收项。多Agent编译器案例值得学习任务切分与测试,不应从代码规模推断任意场景可无人管理。[S134]
质量下降也可能来自Harness
Anthropic在2026-04-23复盘了产品层变化,包括推理努力、旧推理处理和冗长度约束对质量的影响。它区分受影响产品层与当时API层的情况,不是所有质量波动的统一解释。[S141]
原创启发:版本化模型、Prompt、工具、裁剪和环境,测试长会话与恢复场景,做消融定位。只测新建短会话可能漏掉状态相关故障。
决策记录与交付
ADR记录背景、选择和后果,适合重要且可能被重新质疑的决策,不必为每个变量写文档。交付应说明实际修改、验证结果、未验证部分和风险,而非笼统“全部完成”。[S140][S135]
自检:测试通过就无需审查?不一定,取决于未覆盖风险。Review越多越好?不是,应看边际缺陷发现与返工成本。
逐项中文讲义
保留拓展阅读目录编号与A/B/C优先级;每项包括机制解释、边界与原创练习。
A11.1 · 跨上下文持续开发
对应资料:Effective Harnesses for Long-Running Agents
长期Harness文章研究如何让Agent跨多个上下文持续推进应用开发,通过初始化、增量任务与交接记录保持进展。它针对特定实验,不是所有项目都必须复制的文件和角色清单。
长对话不是唯一持久状态。需求、代码版本、测试结果与下一步应能在新会话中重新确认,避免反复从零开始。
新上下文如何接着修复而不重做
输入与条件。上一阶段已写v8,测试未运行,原文日志外置。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1交接 | 目标、v8、未测、禁止提交 | 明确当前状态。 |
| 2恢复 | 先确认磁盘确为v8 | 避免拿旧检查点继续。 |
| 3下一步 | 运行必要测试 | 不重新应用已完成补丁。 |
把过程连起来。跨窗口连续性依赖可核查状态,不是让模型记得全部聊天。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:完成一半功能后清空会话,只保留简短交接和原始证据位置,让后续过程恢复任务。
完成标准是不重复已完成动作、不把未验证状态当成通过,并能识别环境后来发生的变化。
拓展阅读目录事实依据 [S130] · 练习与工程推导为本书独立编写。
A11.2 · 长应用开发的反馈结构
对应资料:Harness Design for Long-Running Application Development
长应用开发Harness探索规划、生成与评价之间的反馈组织,尤其关注完整应用的质量。模型能力变化可能使某些旧约束不再必要,因此方案需要重新评估。
复杂应用需要外部验收与状态管理,简单修复却可能不值得同样编排。不能把一个成功案例升级成固定多阶段制度。
长应用开发按可验证功能推进
输入与条件。待实现登录、搜索、导出三功能。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1定义 | 每项有具体验收输入 | 不只列“完成登录”。 |
| 2增量 | 先做登录并运行测试 | 再进入依赖它的功能。 |
| 3汇总 | 组合路径重新验证 | 三项各自通过不保证整应用可用。 |
把过程连起来。小步完成与集成验证共同控制长任务漂移。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对小功能与完整应用分别列出必要反馈,比较是否真的需要独立规划者和评估者。
完成标准是根据任务风险和证据决定深度,不把流程长度当作专业程度。
拓展阅读目录事实依据 [S131] · 练习与工程推导为本书独立编写。
A11.3 · 面向Agent的计算机接口
对应资料:SWE-agent
SWE-agent研究面向Agent的计算机交互接口如何影响自动软件工程。搜索、读取、编辑和测试工具的设计会影响模型能否有效行动。
相同模型使用不同工具界面可能表现不同。工具输出过大、编辑反馈模糊或错误信息缺失,都会增加失败概率。
工具接口保留行号怎样帮助补丁准确定位
输入与条件。文件很长,只返回匹配行文本但无路径/行号。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1缺信息 | 模型知道关键词但不知道改哪里 | 可能重新大范围搜索。 |
| 2补接口 | 返回路径、范围、版本与上下文 | 支持定点读取。 |
| 3写入 | 仍按当前文件核对 | 行号过期时不能盲套。 |
把过程连起来。面向Agent的接口应提供可行动、可恢复的证据。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:比较只返回文件名与返回相关片段的搜索工具,统计为定位同一Bug需要多少轮读取。
完成标准是把工具设计当作可评测的工程变量,而不是所有失败都通过换模型解决。
拓展阅读目录事实依据 [S132] · 练习与工程推导为本书独立编写。
A11.4 · 代码审查的目的与流程
对应资料:Google Engineering Practices Code Review
Google代码审查实践关注设计、功能、复杂性、测试和可维护性等方面。审查应改善代码健康度,而不是无依据地阻止任何不完美修改。
AI可以协助发现问题,但必须结合补丁、上下文和验证。只读作者解释容易共享同一个错误前提。
审查发现小命名问题,如何避免重走设计
输入与条件。功能与测试正确,仅局部变量名误导。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1分类 | 不影响架构选择 | 无需重新设计方案。 |
| 2处理 | 直接局部修正 | 保持原验收目标。 |
| 3验证 | 按实际影响补检查 | 完成后合并,不无限延长审查。 |
把过程连起来。Review应改善代码健康度,不把所有问题升级为流程阻塞。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:审查一个能通过目标测试但破坏默认行为的补丁,指出需要额外读取与验证的地方。
完成标准是提出具体、可行动且有依据的问题,不用大量风格意见制造“审查很深入”的印象。
拓展阅读目录事实依据 [S133] · 练习与工程推导为本书独立编写。
B11.5 · 并行Agent构建编译器案例
对应资料:Building a C Compiler
并行Agent构建编译器的案例展示任务分工、测试基础设施与协调的结合。它是特定项目经验,不保证任意复杂软件都可完全无人管理。
代码规模与任务正确性不同。编译器需要语言语义、测试覆盖、平台行为等多方面验证,生成很多文件只是过程指标。
并行写编译器的模块接口要一致
输入与条件。Agent A写词法Token,B写解析器,双方对token.type命名不同。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1各自通过 | A自己的测试、B自己的mock都绿 | 接口不一致被隐藏。 |
| 2集成 | 真实Token进入解析器 | 字段不匹配失败。 |
| 3修复 | 明确共享接口与组合测试 | 不是只再加两个独立审查者。 |
把过程连起来。大规模并行需要真实集成反馈;本例不是已发表项目的原始实验数据。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:把词法分析、解析和代码生成之间的接口画清,说明哪些可并行、哪些需要先稳定约定。
完成标准是学习可分解边界与验证机制,不把案例中的投入或成绩外推成自己的预算承诺。
拓展阅读目录事实依据 [S134] · 练习与工程推导为本书独立编写。
B11.6 · 使用Agent进行代码审查
对应资料:Copilot Agentic Code Review
Copilot的Agent代码审查功能提供发现和处理问题的产品入口,但不能代替项目验收。支持方式与权限应按具体CLI版本核查。
审查结果需要区分实际缺陷、风险提示和风格建议。模型提出的问题也可能错误,应以源码、规范和测试验证。
Agent审查不能只复述diff
输入与条件。补丁把>=改>,用户需求在边界等值仍应允许。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1diff说明 | “比较更严格” | 只是描述。 |
| 2需求核验 | 等值输入应允许 | 新行为违反契约。 |
| 3审查证据 | 构造相等测试并失败 | 形成可验证发现。 |
把过程连起来。有效Review要连接需求、变化和反例,而非点评代码风格。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:给一个含真实边界Bug及无害风格差异的补丁,检查审查是否正确排序重要性。
完成标准是减少有效缺陷与返工,而不是追求评论数量或强迫每次审查都有发现。
拓展阅读目录事实依据 [S135] · 练习与工程推导为本书独立编写。
A11.7 · 审查标准与非完美交付
对应资料:The Standard of Code Review
代码审查标准强调当修改改善整体代码健康度时,不应因尚未完美而无限阻塞。重要质量问题与个人偏好需要区分。
这并不意味着降低正确性要求。关键缺陷、兼容性和安全问题仍应解决;只是避免把所有小建议都升级为重大返工。
不完美但改善代码与阻塞缺陷分开
输入与条件。补丁修复数据丢失,仍有一个不影响功能的小注释措辞。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1关键问题 | 数据丢失已被反例与回归验证 | 核心价值明确。 |
| 2非阻塞项 | 注释措辞可直接修或后续记录 | 不必否定整个方案。 |
| 3阻塞条件 | 若仍有可触发丢失更新 | 不能以“整体改善”掩盖重大缺陷。 |
把过程连起来。审查标准允许渐进改善,但不等于忽略实际风险。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:将审查意见分为必须修复、可直接顺手修复和非阻塞建议,逐条写出具体后果。
完成标准是让Review的成本与实际风险匹配,而不是形成设计—审查—重设计的无休止循环。
拓展阅读目录事实依据 [S136] · 练习与工程推导为本书独立编写。
A11.8 · 设计、功能、复杂度与测试
对应资料:What to Look for in a Code Review
审查检查内容覆盖设计、功能、复杂度、测试、命名和文档等,但不同修改需要不同重点。一个配置修复不应自动触发完整架构重构。
测试存在不代表测试有效,注释丰富也不代表解释准确。审查应检查它们是否支持实际行为与维护。
设计、复杂度与测试一起判断
输入与条件。为了排除一个目录,引入三层插件和一张数据库表。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1必要性 | 简单边界判断已经覆盖目标 | 额外组件尚无失败模式对应。 |
| 2成本 | 增加配置、迁移和维护 | 可能大于收益。 |
| 3验证 | 用实际扩展需求证明抽象必要 | 否则保留小实现。 |
把过程连起来。工程合理性不是组件越多越资深。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:阅读一个只有正向断言的过滤测试,增加“不应排除其他文件”的反例,解释遗漏的风险。
完成标准是从目标和失败模式出发选择检查项,而不是机械完成一张与任务无关的长表。
拓展阅读目录事实依据 [S137] · 练习与工程推导为本书独立编写。
A11.9 · 测试金字塔
对应资料:The Practical Test Pyramid
测试金字塔说明不同层次测试在范围、速度和维护成本上的差异。单元、集成与端到端测试互补,不存在适用于所有项目的固定数量比例。
测试应验证行为而非锁死实现细节。过度依赖内部结构会让合理重构频繁破坏测试,过度只测最终界面又可能难以定位故障。
三层测试分别抓哪类错
输入与条件。路径判断、配置读取、真实构建流程三个层次。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1单元 | 测a/a-x/ab边界 | 快速定位逻辑。 |
| 2集成 | 读取配置并调用判断 | 抓接线、默认值问题。 |
| 3端到端 | 真实构建结果保留/排除目录 | 验证完整行为,但成本更高。 |
把过程连起来。层次互补,不是把所有测试都堆到最慢的端到端。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为exclude设计匹配函数、配置集成和最终构建产物三个层次测试,说明每层独有的价值。
完成标准是用较低成本覆盖关键风险,而不是用测试数量代替覆盖质量。
拓展阅读目录事实依据 [S138] · 练习与工程推导为本书独立编写。
B11.10 · 持续集成与反馈速度
对应资料:Continuous Integration
持续集成强调频繁整合与自动反馈,尽早发现变化之间的冲突。CI绿色状态只说明已配置检查通过,不证明所有需求和缺陷都被覆盖。
Agent修改后应记录验证对应的版本。之后继续改代码,旧测试通过记录不能自动证明最新代码正确。
持续集成测试必须针对合并结果
输入与条件。分支A/B各自基于v7测试通过,合并后产生v9。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1各分支 | 只证明各自状态 | 不证明组合。 |
| 2合并对象 | v9可能有交互冲突 | 应触发必要集成验证。 |
| 3发布 | 只使用对应版本验证结果 | 避免错用旧流水线绿灯。 |
把过程连起来。CI的价值在频繁且版本对齐的反馈。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:让补丁A通过测试后再应用补丁B,检查交付说明是否准确区分已验证与待验证部分。
完成标准是把验证嵌入实际交付流程,同时保持反馈速度,避免所有小改动都运行无关且昂贵的检查。
拓展阅读目录事实依据 [S139] · 练习与工程推导为本书独立编写。
B11.11 · 记录架构决策及其条件
对应资料:Architecture Decision Records
ADR记录重要架构决策的背景、选择与后果,帮助未来维护者理解当时约束。它不是为每个变量或小修复创建文档的要求。
有价值的记录应说明替代方案和取舍,而不是只写“提高可维护性”。条件变化后,旧决定可以被新决定替代,但历史理由仍可保留。
架构决策记录需要包含放弃条件
输入与条件。决定暂用关键词检索,不建向量库。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1理由 | 符号查询占多数且精确搜索有效 | 绑定当前场景。 |
| 2限制 | 自然语言跨模块发现较弱 | 明确已知边界。 |
| 3复议触发 | 相关任务持续漏召回并有测评证据 | 到时再升级,而非永久教条。 |
把过程连起来。有用ADR记录为什么及何时重新考虑,不只记录选了什么。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为“在匹配器入口统一路径”写一段简短决策,包含调用者约定、兼容风险和失效条件。
完成标准是让未来Agent能判断是否仍适用,而不是把旧决策当成永远不能改变的规则。
拓展阅读目录事实依据 [S140] · 练习与工程推导为本书独立编写。
A11.12 · 编码Agent质量回退复盘
对应资料:An Update on Recent Claude Code Quality Reports
2026年4月的Claude Code质量复盘指出部分变化来自产品层的推理配置、历史处理与提示调整,不能把最终产品质量等同于底层模型能力。
同一模型在不同Harness配置下可能表现不同。尤其长会话、恢复与上下文清理相关缺陷,未必能被短任务测试发现。
产品质量回退先拆模型与Harness
输入与条件。模型版本没变,工具结果裁剪策略改变。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1现象 | 任务更常遗漏关键报错 | 可能来自裁剪。 |
| 2对照 | 同日志保持模型相同,只恢复输出范围 | 检查问题是否消失。 |
| 3结论 | 只有受控证据支持时归因 | 不凭用户感觉宣称模型“变笨”。 |
把过程连起来。此为故障诊断构造,不冒充厂商事故细节或内部原因。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:固定模型,分别改变推理预算、历史裁剪和输出要求,设计消融测试以定位回归。
完成标准是保存可比较版本与执行证据,不把用户感知的质量下降简单解释成“模型变笨了”。
拓展阅读目录事实依据 [S141] · 练习与工程推导为本书独立编写。
B11.13 · 推理与执行环境解耦
对应资料:Scaling Managed Agents
Managed Agents文章讨论把模型运行、会话状态和执行环境解耦。这样可以减少单一容器或进程故障对整个任务连续性的影响,但也增加边界设计需求。
持久日志应区分意图与已执行事实。重放任务历史不应自动重放全部外部副作用。
模型进程中断,外部任务仍可能运行
输入与条件。远端构建启动后模型会话断开。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1模型侧 | 无法继续生成 | 不是构建被取消的证明。 |
| 2执行侧 | 构建服务有独立job_id | 可以继续运行。 |
| 3恢复 | 按job_id查询状态并接回任务 | 不直接再启动一份构建。 |
把过程连起来。推理与执行生命周期解耦必须配套任务身份与恢复。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:在文件修改完成但Harness重启的情境下,设计如何恢复状态并检查版本,而不是再次盲目应用补丁。
小型本地工具未必需要立即服务化。应先保持职责清晰,再随真实恢复与规模需求演进。
拓展阅读目录事实依据 [S142] · 练习与工程推导为本书独立编写。