Agentic Coding · Vibe Coding · Spec Coding:三种 AI 编程范式的比较、演进与落地路径
版本 2026.09 | 面向工程团队负责人与一线开发者 | 文中标注「待核实」的数字请以发布方官方口径为准
从 2021 年的代码补全,到 2026 年的规格驱动智能体工程------一次完整的范式迁移复盘。
目录
- 一页速览:三句话结论
- 概念定义与本质边界
- 关键辨析:它们不在同一维度
- 演进史:2021 → 2026
- 全维度对比总表
- Agentic Coding 深度拆解
- Vibe Coding 深度拆解
- Spec Coding 深度拆解
- 融合实践:分层策略与决策树
- 风险清单与治理框架
- 2026 现状数据与展望
- 术语表与参考来源
一、一页速览:三句话结论
- Vibe Coding(氛围编程) :凭感觉下指令,不看代码,只看结果。由 Karpathy 于 2025 年 2 月命名。核心是「忘记代码的存在」,用自然语言反复描述现象来逼近可用结果。它是探索工具,不是交付方式。
- Agentic Coding(智能体编程) :把执行权交给智能体,人类转做监督者。AI 能自己规划、读写文件、跑命令与测试、根据报错自我修正,并长时间连续工作。它描述的是执行方式,不规定意图怎么写。
- Spec Coding(规范驱动编程) :先写结构化规格,再让智能体照着做。规格(而非代码)是真相源与契约。它解决的是 Agent 变强之后暴露的新瓶颈:AI 不知道该写什么。
一句话演进逻辑
补全时代的问题是「AI 写得慢」→ Agentic Coding 解决了速度与自主度 → 于是新问题变成「AI 写错方向且没人发现」→ Spec Coding 用显式契约把意图钉死。
Vibe Coding 回答的是「AI 能不能写」,Spec Coding 回答的是「AI 写的东西能不能信」。
⚠️ 最容易被误读的一点三者不是同一维度的三个并列选项。Agentic 是执行层,Vibe 与 Spec 是契约层。现实中的主流组合是「Spec 定契约 + Agent 执行 + Vibe 探索」的三层结构,而不是三选一。
给不同角色的最短行动建议
| 你的处境 | 推荐做法 | 理由 |
|---|---|---|
| 个人项目 / 0 到 1 原型 / 一次性脚本 | Vibe 为主 | 爆炸半径小,代码活不过一周,规格的收益覆盖不了成本 |
| 日常生产开发、单人负责的模块 | Agentic + 轻量 Spec | 先写验收标准再让 Agent 跑,成本增加不到 10%,返工率下降显著 |
| 多人协作 / 核心系统 / 受监管行业 | 完整 SDD + Agent 执行 | 需要可追溯、可审计、跨人共享的单一真相源 |
| 维护十年以上的存量系统 | Spec-anchored | 以「变更」为单位积累规格,逐步把隐性知识显式化 |
二、概念定义与本质边界
2.1 Vibe Coding(氛围编程)
2025 年 2 月,Andrej Karpathy 在社交平台提出这个词,原意是:完全投入到「感觉」里,忘记代码的存在------用语音或自然语言描述需求,AI 生成代码,出问题就把报错原样贴回去,不看 diff、不读代码、能跑就行。
| 维度 | 内容 |
|---|---|
| 真相源 | 没有持久真相源。对话历史即上下文,关掉窗口就没了 |
| 人类角色 | 需求提出者 + 结果验收者("跑起来了吗?") |
| 验证方式 | 手动点一点,主观判断"看起来对" |
| 典型工具 | Cursor Composer、Replit Agent、Bolt.new、Lovable、v0 等对话式生成类产品 |
| 最大价值 | 把「想法 → 可交互实物」的时间从天级压到分钟级;让非程序员也能做出能跑的东西 |
| 失效边界 | 一旦涉及跨文件、跨会话、跨人协作,或者需要半年后还维护,立刻失效 |
❌ 三类典型失败
- 意图漂移:模型选了"合理的默认值",但和团队真正想要的不一样;因为代码看起来是对的,没人发现。
- 幻觉接口:Agent 编造了一个不存在的 API 方法、配置键或数据库字段------编译通过,运行时炸。
- 上下文坍塌:任务跨多个会话或文件时,Agent 忘了之前的决策,开始自相矛盾。项目越长越严重。
2.2 Agentic Coding(智能体编程)
指 AI 以智能体形态参与工程:给定一个目标后,它能自主完成「规划 → 检索上下文 → 读写文件 → 执行命令 → 跑测试 → 读取报错 → 修正 → 再验证」的完整闭环,并在无人值守状态下连续工作数十分钟到数小时。
#mermaid-svg-OYEldD6DfD8NF8F9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OYEldD6DfD8NF8F9 .error-icon{fill:#552222;}#mermaid-svg-OYEldD6DfD8NF8F9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OYEldD6DfD8NF8F9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OYEldD6DfD8NF8F9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OYEldD6DfD8NF8F9 .marker.cross{stroke:#333333;}#mermaid-svg-OYEldD6DfD8NF8F9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OYEldD6DfD8NF8F9 p{margin:0;}#mermaid-svg-OYEldD6DfD8NF8F9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster-label text{fill:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster-label span{color:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster-label span p{background-color:transparent;}#mermaid-svg-OYEldD6DfD8NF8F9 .label text,#mermaid-svg-OYEldD6DfD8NF8F9 span{fill:#333;color:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 .node rect,#mermaid-svg-OYEldD6DfD8NF8F9 .node circle,#mermaid-svg-OYEldD6DfD8NF8F9 .node ellipse,#mermaid-svg-OYEldD6DfD8NF8F9 .node polygon,#mermaid-svg-OYEldD6DfD8NF8F9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OYEldD6DfD8NF8F9 .rough-node .label text,#mermaid-svg-OYEldD6DfD8NF8F9 .node .label text,#mermaid-svg-OYEldD6DfD8NF8F9 .image-shape .label,#mermaid-svg-OYEldD6DfD8NF8F9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-OYEldD6DfD8NF8F9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OYEldD6DfD8NF8F9 .rough-node .label,#mermaid-svg-OYEldD6DfD8NF8F9 .node .label,#mermaid-svg-OYEldD6DfD8NF8F9 .image-shape .label,#mermaid-svg-OYEldD6DfD8NF8F9 .icon-shape .label{text-align:center;}#mermaid-svg-OYEldD6DfD8NF8F9 .node.clickable{cursor:pointer;}#mermaid-svg-OYEldD6DfD8NF8F9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OYEldD6DfD8NF8F9 .arrowheadPath{fill:#333333;}#mermaid-svg-OYEldD6DfD8NF8F9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OYEldD6DfD8NF8F9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OYEldD6DfD8NF8F9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OYEldD6DfD8NF8F9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OYEldD6DfD8NF8F9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OYEldD6DfD8NF8F9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster text{fill:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 .cluster span{color:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OYEldD6DfD8NF8F9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OYEldD6DfD8NF8F9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-OYEldD6DfD8NF8F9 .icon-shape,#mermaid-svg-OYEldD6DfD8NF8F9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OYEldD6DfD8NF8F9 .icon-shape p,#mermaid-svg-OYEldD6DfD8NF8F9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OYEldD6DfD8NF8F9 .icon-shape .label rect,#mermaid-svg-OYEldD6DfD8NF8F9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OYEldD6DfD8NF8F9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OYEldD6DfD8NF8F9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OYEldD6DfD8NF8F9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 通过
不通过
目标与约束
人给出意图与边界
规划与分解
拆成可执行子任务
工具调用
读写文件 / 执行命令
验证闭环
编译 / 测试 / lint
结果交付
diff / PR 供人评审
自我修正
读报错、改实现
Agentic 与传统 AI 辅助的分水岭,在于是否存在可自动判定的验证信号。编译器报错、测试失败、lint 提示、类型检查------这些机器可判定的反馈,让 Agent 能够脱离人类"自己试错"。这也是为什么测试覆盖率高的项目,AI 编程收益呈数量级放大。
Agentic 的能力栈(从下往上缺一不可)
| 层级 | 能力 | 2026 年的现状 |
|---|---|---|
| 模型层 | 长上下文、长程推理、代码能力 | 上下文已扩展到百万 token 量级,长程编程(连续自主运行数十小时)成为新的竞争焦点 |
| 上下文层 | 代码库检索、依赖图、向量索引、规则文件 | 从「把代码粘进 prompt」进化到「上下文工程」;CLAUDE.md / AGENTS.md 成为事实标准的契约文件 |
| 工具层 | 文件读写、终端、浏览器、MCP 外部系统 | MCP 成为事实标准接口,被类比为「软件工程的 USB-C」;工具调用衔接的稳定性成为核心卖点 |
| 验证层 | 编译、单测、集成测试、静态分析、E2E | 决定 Agent 上限的关键层;没有自动验证就没有真正的自主 |
| 编排层 | 任务分解、多 Agent 协作、并行会话 | Maker / Critic / Tester 多角色分工开始流行,A2A 等协议在形成中 |
| 治理层 | 权限边界、审计留痕、人在回路审批 | 2026 年最薄弱也最受关注的一层;「有界自主」(bounded autonomy)成为共识方向 |
2.3 Spec Coding(规范驱动编程 / SDD)
又称 Spec-Driven Development(SDD)。核心主张:在「人的意图」和「AI 的实现」之间插入一层显式规格。它写清楚系统要做什么、边界在哪、什么不能做、怎样算完成。Agent 先读规格,有歧义就问,再动手生成。
一份合格的规格通常拆成四份文档
| 文档 | 内容 |
|---|---|
constitution.md |
项目宪法:不可变的全局原则------测试标准、架构约束、命名规范、安全红线。跨会话长期有效(Spec Kit 独有) |
requirements.md |
要做什么:用户故事 + 验收标准。Kiro 采用 EARS 句式「WHEN 条件 THE SYSTEM SHALL 行为」,源自劳斯莱斯的安全关键系统实践 |
design.md |
怎么做:架构、数据模型、API 契约、时序 |
tasks.md |
执行步骤:离散、可追踪、可逐个验证的实现任务 |
一个坏 prompt 与一份真规格的对比
坏:「加一个把用户数据导出成 CSV 的功能,做得好看点。」
好:明确写出触发入口、字段清单与顺序、时间范围上限、超过 N 行时改异步生成并用邮件发送附件、UTF-8 BOM 兼容 Excel、导出需通过权限校验并记录审计日志、失败时的错误码与重试策略、以及「不做什么」(不导出已删除用户的历史快照)。
差别不在于字多,而在于把 Agent 必然会自行猜测的每一个决策点都显式写死。
三、关键辨析:它们不在同一维度
把三个词平铺对比会造成严重误解。正确的坐标系是两个正交的轴:
- 轴一:AI 自主度(执行方式) ------单步补全 → 多步自主执行。Agentic 描述的是这一轴的高端位置。 它不关心你的意图是写在脑子里、聊天框里还是 markdown 里。
- 轴二:意图的形式化与持久化(契约方式) ------即兴 prompt → 持久化规格。Vibe 与 Spec 是这一轴的两端。 它们不关心谁来执行代码。
由此得到四种组合,也解释了为什么行业讨论常常鸡同鸭讲:
| 低形式化(即兴 prompt) | 高形式化(持久化规格) | |
|---|---|---|
| 低自主(AI 只补几行) | AI 自动补全时代(2021--22):Copilot 补行补函数,人是唯一作者,意图即写即弃 | 传统文档驱动开发:人按详细设计文档手写代码。重规格、零自主------也就是瀑布模式 |
| 高自主(AI 自主多步) | Vibe Coding:AI 大包大揽,但意图只存在于一次性对话中 | Spec Coding / Agentic Engineering:规格是契约与真相源,Agent 按其执行,产出可追溯 |
✅ 这个框架的解释力
它解释了为什么 Karpathy 在 2025 年提出 Vibe Coding、不到一年又改口说"vibe coding 时代正在结束,我们进入的是 agentic engineering" ------他不是在推翻自己,而是从"右上象限"这个视角指出:光有高自主不够,还得有高形式化。
它也解释了为什么 Claude Code 和 Cursor 的 Plan 模式算「最轻量的 spec-first」:意图先对齐再执行,但方案通常单次会话、用毕即弃,没有 constitution、没有结构化需求格式、没有归档更新回路。它是 SDD 的入门坡道,不是替代品。
四、演进史:2021 → 2026
| 时间 | 阶段 | 发生了什么 | 暴露的问题 |
|---|---|---|---|
| 2021--2022 | 自动补全时代 | GitHub Copilot 发布并普及。AI 补行、补函数、补样板代码,人类始终是代码的唯一作者 | 省了打字时间,没有改变工程流程 |
| 2023 | 对话式辅助 | ChatGPT、Copilot Chat 进入日常。开发者在聊天窗口与 IDE 之间复制粘贴,AI 扮演顾问 | 上下文要手工搬运;AI 看不到完整代码库 |
| 2024 | Agent 雏形 | Cursor Composer、Devin 等产品出现。AI 开始能跨多文件编辑、执行终端命令、提交 PR | 可靠性不足;长任务容易跑偏;缺少验证闭环 |
| 2025.02 | Vibe Coding 出圈 | Karpathy 命名并普及了"忘记代码存在"的做法。非程序员第一次能独立做出能跑的应用 | 安全漏洞、不可维护、无法调试;"氛围债"成为流行词 |
| 2025 H2 | Agentic Coding 主流化 | Claude Code、Codex CLI、Copilot coding agent 等 CLI 与后台 Agent 成为专业开发者默认工具;MCP 生态爆发;长任务、并行会话、无人值守成为卖点 | 瓶颈转移:AI 足够能写了,但"不知道该写什么" |
| 2025 Q4--2026 H1 | Spec-Driven 上位 | GitHub Spec Kit 于 2026 年 8 月发布 1.0;AWS Kiro GA 并把 SDD 做成 IDE 原生工作流;OpenSpec、BMAD-METHOD、Tessl 等工具形成生态;Thoughtworks 把 SDD 列入技术雷达 Trial 环 | 流程偏重;"瀑布回魂"的质疑;评审负担可能不降反升 |
| 2026 起 | 融合分层 | 探索用 Vibe、交付用 Spec、执行用 Agent;规格与测试双驱动、有界自主、审计留痕成为团队标配 | 治理与评测体系仍在成形中 |
演进的底层驱动力
每一轮的转折,都源于前一阶段瓶颈的转移:
- 补全时代瓶颈 = 生成速度 → 被模型能力解决;
- Agent 时代瓶颈 = 能否端到端跑完 → 被工具调用与长上下文解决;
- 于是 2026 年的瓶颈 = 意图的保真度。「歧义是昂贵的」------在 Vibe Coding 里 prompt 是短暂的、生成的代码成了事实上的真相源,而代码最不擅长解释自己为什么存在。
五、全维度对比总表
| 维度 | Vibe Coding | Agentic Coding | Spec Coding |
|---|---|---|---|
| 本质定位 | 一种低摩擦的探索方式 | 一种 AI 自主执行的工程能力 | 一种以规格为契约的研发方法论 |
| 真相源 | 对话历史(易失) | 代码 + 规则文件 | 规格文档(可版本控制) |
| 人类角色 | 提需求、看效果 | 定目标、设边界、审结果 | 立宪法、写规格、把质量关 |
| 验证方式 | 主观:"跑起来就行" | 自动化:编译 / 测试 / lint | 规格对齐 + 验收标准 + 测试 |
| 上下文载体 | 对话窗口 | 代码库索引 + AGENTS.md |
constitution / spec / plan / tasks |
| 适用规模 | 单文件、单次会话、原型 | 多文件、跨模块、长任务 | 跨人、跨会话、长期维护的系统 |
| 可追溯性 | 几乎为零 | 有 diff 与会话记录 | 需求→设计→任务→代码全链可查 |
| 上手成本 | 极低 | 中:需要会写规则文件与测试 | 较高:需要规格写作与流程纪律 |
| 边际成本 | 随项目变长急剧上升 | 随验证完善而下降 | 前期高、后期摊薄 |
| 典型失败模式 | 意图漂移、幻觉接口、上下文坍塌 | 范围蔓延、级联错误、工具误用 | 过度设计、评审过载、流程僵化 |
| 核心技能要求 | 会描述问题 | 任务分解、验证设计、上下文工程 | 结构化沟通、领域建模、契约设计 |
| 团队协作 | 基本无法协作 | 可协作但缺共享契约 | 规格即协作界面 |
⚠️ 读表提醒
Agentic 那一列严格来说不是与另外两者互斥的第三选项。真实世界里 Spec Coding 通常就跑在 Agentic 的执行引擎之上。此表把它单列,是为了对比"只做 Agentic 而不引入规格"时的典型状态。
六、Agentic Coding 深度拆解
6.1 五个能力等级(社区通行的分层)
| 级别 | 名称 | 特征 |
|---|---|---|
| L1 | 自动补全 | AI 补几行,人写全部逻辑 |
| L2 | 对话式辅助 | 人复制粘贴,AI 在窗口里出方案 |
| L3 | Agentic Coding | AI 在 IDE/CLI 内自主多步执行,人审 diff、跑测试套件验证 |
| L4 | Agentic Engineering | 执行前先写规格;多 Agent 按契约分工;每个阶段都有系统化验证;人是工程总监 |
| L5 | AI 原生架构 | 系统本身就是智能体的(生产环境跑业务逻辑的 Agent),人是人机混合系统的架构师 |
多数自称在用 AI 编程的人实际处于 L2--L3;Karpathy 所说的 agentic engineering 对应 L4。这不是"多加了几个步骤",而是任务结构变了:传统软件工程假设每一步由人执行,Agentic Engineering 假设大部分步骤由 Agent 执行------因此任务要拆得更小更离散、规格要机器可执行、验证要自动化而非靠人读代码。
6.2 上下文工程:Agentic 的真正护城河
模型能力之外,决定 Agent 表现差异的主要是喂给它的上下文质量。2026 年的实践共识是几个固定的抓手:
- 规则文件即契约 :
CLAUDE.md/AGENTS.md不应写成偏好清单,而要写成能约束行为的契约 ------命名规范、架构分层、测试要求、禁止触碰的路径。判据很简单:Agent 在你不在场时,能否仅凭这份文件做对事。 - 分层加载:全局规则(组织级)→ 项目规则(仓库级)→ 目录规则(模块级),按需注入而非全量塞入。
- 依赖知识显式化:开源库的使用规格(版本、API 签名、惯用法)单独供给,避免 Agent 凭训练记忆混用版本。Tessl 的 Spec Registry 就切这个点,官方称可减少约 35% 的集成错误、提升最多 90% 的准确率*(厂商口径,待独立验证)*。
- 检索优于投喂:让 Agent 自己 grep / 语义检索代码库,比预先把整包代码塞进上下文更稳,也更省 token。
- 会话卫生:一个会话只做一件事;上下文污染时果断开新会话并让 Agent 读回规格,而不是在同一窗口里硬撑。
6.3 验证闭环:没有它就没有自主
✅ Kent Beck 的判断
规格给出"做什么",但仍需要 TDD 来证明"确实可运行"。他把 TDD 称为与 AI Agent 协作时的 superpower ------因为 Agent 极易引入回归,而单元测试提供了一道自动的回归防线。
换句话说:测试是 Agent 的方向盘与刹车。 没有测试的 Agentic Coding,等于让 AI 蒙眼高速驾驶。
| 验证手段 | 机器可判定 | 说明 |
|---|---|---|
| 类型检查 / 编译 | 是 | 最便宜的第一道闸,静态类型语言在 AI 时代反而更吃香 |
| 单元测试 | 是 | 回归防护主力,也是 Agent 自我修正的信号源 |
| Lint / 静态分析 | 是 | 守住风格与安全基线,能被 Agent 自动修复 |
| 契约 / 集成测试 | 是 | 防止 Agent 编造不存在的接口(幻觉接口的主要防线) |
| E2E / 视觉回归 | 部分 | UI 类任务必要,但结果判定仍有主观成分 |
| 人工代码评审 | 否 | 不可替代但不可扩展,应聚焦架构与安全而非逐行语法 |
6.4 典型失败模式与对策
| 失败模式 | 表现 | 对策 |
|---|---|---|
| 范围蔓延 | 做着做着顺手重构了无关模块,diff 失控 | 在规则文件里明确"不做什么";任务切成 30--90 分钟粒度;超出范围直接拒收 |
| 级联错误 | 修一个 bug 引入三个新 bug | 先补测试再现问题,再让 Agent 修;每步跑全量测试而非只跑相关用例 |
| 上下文丢失 | 长任务后半段忘了前面的决策,自相矛盾 | 把关键决策写进规格/计划文件,让 Agent 每步回读;过长任务主动分段 |
| 工具误用 | 用错命令、改错文件、误删内容 | 权限白名单;危险命令需人工确认;用 git 做可回滚的 checkpoint |
| 覆盖真空 | 生成的测试"看起来很全"但没测到关键分支 | 先写测试再让 Agent 实现;用变异测试检验测试有效性 |
| 静默偏离 | 偏离了设计但没告诉你 | 要求 Agent 输出"偏离说明";规格与实现的一致性做自动检查 |
七、Vibe Coding 深度拆解
先说结论:Vibe Coding 没有错,错的是把它用在错误的场景
它解决的是一个真实且重要的问题------把想法变成可交互实物时的摩擦力太大。在这个目标上它无可替代。真正的问题在于,很多团队把一个探索工具当成了交付流程。
7.1 适用场景与禁用场景
放心用 Vibe 的场景:
- 0 到 1 原型验证:想看看这个想法长什么样
- 一次性脚本:数据清洗、批量改名、临时报表
- 学习与探索:摸清一个新框架/新 API 的行为
- UI 与视觉迭代:需要快速看到效果、反复微调
- 个人小工具:用户只有你自己,坏了大不了重写
- 非程序员做内部工具:这是 Vibe 最大的社会价值
不要用 Vibe 的场景:
- 生产系统、会长期维护的代码
- 涉及权限、认证、支付、数据删除的逻辑
- 多人协作的同一代码库
- 跨多个会话才能完成的中大型特性
- 受监管行业(金融、医疗、工业控制)的核心链路
- 任何"半年后还要改"的东西
7.2 三条自保规则(想 Vibe 又不翻车)
- 先定验收,再开聊。哪怕只是一句话:"做完后,我要能在 X 页面点 Y,看到 Z。"这一个习惯对结果质量的提升,超过换任何工具。
- 小步提交 。每得到一个能跑的状态就
git commit。Vibe 的致命伤是"改着改着回不去了",频繁提交是唯一的解药。 - 设置转正门槛。原型一旦决定要长期维护,必须补三样东西:类型/测试、一份简短规格、一次人工代码走查。这一步叫"从 vibe 到工程的转股",跳过它,原型就会变成技术债的发源地。
⚠️ 行业数据的一面之词
有研究指出 AI 生成代码已造成大量已知生产问题,不同基准下漏洞率从 9.8% 到 42.1% 不等*(差异极大,需按发布方口径理解)*。这些数字主要针对的是"只让 AI 写、不立规格、不验质量"的工作方式,不应被解读为"AI 写的代码普遍更差"------同样的研究也显示,结构化工作流下成功构建率、合并率均有明显提升。
八、Spec Coding 深度拆解
8.1 标准工作流(以 GitHub Spec Kit 为主线)
#mermaid-svg-mTe418ygpk9MApEc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mTe418ygpk9MApEc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mTe418ygpk9MApEc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mTe418ygpk9MApEc .error-icon{fill:#552222;}#mermaid-svg-mTe418ygpk9MApEc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mTe418ygpk9MApEc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mTe418ygpk9MApEc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mTe418ygpk9MApEc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mTe418ygpk9MApEc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mTe418ygpk9MApEc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mTe418ygpk9MApEc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mTe418ygpk9MApEc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mTe418ygpk9MApEc .marker.cross{stroke:#333333;}#mermaid-svg-mTe418ygpk9MApEc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mTe418ygpk9MApEc p{margin:0;}#mermaid-svg-mTe418ygpk9MApEc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mTe418ygpk9MApEc .cluster-label text{fill:#333;}#mermaid-svg-mTe418ygpk9MApEc .cluster-label span{color:#333;}#mermaid-svg-mTe418ygpk9MApEc .cluster-label span p{background-color:transparent;}#mermaid-svg-mTe418ygpk9MApEc .label text,#mermaid-svg-mTe418ygpk9MApEc span{fill:#333;color:#333;}#mermaid-svg-mTe418ygpk9MApEc .node rect,#mermaid-svg-mTe418ygpk9MApEc .node circle,#mermaid-svg-mTe418ygpk9MApEc .node ellipse,#mermaid-svg-mTe418ygpk9MApEc .node polygon,#mermaid-svg-mTe418ygpk9MApEc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mTe418ygpk9MApEc .rough-node .label text,#mermaid-svg-mTe418ygpk9MApEc .node .label text,#mermaid-svg-mTe418ygpk9MApEc .image-shape .label,#mermaid-svg-mTe418ygpk9MApEc .icon-shape .label{text-anchor:middle;}#mermaid-svg-mTe418ygpk9MApEc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mTe418ygpk9MApEc .rough-node .label,#mermaid-svg-mTe418ygpk9MApEc .node .label,#mermaid-svg-mTe418ygpk9MApEc .image-shape .label,#mermaid-svg-mTe418ygpk9MApEc .icon-shape .label{text-align:center;}#mermaid-svg-mTe418ygpk9MApEc .node.clickable{cursor:pointer;}#mermaid-svg-mTe418ygpk9MApEc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mTe418ygpk9MApEc .arrowheadPath{fill:#333333;}#mermaid-svg-mTe418ygpk9MApEc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mTe418ygpk9MApEc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mTe418ygpk9MApEc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mTe418ygpk9MApEc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mTe418ygpk9MApEc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mTe418ygpk9MApEc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mTe418ygpk9MApEc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mTe418ygpk9MApEc .cluster text{fill:#333;}#mermaid-svg-mTe418ygpk9MApEc .cluster span{color:#333;}#mermaid-svg-mTe418ygpk9MApEc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mTe418ygpk9MApEc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mTe418ygpk9MApEc rect.text{fill:none;stroke-width:0;}#mermaid-svg-mTe418ygpk9MApEc .icon-shape,#mermaid-svg-mTe418ygpk9MApEc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mTe418ygpk9MApEc .icon-shape p,#mermaid-svg-mTe418ygpk9MApEc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mTe418ygpk9MApEc .icon-shape .label rect,#mermaid-svg-mTe418ygpk9MApEc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mTe418ygpk9MApEc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mTe418ygpk9MApEc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mTe418ygpk9MApEc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} constitution
立项目原则
specify
写功能规格
clarify
消歧提问
plan
技术方案
tasks
拆任务
analyze
一致性检查
implement
Agent 按任务逐个实现
规格始终是真相源
每个阶段产出一份文档,全部提交进版本库,形成可追溯链条。
8.2 规格到底该写什么
判断规格质量的标准只有一条:把 Agent 必然会自行猜测的决策点全部显式写死。实践中一张最小检查表:
| 要素 | 要回答的问题 |
|---|---|
| 问题与动机 | 为什么要做?不做的代价是什么?一两句说清 |
| 范围边界 | 做什么,以及明确不做什么。后者常被省略,却是范围蔓延的根源 |
| 功能需求 | 用户故事 + 验收标准。推荐 EARS 句式:WHEN 条件 THE SYSTEM SHALL 行为 |
| 数据模型 | 表结构、字段类型、约束、迁移策略。别让 Agent 猜列名 |
| 接口契约 | API 路径、请求/响应结构、错误码。这是防"幻觉接口"的关键 |
| 非功能需求 | 性能、并发、安全、合规、可观测性 |
| 失败路径 | 超时、重试、降级、幂等、部分失败怎么处理 |
| 验收方式 | 怎样算完成?哪些测试必须通过? |
| 禁区 | 哪些文件/模块不许碰,哪些依赖不许引入 |
8.3 主流工具横向对比
| 工具 | 出品方 | 工作流 | 规格形态 | 开源/价格 | 定位与取舍 |
|---|---|---|---|---|---|
| Spec Kit | GitHub | constitution → specify → clarify → plan → tasks → analyze → implement(七阶段关卡) | Markdown,由 Agent 解读 | MIT 开源,免费 | 社区最活跃(2026 年 8 月发布 1.0),支持 30 余种 Agent。独有 constitution 机制。缺点是七阶段对小型改动偏重,个人开发者收益有限 |
| Kiro | AWS | requirements → design → tasks(三步) | 三份 md,需求用 EARS 受限句式 | 闭源,已 GA,按月分档付费 | 开箱即用的独立 IDE,体验最完整、可追踪性最好。缺点是绑定它的 IDE 与模型,且存在 Vibe/Spec 两种模式的割裂感 |
| OpenSpec | Fission-AI | propose → apply → archive(每个变更一个文件夹) | proposal / specs / design / tasks 四份 | MIT 开源,免费 | 最轻量,npm 一条命令装好,不绑定 IDE,支持 25 余种工具。因归档时会更新规格,最接近 spec-anchored,适合存量系统渐进式引入 |
| BMAD-METHOD | 社区 | 模拟完整敏捷团队,12 个以上专职 Agent 角色接力 | 各角色产出的文档链 | MIT 开源 | PM、架构师、UX、开发、QA、Scrum Master 各司其职,形成需求到代码的追溯链。适合想让 Agent 扮演完整团队的场景,但复杂度高 |
| Tessl | Guy Podjarny(Snyk 创始人) | 规格为唯一维护物,Agent 据此生成代码 | 结构化、可测试的 spec,生成代码标注 DO NOT EDIT | Spec Registry 开放,Framework 闭源 beta | 理念最激进(spec-as-source)。核心难题是非确定性编译器:同一份规格多次运行会产出不同实现。2026 年初已向"Agent 使能平台"方向调整 |
| Plan Mode(Claude Code / Cursor) | Anthropic / Cursor | 只读研究 → 输出方案 → 人工批准 → 执行 | 单次会话的 markdown 方案 | 内置,零配置 | 最轻的 spec-first,SDD 的入门坡道。没有 constitution、没有结构化需求格式、没有归档回路,方案通常不沉淀。个人小改动够用,跨人共享不够 |
8.4 支持方的论据
- OpenAI 的 Sean Grove :写代码只占程序员价值的 10--20%,其余 80--90% 是"结构化沟通"------理解用户、提炼需求、规划与验证。由此推论,写规格将取代写代码成为最关键的开发技能。(该比例为修辞表达,非实测数据)
- Karpathy 的 agentic engineering:承认 AI 写代码已是默认工作流,但强调需要"更多监督",与 SDD 的纪律取向一致。
- Kent Beck:规格给出"做什么",TDD 证明"确实可运行",两者是互补而非替代------这也催生了"规格 + 测试双驱动"的做法。
8.5 反方质疑(这部分必须读)
❌ Birgitta Böckeler(Thoughtworks)的批评最为扎实
- 小题大做:Kiro 把一个很小的缺陷扩展成 4 个用户故事、16 条验收标准
- 评审负担可能更重:她直言"我宁愿审阅代码,也不愿审阅一堆 markdown 文件"
- 可能放大既有问题:SDD 或许放大了评审过载与幻觉,而非解决它们
- 术语涣散:已有人把 "spec" 等同于"详细 prompt",概念被稀释
- 历史教训:她以模型驱动开发(MDD)作类比------MDD 在业务系统中"从未真正成功",并警告 spec-as-source 可能"同时继承 MDD 与 LLM 的缺点:既不灵活,又不确定"
更直接的批评则给它贴上了「瀑布回魂」的标签,担忧它重新带回"先确定全部需求、再行实现"的旧弊病。
⚠️ 怎么回应这些质疑
SDD 与瀑布的关键区别在于迭代单位 :瀑布是"整个项目先 freeze 需求再开工",SDD 是"每个变更先写清再动手",变更本身仍然小步、频繁、可回退。
但它确实不是免费的:对单个空值检查级别的小改动,走完整七阶段是纯粹浪费。务实的做法是分档------按变更的爆炸半径选择规格的深度。
九、融合实践:分层策略与决策树
2026 年真正跑得顺的团队,几乎都不是"三选一",而是按变更的爆炸半径分层:
#mermaid-svg-m8Sy3FGYRnmakgC6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-m8Sy3FGYRnmakgC6 .error-icon{fill:#552222;}#mermaid-svg-m8Sy3FGYRnmakgC6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m8Sy3FGYRnmakgC6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .marker.cross{stroke:#333333;}#mermaid-svg-m8Sy3FGYRnmakgC6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m8Sy3FGYRnmakgC6 p{margin:0;}#mermaid-svg-m8Sy3FGYRnmakgC6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster-label text{fill:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster-label span{color:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster-label span p{background-color:transparent;}#mermaid-svg-m8Sy3FGYRnmakgC6 .label text,#mermaid-svg-m8Sy3FGYRnmakgC6 span{fill:#333;color:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .node rect,#mermaid-svg-m8Sy3FGYRnmakgC6 .node circle,#mermaid-svg-m8Sy3FGYRnmakgC6 .node ellipse,#mermaid-svg-m8Sy3FGYRnmakgC6 .node polygon,#mermaid-svg-m8Sy3FGYRnmakgC6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .rough-node .label text,#mermaid-svg-m8Sy3FGYRnmakgC6 .node .label text,#mermaid-svg-m8Sy3FGYRnmakgC6 .image-shape .label,#mermaid-svg-m8Sy3FGYRnmakgC6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-m8Sy3FGYRnmakgC6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .rough-node .label,#mermaid-svg-m8Sy3FGYRnmakgC6 .node .label,#mermaid-svg-m8Sy3FGYRnmakgC6 .image-shape .label,#mermaid-svg-m8Sy3FGYRnmakgC6 .icon-shape .label{text-align:center;}#mermaid-svg-m8Sy3FGYRnmakgC6 .node.clickable{cursor:pointer;}#mermaid-svg-m8Sy3FGYRnmakgC6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .arrowheadPath{fill:#333333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-m8Sy3FGYRnmakgC6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-m8Sy3FGYRnmakgC6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-m8Sy3FGYRnmakgC6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster text{fill:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 .cluster span{color:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-m8Sy3FGYRnmakgC6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-m8Sy3FGYRnmakgC6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-m8Sy3FGYRnmakgC6 .icon-shape,#mermaid-svg-m8Sy3FGYRnmakgC6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-m8Sy3FGYRnmakgC6 .icon-shape p,#mermaid-svg-m8Sy3FGYRnmakgC6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-m8Sy3FGYRnmakgC6 .icon-shape .label rect,#mermaid-svg-m8Sy3FGYRnmakgC6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-m8Sy3FGYRnmakgC6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-m8Sy3FGYRnmakgC6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-m8Sy3FGYRnmakgC6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第1层 探索层
原型/脚本/UI微调 → 用 Vibe:不写规格,但要小步提交
第2层 日常交付层
单模块特性/Bug修复 → Agentic+轻量规格
第3层 系统层
跨模块/跨人/长期维护 → 完整 SDD
贯穿三层: 版本控制 · 自动化验证 · 权限边界 · 审计留痕 · 人在回路
9.1 决策树:这次改动该走哪一档
| 判断问题 | 命中 | 走哪一档 |
|---|---|---|
| 这段代码三个月后还需要改吗? | 不需要,用完就扔 | Vibe 直接开干,记得频繁 commit |
| 改动是否局限于单个文件、且你能一眼看懂整个 diff? | 是 | Agentic + 一句验收标准即可 |
| 是否涉及数据模型、接口契约、权限或资金? | 是 | 完整规格:至少写清数据模型与契约 |
| 是否有第二个人(或第二个 Agent)会碰同一块代码? | 是 | 规格必须是共享契约,进版本库 |
| 是否有现成的自动化测试能判定对错? | 否 | 先补测试再动手,否则 Agent 只能帮你"看起来对" |
| 失败后是否需要向他人解释"为什么这么设计"? | 是 | 规格即解释材料,也是审计证据 |
9.2 一份可直接照抄的日常配方
text
# 1. 仓库根目录维护一份规则契约(全局)
AGENTS.md # 架构分层、命名规范、测试要求、禁区
# 2. 每个非平凡改动起手式(轻量 spec-first)
- 一段话:解决什么问题、做完的样子、验收标准
- 明确「不做什么」
- 让 Agent 复述理解,有偏差就地修正
# 3. 执行(Agentic)
- 任务切成 30--90 分钟粒度,一次一个
- 先写失败测试,再让 Agent 实现(红 → 绿 → 重构)
- 每完成一个任务跑全量测试并 commit
# 4. 收口
- 让 Agent 输出「偏离说明」:哪里没按方案做、为什么
- 人工评审聚焦架构与安全,不做逐行语法检查
- 把最终规格归档,作为下次变更的基线
✅ 成本提示
第 2 步那"一段话 + 不做什么"通常只要 3--5 分钟。这是投入产出比最高的一个动作:它把 Agent 从"猜你想要什么"变成"按你写下的做",返工率的下降远超这几分钟的投入。
十、风险清单与治理框架
10.1 六类风险与对应控制
| 风险 | 典型表现 | 控制手段 |
|---|---|---|
| 质量与回归 | Agent 引入静默回归;测试"看起来全"但没测关键分支 | 强制测试先行;变异测试抽检;覆盖率只作参考不作目标 |
| 安全 | 注入漏洞、硬编码密钥、不安全的默认值、依赖投毒 | 密钥扫描与 secret 管理;依赖锁定与 SBOM;安全扫描进 CI;Agent 不得访问生产凭据 |
| 合规与审计 | 无法解释某段代码为何存在;监管问询时拿不出依据 | 规格与代码双向可追溯;变更留痕;关键节点人工签核(human-in-the-loop) |
| 知识产权与许可 | 生成代码与开源代码高度相似,带入不兼容许可证 | 许可证扫描;对高风险模块要求人工重写;留存生成记录 |
| 知识空心化 | 团队没人真正理解系统,只会"再问一次 AI" | 规格作为知识载体强制维护;关键模块轮值 owner;定期架构走查 |
| 成本失控 | 长任务 token 消耗失控;反复重试烧钱 | 上下文分层与检索优先;任务粒度控制;按任务类型路由模型 |
10.2 「有界自主」的四条硬边界
2026 年的共识方向不是限制 AI 写代码,而是限制它能 autonomously 触碰什么。建议把以下四条写进团队规则,并用工具强制而非靠自觉:
- 文件系统边界:Agent 只能在指定目录内写入;配置、迁移脚本、基础设施代码默认只读。
- 命令白名单:允许跑测试、构建、lint;任何删除、强制推送、数据库写操作必须人工确认。
- 网络与凭据边界:不给生产环境凭据;外部访问走代理与审计;禁止自动安装未审查的依赖。
- 合并闸门:Agent 可以提 PR,但合并需要测试全绿 + 至少一人审阅;受监管链路需额外签核。
⚠️ 一个正在成形的趋势
行业在讨论「代码数字孪生」(Code Digital Twin)的思路:在代码之上叠一层活的知识基础设施,把物理代码与概念意图、历史设计决策、业务约束映射起来。Agent 不再只读
PaymentValidator.java,而是能查到"这里不能改成异步,会打挂 2014 年那个遗留主机系统"。长期知识工程 与任务时上下文工程的分离,被认为是复杂存量系统中安全部署 Agent 的唯一可行路径。
十一、2026 现状数据与展望
11.1 值得留意的数字(含口径说明)
| 数据 | 来源 | 口径说明 |
|---|---|---|
| Spec Kit 2026 年 6 月超 11 万星,8 月 21 日发布 1.0,后续突破 13 万星,支持 30 余种 Agent | GitHub / 媒体报道 | 星数增长快但属流行度指标,不等于生产采用率 |
| AWS Kiro 于 2026 年 5 月国际发布并 GA | AWS 官方 | 官方口径可信;付费分档约 20--200 美元/月 |
| 采用结构化 AI 工作流后:合并请求 +8.69%、合并率 +15%、成功构建 +84% | Accenture 450 人随机对照试验 | 有对照组,可信度较高 |
| 头部团队交付速度快 5--6 倍 | McKinsey | 观测性结论,样本与口径未完全公开 |
| AI 生成代码漏洞率 9.8% -- 42.1% | 多项基准 | 区间极宽,说明测量方法差异巨大,不宜单独引用 |
| Tessl 称可减少 35% 集成错误、提升最多 90% 准确率 | Tessl 官方 | 厂商自述,缺独立验证 |
| 规格驱动工作流首次通过率提升 3--10 倍 | 早期采用者报告 | 自我报告,存在选择偏差 |
11.2 接下来两三年的五个方向
- 多智能体编排(VibeOps):不再是"一个全能聊天机器人",而是 Maker 写码、Critic 审安全、Tester 生成测试、Release 管流水线。MCP 与 A2A 等协议正在成为 Agent 间通信的事实标准。
- 规格的版本化与回归:规格会像代码一样进版本库、做 diff、写测试。"规格回归测试"------检查实现是否仍与规格一致------会成为 CI 的常规环节。
- 有界自主与强制签核:受监管压力(如欧盟 AI 法案)与数据泄露责任的双重驱动,Agent 将运行在严格的护栏内,生产变更需要可 cryptographic 追溯的人工签核。
- 评测与审计职业化:写代码本身在贬值,**代码审计、威胁建模、AI 评测(Eval)**在升值。掌握这三样的人,会取代"写得最快的人"成为新的核心。
- 开发者身份重构:从"手工雕刻逻辑的匠人"转向"系统架构师 + 意图管理者"。初级工程师不再靠写 CRUD 练手,这对培养体系提出了全新问题------目前行业还没有好答案。
- 长程编程的可靠性 :模型厂商已把"连续自主运行数十小时完成复杂工程"作为竞争焦点。真正的瓶颈不在时长,而在长程任务中的目标保真与错误累积。
回到本质
这场迁移的主线不是"AI 越来越会写代码",而是人类的抽象层级在不断上移 :从写语法 → 写逻辑 → 写意图 → 写契约。
每一次上移都释放了巨大的生产力,也把"把事情说清楚"这件事的成本提高了。歧义从未像今天这样昂贵。
十二、术语表与参考来源
12.1 术语表
| 术语 | 含义 |
|---|---|
| Vibe Coding | 凭自然语言感觉驱动 AI 生成代码、不审阅代码本身的工作方式。Karpathy,2025.02 |
| Agentic Coding | AI 以智能体形态自主完成规划、工具调用、验证与修正的闭环 |
| Agentic Engineering | Karpathy 提出,指在详细规格之下编排多个智能体、每阶段系统化验证的更纪律化做法 |
| Spec-Driven Development (SDD) | 规格驱动开发,口语称 Spec Coding。规格而非代码作为真相源 |
| spec-first | 先写规格驱动本次生成,规格未必长期维护 |
| spec-anchored | 规格留存并与代码共同持续演进 |
| spec-as-source | 规格是唯一主产物,代码完全由规格生成、人工不改代码 |
| Constitution | 项目宪法:测试标准、架构约束、安全红线等不可变全局原则(Spec Kit 独有) |
| EARS | Easy Approach to Requirements Syntax,"WHEN 条件 THE SYSTEM SHALL 行为"的受限句式,源自劳斯莱斯安全关键系统实践 |
| Context Engineering | 上下文工程:为 Agent 组织、检索、注入高质量上下文的系统性工作 |
| MCP | Model Context Protocol,Agent 接入外部工具与数据源的接口标准 |
| Bounded Autonomy | 有界自主:在严格权限与审计护栏内运行 Agent |
12.2 主要参考来源
- Karpathy 关于 vibe coding 与 agentic engineering 的公开表述(2025--2026)
- GitHub Spec Kit 官方仓库与 README(MIT 开源,2026 年 8 月发布 1.0)
- AWS Kiro 官方文档与发布公告(2026 年 5 月国际发布)
- Thoughtworks 技术雷达(SDD 列入 Trial 环)与 Birgitta Böckeler 关于 SDD 三级成熟度的分析
- Martin Fowler 团队关于 spec-first / spec-anchored / spec-as-source 的论述
- OpenAI Sean Grove,"The New Code" 演讲
- Kent Beck 关于 TDD 与 AI Agent 协作的观点(Pragmatic Engineer 播客)
- Accenture 450 人随机对照试验;McKinsey 关于交付速度的观测报告
- Tessl 官方关于 Spec Registry 的定位与数据
- OpenSpec、BMAD-METHOD 开源项目文档
- 2026 年多篇关于 spec-driven development 的行业分析与框架对比文章
⚠️ 使用提醒
本报告中的量化数据均标注了来源与口径。涉及厂商自述的指标(准确率提升、漏洞率等)缺少独立第三方验证,建议在正式决策材料中以官方口径复核后再引用。