Storforge
编码预计 40 分钟

AI 结对开发:你的第二双手

整条学习路线都假设代码由 AI 来写,你来定规格、验收。这节课把规矩立好:怎么把行为说清楚、怎么让 AI 出代码、怎么在不读 Rust 的前提下验它的产出 —— 以及哪些事绝不能外包给 AI。

学完这节你能做到

  • 装好并跑通一个终端 AI 编程工具(Claude Code 或同类)
  • 用「规格 → 生成 → 验收 → 摧毁」四步循环完成一个小改动
  • 不读 Rust 也能 review:要讲解、要表格、要它自证

你比科班程序员更适合 AI 结对

先说一个反直觉的判断:在 AI 结对开发这件事上,你的运维背景是优势,不是劣势。

AI 写代码又快又多,真正稀缺的能力是验收:判断它写的东西对不对、什么场景会坏、 坏了怎么发现。而验收恰恰是运维的日常 —— 你天天在做「上线前怎么验证」「出了事怎么定位」。 科班程序员要学的是放手让 AI 写;你要学的是把话说清楚,然后把它写的东西弄坏。

整条 storforge 路线都建立在这个分工上:

  • AI 负责:所有 Rust 语法、函数怎么定义、用哪个库、代码怎么组织、样板代码、跑命令、解释报错
  • 你负责:说清楚系统该有什么行为、失败时该怎么办、怎么算做对了,然后动手验证
i你不需要会写 Rust

这条路线从头到尾不要求你写出一行 Rust,也不要求你能读懂每一行。 后面每节课的任务卡,你只需要描述行为:什么输入出什么结果、断电了怎么办、盘满了怎么办。 函数长什么样、用哪个库、错误类型怎么定义 —— 这些全是 AI 的活,它比你熟。 课文里出现的 Rust 代码块都是给你读的,不是让你照着写的;读不懂的部分, 直接把它贴给 AI 说「用人话解释这段」。

装备:选一个终端 AI 工具

选一个能直接读写你项目文件、能跑命令的终端 agent 工具,而不是网页聊天框:

# Claude Code(本教程的演示工具)
npm install -g @anthropic-ai/claude-code
cd ~/forge && claude

# 或 OpenAI Codex CLI
npm install -g @openai/codex

网页聊天框也能用,但你要来回复制粘贴,而且它看不到完整项目 —— 效率差一个量级。 更要紧的是:终端工具能自己跑测试、自己看报错,你才有资格说「跑给我看」。

✓第一次对话干什么

装好后,进入任意一个你机器上的代码目录(没有就 clone 一个开源项目),问它: 「这个项目是干什么的?入口在哪?」看它怎么自己翻文件、总结结构。 你会立刻明白这类工具和聊天框的区别 —— 它是个能自己动手的实习生,不是问答机。

四步循环:规格 → 生成 → 验收 → 摧毁

这是本教程每个编码任务的标准工作流,现在把规矩立好。

1. 写规格:把「大概这样」变成可验收的描述

注意这里说的是行为规格,不是代码设计。你要写的东西和你写变更方案时的口吻一模一样。

坏规格:「帮我写个解析容量的函数」。 好规格长这样:

我要一个能把人类写法的容量换算成字节数的功能。

  • 512 就是 512 字节;4KiB 是 4096;1.5TiB 允许小数;2TB 也要认
  • KiB/MiB/GiB/TiB 按 1024 进位,KB/MB/GB/TB 按 1000 进位 —— 这两套单位不许混
  • 数字和单位之间允许有一个空格
  • 算出来带小数就向下取整到整字节
  • 空字符串、负数、不认识的单位:明确报错,错误信息里要带上原始输入,方便我排查
  • 大到装不下的数字(比如 999999999TiB)也要报错,不许让程序直接崩掉

区别在哪?好规格把边界情况和失败行为都说死了,而且通篇没有一个 Rust 概念。 这正是运维思维:你在写变更方案时早就习惯了「异常情况怎么处理」这一栏。

✓行为规格四件套

写不出来的时候,照这四个格子填,填满就是一份合格的规格:
1. 要什么 —— 一句话说清这东西干嘛用的
2. 正常情况 —— 给几个具体例子:什么输入,得到什么结果
3. 不正常情况 —— 每种异常分别该怎么办(报错?重试?拒绝?)
4. 怎么算做对 —— 我用什么命令、什么操作能亲眼确认它对了

2. 生成:让 AI 动手

把规格交给 AI,让它同时写实现和测试。不要一次要一个大系统 —— 一次一个模块,小步走。

任务卡里的提示词复制时会自动带上一段固定前缀,把分工告诉 AI: 我没有 Rust 经验、语言层的决定你来做、每步用中文讲、给我可执行的验收命令。 这段话不用你写,但你要知道它在起作用 —— 它是你能看懂后续对话的前提。

3. 验收:三道关

  • 第一关,机器关:让 AI 自己跑 cargo build、cargo clippy、cargo test,把输出贴给你。 你不用懂这些命令的细节,只看一件事:全绿,还是有红的。有红的就打回去。
  • 第二关,讲解关:让它讲清楚关键路径干了什么,讲到你能用自己的话复述为止。 复述不出来,就是没讲明白 —— 是它的问题,不是你的问题,继续问。
  • 第三关,行为关:你自己动手验。跑一遍它给的验收命令,然后加一刀它没想到的。 这一关不需要读任何代码,只需要你运维时那套「我不信,我自己试试」。

4. 摧毁:你再补一刀

AI 写的测试常常「围着实现转」—— 实现漏了的场景,测试也跟着漏。 你的职责是站在规格一侧再想一轮:「运维时我见过什么邪门情况?」然后要求它补上。

✓一招验出测试是真是假

让 AI 故意把某条测试的断言改错,然后重跑 —— 测试必须变红。 不变红,说明这条测试根本没在测你以为的东西。 绿灯只有在「会说真话」的前提下才有意义,这一招后面每节课都用得上。

Checkpoint单选

下面哪条规格最可能让 AI 一次做对?

红线清单:哪些地方不许含糊

有三类东西你必须弄懂到能用自己的话复述,复述不出来就不许合并。 注意是「复述」不是「读代码」—— 让 AI 讲,讲到你能复述为止:

  1. 数据落盘路径 —— 写入、刷盘、改名的先后顺序;盘上格式里每个字段是干嘛的。 这里错了就是丢数据,而且往往测试测不出来(要断电才暴露)。 你要能回答:「返回成功的那一瞬间断电,这条数据还在吗?」
  2. 错误处理 —— 哪些失败被悄悄吞掉了?哪些失败会让整个进程直接崩掉? AI 特别爱在示例代码里写「出错就崩」,生产路径上每一处都要问「这里崩了会怎样」。
  3. 并发 —— 同时来两个请求会不会互相踩?一个卡住了会不会把别人也拖住? AI 写的并发代码看起来永远很自信,自信和正确是两回事。

不会 Rust,怎么 review

三招,一招比一招狠,后面每节课都靠它们:

第一招,要讲解。 「把这段代码的执行顺序画出来,用中文标清每一步在干什么。」 执行顺序错了(比如先告诉调用方成功、再去刷盘),你一眼就能看出来 —— 这是逻辑,不是语法。

第二招,要表格。 让它把关键信息列成表交给你核对:所有出错的情况分别返回什么、 每个操作的超时是多少、每条测试覆盖的是规格里的哪一条。 核对表格是不会 Rust 也能做的 review,而且比读代码更容易发现「漏了一项」。

第三招,要它自证。 「哪一条测试证明了这件事?」是最有杀伤力的一句追问。 它说不出来,就是没测;它说得出来,你就去把那条断言改坏,看测试变不变红。

×最危险的时刻:代码能跑

「能跑」是 AI 结对里最大的陷阱 —— demo 一次跑通,你就想往下走了。 存储系统的 bug 从不在 happy path 上;它们在断电、满盘、位翻转、并发竞争里等你。 所以本教程每个里程碑的验收全是破坏性测试:kill -9、拔盘、断网。能跑不算数,弄不坏才算数。

⚡AI 结对:跑通四步循环pair with ai

这是你的第一个真正的编码任务 —— 注意提示词里没有一行 Rust,只有行为。 贴出提示词只是第一步,重点在后面:先让它讲,再让它证明,最后你自己上手试。 这个循环你要在接下来 28 节课里重复 28 次,现在把它跑顺。

目标:做一个能把人类写法的容量换算成字节数的小工具,当作我们第一次合作的热身。先在当前目录建一个新的 Rust 项目。

行为规格:
1. 认这几类写法:512 就是 512 字节;4KiB 是 4096;1.5TiB 允许小数;2TB 也要认;数字和单位之间允许有一个空格,比如 1.5 TiB;
2. KiB/MiB/GiB/TiB 按 1024 进位,KB/MB/GB/TB 按 1000 进位 —— 这两套单位不许混,大小写按通行写法,不要模糊匹配;
3. 算出来带小数就向下取整到整字节;
4. 这些情况必须明确报错,并且错误信息里带上原始输入:空字符串、负数、不认识的单位、大到装不下的数字(比如 999999999TiB);
5. 报错就是报错,任何一种上面列的情况都不许让程序直接崩掉。

交付:实现 + 覆盖上述每一条的自动化测试 + 一条我能直接粘贴运行的命令,用它试几个例子看输出。
另外:做完之后反过来问我 3 个问题,检验我有没有真的想清楚这些边界。
你的验收动作自己跑、自己看,不用读代码
  • 让它把测试跑一遍,你只看一件事:全绿还是有红的。有红的就打回去,不要听解释
  • 让它把「1.5TiB 和 1.5TB 分别是多少字节」的测试断言故意改错、重跑,确认测试会变红 —— 绿灯会说真话,后面的绿灯才值钱
  • 自己敲那条命令试三个它没测过的输入:1.5 不带单位、0KiB、1024 后面跟一个空格什么都没有,看报错信息能不能让你一眼看出问题在哪
  • 让它列一张表:每一条规格对应哪一条测试。表里有哪条规格找不到对应测试,就是漏了
必须问到听懂的问题答不上来就别合并
  • 999999999TiB 这种大到装不下的输入,程序内部是怎么发现装不下的?会不会先崩掉再报错?
  • 如果我传进去一个 1e3GB 这种科学计数法写法,现在会发生什么?你觉得该发生什么?

小结

  • 分工:AI 出手速,你出判断;行为规格和验收永远是你的活,Rust 语法永远不是
  • 行为规格四件套:要什么、正常情况、不正常情况、怎么算做对
  • 四步循环:规格 → 生成 → 验收(机器关/讲解关/行为关)→ 你再补一刀
  • 不会 Rust 的三招 review:要讲解、要表格、要它自证
  • 三条红线:落盘、错误处理、并发 —— 复述不出来就不许合并
  • 下一节把 Rust 工具链装起来,forge 仓库正式开工