
周一上午,后端小李要给后台补五个查询页:退款、发票、结算、对账、物流。他没从头写,把项目里那个四十行的「查订单」函数贴给 AI。跟着说了句:照这个样子再来四个。
三分钟,四份回来了。字段名、日期怎么比、状态码写 3 还是写「已支付」,跟原件一个样。小李扫了一遍就提交了,之后几个月谁要加查询,都照这个样子抄。
上周一运维找上来:跨月那天的订单漏了三百多单。病根在四十行里的一处判断——日期按字符串比大小,「9月8日」被判成比「10月1日」大。这个判断全项目一共十三处,他盯着它们看了半天:明明只错了一次。
为什么会这样
它不是读懂了你的代码,是照着你递过去的样子往下接。你给的样板带毛病,它就把毛病当标准,一份一份抄下去。
函数就是一段起了名字、能反复叫来干同一件事的代码。AI 看它的时候,没有「这样写对不对」这根弦,只有一句「接下来最像什么」。
你贴四十行,它学到的是这四十行的脾气:字段怎么取、日期怎么比、状态码用数字还是用字。四十行里三十六行是对的,四处是半年前那个人顺手写下的习惯。
它分不出哪句是要求、哪句是凑合,两样一起学走。就像复印:原件第三行有个错字,复印十三份就是十三个错字。
改原件一分钟,改复印件要跑十三趟。三个月里这个查询被复制十二次,加上原件十三个。四十行乘十三,五百二十行。
五百二十行里,真正不一样的只有查询条件那五六行。改一处判断,要在十三个地方找同一行字。
怎么解决
抄之前先搜一句——在项目里搜函数名里最特别的那个词,三十秒。有现成的就直接叫,没有才让它写。这一下能把十三处挡回一处。
第二次抄的时候把公共部分抽出来——四十行里真正会变的只有条件那几行,其余合成一份,条件做成参数。头一次动手半小时,之后每加一个查询省二十分钟,加到第二个就回本。
提交前加一道自动检查——同一段代码出现两次以上就标红,让人当场决定抽还是留。配一次两小时,往后每次提交都自动挡。最贵,但管得住下一个人。
别踩的三个坑——换个更贵的工具不会让人不抄,抄是人的动作,工具只负责照着学;把四十行原封不动搬进新文件、改个函数名,只是把问题挪了个地方;一次把十三处都抽掉容易改出新错,先抽最常改的那三处。

平台怎么管这些问题
代码库检索接住头一步。贴进去之前先搜一遍,同名同义的老函数当场露出来。重复块扫描接第二步,提交时把连续相同的十几行圈出来,十三处会在同一张清单上排开。
改动影响面接第三步,改一处判断,它把用到这处的页面全列出来。提交卡口接第四步,同类重复出现第三次必须写一句理由,不写不让合。变更单把散在各处的改动收成一张,验收按单核;上线后的错误汇总按页面归堆,漏单这类问题能看出是同一个病根。
改规则的是技术负责人。重复几次算超标写在卡口配置里,他签字才生效。批减免要值班负责人和小李的组长两个人点头,紧急修复可以先合,二十四小时内补齐记录。
倒查靠每处改动带的人名和时间,回退按变更单走,能看清这十三处是哪天、被谁抄出来的。线上漏单这类问题,告警发给当天的值班后端,重复三次没压住就升级到组长。
这笔钱值不值
假设一个后端月薪两万,二十二个工作日,一天九百零九元,一小时一百一十四元。
十三处各改一次,每处十五分钟,一百九十五分钟,折三百七十元。抽成一份公共函数只要改一处,十五分钟。省下的一百八十分钟,是三百四十二元。
抽公共函数头一次半小时,五十七元。改一回就省三百四十二元,头一次就回本。这类判断一年总要动两三次。
漏单那次多花的排查时间没算进去——两个人半天,九百多元。这半天本来可以不花。
行业规则怎么管这件事
MITRE 的 CWE 清单里有一条 CWE-1041,名字叫 Use of Redundant Code,直译是重复代码。这一条 2018 年 7 月 2 日由 MITRE 的 CWE 内容组提交,收在 CWE 3.2 版里。
原文定义很短:产品里有多个函数、方法、过程或宏,装着同一份代码。后果一栏写的是可维护性下降——两份一样的代码,改了一份,另一份容易被忘掉。
它给的做法也只有一句:把公共的部分并成一个函数,全项目都去调它。
小李那十三处,正好是这条规则描述的样子。他最后把日期判断抽成一个函数,十三处都改成调它,四十分钟改完。跨月那天的单子当天补了回来。
他现在贴代码之前,先花三十秒搜一遍。那四十行不是 AI 写坏的,是半年前一个人十分钟里定下的样子,后面十三个只是照着长。
Codex、Claude Code、Trae、Qoder 要用的模型 token,统一接入、统一计费。