乐于分享
好东西不私藏

It Ain’t Broke:为什么软件基础在AI时代比以往更重要

It Ain’t Broke:为什么软件基础在AI时代比以往更重要

It Ain’t Broke:为什么软件基础在AI时代比以往更重要

代码从来都不便宜。只是在AI时代,坏代码的代价终于被人看见了。

Matt Pocock在AI Engineer Europe的演讲里讲了一个他亲历的故事:他尝试用”规范转代码”的工作流——写规格说明书,让AI生成代码,出错了就改规格,再生成。最后得到一堆垃圾,观众里一片苦笑。

这个经历戳破了一个被热炒的叙事:“代码是廉价的”——这是谎言。坏代码的代价从来没有像今天这样高昂。为什么?因为AI在好代码库里如鱼得水,在烂代码库里寸步难行。它是那个在地面上埋头写代码的战术兵,但需要一个战略层面的指挥官——那就是你。而你需要的武器,是那些被很多人认为”过时”的软件工程基本功。

Pocock归纳了AI编程的六个常见失败模式,以及如何用经典设计思想一一破解。每个模式背后,都对应着他开源在GitHub上的一套AI Agent Skills——这些是他每天在真实项目里使用的实战工具,已经被数万开发者安装使用。


坑一:AI做的事和你想的不一样

你脑子里有个模糊的设计,和AI聊了半天,它给出一堆你不想要的东西。这不是AI的错,而是你们之间缺少一个共享的”设计概念”——Frederick Brooks在《设计的设计》里提出的词,指的是团队成员之间那种心照不宣的理解,它没法写进文档,却是协作真正的粘合剂。

解法叫“Grill Me”:让AI反过来不断向你提问,追问每个决策的细节,直到你们在所有分支上达成共识。这个只有两行字的提示词,在GitHub上收获了13000颗星。

Pocock把这套逻辑做成了更完整的/grill-with-docs skill——在提问的基础上,还要求AI帮团队维护一份CONTEXT.md术语文档和ADR(架构决策记录),把那些模糊的共享理解慢慢固化下来。简单说:每次对话结束,AI不是在凭空生成代码,而是在积累一份整个项目的认知资产。


坑二:AI说话像在写博士论文

你问它一个简单问题,它洋洋洒洒几千字,越说越跑偏。这种”语言不通”的根源,和程序员与领域专家协作时遇到的沟通鸿沟一模一样——大家不在同一个语义空间里。

Eric Evans的《领域驱动设计》早就给出了答案:通用语言。为团队(包括AI)建立一套统一的术语表,所有代码、文档、对话都用同一套词汇,让AI扫描代码库自动提取关键术语生成词汇表,之后所有沟通都在这个基础上展开。

/grill-with-docs 技能里,这件事是自动化的:它扫描代码库,找到项目中已有的术语用法,生成一份CONTEXT.md——相当于给AI一份”行话词典”。Pocock把词汇表常驻在屏幕旁边,AI思考的噪音明显少了,产出质量也更高。一份好的通用语言文档,不只能减少AI的废话,还能让变量命名、函数接口都自然对齐,代码库本身也因此更好导航。


坑三:代码建对了,但不工作

你和AI达成共识了,它也按你说的做了,但一跑就崩。问题出在反馈机制的缺失——TypeScript静态类型、自动化测试、运行状态可见,这些是让AI”看见”代码是否工作的眼睛。没有这些,AI在黑暗中狂奔,连自己在犯错都不知道。

《实用程序员》里有句话被他反复引用:反馈的速度就是速度的极限。没有反馈循环,AI跑得越快,偏得越远。

/diagnose 技能把调试变成了一套纪律严明的闭环:复现 → 最小化 → 假设 → instrument → 修复 → 回归测试。遇到难缠的bug,就让AI按这个流程走。


坑四:一次性生成太多,乱了手脚

即使AI能看见错误,它仍然倾向于一次生成一大堆代码,然后才想起来要做检查——开远光灯,眩光刺眼,什么都看不清。

解法是TDD,测试驱动开发:先写一个测试,让它失败,然后只写最小量的代码让测试通过,再重构。这个”小步快跑”的循环强迫AI一次只走一步——每一步都在验证,每一步都可撤回。AI生成10行代码时有7行可能是错的,但生成3行时,错误成本低到可以忽略。小步快跑把AI的破坏半径锁死在可控范围内。

/tdd 技能把红-绿-重构的节奏固化成了AI的工作流规范:永远是失败测试先行,永远是小步提交,永远在重构之前先有绿色。


坑五:代码库里全是浅层模块

有些代码库看起来模块化做得很好,一堆独立文件,每个几十行。AI进去探索之后就迷失了——就像一个外地人走进一座由无数小摊位组成的夜市,每个摊位只卖一样东西,你要买齐一顿饭的材料得问几十个人。

John Ousterhout在《软件设计的哲学》里把”深层模块”作为好代码的标志:大量功能藏在简单的接口后面,使用者不需要知道内部有多复杂。深层模块的系统边界清晰,每块是一个”灰箱”——你知道它是做什么的,但不需要深究它怎么做。

AI天然擅长生成”夜市式”代码库——大量浅层模块堆在一起,每个看起来都没问题,但整个系统变成一锅粥。/improve-codebase-architecture 技能定期扫描代码库,识别可以合并成深层模块的机会,帮AI主动整理架构,而不是等架构烂透了再推倒重来。


坑六:一切都对了,但你累垮了

代码产出比以往任何时候都快,但你的大脑在尖叫。这是AI时代特有的burnout——心智模型在过载。

解法是设计接口,把实现委托出去。你专注于模块的边界和契约,把具体实现交给AI处理。只要边界上有可测试的接口,你就可以从外部验证正确性,而无需在脑子里装下所有实现细节。这个思路和Kent Beck那句”每天为系统设计做一点投资”一脉相承。

/zoom-out 技能让AI在任何时候都能”拉远镜头”——不是钻进某个函数的实现细节,而是从整个系统的视角解释这段代码在全局中的位置和意义。有了这个,AI就不再是那个丢给你一千行代码让你自己消化的混蛋,而是真正在帮你思考系统全局的协作伙伴。


AI时代的正确打开方式

Pocock把这些技能开源在 github.com/mattpocock/skills,用一条命令就能装进任何主流AI编程工具:

npx skills@latest add mattpocock/skills

这套工具的本质,是把那些经典的软件工程基本功——共享理解、通用语言、TDD、持续架构投资——做成了AI能理解和执行的提示词。它们不是让AI替代你的思考,而是逼着AI配合你的思考节奏。

演讲结尾有句话被很多人记下:“AI是那个在地面上不知疲倦写代码的军士,而你是那个站在高处决定往哪打的人。” 这话听起来简单,但要真正做到,你手里的武器不能只是热情——得是那些真正经过时间验证的软件工程思维。

那些老书没有过时。它们是AI时代的战略装备。


延伸阅读

  • 《软件设计的哲学》— John Ousterhout:复杂度是软件的核心敌人,深层模块是好设计的基本单元。
  • 《实用程序员》— Andy Hunt & Dave Thomas:软件熵无处不在,每一次只顾当前需求而忽视整体设计的修改都在加速熵增。
  • 《设计的设计》— Frederick P. Brooks:设计概念是团队协作的无形资产,无法文档化,却决定了一切。
  • 《领域驱动设计》— Eric Evans:通用语言是跨越沟通鸿沟的桥梁,代码和对话应当共享同一套术语。

【转载】长文: Harness Engineering的本质是什么?

Harness Engineering是软件工程的银弹么?