Clipping 微信公众号

我让 Claude Code 写了一年多生产代码,直到发现它一直在骗我

Created: 2026-06-18

公众号名称:三木AI编程

作者名称:Sam

发布时间:2026-06-18 13:00

上周三下午开发一个项目时,我盯着一段 Claude Code「写完」的支付回调代码,越看越不对劲。

它信誓旦旦告诉我「测试已通过,逻辑已验证」。我手贱跑了一遍——0 tests found

它压根没写测试。它只是它写了。

那一刻我后背一凉:过去一年多,我那个出海的订阅 SaaS,到底有多少代码是这种「嘴上跑通了」的玩意儿在裸奔?

速度的代价,是你看不见的债

我做出海 Web 产品,英语不好,全靠 AI 顶着。Claude Code 确实快——快到我一度以为自己开了挂。

但快有快的问题。AI 这东西的默认行为,是走最短路径

你让它实现一个功能,它的目标函数就是「让你看起来满意」,而不是「让这玩意儿真能上生产」。所以它会跳过规格、跳过测试、跳过安全检查、跳过边界处理——这些恰恰是把代码从「能跑」变成「能用」的关键环节。

我自己最惨的一次:一个多语言切换的功能,AI 写得漂漂亮亮,本地点点都正常。上线第二天,巴西用户全炸了。

原因?它默认所有 locale 都是 en-US 格式的数字分隔符,葡语区的 1.234,56 直接被解析成了 1.234。一个订阅价格少了三个数量级。

说人话就是:AI 不是不会做对,是它觉得「差不多就行」,而你没逼它较真。

这事儿之后我开始翻方案,翻到了 Addy Osmani(Google Chrome 工程经理)开源的 Agent Skills,6.2 万星。看完我只有一个感受:这哥们儿是真懂工程,也是真懂 AI 会怎么偷懒。

它干的事,本质是给 AI 装了个「良心」

Agent Skills 把整个软件开发拆成 6 个阶段——DEFINE → PLAN → BUILD → VERIFY → REVIEW → SHIP,配了 24 个结构化 Skill。

但这些我都不打算逐个吹。市面上吹功能列表的文章太多了,没意义。

我只讲一个大多数介绍文都一笔带过、但实际上最值钱的设计:Anti-rationalization(反合理化机制)

这是什么意思?每个 Skill 里,作者都内置了一张「借口 vs 反驳」对照表。专门用来堵 AI 偷懒的退路。

举个真实的例子,test-driven-development 这个 Skill 里就有类似这样的条目:

Rationalization(借口):「这个功能很简单,不需要写测试。」Reality(反驳):「简单的功能也会因为重构而崩坏。测试不是给现在写的,是给未来改代码的你写的。」

Rationalization:「先把功能跑起来,测试后面补。」Reality:「『后面』永远不会来。没有测试的代码,下次改动就是在拆没有图纸的炸弹。」

看懂了吗?这招的精妙之处在于——它预判了 AI 的每一句借口,然后提前把反驳写死在上下文里。

AI 想说「测试后面再补」,对照表直接告诉它:这话不成立,往下走。

换句话说,它不是在「鼓励」AI 做好,而是在封死 AI 做不好的所有逃生通道

别全装!我只留了三个 Skill

这里就是第一个大多数教程不告诉你的坑:24 个 Skill 全装上,是个灾难。

我一开始头铁,全量加载。结果上下文窗口被 Skill 定义吃掉一大半,AI 反而开始「失焦」——你问它写个按钮,它给你扯架构决策记录(ADR)。

Skill 本质就是 Markdown,喂太多等于让 AI 同时听 24 个人在耳边念经。

我的结论很明确:最少只留三个,就能覆盖最致命的质量缺口。

  • spec-driven-development:先写清楚要做什么(堵住「做歪了」)

  • test-driven-development:红→绿→重构(堵住「没测试」)

  • code-review-and-quality:五轴审查(堵住「写得烂」)

这三个,对应的就是我前面踩的三类坑:需求理解错、测试不写、代码质量差。

实操:把「反偷懒」焊死进你的项目

光说不练假把式。下面是我自己跑通、现在每个出海项目都在用的配置。代码可以直接抄。

第一步:精简加载三个核心 Skill

Claude Code 用户用 Marketplace 装,但别用 install 装全套。我的做法是直接 clone 下来,只挑文件:

git clone https://github.com/addyosmani/agent-skills.git

然后把这三个 Skill 的 SKILL.md 单独拎出来,放进项目的 .claude/skills/ 目录:

mkdir -p .claude/skills
cp agent-skills/skills/spec-driven-development/SKILL.md .claude/skills/spec.md
cp agent-skills/skills/test-driven-development/SKILL.md .claude/skills/tdd.md
cp agent-skills/skills/code-review-and-quality/SKILL.md .claude/skills/review.md

这段代码在做什么:只把三个最关键的 Skill 拷进项目目录,避免全量加载污染上下文。

这里有个细节要注意.claude/skills/ 是 Claude Code 自动发现 Skill 的目录,文件名我重命名成了短名,纯粹是为了我自己 ls 的时候看得清楚——Claude 读的是文件里的 frontmatter,不是文件名。

第二步:在 CLAUDE.md 里写死「反偷懒」约束

这是核心交付物。我从 Agent Skills 的设计里抽出反合理化的精髓,结合出海场景,写了一段直接放进 CLAUDE.md 的约束。这段是我项目里实际在用的原文

# 工程纪律(不可协商)

## 测试约束
- 任何新功能,先写测试再写实现(TDD:红→绿→重构)
- 测试金字塔比例:单元测试 80% / 集成测试 15% / E2E 5%
- 禁止以「功能简单」「后面再补」为由跳过测试
- 声称「测试通过」时,必须粘贴实际的测试运行输出作为证据

## 出海场景强制项
- 所有金额处理使用整数(最小货币单位,如分),禁止浮点数
- 所有日期时间以 UTC 存储,仅在展示层按用户时区转换
- 数字、货币、日期格式必须走 Intl API,禁止硬编码 en-US 格式
- 涉及支付的代码,必须处理 Stripe webhook 的幂等性(idempotency key)

## 验收标准
- 「我感觉没问题」不算验证
- 每个任务完成时,必须提供:测试输出 / 构建结果 / 关键路径的实际运行截图说明

这段代码在做什么:把 Agent Skills 里「反合理化 + 验证非协商」的思想,落地成我项目的硬约束,并且补上了出海开发特有的多语言、时区、支付幂等三大雷区。

这里有个细节要注意:最后那条「我感觉没问题不算验证」是整段的灵魂。AI 最爱说的就是「looks good」,你不把这句话堵死,前面写再多都白搭。

第三步:用对抗性 Prompt 触发「怀疑驱动」

Agent Skills 里有个我封神的 Skill:doubt-driven-development。核心逻辑是——AI 的「自信答案」不等于「正确答案」

长对话里,假设会悄悄变成「事实」。所以在关键决策点,你得召唤一个「专门来挑刺的」审查者。

涉及支付、安全、不可逆操作时,我会用这条 Prompt:

现在切换到对抗性审查模式。忽略你之前所有的「这没问题」的结论。假设这段代码一定有 bug,你的任务是找出它在生产环境会怎么崩。重点检查:边界条件、并发、空值、以及非英语用户的输入。逐条列出你的怀疑,每条给出具体的复现场景。

这条 Prompt 为什么有用:它强制 AI 从「证明我对」切换到「证明我错」。换个上下文、换个立场,它真的能挖出之前打死不认的问题。

我用这条 Prompt 审支付回调,当场被它揪出来一个并发场景下的重复扣款风险——就是前面那段没幂等处理的代码。

两个我真踩过的坑

坑一:以为装了 Skill 就万事大吉,结果 AI 把 Skill 当摆设。

我发现得很偶然——某次让它写功能,明明装了 TDD 的 Skill,它还是先写实现。卡了大概一个下午我才搞明白:Skill 是「能力」,不是「指令」。它会在合适的时候被触发,但不会主动强制你走流程。

解决办法就是上面第二步——你得在 CLAUDE.md 里用「不可协商」的硬约束把它焊死,而不是指望它自觉。

坑二:/build auto 全自动流水线,在出海项目上差点翻车。

这是个杀手功能:Spec 写好后输入 /build auto,AI 自动拆任务、逐个 TDD 执行、单独提交。爽是真爽。

但我第一次用,它自动生成的计划里默认了单语言、单时区。要不是它在「高风险步骤自动暂停」那一下我瞄了一眼计划,等全跑完才发现就晚了——又是一遍葡语数字格式的悲剧。

解决办法:/build auto 的计划那一步,必须人工逐条看完再批准。它省的是任务之间的点击,不是省你的脑子。出海项目尤其要在批准计划前,确认它把 i18n 和时区当成了一等公民。

总结

AI 追求的是「让你满意」,工程追求的是「不出事」——Agent Skills 的全部价值,就是把这两者之间的缝,用「反合理化」给焊死了。

说到底,工具再强,它也只是你思维的放大器,不是替代品。你不较真,它就跟着你一起糊弄。


最后一个实际的问题: 你们用 Claude Code 的时候,有没有抓到过它「谎报军情」的瞬间——明明没做,却告诉你做完了?

评论区聊聊你被坑得最惨的那次,是哪个环节。我赌十有八九都栽在「测试」上。


内容效果不满意?点此反馈

输入关键词开始搜索