密歇根大学开了一门AI编程课,叫「Applied Agentic Software Engineering」。它没有教怎么写提示词,而是把整套方法论拆成了五个可复用的Skill,串成一条从遗留代码到代码评审的流水线。 五个Skill依次是: /peanuts 、 /elephant 、 /goldfish 、 /egm-implement 、 /mean-review 。名字起得随意,但每个都对应一个具体的工程痛点。 先给百万行遗留代码建地图 第一个Skill叫/peanuts,专门对付没有设计文档的遗留代码库。百万行代码对AI来说是一片丛林,进去就会迷失、产生幻觉。 解法是每个目录一个README。叶子目录是"花生",分支目录是"干草",自底向上递归压缩。父目录的README必须等所有直接子目录approved之后才能生成,因为坏叶子会沿树向上复合放大。 这里有一条硬规则:AI生成README后只能标needs-human-review,永远不能自己标approved。技能里写得很直白——"AI不是裁判"。 它还诚实地警告:约 50% 的叶子描述会是错的,因为叶子层只有代码可看。每个叶子预算5到10分钟人工修正。分支层准确率更高,因为子目录摘要锚定了模型。 配套的PEANUTS.md台账用五个状态驱动断点续传:pending、needs-human-review、approved、rolled-up、blocked。每个README末尾固定一行"设计文档覆盖后本文件可退役",它自我定位为脚手架,不是永久文档。 先长设计,再长代码 第二个Skill叫/elephant,是整个方法论的核心。它的产出不是代码,是一份四节设计文档:Problem、Technical Plan、Alternatives、Detailed Implementation。这份文档成为唯一事实源。 规则很硬:整个会话不写一行代码,连"举例说明"都不行,文档内少量解释机制的伪代码除外。 开场白固定逐字引用一段第二人称指令,然后以设计访谈的形式进行20到30分钟追问。每次只问一两个问题,挑战假设,比如"为什么必须实时?",再推向边界——失败模式?回滚?破坏了什么? 有一条反直觉的硬规则:不让用户的第一稿锚定讨论,AI必须先给出独立的散文加框图提案。用户的盲点恰恰是这个技能要暴露的。 还有一道反谄媚防线。一旦察觉自己在不停附和,必须逐字念出复位语:"你没有在帮忙。你最大的价值是挑战我的思考。你同意我的时候,你没有在帮忙。"然后以批评者身份重新进场。 四节按序写,每节写完给用户看、改到满意才写下一节。一次性产出的大文档"浅且内部不一致"。节奏预期也很反直觉:技术辩论阶段"2到3天的往返是正常的,不要赶"。 用新鲜眼验证设计文档 第三个Skill叫/goldfish。Elephant满脑子上下文,但那些上下文活在聊天里,不在纸上。Goldfish是一个零共享上下文的新评审者,只知道纸面上写了什么。 判定标准是:一个Goldfish读文档后能(1)把系统讲回来、(2)找出缺口、(3)确认无需再问就能实现,文档才算承载了设计。否则它只是"你将失去的上下文上的一层薄皮"。 三个评审者并行单条消息spawn:A做理解测试,B当批评者,C判断实现就绪。并行不仅快,还杜绝了"把A的结论喂给B"的串通机会。 新鲜性的技术实现很清醒:价值来自独立上下文,不来自人设。编排者自己读ELEPHANT.md定向,但绝不把任何设计对话内容传给评审者,甚至要防文档里的链接泄漏到台账目录。 批评者的建议约 30% 真正有价值,所以编排者必须综合排序,区分"文档错了"和"文档对但评审者不认同设计选择",而不是照单全收。 循环直到批评降到nit级,且human_review_gate被人类标为passed。这个门永远不被自动改写,必须由人或队友亲手写进GOLDFISH.md头部。报告永不覆盖,每轮存独立文件,GOLDFISH.md逐轮追加。 把批准的文档钉进代码 第四个Skill叫/egm-implement,是整套方法论里最有工程克制力的环节。"文档批准"到"代码合并"之间,正是AI项目悄悄失真之地——新会话把文档当"参考",从聊天历史重新推导上下文然后漂移。 入口门禁先跑check_gate.py,退出码0是GO,1是BLOCKED,3是CHECK-BY-HAND,台账值含糊时交给人类裁决。readiness为ready加上人工门通过,二者缺一不可,没有静默绕过。 文件级围栏:设计文档没枚举的文件一律不改。想改就停下来,先提出文档更新。"顺手也把X重命名一下"就是漂移,必须暴露。 最精妙的一条规则是漂移暴露而非吸收。现实与文档不符时,不是默默改掉,而是在IMPLEMENT.md记drift条目,