AI写代码不会堆屎山,但会堆成群山

作者:宇宙中心我曹县2026.11.06 20:55浏览量:0

简介:AI生成的代码往往低耦合、少复用、随时重构,因此不易形成传统“屎山”;但它会快速膨胀为规模庞大的“群山”,最终受限于上下文窗口,变成人类难维护、AI也读不完的工程。本文剖析这一现象背后的机制,并给出架构治理与规模控制的实践建议。

AI 写代码不会堆出“屎山”,但它会堆出一片“群山”

关于 AI 生成代码,业界流传着一个颇为形象的担忧:让 AI 写代码,是不是迟早会把整个项目堆成一座无人敢碰的“屎山”?

这个直觉看似合理,但结论恰恰相反。AI 的编码风格决定了它很少制造传统意义上的屎山——然而它会带来另一种更隐蔽的工程风险:代码规模的无节制膨胀。理解这两种失败模式的差异,比简单地对 AI 编程下判断更有价值。

一、屎山是怎么被人类堆出来的

要判断 AI 会不会堆屎山,先要搞清楚屎山的成因。屎山很少是某一次糟糕设计的结果,它更像是一种长期演化的产物,核心驱动力是人类对“省事”的追求与心智带宽的有限性。

典型的形成路径是这样的:

  1. 逻辑耦合求方便。新需求来了,最省力的做法不是抽象出新的模块,而是往已有的流程里再塞一段判断。于是 if 套 if,循环里嵌循环,一个函数承担了五件事。
  2. 复制粘贴求速度。需要一段相似逻辑时,复制一份改改参数是最快的。但复制的代价是隐性的:此后每次修改都要记得同步多处,改漏一处就是 bug。
  3. 重构成本高到不敢动。当耦合积累到一定程度,任何重构都意味着巨大的回归测试成本和心理负担。于是所有人都选择“只加不改”,屎山继续长高。
  4. 最终失去可维护性。某一天要加新需求时,开发者发现这坨代码已经完全无法理解,只能另起炉灶,留下旧代码继续腐烂。

可以看到,屎山的本质不是“代码多”,而是逻辑纠缠 + 修改影响面不可控。一个函数改动会牵动十几处隐藏依赖,这才是维护者的噩梦。

二、AI 的编码风格为何天然抗屎山

AI 写代码时,恰好在这几个成因上表现出与人类相反的行为倾向。

2.1 它不心疼重构

人类不愿重构,是因为重构要付出精力且风险自担。AI 在修改代码时,如果发现某段逻辑结构不顺眼,顺手就会重写一遍——对它而言,重写和微调的成本差异远没有对人类那么大。这种“看不顺眼就重构”的倾向,天然抑制了耦合的积累。

2.2 它没有复用代码的动机

这一点常被误解为缺点,实际上是 AI 代码低耦合的关键来源。人类开发者倾向于复用,是因为“改一处要改多处”是真实的心智负担。而 AI 面对同样的任务,可以直接复制一份逻辑、另写一个几乎一样的函数,因为它可以自动搜索所有相关位置并批量修改——改一处和改二十处对它没有本质区别。

于是结果就是:AI 缺乏复用动力,从而主动制造低耦合。每个函数只服务一处逻辑,改一处代码只影响一处行为,修改影响面被牢牢限制在局部。

2.3 低耦合意味着抗腐烂

一个不在乎重构、不追求复用、主动保持低耦合的编码者,确实很难堆出传统屎山。因为屎山的核心特征——修改影响面不可控——在这种风格下几乎不成立。

用一段示意代码对比会更直观。人类容易写成这样:

  1. def handle_order(order, user, is_vip, channel):
  2. # 下单、计价、优惠、库存、通知全塞在一起
  3. if channel == "app":
  4. if is_vip:
  5. price = order.base * 0.9
  6. else:
  7. price = order.base
  8. # ... 后续几十行继续嵌套

而 AI 更倾向于拆成彼此独立的函数,甚至为不同渠道各写一份:

  1. def calc_price_app_vip(order):
  2. return order.base * 0.9
  3. def calc_price_app_normal(order):
  4. return order.base
  5. def calc_price_web_vip(order):
  6. return order.base * 0.85

后者看起来“重复”,但每个函数职责单一、边界清晰,修改一个渠道的计价规则不会波及其他渠道。

三、真正的风险:不是屎山,而是群山

如果故事到此结束,结论就是“AI 代码质量更好”。但问题在于,低耦合 + 不复用会带来另一个后果:代码总量快速膨胀。

不复用意味着同样的逻辑以近乎复制的方式散布在数十个函数里;随手重构意味着结构不断被重写而非收敛。项目规模会以一种人类开发者难以想象的速度增长,最终形成一片“群山”——每座山头都不烂,但山头太多。

这会带来两个层面的维护难题:

3.1 人类维护者:阅读成本爆炸

屎山难在“看不懂一处”,群山难在“要看的地方太多”。即使每段代码都清晰可读,当同类逻辑分散在几十处时,人类要建立全局理解仍然极其吃力。代码审查、故障定位、影响面评估的工作量都随规模线性甚至超线性上升。

3.2 AI 维护者:上下文窗口的硬约束

对 AI 来说,单点理解不成问题,但它的上下文长度是有限的。当代码规模超过模型一次能容纳的 token 上限时,就会出现“读了后边忘了前边”的情况。此时 AI 对项目的整体把握能力急剧下降,修改代码时可能引入与远处逻辑冲突的改动。

这就形成了一个颇具讽刺意味的结局:项目最终不是死于代码腐烂,而是死于上下文爆掉。代码量大到人类读不完、AI 也读不全,维护成本同时压倒两类维护者。

四、如何治理“群山”而非“屎山”

既然风险类型变了,治理思路也要相应调整。核心不是“防止耦合”,而是控制规模与维持结构可导航性。

  • 引入架构约束。低耦合不等于无结构。需要架构师或高级开发者定义清晰的分层、模块边界和接口契约,让膨胀的代码仍然落在可预期的位置上,而不是随机蔓延。
  • 主动做抽象收敛。AI 没有复用动力,但人类可以在评审阶段识别高频重复模式,将其提炼为公共能力,把“群山”中的同质山头合并。这一步不能指望 AI 自发完成。
  • 控制单文件与单模块体量。为文件长度、函数数量、模块职责设定软性上限,避免规模在无人察觉时失控。
  • 建立面向 AI 的代码索引与摘要层。通过模块级文档、接口说明、依赖图等元信息,降低 AI 理解项目所需的上下文开销,缓解上下文窗口压力。
  • 分治与拆分。当一个项目大到单次上下文无法覆盖时,按领域拆分为多个可独立维护的子项目,让每次修改只需要加载相关局部。
  • 把规模指标纳入工程度量。将代码总量、重复率、模块耦合度、平均文件长度等纳入持续观察,及早发现膨胀趋势。

五、结论

AI 写代码确实不太会产生传统意义上的屎山。它的低耦合、强重构、弱复用风格,从机制上抑制了“修改影响面不可控”这一屎山核心特征。

但这不等于 AI 代码好维护。它带来的是另一种失败模式:代码规模无序膨胀形成的“群山”,让人类因阅读量过大而难以维护,让 AI 因上下文有限而难以全局把握。屎山是人类的专利,群山是 AI 的副产品。

真正决定项目命运的,不是写代码的是人还是 AI,而是有没有人在规模失控之前,把架构约束、抽象收敛和上下文治理做到位。工具改变了失败的形式,但没有取消工程判断的必要性。