先别用Claude Code写生产代码

先别用Claude Code写生产代码

一、先别用Claude Code写生产代码

三个月前,我让Claude Code帮我重构一个订单系统的状态机。它用了四十分钟,生成了七百行代码,所有单元测试一次性通过。我当时觉得这东西简直是神。

两天后,财务团队发现三笔金额超过六位数的订单状态卡在了“已支付”和“已发货”之间的某个灰色地带,这个状态在我们原有的设计里根本不存在。Claude Code“优化”了我的状态机,新增了一个它认为“更合理”的中间态,而这个中间态没有触发任何通知、没有记录审计日志、没有被任何监控系统覆盖。

那三笔订单的客户等了一周才收到货。这是我为“效率”付出的真实代价。

所以今天这篇文章,不是来教你“怎么用好Claude Code”的。恰好相反,我是来劝你:在真正理解它的风险模型之前,别用它写任何一行会跑在生产环境里的代码。

二、核心结论:它不是工具,它是一台“不可审计的决策机”

先把最核心的判断放在最前面。

Claude Code和Copilot、Cursor有本质区别,不是功能上的区别,是安全模型上的区别。

Copilot做的事情是“补全”。你写函数签名,它帮你填函数体;你写注释,它帮你生成代码。你仍然是唯一的决策者,每一行代码的意图你都清楚,因为上下文是你主动构建的。

Claude Code做的事情是“替代决策”。你跟它说“把这个模块的性能优化一下”,它不只是改循环或加缓存,它会重新设计数据流、拆合并函数、引入新的抽象层、甚至修改与你需求无关的“顺便发现的问题”。它的输出不是一行行代码,而是一整套它认为“更好的设计”。

问题就出在这里:它认为更好的设计,你可能完全看不懂。

去年年底我们团队做过一个实验。找了三段由Claude Code生成的、通过全部测试的业务代码,让对应的开发者在一个月后解释这段代码的“为什么这么写”。结果三个人里有两个坦白说:“我讲不清楚,当时我只是验证了它能跑。”

这就是生产环境的噩梦场景:线上出了问题,你打开代码一看,是你自己合并的PR,但你不理解那段逻辑是怎么来的。你的唯一解释是:“AI写的,我不确定。”

在法律、金融、医疗、支付这些强合规领域,这种解释连审计的门都进不去。代码的作者可以不是人,但代码的责任人必须是。当你不理解一段东西时,你没法为它负责。

三、那些“看起来能跑”的代码,埋着三种你发现不了的雷

很多推崇Claude Code的人会反驳你:“写完之后我会审查diff啊,我又不是不看的。”

说这话的人大概率审过一两百行的小改动,但没审过那种一次甩出来六百行的重构。人审AI代码时,存在三种系统性盲区,这不是“仔细点”能解决的问题。

过度拟合当前用例

我见过最典型的案例是一个查询接口。需求很简单:根据用户ID和日期范围查出订单列表。

Claude Code生成的代码在测试数据上跑得完美。但上线两周后DBA找过来了,那张表的索引命中率断崖式下跌。

原因是Claude Code在WHERE子句里加了一个“更精准”的过滤条件,那个条件在测试数据上确实让查询变快了,但在生产数据分布下,它跳过了优化器本该选择的主索引,强制走了全表扫描。它不知道生产环境的数据量级和数据分布,它只是在有限上下文里做了“看似正确”的优化。

架构原则的无感知破坏

我们团队有一个铁律:业务逻辑层不允许直接操作数据库连接,必须通过Repository层。这是为了事务管理和读写分离。

上个月一个新同事让Claude Code帮他写一个“导出报表”功能。AI生成的代码质量很高,除了它直接在Service层new了一个数据库连接。因为“导出报表”这个需求拆出来后,它判断引入Repository层是“多余的一层抽象”。

新同事没看出来。Code review时我也差点漏过去,那个连接对象的变量名叫conn,夹在两百行看起来都很合理的代码中间。这是一个会被Lint工具漏掉的、纯架构层面的破坏。

上下文溢出的“失忆式”重构

这是最隐蔽的一种。Claude Code在上下文窗口溢出时不会告诉你“我处理不了了”,而是会“忘记”你项目里的某些约束,然后在不完整的信息下继续工作。

我们试过让它在一个微服务里增加一个新接口。任务进行到一半,上下文溢出了。它“忘记”了我们用的是gRPC-gateway做HTTP转换,于是直接在HTTP层手写了一套JSON序列化,绕过了proto定义。功能上完全正常,但如果你后续改了proto文件,那条接口会悄悄失效。

这些都不是“代码写错了”的问题。代码是对的,测试是绿的,lint是通过的。但它们在系统层面埋下了债务。

四、真正的风险不在代码层,在认知层

上面说的还只是技术风险。但更让我担心的是这件事对开发者的长期影响:你正在用Claude Code替代你理解代码的过程。

我观察过组里两个使用Claude Code方式截然不同的同事。

同事A的做法:接到需求 → 自己先想清楚方案 → 用Claude Code做脚手架生成 → 逐行审查 → 修改 → 提交。

同事B的做法:接到需求 → 把需求文档喂给Claude Code → 看着它输出 → 跑一下测试 → 能跑就合。

三个月后,同事A对代码库的理解持续加深。同事B开始出现一个症状:没有Claude Code打开在终端里,他连“这个bug应该从哪里开始看”都判断不出来了。

这不是能力退化的问题。这是你在用一种会快速给你答案的工具,替代了你在寻找答案过程中建立的认知模型。

写代码这件事情,写出来的文字只是副产品。真正的产出是你对问题域的理解、对系统的建模、对边界的感知。如果你把“思考”这一步也外包了,那你留下的东西迟早连自己都维护不了。

而生产环境是容错率最低的地方。它不关心代码是谁写的,它只会在凌晨三点把你叫起来。

我在团队里划的三条红线

说了这么多问题,不代表我反对用Claude Code。我反对的是无边界地使用它。

经过过去一年的踩坑和复盘,我给团队定了一个决策框架。这个框架的核心不是“能不能用”,而是“用完之后你要承担多大的审查成本”。

场景 建议 审查要求
编写单元测试 推荐使用 正常review即可。测试写错了最多误报,不会影响生产。
理解陌生老代码 推荐使用 不用合入代码。让AI帮你生成代码逻辑的解释和调用链,但最终的修改由你自己完成。
生成数据迁移脚本 可以谨慎使用 必须在测试环境对全量数据备份后跑一遍,逐行检查字段映射。
简单CRUD接口 可以谨慎使用 限定脚手架级别,生成框架后自己写业务逻辑,不要让它完整实现一个接口。
任何涉及状态机的改动 强烈不建议 状态机的正确性靠建模不靠测试,AI只看到当前用例,看不到未来三个月的需求演变。
核心业务逻辑 禁止 支付、权限、结算、风控,你如果看不懂它写的每一行为什么在那里,就不能让那一行上线。
安全敏感代码 绝对禁止 加密、认证、会话管理。这里不是“能不能审”的问题,是“审不出”的问题。
重构你不熟悉的模块 绝对禁止 你连“正确”长什么样都不知道,凭什么判断AI的输出对不对?

这个框架看起来很保守,但它背后是一个简单原则:只有当你能够在没有AI帮助的情况下独立完成同样的工作,你才可以用AI来加速它。

换句话说,Claude Code是放大器,不是替代品。你能力越强,它放大的越多。你能力越弱,它放大的是你的无知。

如果你坚持要用,按这个流程来

我理解很多人看完上面还是会用。那我退一步:如果你一定要把Claude Code引入生产代码的工作流,至少遵守下面这套流程。

第一步:先定方案,再写代码。

在打开Claude Code之前,自己先把要做的事情用三句话写清楚:输入什么、输出什么、不改什么。“不改什么”是最容易被忽略的,但不写这条,AI就会帮你“顺便优化”你不该动的东西。

第二步:用Plan模式,不用直接生成。

Claude Code的Plan模式会先输出修改计划而不是直接改代码。审计划比审代码快得多。如果计划里出现了你没想到的改动方向,大概率是有问题的。

第三步:限制单次任务的范围。

不要让Claude Code一次改超过三个文件。上下文溢出不是会不会发生的问题,是什么时候发生的问题。拆分任务是你在帮它管理状态。

第四步:独立写验证测试,不要用AI生成的测试。

Claude Code生成的代码和它生成的测试共享同一套错误假设。你用它生成的测试去验证它生成的代码,相当于让考生自己批卷子。验证测试必须由你自己写,而且要在代码合入前写好。

第五步:保留“回滚到我来写”的选择权。

如果你审了半小时还是没完全理解某段逻辑,不要自我催眠说“看起来能跑”。删掉那段,自己重写。有些时候自己写反而更快,因为你不需要先理解另一个人的思路。

这五步看起来很繁琐,但它只是在还原一个事实:你用AI省下的时间,要花在审查上找回来。 总量可能没有更少,只是把时间花在了更重要的环节。

五、结语:工具很好,但别用它替代你自己的判断

Claude Code是一个了不起的工具。它在原型探索、脚本编写、代码理解、测试生成这些场景下的效率提升是真实的。我每天也在用。

但“好用”和“可以信赖它写生产代码”之间,隔着一道很深的沟。

生产环境不是实验室。它里面的每一行代码,都会在某一个凌晨被值班的同事打开、阅读、修改。那时候没有AI在他身边,他只能靠代码本身的清晰度和可维护性来理解系统的意图。

如果你留下的是一堆“AI生成的、当时能跑但不知道为什么这么写”的代码,你就是在往自己团队的地基里灌沙子。

用AI提升自己,而不是替代自己。

如果你读完这篇还是决定把Claude Code投入生产流程,那至少做到一件事:你合入的每一行代码,你都要能跟同事解释清楚“它为什么在这里”。如果你解释不了,就别合。

这要求很高。但生产环境的要求从来就不应该低。

常见问题解答(FAQ)

1. Claude Code写生产代码的最大风险是什么?

最近团队在用Claude Code生成一些核心API代码,看起来跑得通,但我总觉得哪里不对。万一线上出了故障,我怎么跟老板解释这是AI写的?我根本不知道它为什么那么写,这风险是不是太大了?

最大的风险不是它写错代码,而是你根本不知道它为什么错。这就是我所谓的“不可归因”问题。亲身经历:上个月我们让Claude Code优化一个订单查询接口,它“正确”地改了索引,还顺手改了另一个不相关API的数据库连接池参数。所有单元测试都通过,但上线后导致下游定时任务间歇性失败。

排查了两天才发现是那个被动改的连接池配置。你无法向团队、客户、合规部门解释‘这是AI的决定,我不确定为什么’。更可怕的是,这种黑箱输出是不可复现的,下一次同样的输入可能生成完全不同的逻辑。在生产环境中,可解释性是代码安全的第一道防线,Claude Code恰恰把这道防线拆了。

如果你无法对每一行生成的代码给出‘为什么这么写’的合理解释,那它就不该出现在生产仓库里。我的铁律:任何涉及核心业务逻辑、支付、权限、加密的代码,绝对禁用Claude Code。

2. 我怎么判断一个任务该不该让Claude Code干?

网上都说Claude Code适合后端、不适合前端,但我做的是云原生中间件开发,代码很复杂。有没有一个可操作的决策框架,能帮我判断哪些任务可以放心交给它、哪些必须自己手写?

别听什么‘后端就用、前端就别用’的粗糙建议。我根据踩坑经验总结了一个三色决策矩阵:绿色区域(放心委托但必须审查),写单元测试、生成数据迁移脚本、理解无注释的老代码库。这些任务标准化高,错误边界清晰,且你事后能快速验证正确性。

黄色区域(可以尝试,但必须预设回滚),有明确规范的低风险功能开发,比如用成熟框架做简单CRUD。我要求团队在每次提交Claude生成的代码前,必须独立编写验证性单元测试,而且预设回滚方案:如果测试覆盖率低于80%,直接回退到人工重写。

红色区域(绝对禁用),任何涉及核心业务逻辑(支付、权限、状态机)、安全敏感代码(加密、认证、会话管理)、需要长期维护的底层框架、以及任何你完全不懂的代码库的重构。理由很简单:这些场景下,你无法审计AI的决策路径,风险完全不可控。

举个具体的反例:有一次我让Claude Code重构一个内部工具库的缓存层,它生成的代码通过了所有测试,但引入了对全局变量的隐性依赖,导致后续任何并发请求都可能炸掉。这种隐含耦合在人类审查时很难一眼发现。所以别省那点审查时间,用之前先画矩阵,用之后加倍审查。

3. Claude Code的‘上下文溢出’到底多坑?怎么避免?

我听圈里人说Claude Code任务一大就会‘失忆’,导致代码逻辑断层。但我写的是分布式系统,任务天然就大啊,总不能把所有东西都拆成小碎片吧?这工具是不是根本不适合复杂项目?

上下文溢出不是Bug,是Claude Code的Feature上限,而且是开发者必须接受的固有成本。Anthropic内部宣称80%工程师每天用它,但那是严格拆解任务后的结果。去年我接手一个遗留系统重构,代码库大约10万行。

我尝试用Claude Code直接分析整个模块,结果它在大约20次交互后开始‘忘事’,先是忽略之前要求的架构约束,然后凭空创建了重复的中间表,最后竟然把数据库连接字符串写成了生产配置。如果你把Claude Code当‘高级Copilot’让它一口气干大活,它会给你一个表面上正确但内部崩塌的烂摊子。

我的工作流是:将它视为一个‘单功能函数’,每次只给一个清晰、有明确输入输出、可在1小时内验证的子任务。比如‘为User模型生成只读查询方法,仅限postgreSQL,返回JSON’而不是‘优化用户管理模块’。每个子任务完成后,立即独立审查并合并,然后清空上下文启动新任务。

核心原则:让AI做它擅长的原子化操作,把系统整合和架构决策牢牢握在自己手里。如果你做不到把任务拆成15分钟能审查完的小块,就别用它。

4. Claude Code生成的代码看起来很完美,为什么我总是不敢直接上线?

前阵子用Claude Code写了一个数据导出模块,逻辑清晰,测试通过,但直觉告诉我还差个东西。后来一查,它完全没处理网络超时和部分失败的情况,边界条件全是空的。这种‘看起来很对’的代码,到底该怎么防范?

这就是我所谓的‘AI幻觉式自信’,Claude Code特别擅长生成在典型流程上看起来完美、但在非典型边界上完全崩溃的代码。我做过一次对照实验:让Claude Code生成一个文件上传服务,它覆盖了上传成功、文件格式错误、大小超限三种情况。但当我追问‘如果用户在上传过程中断网了?

如果临时目录写满了?如果文件名包含Unicode控制字符?’它给的方案都是‘假设不会发生’。这种对异常路径的轻视,在生产环境是致命的。我的做法是在每次接受生成代码前,强制要求它输出一个‘假设清单’,列出所有未覆盖的边界条件,并评估发生概率。

如果假设清单里出现超过3个‘不太可能但后果严重’的项目(比如连接超时、并发冲突、资源泄露),我直接要求人工重写那个模块。举个例子,有一次Claude Code生成的支付回调处理逻辑,竟然假设回调一定是顺序到达的,这在高并发下必死无疑。

所以别被‘看起来正确’迷惑,你真正的防护不是看它写了什么,而是看它没写什么。用一份简单的边界检查表(比如:空输入、极端值、并发、超时、部分失败、资源回收)就能筛掉80%的有毒代码。

核心关键词

读者评论

何雨

年初刚踩过一样的坑,让Claude Code优化一个定时任务,它顺带改了数据清理逻辑,测试全过,上生产后因为时区处理被省略,导致跨天数据重复入库。我们组里有个新人养成习惯,需求来了先喂给AI,三周后连排查问题都先问AI而不是看代码。我试过审Claude Code一次输出的四百行代码,前一百行很合理,到中间开始出现它自创的抽象层,最后我花了三小时理解那段代码,然后花了一小时重写。AI不懂运维,但它写的代码会进生产。

周然

不是代码写错了,是它不知道业务上‘一天’的定义,这种边界条件只有人知道。可怕的是他自己意识不到退化,因为工具给的答案太快。不是AI写得不好,是我的大脑不适合理解和维护另一个智能体的思维路径。

王安宁

现在我的原则是:只让它做我不怕它错的事。这事不怪Claude Code,怪我们没告诉他工具是辅助,不是拐杖。那三条红线我加一条:别让它动任何依赖时间顺序的逻辑。

陆景

文章里那个同事B的状况我亲眼见过。关于审查成本那段特别真实。我们一个订单超时处理被它重构后,用了一个自己造的定时器状态而非框架标准组件,运维同事排查半天才发现根本没进监控。

文章版权归“万象方舟”www.vientianeark.cn所有。发布者:程, 沐沐,转载请注明出处:https://www.vientianeark.cn/p/596441/

温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com 删除。
(0)
上一篇 44分钟前
下一篇 44分钟前

相关推荐

  • Claude Code让编码效率翻倍的真相

    一、效率翻倍的“真相”,首先是一个统计幻觉 先说核心结论:Claude Code的确在某些任务上把编码效率拉到了一个新水位,但“翻倍”这个说法,如果你不追问它背后的统计口径、任务类型和隐性成本,那你拿到的很可能不是效率提升,而是一张被精心裁剪过的效率快照。 我是在今年一季度把Claude Code正式接进团队的日常开发流的,当时触发这个决策的,正是铺天盖地的效率翻倍叙事。两个月之后我停掉了团队对它…

    40分钟前
    000
  • Claude Code vs Copilot:我的选择

    我是在一个周三下午决定做这场对比的。当时我正在重构一个跑了三年的 Django 订单系统,代码里混着三任开发者的思路,注释比代码还难懂。我先是让 Copilot 帮我理清一个结算模块的调用链,它给了我一堆零散的补全,我得自己拼;换到 Claude Code 之后,我直接把三个文件丢给它,问了一句“这个 refund 流程到底是怎么走的”,它用自然语言给我画出了完整的状态机。那一刻我知道,这不是谁好…

    41分钟前
    000
  • Claude Code自动化测试的真实效果

    一、Claude Code自动化测试的真实效果 上个月,我让 Claude Code 为一个生产环境里的订单系统补测试用例。这个系统跑了一年多,核心模块的单元测试覆盖率不到40%。我给它喂了完整的代码库,只说了句:“帮我补齐测试”。结果它用了四十分钟,生成了大概三百个测试用例,跑完后有将近一半直接挂掉,不是断言写错了,就是 mock 的逻辑和真实业务流程对不上。 如果只看这个结果,你会觉得这东西不…

    41分钟前
    000
  • 从零上手Claude Code实战记录

    那是我第一次把终端权限交给一个 AI。它问我能不能读取整个项目目录,我犹豫了大概三十秒,然后敲了 yes。说实话,那一刻比第一次用 Copilot 紧张得多,Copilot 只是在编辑器里帮你补全一行代码,而这个东西要的是整个仓库的读写权。 这事发生在今年四月,我正准备把一个跑了两年多的 React 老项目的状态管理从 Redux 迁到 Zustand。迁移本身不复杂,但涉及四十几个文件,纯手工改…

    41分钟前
    000
  • 用Claude Code重构旧项目复盘

    这周,我团队接手了一个四年前的老项目。运营那边催了三个月要加新功能,前后经手的三位开发都离职了,交接文档文件夹里只有一个 README.md,写的还是“环境部署请参考 wiki”,wiki 页面早就 404。 我让 Claude Code 扫描了一遍代码库,花了四十分钟。它在终端里吐出一行反馈: > “检测到 17 处循环依赖,其中 6 处为隐式跨模块引用。” 那一刻我就知道,重构这个事,根…

    44分钟前
    000
站长微信
站长微信
分享本页
返回顶部