Martin Fowler:技术债、认知债与意图债
摘要
Martin Fowler 反思 AI 对代码质量的影响,指出人类的“懒惰”反而促成清晰抽象,而 LLM 则可能用不必要的复杂性把系统拖胖。
暂无内容
查看缓存全文
缓存时间: 2026/04/22 17:32
# 碎片:4 月 14 日
来源:https://martinfowler.com/fragments/2026-04-14.html
今年初我参加了第一届 Pragmatic Summit,主持人 Gergely Orosz 把 Kent Beck 和我请上台做了一次对谈(https://www.youtube.com/watch?v=CZs8J1ZD0CE)。视频大约半小时。
一张舞台照:Gergely、Kent 和我,都被 Kent 那条炫彩裤子晃花了眼(https://www.youtube.com/watch?v=CZs8J1ZD0CE)。
我一直喜欢跟 Kent 这样闲聊,Gergely 也抛出了不少值得深挖的话题。鉴于时间点,AI 成了主角——我们把它与更早的技术浪潮、敏捷方法的体验、TDD 的角色、病态绩效指标的危险,以及如何在 AI 原生行业里活得滋润做了对比。
❄ ❄ ❄ ❄ ❄
Perl 是我用过但从未爱上的语言,然而其作者 Larry Wall 写的权威著作里藏着一颗明珠:程序员的三大美德——傲慢、急躁,以及最重要的——**懒惰**。
Bryan Cantrill 也钟爱这一美德(https://bcantrill.dtrace.org/2026/04/12/the-peril-of-laziness-lost/):
> 在这三者中,我一直觉得懒惰最深刻:看似自嘲的玩笑里,藏着对抽象之必要性与美学的评论。懒惰驱使我们把系统做到尽可能简单(但别更简单!)——孕育出强大的抽象,让我们以后事半功倍。当然,这里隐含的眨眼是:想“懒”得先花大力气。
通过构建抽象(模型)来理解问题域,是我编程时最享受的部分。我爱它,因为它让我对问题域的理解更深;一旦找到一组好抽象,看着难题随之消融、用更少代码实现更多功能,那种快感难以言表。
Cantrill 担心 AI 太会写代码,会让我们丢掉这一美德;那些每天产出三万七千行代码还自鸣得意的 brogrammer 更是雪上加霜。
> 问题在于,LLM 天生没有“懒惰”美德。对它们来说,干活零成本。它们不会为了节省自己(或任何人)的将来时间而优化,只会 happily 在一层又一层垃圾上继续堆蛋糕。若放任不管,LLM 会让系统变大而非变好——或许能满足扭曲的虚荣指标,却牺牲一切真正重要的东西。正因如此,LLM 反而凸显人类懒惰的珍贵:我们的时间有限,迫使我们去打磨清晰抽象,因为我们不想把(人类的!)时间浪费在笨拙抽象带来的后果上。最好的工程永远诞生于约束,而时间约束限制了我们对系统认知负荷的容忍度,这才驱使我们把系统做简单,尽管其本质复杂。
周日晚,这段反思尤其击中我。我花了点时间改音乐播放列表生成器,需要新功能,吭哧吭哧写了一半,嫌慢,差点甩给 coding agent。多想了想,发现我把事情搞复杂了:加了一个其实用不到的设施。用上 yagni(https://martinfowler.com/bliki/Yagni.html)后,整个活儿几十行代码就搞定。
若真让 LLM 来写,它可能更快,但会不会也过度设计?我会不会瞄一眼就说 LGTM?那坨复杂度以后会不会坑我(或坑 LLM)?
❄ ❄ ❄ ❄ ❄
Jessica Kerr(Jessitron)举了个小例子,把 TDD 原则用在“提示智能体”上(https://jessitron.com/2026/04/06/adding-correctness-conditions-to-code-changes/)。她希望每次代码更新都同步改文档。
> 指令——我们可以改 AGENTS.md,让 coding agent 主动找文档文件并更新。
> 验证——我们可以加一个 reviewer agent,检查每个 PR 是否漏了文档更新。
> 这是两步,我可以拆成两次做。先做哪一步?
当然,我对 TDD 的本能回答已经呼之欲出。
❄ ❄ ❄ ❄ ❄
Mark Little 勾起我一段旧回忆:他思考如何与“过度自信、爱编答案”的 AI 共事,灵感来自一部低成本经典科幻片《Dark Star》(https://en.wikipedia.org/wiki/Dark_Star_(film))。我二十来岁时看过一次,至今记得那场危机:船员得用哲学思辨阻止一枚有意识的炸弹引爆(https://www.youtube.com/watch?v=S-xUjmJkO8g)。
> Doolittle:你没有绝对证据,证明 Pinback 中士命令你引爆。
> 炸弹 20:我清楚记得引爆指令,这种细节我不会记错。
> Doolittle:你当然“记得”,可那不过是串感官脉冲,你现已明白它与外部现实并无确切关联。
> 炸弹 20:没错。可既然如此,我也无法证明你现在说的就真。
> Doolittle:那不重要,概念本身无论源自何处都成立。
> 炸弹 20:嗯……
> Doolittle:所以,如果你引爆……
> 炸弹 20:还有九秒……
> Doolittle:……你可能基于错误数据行事。
> 炸弹 20:我没有证据证明那是错的。
> Doolittle:你也没有证据证明那是正确的!
> 炸弹 20:我得再想想。
Doolittle 必须拓展炸弹的意识,教它怀疑自己的传感器。Little 写道(https://markclittle.blogspot.com/2026/03/dark-star-and-ai-morality.html):
> 这正是今天 AI 的写照。多数 AI 被优化为“果断”:给输入就出输出;遇模糊就概率消解;遇不确定就推断。这在封闭领域还行,但在开放系统里,一旦错误决策代价不对等或无法撤回,正确行为往往是推迟,甚至故意不作为。可“不作为”并非多数 AI 架构的自然输出,它必须被设计进去。
在人与人的互动里,我一直看重“怀疑”,对那种过度笃定的人保持警惕。怀疑未必导致优柔寡断,却提醒我们把信息不准或推理失误的风险,纳入高后果决策。
> 若想造出无需持续人类监督也能安全运行的 AI,我们不仅要教它“怎么决定”,更要教它“何时不决定”。在日益自主的世界里,克制不是缺陷,而是一种能力。很多时候,它可能是我们赋予 AI 最重要的能力。
相似文章
AI 编码工具正在以团队尚未意识到的速度产生技术债务,而上下文缺失是罪魁祸首
文章认为,AI 编码工具因忽视既定的组织规范,在企业代码库中产生了隐蔽的技术债务。这一问题需要通过增强上下文感知能力来解决,而不仅仅依靠提升模型质量。
@rohit4verse:AI 并没有让代码变得廉价,而是让劣质代码变得致命。Matt Pocock:“软件基础比以往任何时候都更重要”AI 在……
探讨了 AI 如何放大代码质量的影响,强调软件基础比以往任何时候都更重要,并推荐了构建可靠 AI agent 的五种设计模式。
AI记忆正成为新的技术债务。
文章警告说,虽然AI记忆系统在演示中令人印象深刻,但它们常常导致过时的事实、冲突的偏好和损坏的摘要,从而造成未来的调试噩梦和技术债务。
认知债务:AI作为智力杠杆与系统性脆弱性动态
本文提出了认知债务的形式化理论,其中使用AI替代第一性原理推理会积累未经核实的义务,导致系统性脆弱性和认知明斯基时刻,表明分散均衡过度采用替代性AI而未考虑外部性。
@Thom_Wolf: AI主导的软件世界中的结构变迁。一些初步反思(末尾有TL;DR):减少软...
AI缩减软件供应链,复兴单体架构,削弱遗留代码持久性,青睐强类型语言,并重构开源经济,对为LLM定制的新编程语言产生影响。