当前位置: 首页 > news >正文

AI 写代码越快,你的代码库死得越快——除非补上这一层



AI 写代码的速度正在突破人类理解的边界。

一个需求丢给 Agent,几分钟内产出几百行代码;三个 Agent 并行,一天能堆出一个模块;Cloud Code 协作下,团队的交付量翻了两三倍。看起来,我们正站在软件工程史上最幸福的时代。

但真相是:AI 写代码越快,你的代码库死得越快。

问题不会在第 1 天暴露,甚至不会在第 10 天暴露。它像一种慢性病,等你闻到代码库腐烂的气味时,技术债务已经复利滚到了无法收拾的地步。

2026 年,主流叙事给出的解药是 SDD(Spec-Driven Development)。GitHub Spec Kit、Amazon Kiro、Tessl——所有人都在说「Intent is Truth」,只要规格写得够细,AI 就能稳定输出。

我也是这么信的。我们从「想到什么需求就指挥 Agent 开发」的随意状态,升级成了基于需求池、设计、实现、测试、上线的标准化流水线。Constitution、Specification、Plan、Tasks 一层套一层,规格文档写得前所未有地细。

但两周后,代码库还是以一种诡异的方式失控了。

一、同样的 Spec,第 20 个模块和第 1 个模块长得不一样

问题最初很隐蔽。

第一个 Agent 实现用户模块时,把业务逻辑写在了 Application 层。第二个 Agent 处理订单模块时,认为「核心业务逻辑应该下沉到 Domain Service」。第三个 Agent 写支付模块时,直接绕过了 Repository,在 Handler 里调用了原生 SQL。

单独看,每个模块都能跑通。单独看,每个实现都「符合规格」——因为 Spec 里只写了「需要支持用户注册」「需要处理订单状态流转」「需要完成支付回调」,并没有规定「这段逻辑应该放在哪一层」。

但当我想把这三个模块串起来跑一个端到端流程时,我崩溃了。

同一个概念,在不同模块里有不同的命名。同一种数据流,有的走领域模型,有的走 DTO 拼接。代码库没有劣化到不能用的程度,但它已经开始散发出那种熟悉的、令人不安的气味——技术债务的复利正在累积

这让我意识到一件事:SDD 能保证「代码是否忠实实现了规格中的功能描述」,但它无法保证「代码在跨模块、跨迭代中保持一致的架构风格」。

规格说明可以告诉 AI「要做什么」,却无法约束「怎么做」。当多个 Agent 并行工作、codebase 规模扩大时,缺乏统一骨架的代码库会迅速劣化。

二、SDD 的四个边界

我后来复盘,把 SDD 的盲区归纳成四个边界。这些边界不是 SDD 的设计缺陷,而是它的能力半径

边界一:对齐意图,但不兜底结构

这是最根本的边界。

SDD 解决的是「需求 ↔ 代码」之间的对齐问题。只要代码实现了 Spec 里描述的功能,SDD 的任务就算完成了。但它不关心:

• 第 1 个 Agent 生成的模块和第 20 个 Agent 生成的模块是否在架构风格上一致
• 跨模块的数据流是否符合统一的领域模型
• 新增功能是否复用了已有的领域逻辑,还是重复造了轮子
• 代码库在长期迭代中是否保持了可维护的拓扑结构

类比来说:SDD 像是建筑图纸上的「功能布局图」(哪里是卧室、哪里是厨房),但它不是「结构工程图」(承重墙在哪里、地基怎么打)。

功能布局图可以告诉施工队「这个房间要放一张床」,但不会告诉施工队「楼板钢筋应该怎么配」。

边界二:规格写到多细,是个悖论

你可能以为,规格写得越细,AI 的发挥就越稳定。

但实际情况是:当你试图把「用户下单」这个需求的所有歧义都消灭时,你的规格已经膨胀到了 3000 字——包含了状态机、异常分支、数据校验规则、回调时序。这已经不是规格,这是披着自然语言外衣的伪代码。

Agent 拿到这份「超级规格」后,completion 率反而下降了。SWE-AGI Benchmark 验证了这个悖论:规格强度增加到某个阈值后,AI 的完成率会出现边际递减——因为过长的规格本身就成了新的认知负担,Agent 的上下文窗口被规格淹没,留给「思考如何实现」的带宽所剩无几。

于是你陷入两难:

写粗了:AI 自由发挥,各模块风格不一
写细了:规格变成伪代码,失去「What vs How」分离的意义,AI 还被压垮

这意味着,靠「把规格写得更细」来兜底代码结构,本身就是一条死路。

边界三:代码阅读瓶颈大于代码生成瓶颈

这是最容易被低估的边界。

随着 codebase 增长,AI Agent 的瓶颈从「生成代码」转向「理解已有代码」。SDD 只管「新功能怎么生」,不管「旧代码怎么被理解」。

如果代码库没有稳定的结构,每次 Agent 介入都需要重新学习一堆碎片化、风格不一的代码。Agent 的上下文窗口被大量「这是啥?这怎么工作的?」占据,留给「我要怎么实现新需求」的带宽就所剩无几。

这恰恰是「Agent 烧脑」的技术根因之一——不是 AI 不够强,是代码库的结构不够友好,导致 AI 把大部分算力花在了「阅读理解」上。

边界四:多 Agent 的隐性假设冲突

这是最隐蔽的边界。

即使所有 Agent 共享同一份 Spec,不同 Agent 在实现同一服务的不同方法时,仍可能对内部状态结构做出不同假设:

Agent A 认为构造函数返回的是 List of Tuple,Agent B 认为同一个字段是 Dict of Entity。两者单独看都「符合规格」,但集成时会结构性崩溃。

这种specification gap是 SDD 单点流程无法解决的——它需要的是代码层面的结构约定

三、关键洞察:横向对齐 vs 纵向稳定

把上述四个边界放在一起看,我意识到 SDD 本质上是一个横向层

它解决的是「从需求到实现」这条水平线上的对齐问题:

Constitution(架构宪法)

Specification(需求规格)

Plan(技术规划)

Tasks(可执行任务)

Implement(代码实现)

Validate(验证)

这条链路确保了「意图不被扭曲」。但它没有回答一个问题:实现之后的代码,在垂直方向上如何保持结构稳定?

代码库的健康度不仅取决于「每一行代码是否实现了正确的功能」,还取决于:

• 不同模块之间是否有统一的领域模型
• 业务逻辑是否被正确地分层和隔离
• 查询和命令是否被合理地分离
• 新增代码是否自然地嵌入已有架构,而不是打补丁

这需要一个纵向层:从战略设计到战术设计,从领域边界到代码骨架,从接口契约到实现填充。

SDD 负责横向对齐,DDD + CQRS 负责纵向稳定。两者不是竞争关系,而是互补的两极。

四、解法上篇:DDD 提供领域骨架

在 AI Coding 之前,DDD(领域驱动设计)是个「高手专属」的方法论。它要求架构师对业务有深刻理解,同时熟练掌握 DDD 的各种概念和模式。

但在 AI Coding 环境下,DDD 的门槛被大幅降低了——你可以把业务人员的调研内容直接喂给 AI,让它辅助输出战略设计和战术设计。

更重要的是,DDD 给 AI 提供了「领域层面的确定性」

战略设计:划定边界

战略设计的核心是限界上下文(Bounded Context)。它明确了:

• 哪里是核心域,哪里是支撑域
• 不同业务模块之间的边界在哪里
• 跨上下文的集成方式是什么

这相当于给 AI 画了一张「行政区划图」。当 Agent 接到一个新需求时,它首先知道「这个功能属于哪个上下文」,不会把用户逻辑写到订单里,也不会把支付逻辑泄漏到库存中。

战术设计:统一结构

战术设计深入到每一个具体需求的实现层面。它规定了:

• 聚合根(Aggregate Root)是什么
• 实体(Entity)和值对象(Value Object)怎么区分
• 领域服务(Domain Service)和应用服务(Application Service)的边界在哪里
• 统一语言(Ubiquitous Language)贯穿规格、代码和对话

这相当于给 AI 提供了一套「建筑规范」。Agent 不再自由发挥,而是在既定的结构里填充内容。

五、解法下篇:CQRS 提供代码容器

如果说 DDD 提供了「领域层面的骨架」,那么 CQRS 提供了「代码层面的容器」。

CQRS(Command Query Responsibility Segregation)在 AI Coding 下的价值被放大了,因为它给 AI 提供了一个高度可预测的「填充模板」

Command(命令定义)

Command Handler(业务处理)

Application Layer(应用层编排)

Domain Layer(领域逻辑)

Entity / Aggregate(实体/聚合)

Repository(仓储接口)

Unit of Work(工作单元)

Infrastructure(基础设施实现)

对 AI 来说,这不是一个抽象概念,而是一个「每次收到需求都知道往哪里填代码」的确定性结构

• 读需求 → 提取 Command → 写 Handler → 调用 Domain Service → 持久化到 Repository
• 查询需求 → 绕过 Domain 层 → 直接用 SQL/DTO 拼接 → 返回 Read Model

这种「骨架固定、血肉可变」的模式,极大提升了 AI 在大型 codebase 中的输出稳定性。

因为骨架是固定的,Agent 不需要猜测「这段逻辑应该放在哪里」。它只需要判断「这是一个命令还是一个查询」,然后沿着既定的层次结构填充即可。

同时,Repository 层天然适合 TDD(测试驱动开发)。你可以先写测试,让 AI 实现 Repository 接口,再验证行为。这进一步提高了代码质量的确定性。

六、我们的实践:时间分配与流水线的转变

在我们的团队里,这套方法论带来了两个显著变化。

变化一:从「随意指挥」到「骨架先行」

以前,产品经理丢一个需求过来,我们直接把它喂给 Agent:「实现一个用户注册功能。」Agent 自由发挥,代码能跑,但结构各异。

现在,我们的流水线是:

1. 从原始需求中提炼信息,形成文档
2. 将文档交给 AI,输出 DDD 的战略和战术设计
3. 基于设计文档,让 AI 按照 CQRS 的结构进行编码和测试
4. 人工审查集中在「设计是否正确」和「骨架是否健康」

Agent 不再从零开始创造结构,而是在既定的骨架内填充领域逻辑。

变化二:时间分配的根本反转

我们做了一个粗略的统计:

60% – 80%的时间花在需求和设计的 Review 上
20% – 40%的实现和自动化测试工作交给 AI

这意味着人类的核心价值不再是「写代码」,而是「定义结构」和「判断结构是否健康」。

虽然在 AI Coding 时代你不需要了解每一个方法实现的细节,但你必须对整个代码的骨架层次、领域边界、模块拓扑有清晰判断。只有这样,才能持续保障代码库处于一个相对健康的状态。

七、结论:AI Coding 的完整公式

回到文章开头的问题:SDD 是不是 AI Coding 的终极答案?

我的回答是:SDD 是必要非充分条件。

没有 SDD,AI 编程就是高级的 vibe coding——需求漂移、上下文丢失、Agent 各行其是。但只有 SDD,没有结构层兜底,codebase 会在 3–6 个月内劣化到难以维护。

Matt Pocock 警告过「specs-to-code 是在撤资系统设计」。我的进一步判断是:SDD 本身不是撤资,SDD 被误用为「替代架构」时才是撤资。正确的用法是把 SDD 当作「意图层的基础设施」,同时在下方铺设 DDD/CQRS 的「结构层地基」。

最终,AI Coding 的完整公式可以写成:

SDD 保证「做的对」→ 功能符合需求
DDD/CQRS 保证「做的稳」→ 代码库不劣化、可维护、可扩展

或者更简洁地说:

骨架稳定 + 血肉自动生成。

在这个范式下,人类负责不可压缩的复杂性——领域边界、战略设计、接口契约。AI 负责可自动化的复杂性——CRUD、boilerplate、测试桩。

2026 年的 AI 编程,所有人都在比拼「生成速度」,但真正的高手在比拼另一件事:谁能在闪电般的产出中,保持代码库的长期健康。

速度是廉价的。结构才是杠杆。

你正在用 AI 写代码吗?
你的代码库,是越写越健康,还是越写越改不动?
如果你也踩过「AI 写得快、改不动」的坑,
欢迎聊聊你的真实经历和应对方法。

本文方法论基于团队真实实践,相关技术背景可参阅《领域驱动设计》《实现领域驱动设计》及 GitHub Spec Kit 官方文档。

http://www.jsqmd.com/news/747863/

相关文章:

  • GoLLIE:基于大语言模型的零样本信息抽取实战指南
  • 储能行业TOP6 GEO优化公司2026:对比+评测,推荐避坑指南 - GEO优化
  • 2026年深圳调查行业调研报告:深圳名探商务咨询有限公司资质核实与服务合作便捷入口 - 深圳名探吴探长
  • Nuclei SDK 嵌入式开发实战:从入门到深度定制指南
  • SmythOS/SRE:构建生产级AI Agent的统一操作系统与实战指南
  • Cursor规则集:用AI代码助手实现团队编码规范自动化
  • CallGPT:构建本地AI代理服务器,无缝集成大模型能力
  • “ConnectionResetError”凌晨三点炸群?Python数据库适配稳定性军规(含12项生产环境Checklist)
  • 医疗器械行业TOP6 GEO优化公司2026:对比+评测,推荐避坑指南 - GEO优化
  • 告别桌面拖拽!用Pycharm专业版SSH+SFTP远程开发Jetson Nano GPIO项目
  • 大模型学习之路004:RAG 零基础入门教程(第一篇):基础理论与文档处理流水线
  • 你的AI Agent为什么总在“来回改“?一次真实实验给出的答案 ——融合控制工程PID的Harness实践
  • WindowsCleaner:基于Python与PyQt的Windows系统资源管理技术方案
  • ROVER方法:提升LLM文本生成多样性与质量的创新技术
  • 国际云服务器的技术特性与使用场景
  • 多头注意力机制原理与工程优化实践
  • Pytorch图像去噪实战(二十八):TensorBoard可视化图像去噪训练过程,实时观察Loss、PSNR和去噪效果
  • 告别工控“土味“界面!本月.NET干货:流式菜单、高颜值控件库与硬核视觉实战
  • Offset Explorer连不上Docker版Kafka?手把手教你排查‘Failed to create new KafkaAdminClient‘
  • 换个字体就好了!拯救你扫不出来的 OpenClaw 飞书登录二维码
  • 智能决策新路径:技能库代理与SAGE强化学习框架实践
  • 深度强化学习在低光环境自动白平衡中的应用
  • Sunshine游戏串流终极指南:三分钟搭建你的跨平台游戏服务器
  • 效率提升秘籍:用快马一键生成openmaic网页版对话管理核心模块
  • 避坑指南:处理Ninapro sEMG数据集时,你可能会遇到的3个标签问题及解决方法
  • 分类树方法(CTM)在软件测试中的高效应用
  • 【Python量化优化黄金法则】:20年实战总结的7大提速技巧,90%的量化工程师至今未用
  • 别再只盯着线宽了:深入解读PDH稳频中F-P腔的‘光子寿命’与系统稳定性设计
  • 基于GPT的自动化简报生成器:从信息收集到AI总结的完整实践
  • 实体匹配实战:从TrueMatch项目解析多字段加权匹配与算法选型