去年七月我写了AI 编程工具用了半年,我的结论是:别让它写完整功能。之后又写了选型、写了 Claude Code 和 Codex CLI 的对比、写了 Trae、写了「AI 是异步实习生」。五篇下来,每篇都在回答一个问题:这个工具能干什么。

没有一篇回答另一个问题:我到底是怎么用它干活的。

这次补上。这篇是这个系列的树干,下面每一节都能点进一篇具体的文章。如果你想只看一篇,看这篇;如果你想看我是怎么得出这些结论的,顺着链接往下走。

01 我为什么用 AI

不是为了写得更快。

我写代码的速度从来不是瓶颈。瓶颈是那些我不想动手的活:13 个页面逐个接同一个函数、把 7 篇文章的分类批量换掉、给一个 85 行 bash 脚本起头。这些活不难,做起来烦,一烦就拖,一拖就是两个月。

AI 真正的价值在这里:它把「不想动手」变成「顺手就做」。这个价值比省下的几小时大得多。

我把 AI 编程工具当成了替代品,这是最大的错误里我写过那个实验——把开源项目的维护全丢给 AI,自己去干「重要的事」,结果两天都在收拾烂摊子。那次之后我改了用法:它不是替代我的,是替我去干那些会把我拖住的活。

02 分工

一句话概括:AI 负责「已知问题的未知解法」,我负责「未知问题的已知边界」。

具体拆开:

交给 AI我自己来
机械重复的接入改造决定改哪些文件、不改哪些
第一版骨架(脚本、配置、样板)判断骨架方向对不对
批量替换、批量重命名定义替换规则
写测试、写注释、写文档决定什么值得测
解释报错、给出候选修法判断哪个修法不会埋雷

这个表不是一开始就有的。是我说过别让 AI 写完整功能,这次我把整个迭代交给了它那次迭代之后,我回头看六小时花在哪,才列出来的。

03 拆需求

我的做法很土:一句话丢给 AI,让它还我一份清单。

那次博客迭代,我给的是「未来日期的文章不该上线」,它还了 9 条。其中两条我没想到:RSS 要过滤,搜索索引也要过滤。我只想到了列表页和详情页。

清单拿到手,我自己过一遍。删掉两条不需要的,补上一条它不可能知道的约束——构建必须在北京时间零点之后跑,因为所有发布时间都写在东八区。

这里有个前提容易被忽略:AI 拆需求不是替你思考,是帮你把漏掉的角度补上。前提是你自己得先想一遍,不然你连它漏了什么都看不出来。

04 喂上下文

这是整个流程里最烦、也最值钱的一步。

我每次会话开头会贴三样东西:项目结构说明、utils.ts 里现有工具函数的写法、内容集合的 schema。外加一份约定清单——函数要短、注释用中文、日期一律带时区。

前两样它看一眼就学会了。真正要喂的是约定。

我在这上面栽过跟头。第二个会话开始五分钟,它就把第一个会话定的「日期统一带时区」忘了,生成的代码又用裸日期。我贴回约定,它说明白,第三个会话又忘一次。

不是它笨,是它每次都是新的。这件事逼出我一个习惯:

任何约定,写进文件,不写进对话。写进对话的约定不算约定。

现在这些约定躺在项目说明文件里。AI 下次读得到,我下次也忘不掉。

MCP 协议,AI 终于有了一个能用的「USB 接口」里讲的其实是同一件事的工业化版本——上下文不该靠我手动贴,该有标准接口去接。

05 让它改代码

同样的需求,两种说法,两种结果。

第一次我说「接入所有列表页」,它改了 8 个页面,漏了 archive 和两个动态路由页。我没怪它,因为是我自己说得模糊。

第二次我换成:「13 个页面,逐个列出文件名,改一个勾一个。」全改完了。

给 AI 的指令里要有名词,不要只有形容词。 「所有列表页」是形容词,「archive.astro、tags/[tag].astro、series/[id].astro」是名词。这个差别值一次返工。

工具选择上,Claude Code 和 Codex CLI:两个终端 AI 编程工具,我最终留下了哪个里写过我的分配:长期维护的项目用 Claude Code,它有项目记忆;一次性脚本用 Codex CLI,用完即走。Trae 用了一个月,字节做的 AI IDE 到底行不行那篇补充了第三种场景——中文需求、快速搭原型,Trae 的 Builder 模式确实顺手。

具体怎么选,看AI 编程工具选型,别问哪个最好,问哪个最适合你的场景。核心就一句:按场景分配,不要按工具站队。

06 Review 是工序,不是可选项

那次迭代能跑之后,我又花了一晚上查隐患,查出两个。

第一个还是时区。filterPublished 里 Date.now() 是 UTC,如果 frontmatter 写的是 2026-08-28 这种裸日期,JS 按 UTC 零点解析,换到北京时间是早上八点。定时构建凌晨跑的时候,这篇文章还没到期,得晚一天才上线。

第二个在脚本里。它用字符串比较日期:[[ "$PUBDATE" > "$TODAY" ]]。格式永远统一时才安全,哪天少个前导零,判断就错了。我给 AI 加了一条硬规则:脚本里所有日期必须 date +"%Y-%m-%d" 输出,不许手写。

还查出一个 workflow 的细节:日志没变化时不产生 commit,Cloudflare Pages 就不会重建,文章照样上不了线。加了个 --allow-empty。

Review 时我看三类东西:时区、边界条件、它没改到的地方。 语法和风格它自己会,不用我操心。

07 测试与验证

个人项目我没有完整测试套件,靠三道关:

  1. 本地全量构建。不是 astro build 单独跑,是 npm run build,因为 CI 里的检查(比如断链检查)在这一步之后
  2. 手动点一遍受影响的页面
  3. 部署完再看一遍线上

第 1 条救过我好几次。本地惯用 npx astro build 会跳过 check-links,问题只在 CI 里暴露——那次两百多个断链报错就是这么来的,根因是中文路径没做 decode。

GitHub Actions 跑了半年,这些坑我替你踩过了里有更多这类「本地过了,CI 挂了」的记录。

08 部署

我的链路是 GitHub Actions 构建 + Cloudflare Pages 分发,没有后端。AI 在这段的价值是写 yaml 和排查失败原因——它读报错日志比我有耐心。

但有两个坑它反复踩:

  • 定时任务要考虑「没有变化就没有 commit」
  • 任何跟日期有关的东西,先确认时区再写代码

Docker Compose 管了 12 个服务,我是怎么没把自己累死的讲的是另一条线:服务多了之后,靠 AI 记配置不如靠文件记配置。同样的道理。

09 出问题怎么办

三步:

  1. 把完整报错贴给它,不要自己精简
  2. 让它先解释原因,再给修法——直接要修法,它经常给一个能跑但不对的
  3. 修完问一句:「这个改动会不会影响别的地方?」

第 2 步是我踩出来的。有一次脚本时区错了,我直接问怎么改,它给了个强制加 8 小时的方案,能跑,但埋了个雷。后来我追问「如果构建发生在北京时间 23 会怎样」,它自己算了一遍,承认错了,改成统一用 TZ=Asia/Shanghai。

让它先解释,是低成本的验证。

10 我坚决不交给 AI 的事

  • 架构决策。 它能给方案,不能替我选。选了要负责任的
  • 数据库迁移。 个人项目没有回滚的成本预算
  • 涉及钱的改动。 服务器付费配置、域名 DNS
  • 删数据。 任何 rm -rf 级别的命令我自己敲
  • 没想清楚的需求。 我自己都说不清,它更说不清
  • 最后一道 review。 这一步交出去,前面全白做

最后一条最重要。去年我说「别让 AI 写完整功能」,这句话今天依然成立。更准确的说法是:别让它一个人写完整功能。

全程参与、每段有人把关,性质完全不同。

这套流程花了多久

那次完整迭代:六小时,分三个晚上。AI 生成代码占一个半小时,剩下四个半小时是我在拆需求、喂上下文、review、排查时区。

对照手动估算七小时多。省了两三成,不多。

但账不能只算时间。分类合并 7 篇文章这种活,AI 十分钟干完,我 review 一眼就过;13 页接入这种活,换我自己会拖到周末,AI 做完当晚就上线了。

它改变的不是速度,是我的启动阈值。

这个系列的其他文章

按阅读顺序:

  1. AI 编程工具用了半年,我的结论是:别让它写完整功能——起点,为什么要这么小心
  2. AI 编程工具选型,别问哪个最好,问哪个最适合你的场景——怎么选工具
  3. Claude Code 和 Codex CLI:两个终端 AI 编程工具,我最终留下了哪个——工具怎么分配
  4. Trae 用了一个月,字节做的 AI IDE 到底行不行——一个具体工具的实测
  5. 我把 AI 编程工具当成了替代品,这是最大的错误——认知转折点
  6. 我说过别让 AI 写完整功能,这次我把整个迭代交给了它——完整项目实录

一年前我写的是工具评测,现在写的是工作流。评测会过期,工具会换代,这套流程不会——它本来就是从一次次翻车里长出来的。

继续阅读Continue Reading

关于本文About

评论Comments

留下你的想法

欢迎在下方评论区留下你的看法,一起把话题聊得更深。

COMMENTS