夜雨聆风学习资料网

ARTICLE · 1143155

AI 辅助软件工程

AI 辅助软件工程
AI 是新的范式,但软件工程的基本功(尤其是那些为了和人协作而生的纪律)在 AI 时代反而更好用。不要追求「AI-native 新方法论」,回到《重构》《务实程序员》《设计的设计》《软件设计的哲学》这些老书里已经讲透的原则,把它们用自然语言「翻译」成给 Agent 的提示词即可。

理论地基:LLM 的两大怪癖约束

1. Smart Zone(聪明区)vs Dumb Zone(傻区)

注意力关系是平方级增长的:每多一个 token,模型要处理的「两两关系」就爆炸式增加。
不管上下文窗口是 200K 还是 1M,大概 100K token 之后就开始变傻,越长越笨,直到做出蠢决策。
含义:把任务切小,让每个任务都落在聪明区内;别让 AI「一口吃成胖子」。
1M 上下文窗口的本质 = 「给你发了一大坨更长的傻区」,对检索有用,对写代码帮助有限。

2. 像《记忆碎片》男主一样健忘(Memento)

每次清空上下文,模型就重置回初始状态(只剩 system prompt)。
演讲者讨厌 compact(压缩),更喜欢「清上下文、回到起点」——因为那个起点状态每次都一样、可控、可优化。
system prompt 要尽量小(有人塞 250K 进去,等于一上来就进傻区)。

完整工作流:从想法到 AI 实现(5 步 Pipeline)

想法 → [Grill Me 对齐] → PRD(目的地文档) → Kanban(可并行 issue) → [人类离场] AFK Agent 实现 → [人类回场] QA + Code Review
↑___________________ 团队可来回争论、出原型 ___________________↑ ↑ 发现新问题再补 issue 回 Kanban

第 1 步:Grill Me(盘问式对齐)—— 反对 spec-to-code

核心不是「写规格文档让 AI 转代码」,而是先和 AI 达成共享理解(design concept)。
grill me skill 极短:「 relentless 地盘问计划的每个方面,逐个 branch 走决策树,每题先给推荐答案,一次只问一个」。
会一直追问(演讲者见过的:40 / 80 / 100 题都有),逼你把没想清楚的点想清楚(例如「历史学习记录要不要回溯补分?」)。
这个对话本身就成了资产——可以喂会议录音进去一起盘假设。
关键分类:Human-in-the-loop(必须人在环)任务 vs AFK(人可离场)任务。对齐阶段必须人在环,实现阶段可以 AFK。

第 2 步:Write a PRD(目的地文档)

PRD 只是把对齐到的 design concept 总结成「我们要去哪」。
演讲者基本不读 PRD——因为 LLM 很会总结,既然已经同频,读 PRD 只是在测它的总结能力。
PRD 包含:问题陈述、解决方案、user stories、实现决策、测试决策、以及out-of-scope(不做什么)——后者对「完成的定义」很关键。

第 3 步:PRD → Issues(Kanban 看板)—— 用 vertical slices(可追踪子弹)

把 PRD 拆成互相独立、可并行认领的 issue,带 blocking 关系 → 本质是 DAG(有向无环图),可多 Agent 并行。
反对「多阶段顺序计划(phase 1→2→3)」:顺序计划只能一个 Agent 串着跑。
Vertical slice(垂直切片)vs Horizontal(水平切片):
水平:先做完所有 DB 层、再做所有 API 层、最后前端——要等到第 3 阶段才有反馈。
垂直:每个切片横跨所有层(schema 改一点 + 新 service + 前端最小可见表示),第一轮结束就能看到东西、拿到反馈。
名字来自「tracer bullet(曳光弹)」——黑夜射击时每几发带磷光,让你看见弹道、即时校准。

第 4 步:AFK Agent(Ralph 循环)—— 人类离场,Agent 自己跑

ralph once.sh:把本地 issue 文件 cat 进变量 + 最近 5 条 commit + prompt,用 claude --permission-mode accept-edits 跑。
AFK 版在 Docker 沙箱里循环:挑下一个 AFK issue(优先级:关键 bug > 基建 > tracer bullet > 打磨/重构)→ explore → TDD 实现 → 跑反馈循环 → 直到无任务。
这就是「日班(人规划)/ 夜班(AI 实现)」模型:人在前面把活儿排好队,交给 AI 离线干。

第 5 步:QA + Code Review —— 人类回场,把「品味」压回代码

实现完了人类必须手动 QA(尤其前端)——这是把你的审美/判断/口味强加回代码库的唯一方式。
全自动化每一环 → 出来的东西「缺品味、是 slop(垃圾)」。人要留一手。
QA 中发现的毛病 → 变成新 issue 回填 Kanban,循环无限延展。
现实: delegation 越多,code review 量只增不减,要做好心理准备。

支撑性理念(散落各处的金点子)

TDD 是榨干 Agent 的命门

Red-Green-Refactor:先写失败测试,再让实现通过。
好处:自动给代码库补好测试;且 AI 很难作弊(它得先 instrumentation 再写实现,而不是「先把实现写完、再在下面补一层测试」那种偷懒)。
反馈循环(feedback loop)是 AI 能力的天花板:你的代码库反馈循环越差,AI 输出越烂;没有测试/类型检查,AI 就是瞎写。

Review 要在 Smart Zone 做

同一上下文里让 AI 审自己写的代码 = 审的人在「傻区」,比实现时还笨。
正确做法:先 clear 上下文,再用一个干净的 session 审 —— 审的人在聪明区。
演讲者用 Sonnet 实现、用 Opus 审(审需要更多智力)。

Deep Module(深模块)vs Shallow Module(浅模块)

引自 John Ousterhout《软件设计的哲学》:深模块 = 小接口、大功能;浅模块 = 一堆导出很多东西的小文件。
AI 天然倾向于产出浅模块(难导航、难测、测试边界混乱)。
要把代码库设计得「易测」 → 反馈循环才好 → AI 才做得好。
心智技巧:设计好模块接口,把实现委托给 AI;模块当「灰盒」——你只需知道它行为和边界,不必通读内部。这样既能快,又不丢对代码库的掌控感。
配套 skill:improve code base architecture——扫描代码库、找能把浅模块「加深」的地方。演讲者安利:在你 repo 上跑一次试试。

Push vs Pull(编码规范怎么注入)

Push:把指令常驻塞给模型(如 Claude.md「像海盗说话」),每次都发。
Pull:给 Agent 一个「按需拉取」的机会(如 skill,带描述头「需要时再调」)。
实践:实现阶段用 pull(Agent 有疑问自行查规范);自动审查阶段用 push(把编码规范压给 reviewer,让它拿着规范和代码对比)。

并行化:Sandcastle

演讲者写的 TypeScript 库,把串行 Ralph 循环升级为并行:
planner 看 backlog + blocking 关系,选一批可并行 issue;
每个 issue 开一个 Docker 沙箱 worktree(独立 git branch)跑 implementer;
有 commit 就交给 merger agent 合并,冲突/类型/测试问题它自己修。
一句话:规划用 Kanban 表达依赖,执行用沙箱隔离,合并用专门 agent。

其他零碎但重要

Doc rot(文档腐烂):PRD 留仓库里,一个月后代码早变样,旧 PRD 反而误导 Agent。演讲者倾向做完就扔(GitHub 上 mark closed,留个「已完成」视觉标记即可)。
前端 / 原型:前端是多模态、极度依赖人眼。别指望 Agent 用 Playwright 看页面就做出好 UI。做法:让 AI 吐 3 个 throwaway 原型路由让你挑,再把挑中的喂回 grilling。原型本就该脏、本就该早给反馈。
Own your stack(控制反转):框架很多(Spec Kit / Open Spec / Taskmaster…),但格局未定,规划栈要尽量自己掌握,否则出了问题你连怎么修都不知道。
Sub agent:子 Agent 有独立上下文,干完活只把摘要「滴灌」回主 Agent,省主上下文 token。

关键 Takeaways(带走这 5 条就够)

AI 不替代工程纪律,它放大工程纪律——老书里的方法现在是给 Agent 的提示词素材库。
先对齐,再写码:grill me 达成共享理解,远比 spec-to-code 靠谱。
垂直切片 + 小任务 + 强反馈循环(TDD/类型/测试) 是让 AI 出活的三件套;反馈循环质量是能力上限。
深模块:把代码库设计得易测,就是给 AI 铺好跑道;浅模块是 AI 的泥潭。
人在环的关键节点是「对齐」和「QA/审查」;中间实现可 AFK,但品味和判断不能外包,否则产出 slop。

可复用的 Skill / 流程清单(演讲者现场用的)

grill me —— 盘问式对齐,逼出 design concept
write a PRD —— 总结成目的地文档(含 out-of-scope)
PRD to issues(Kanban)—— 用 vertical slices 拆可并行 issue(本地 markdown,不强制 GitHub)
ralph once.sh / AFK loop —— Docker 沙箱里循环实现
improve code base architecture —— 扫描并加深浅模块
Sandcastle —— 并行化框架(planner + 沙箱 implementer + merger)

相关学习资料