Storforge
编码预计 40 分钟

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

整条学习路线都假设你带着 AI 写代码。这节课把规矩立好:怎么写 spec、怎么让 AI 出代码、怎么 review 它的产出 —— 以及哪些事绝不能外包给 AI。

学完这节你能做到

  • 装好并跑通一个终端 AI 编程工具(Claude Code 或同类)
  • 用「spec → 生成 → review → 测试」四步循环完成一个小改动
  • 判断哪些产出必须逐行读懂:数据落盘、并发、unsafe

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

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

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

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

  • AI 负责:语法细节、样板代码、测试用例的穷举、API 文档查询、解释报错
  • 你负责:说清楚要什么(spec)、判断做没做对(review + 测试)、拍板设计决策

装备:选一个终端 AI 工具

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

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

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

网页聊天框也能用,但你要来回复制粘贴,而且它看不到完整项目 —— 效率差一个量级。

第一次对话干什么

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

四步循环:spec → 生成 → review → 测试

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

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

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

写一个 Rust 函数 parse_capacity(s: &str) -> Result<u64, ParseError>:

  • 接受 "512"(纯字节)、"4KiB""1.5TiB""2TB" 这类输入
  • 二进制单位(KiB/MiB/GiB/TiB)按 1024 进位,十进制单位(KB/MB/GB/TB)按 1000
  • 允许小数,结果向下取整到字节;溢出 u64 要报错,不许 panic
  • 空串、负数、未知单位返回错误,错误信息要能定位问题

区别在哪?好 spec 把边界情况和失败行为都说死了。这正是运维思维: 你在写变更方案时早就习惯了「异常情况怎么处理」这一栏。

2. 生成:让 AI 动手

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

3. review:三道关

  • 第一关,编译 + clippy:cargo build && cargo clippy,机器把最低标准守住
  • 第二关,跑测试:cargo test,并且读一遍测试用例,确认它测的是你 spec 里的边界
  • 第三关,逐行读关键路径:数据落盘、错误处理、并发 —— 这三类代码必须逐行读懂,下面细说

4. 测试:你再补一刀

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

Checkpoint单选

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

红线清单:哪些代码必须自己吃透

AI 可以写,但以下三类你必须逐行读懂,说不出每一行为什么存在就不许合并:

  1. 数据落盘路径 —— write、fsync、rename 的顺序;格式里每个字段的含义。 这里错了就是丢数据,而且往往测试测不出来(要断电才暴露)。
  2. 错误处理 —— 哪些错误吞掉了?unwrap() 出现在哪?AI 特别爱在示例代码里 用 unwrap(),生产路径上每一个都要问「这里 panic 了会怎样」。
  3. 并发与 unsafe —— 锁的范围、原子操作的 ordering、任何 unsafe 块。 AI 写的并发代码看起来永远很自信,自信和正确是两回事。
×最危险的时刻:代码能跑

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

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

用这节课学的四步循环完成第一个真正的编码任务。贴出提示词只是第一步 —— 重点在后两步:读它写的每一个测试,然后追问至少两个它没覆盖的边界 (提示:"1.5" 该是多少字节?u64::MAX 附近呢?"1e3GB" 呢?)。

请在当前目录初始化一个 Rust 项目(cargo init --name capacity),然后实现:

fn parse_capacity(s: &str) -> Result<u64, String>

规格:
- 接受 "512"(纯字节)、"4KiB"、"1.5TiB"、"2TB" 等输入,允许一个可选空格,如 "1.5 TiB"
- KiB/MiB/GiB/TiB 按 1024 进位;KB/MB/GB/TB 按 1000 进位;大小写按惯例,不要模糊匹配
- 允许小数,结果向下取整;计算溢出 u64 必须返回 Err,不许 panic
- 空串、负数、NaN、未知单位返回 Err,错误信息包含原始输入
- 同时给出覆盖上述所有边界的单元测试

完成后运行 cargo test 和 cargo clippy,把结果给我看。

小结

  • 分工:AI 出手速,你出判断;spec 和验收永远是你的活
  • 四步循环:spec → 生成 → review(编译/测试/逐行)→ 你再补测试
  • 三条红线:落盘、错误处理、并发 —— 读不懂就不许合并
  • 下一节把 Rust 工具链装起来,forge 仓库正式开工