代码里的隐性逻辑与冗余信息
现在写代码的人大概都有类似的体验:让 AI 生成一段补全,它给出的东西看起来头头是道,放进项目里一跑,不是缺了点什么,就是多了一堆没用的东西。差的这一口气,很多人归因于模型不够聪明,或者提示词没写好,但真正的根源往往藏在两个更底层的问题里——代码的隐性逻辑,和大模型生成结果里的冗余信息。
所谓隐性逻辑,指的是那些没有写进代码、却真实约束着代码的东西。比如某个字段为什么必须留着,是因为三年前一次线上事故留下的兜底;比如某段看起来可以合并的分支为什么没人敢动,是因为下游有个没写进文档的老系统还在按特定顺序读它;再比如“这里先这么写着,回头再改”里的“回头”,其实是团队心里都清楚、但谁也没落笔的某次大版本升级。这些信息散落在聊天记录、会议纪要和老兵的记忆里,代码本身一行都看不到。
大模型看不见这些。它的全部输入就是眼前的代码和用户给的提示词,训练数据里也没有你们公司那个祖传系统的任何痕迹。常见的开源项目和热门框架语料充足,生成质量自然高;一旦换到冷门的技术栈或者行业特有的老系统,数据稀疏,模型只能靠语义上的“猜”来凑合,猜出来的东西形式上像模像样,语义上早已经偏了。这不是提示词技巧能弥补的鸿沟——模型确实读到了代码,但读不到代码背后的那半句话。
冗余信息是另一重坑。大模型生成本质上是概率补全,为了“看起来对”,它常常顺手塞进一些多余的东西:不存在或者早已废弃的 API、为了防御一种永远不会发生的情况而写的嵌套判断、多包了一层的抽象,以及从训练数据里带出来的过时写法。这些内容单看每一行都“合理”,合在一起就把真正的信号稀释了。人要做的不再是写代码,而是逐行甄别哪几句是真有用、哪几句是模型为了补全概率制造的噪音——成本没有消失,只是从写转移到了筛。
所以真正高效的做法,不是在“AI 万能”和“AI 不行”之间站队,而是先把自己的隐性逻辑显式化:把口头约定写成文档,把历史包袱的来龙去脉写进注释,把边界条件整理成测试用例,再连同这些上下文一起喂给模型。上下文给得越完整,模型输出的冗余就越少,甄别成本也就越低。反过来,指望一句“帮我写个登录功能”就得到能直接上线的代码,得到的多半是一堆需要花更多时间清理的半成品。
模型还在一年几次地迭代,上下文窗口越来越长,检索工具也越来越成熟,隐性逻辑的鸿沟正在被一点点填平。但在完全填平之前,“把人和机器之间没说出口的那部分翻译出来”这件事,始终要由写代码的人来完成——这恰恰是工具再强也替代不掉的那部分工作。