技术债存在于你的代码里。认知债存在于你的脑海里。意图债存在于那些你可能从未写下来的工件里:目标、约束,以及系统为何如此设计的理由。运气好的话,其中一些会零散地出现在团队文档或讨论里,但多半并不完整。这是唯一一种你的智能体无法替你偿还的债,而代理式工程让它变得最昂贵。
Margaret-Anne Storey 的 三重债务模型 是理解软件健康状况的一种清晰方式。三种债务模型分别是技术债、认知债和意图债。
技术债存在于代码里。 它是那些让系统日后更难修改的实现选择的累积:缠绕在一起的模块、赶工时采取的权宜之计、泄露的抽象。这个概念我们已经理解了几十年。你会从缓慢的构建、脆弱的测试,以及一想到要碰某个特定文件就心生畏惧中感受到它。
认知债存在于人身上。 它是共享理解的流失,是代码规模与任何一个人能理解的程度之间的差距。我一直把这称为理解债。它会在系统增长速度超过团队对它的心智模型时不断累积。即使你的代码完美无瑕,你也可能背负沉重的认知债,因为没人真正理解这份完美的代码。
意图债存在于工件里。 它指的是那些被外化的理由、目标和约束的缺失或流失,这些内容本应解释系统为何如此。关键字是“外化”。理由必须写下来,放在队友、未来的你,或智能体能够读到的地方,而不是只留在你的脑子里。当天意图债高企时,系统就会偏离你原本希望它做的事,而没有人能说清它是什么时候偏离的,又为什么偏离。
这三者彼此独立,这一点我花了些时间才真正理解。
你可以拥有很低的技术债,却有很高的意图债。你也可以自己完全理解一个系统(对你来说没有认知债),而它的意图却没有存在于你的颅骨之外的任何地方(对其他所有人来说都是巨大的意图债)。
从内部看,它们很相似,但每一种都会单独向你收费。
AI 生成代码的速度比以往任何时候都快,这让技术债更便宜,也更容易偿还。把一个智能体指向某个缠结的模块,它就会把它重构掉。
认知债也能恢复,而且通常比大多数工程师预期的更容易。当你不理解系统中的某一块时,你可以让智能体解释它。你可以按需重建一部分失去的心智模型,因为代码还在,模型可以把它读给你听。
意图则不同。智能体无法生成意图,因为意图是唯一必须来自你的输入。 模型可以从代码中推断出一个合理的理由,就像你也能猜出前一位工程师为什么这么做一样。但对意图的猜测并不等于意图本身。模型不知道那 300 毫秒的防抖到底是刻意为之的用户体验设计、基准测试的结果,还是某个人随手敲进去后就再也没回头看的数字。它会编造一个听起来很自信的理由,而这比老老实实承认自己不知道更糟。
在这三种债务里,只有意图债是智能体无法替你兜底的。它可以写代码,也可以恢复你的理解。但“为什么”这件事,它唯一能做的只是编造。
过去团队之所以能长期背着高额意图债,是因为这些东西被我们装在脑子里,再加上一些旧文档。
当一个新人加入团队时,你不需要把一切都写下来,因为他们会随着时间逐渐吸收这些意图:走廊里的闲聊、代码评审里的评论、以及“哦,我们不那样做,是因为 2023 年出过一次事故”。知识在人与人之间流动并不断累积。那个在团队里待了四年的工程师,就是意图文档本身——昂贵、且有损耗,但确实管用。
智能体打破了这种模式。把智能体接入团队,相当于一夜之间把团队规模翻倍,却多了一批没有长期记忆的初级成员。智能体大多数会话都是冷启动。 它不携带你的人类成员多年来积累的那些默认意图。凡是你没有外化成它能读到的工件的内容,它就没有。
这改变了“不把事情写下来”的经济学。过去,未外化的意图只是偶尔在入职或有人离职后让你付一次账。现在,你在每一次会话里都要付,而且每运行一个智能体都要再乘一遍。
想象一下你兴奋地准备并行化的那 20 个智能体。每一个都像一个从没见过你、读不懂你心思、并且会用一个合理猜测去填补你意图空白的队友。我在《编排税》里写到的编排开销,部分其实就是意图债税。管理多个智能体之所以让人精疲力竭,很大一部分原因,就是你得不断补回那些从未写下来的意图。
当我写 理解债 时,我提出过一个观点,现在我想重提一下,因为意图债让它更加尖锐。
我认为,详细规格说明并不是完整答案。把规格转成可运行代码,需要做出大量任何规格都无法完全捕捉的隐性决策;而如果一份规格详细到足以“成为”程序,那它就只是用一种更慢的语言写出来的程序。我至今仍然相信这一点。
意图债则是与之互补的真相。
不能捕捉全部意图,并不意味着可以捕捉任何意图都不做。智能体如今会替你做出的那些隐性决策,那些规格永远不会逐条列出的决策,如果你不至少把那些最关键的部分记录下来,它们的理由就会蒸发。你不可能把所有东西都写下来。
但你确实需要把那些“为什么要这么选”的理由写下来,因为这些选择一旦错了,代价会很大,而以后没人能再把它们重建出来。
理解债提醒你,不要因为代码存在,就相信它一定正确。
意图债提醒你,不要因为代码还在,就相信背后的理由也还活着。代码是答案;意图才是它试图解决的问题。AI 最擅长的,就是为那些你忘了写下来的问题,生成看似完美的答案。
意图债很少表现为摩擦。它更多表现为一种无力感。
智能体“修复”了一个 bug,却删掉了一个保护性判断,而没人能说清那个判断到底是关键逻辑还是遗留代码,因为没有文档或提交信息记录它为什么存在。
一次重构改变了用户依赖的行为。代码评审通过了,因为 diff 看起来很干净,测试也全绿;但测试只编码了之前的行为,从未编码意图。
你问为什么两个服务要通过队列通信,而不是直接调用,得到的诚实回答是“智能体建议这么做,看起来还不错”。这个回答本身,就是已经开始计息的意图债。
如果你经历过这种认知投降——为一个你无法重建的设计选择辩护——那意图债就是同一个洞在团队规模、写入文档后的版本。
投降说的是你此刻自己的姿态。意图债则是这一百次这样的时刻,留给仓库里的下一位人类和下一批智能体继承的东西。
过去几个月我写的大部分内容,最后都指向了意图债管理。我当时并没有这个词,但每次做的动作都一样:把意图从脑子里拿出来,放到一个智能体可以读取的地方。
写的是意图规格,而不是实现规格。 一份好的规格说明应当捕捉目标、约束、不可妥协项,以及对“完成”的明确界定(快速、可访问、安全、令人愉悦,而不仅仅是“功能正确”)。规格承载着代码自己无法承载的意图。
把 AGENTS.md 当作你的意图台账,而不是配置文件。 这也是我一直说要停止使用 /init 的原因。自动生成的文件描述的是代码是什么;意图文件描述的是团队想要什么:约定、之所以“不这样做”的原因,以及在任何单个文件里都看不见的约束。智能体推断不出这些,而这恰恰是它们最需要的。
在决策发生的地方把它记录下来。 轻量级的决策日志(ADR)本质上就是在偿还意图债。你在做决定的那一刻记录“为什么”,几乎不花什么成本。八个月后,当知情者已经调去别的团队,再去重建它,成本却高得惊人。智能体让日志记录比以往任何时候都更便宜,所以过去的借口已经不成立了。
让学习闭环把意图再写回来。 我一直主张自我改进型智能体,在会话结束时更新 learnings 文件。这个循环同样可以反向运行,成为一台意图债泵:每一个你记录根因的错误、每一次“我们试过 X,但因为 Y 没成功”,都是原本只会留在你对糟糕下午的记忆里的意图。
这些都不是什么新工具。它们是一种纪律:在一个你的大脑不再是主要工作场所的时代,拒绝让“为什么”只存在于脑子里。
很长一段时间里,软件中最稀缺、最有价值的东西,是做出正确实现的能力。代码很贵,所以我们优化的是写代码。
AI 让代码变得便宜,而理解是可以恢复的。意图——目标、约束和理由——是至今仍必须由人类发起的唯一输入。它也是我们最不擅长外化的东西,因为几十年来,我们都能靠把它装在脑子里勉强过关。
当团队只是少数几个人,能够在多年共享上下文中吸收意图时,这种方式是有效的。可当团队里有一半是每次会话都像陌生人的智能体时,它就不再奏效了。
技术债让你的系统难以修改。认知债让它难以理解。意图债让你难以确定系统是否仍在按你的意愿运行,而这三种债里,只有它不能由你的智能体替你偿还。那部分仍然属于你。把“为什么”写下来,因为它正变成你能留在仓库里的最有价值的东西。