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 补上。
下面哪条 spec 最可能让 AI 一次做对?
红线清单:哪些代码必须自己吃透
AI 可以写,但以下三类你必须逐行读懂,说不出每一行为什么存在就不许合并:
- 数据落盘路径 —— write、fsync、rename 的顺序;格式里每个字段的含义。 这里错了就是丢数据,而且往往测试测不出来(要断电才暴露)。
- 错误处理 —— 哪些错误吞掉了?
unwrap()出现在哪?AI 特别爱在示例代码里 用unwrap(),生产路径上每一个都要问「这里 panic 了会怎样」。 - 并发与 unsafe —— 锁的范围、原子操作的 ordering、任何
unsafe块。 AI 写的并发代码看起来永远很自信,自信和正确是两回事。
「能跑」是 AI 结对里最大的陷阱 —— demo 一次跑通,你就想往下走了。 存储系统的 bug 从不在 happy path 上;它们在断电、满盘、位翻转、并发竞争里等你。 所以本教程每个里程碑的验收全是破坏性测试:kill -9、拔盘、断网。能跑不算数,弄不坏才算数。
用这节课学的四步循环完成第一个真正的编码任务。贴出提示词只是第一步 ——
重点在后两步:读它写的每一个测试,然后追问至少两个它没覆盖的边界
(提示:"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 仓库正式开工