先贴一段东西。不用翻 Copilot Individual 的服务协议,核心就这一句:
User is solely responsible for the code...
你负责。它不管。供应商在合同里把自己摘得干干净净,出了事全是你的。这不叫霸王条款,这叫它自己也知道那玩意儿产出的东西不靠谱。
我反对的是这帮人把 AI 代码当空气用。拿过来,看一眼,嗯,看起来对,跑一下,过了,合进主干。然后就是那篇研究里说的:AI 生成的代码在 code review 阶段,审查者发现的问题更少。人潜意识里觉得“反正机器写的,大概没问题”,或者“这玩意儿我看也看不懂,跳过吧”。
这跟把第三方依赖直接合进主干有什么区别。你引入一个新库,好歹还会扫一眼 license,搜搜有没有已知漏洞。但 AI 生成的那段,直接就进去了。不需要过任何审计。
Copilot 有个重复检测过滤器,大概 65 个词素以上的建议,如果跟公开代码高度相似,会被抑制。听起来挺好。低于这个阈值的呢?照进不误。你拿了一段 GPL 代码,它没拦住,你合进去了,过了两年被人翻出来。你赔。
说句题外话。前两天我让模型帮我写个跳表的范围删除,它给了我四十多行,带回调注册、带可选并发锁、带个“如果传了 logger 就记日志”的分支。功能上没错,都能跑。问题是我根本没要这些。
我花二十分钟往回砍成这样:
int skiplab_delete_range(skiplist *sl, double min, double max);
一个函数,三个参数,干一件事。这跟责任归属有什么关系?关系大了。
AI 默认给“什么都覆盖”的方案,因为训练数据里多数长这样。它不知道你的上下文,不知道你不需要那些分支。它把所有可能性都保留下来——而保留所有可能性,就是最大的复杂度。你如果不往回砍,直接合进去,你背的不是一段逻辑的锅,是一堆你根本不需要、也看不懂的间接调用的锅。
我的规则很简单:凡是 AI 生成的代码,一律按第三方依赖的标准审。函数名对不对、边界条件有没有、这行到底干了什么,一个都不能少。比你自己写的要审得更狠。因为它“看起来对”的概率更高。
那玩意儿不是你的免死金牌。它是你的债务。
