首页/开发/系统分析与架构设计速查/大泥球(Big Ball of Mud)反模式
架构风格与模式58 条

大泥球(Big Ball of Mud)反模式

缺乏清晰架构的系统形态:边界模糊、依赖纠缠、补丁叠加,短期能运行但修改风险随规模上升;识别信号包括改动一处牵连多处、无人知晓完整调用关系。

什么是大泥球反模式

大泥球(Big Ball of Mud)由 Brian Foote 与 Joseph Yoder 在 1997 年提出,描述缺乏清晰架构的系统形态:边界模糊、依赖纠缠、补丁层层叠加,短期能跑但修改风险随规模上升。识别信号很直接——改一处牵连多处,没有人能说清完整的调用关系。

基本信息

成因持续赶工、缺少边界约束、评审缺失、人员流动
典型症状循环依赖、复制粘贴、全局变量、测试难以编写
危害变更风险与成本随规模非线性上升,故障定位困难
应对方向先加护栏与测试,再用绞杀者模式渐进改造,不做一次性大重构

典型使用场景

  • 遗留系统接手:先做依赖地图与热点分析,摸清真实结构
  • 改造立项:评估哪些模块相对独立可作为首批拆分试点
  • 护栏建设:加静态依赖检查与自动化测试,先阻止新增循环依赖
  • 故障排查:用调用链与依赖图定位改动牵连范围
  • 技术债治理:把结构债单独登记,按利息排序偿还
  • 外包交接:以依赖地图与接口清单作为交接基础

诊断与护栏(示意)

诊断与护栏(示意)
# 1) 生成依赖图,找出循环依赖与高扇入模块
madge --circular --extensions ts src/        # 循环依赖清单
depcruise --output-type dot src/ | dot -Tsvg > deps.svg   # 依赖可视化
# 2) 加护栏:把当前违规设为基线,只拦新增
#    (避免历史违规导致检查永远红灯,团队很快关闭检查)
# 3) 选试点:挑耦合最低、业务相对稳定的模块先划边界
# 4) 小步替换:用绞杀者把模块迁入新边界,每次替换后回归验证

改造路径与判定

阶段动作完成判定
护栏加测试与静态依赖检查,设定违规基线新增违规为零
试点选低耦合模块先明确接口边界接口稳定,替换后可回滚
替换用绞杀者逐块迁入新边界旧路径流量归零并清理
记录维护依赖地图与违规趋势违规数量持续下降
不要在泥球上直接做大范围重构:先加自动化测试与边界约束,再逐步替换,否则一次改动就可能引发连锁故障。
泥球往往是理性选择的结果而非懒惰:在交付压力下,打补丁的短期收益确实更高,所以治理要给团队可用的替代路径。

易错点

  • 以「能跑就行」持续打补丁,边界进一步瓦解,变更成本不断累积
  • 没有测试覆盖就大面积重构,风险不可控且无法回退
  • 护栏设置过严,历史违规让检查长期红灯,团队直接关闭检查
  • 只改结构不改约束,改造完成后新的耦合又迅速长回来

数据来源与参考

  • Brian Foote & Joseph Yoder《Big Ball of Mud》(PLoP, 1997)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌