Change it, like it or leave it
读完前十二篇文章,也许会期待 Big Ball of Mud 最终能够被归结为一个简单原因。
也许是糟糕的架构,也许是缺少 Refactoring、缺少技术领导、长期时间压力、Legacy、管理决策,或者开发者在多年中不断加入过多例外。
如果原因能够被找到,那么看起来也应该能够推出一个明确的解决方案。
但这正是这组文章没有得到的结论。
我们越深入观察 Big Ball of Mud,就越能看到一些表面上的矛盾:一个系统可以在技术上问题重重,同时在运营上非常稳定;专家可以一边解决极其困难的问题,一边让组织对个人知识的依赖进一步加深;组织可以明显承受糟糕架构带来的代价,却依然完全理性地决定暂时不做根本性改造;同一个工作环境,对不同的人来说可以是有趣的挑战、可以接受的现实,也可以成为几乎无法长期承受的冲突。
只有当我们试图把 Big Ball of Mud 纯粹解释成代码问题时,这些现象才显得矛盾。
Big Ball of Mud 充满了看似矛盾的现象,而这些矛盾往往只在把它纯粹当作代码问题时才显得矛盾。
因此,在对 Big Ball of Mud 的定义中,我们首先划清了一个重要边界:Big Ball of Mud 不是 Monolith 的同义词,也不是“旧系统”或“大系统”的同义词。真正关键的是一种结构状态——系统可见的、声明的或原本设计的架构,越来越无法可靠解释系统实际上如何组织、如何耦合、以及变化真正会扩散到哪里。
到了这组文章的结尾,我们还需要把这个视角再扩大一步。
一个长期存在的 Big Ball of Mud 最终不再只是代码和依赖关系。围绕它会形成流程、知识、角色、经济决策和人的适应策略。这些层面彼此作用:它们会补偿系统的弱点,也会形成新的依赖,并可能稳定一个从纯技术视角看本应非常不稳定的状态。
它可以正常运行——同时结构仍然在持续侵蚀
Section titled “它可以正常运行——同时结构仍然在持续侵蚀”这组文章中最重要、也最简单的区分之一,就是:
Big Ball of Mud 并不需要先“坏掉”。
产品依然可以创造收入、服务客户、满足监管要求并稳定运行。Release 可以持续发生,新 Feature 可以交付,Incident 仍然可以处理,软件甚至可以在很多年里持续提供非常显著的商业价值。
正因为如此,“但它不是还能运行吗?”并不是一个幼稚的反应。从 Stakeholder 的视角看,这首先是一种完全合理的判断。
问题在于,结构状态回答的是另一个问题,而不是“产品今天是否还能工作”。
一个软件系统今天可以可靠创造价值,同时越来越不擅长应对明天的变化。
功能正确性与可变更性是不同的质量维度。
因此,一个系统不会仅仅因为架构已经恶化,就自动变成“坏掉的系统”。它依然可以很好地完成当前任务。真正的问题出现在:今天的成功开始遮蔽未来变化已经需要付出的额外成本和不确定性。
这也正是 Big Ball of Mud 能够长期存在的原因之一。组织往往看不到一个立即而明确的证据,证明“现在必须根本重建”。可见的东西仍然在工作;真正变差的是系统对一个尚未发生的未来做出反应的能力。
没有人建造了它——但很多人都参与了它的形成
Section titled “没有人建造了它——但很多人都参与了它的形成”Big Ball of Mud 通常也不是从这样一个决策开始的:
我们现在要故意设计一个糟糕架构。
“没有人建造了它”之所以没有寻找一个罪魁祸首,就是因为长期系统会在多年里累积大量局部决策:Proof of Concept 变成正式产品,临时例外一直保留下来,整合被推迟,需求改变,团队轮换,职责重新切分,时间压力下不断出现当时看起来完全合理的解决方案。
这些决定中的任何一个,都未必足以解释多年后的整体状态。
真正能够解释它的,是这些决定共同形成的历史。
架构不仅由我们主动设计的东西形成,也由那些多年之后从未被撤回的临时决定形成。
这里存在另一个看似矛盾的地方:没有人需要主动“规划”一个 Big Ball of Mud,但仍然可以有很多人共同参与它的形成。
这并不意味着责任消失了。开发者会做技术决策,架构师会建立或者没有建立边界,领导层决定环境和激励,Product Ownership 决定优先级,组织决定预算和职责如何分配。
但简单的归责,并不能很好解释为什么某些局部决定能够在几年甚至十几年中不断相互强化。
不把系统问题简化成“是谁的错”,并不意味着取消责任。它只是意味着:不要把一个系统性现象压缩成对单个人的道德判断。
它依然有结构——只是结构已经不能可靠解释系统
Section titled “它依然有结构——只是结构已经不能可靠解释系统”“泥球”这个名字也容易让人误解。
Big Ball of Mud 并不一定是完全没有结构的代码库。里面仍然可能有 Module、Layer、目录、Service、Component 和非常精美的架构图。仅从文件夹结构看,它甚至可能相当整齐。
真正关键的问题是:这些结构是否仍然有效。
在“如何识别前端里的 Big Ball of Mud”中,我们关注的并不是某一个特别大的 Component 或某个切分不佳的 Service。真正危险的是:原本设计出来的边界开始失去约束力。
一个业务 Slice 可以在目录上存在,但其他 Slice 仍然直接访问它的内部 Service。Domain Layer 可以存在,但 Business Rule 同时散落在 Component、Effect、Mapper 和 HTTP Service 中。Public API 可以明确定义,但所有人都知道“需要的时候”可以绕过去。
一个任何人都可以随意跨越的边界,最终只剩下一个文件夹名称。
因此,Big Ball of Mud 不一定完全失去结构。它失去的是结构作为系统解释模型的可靠性。
这会让架构越来越没有价值。架构的作用从来不只是把文件排列整齐。它应该限制可能出现的依赖关系,帮助我们预测职责在哪里、哪些部分允许相互知道、一次修改需要理解多大的上下文。
当这种预测能力消失时,架构仍然“看得见”,却已经不能提供足够的方向感。
需求写得很小——但进入系统后会变得很大
Section titled “需求写得很小——但进入系统后会变得很大”一条 User Story 也许只有三句话。真正的 Patch 可能只有几行。业务行为本身完全可以很简单。
但为了安全地做完这次修改,团队仍然可能必须理解和触碰系统的大量区域。
在“当每次修改都到处疼”中,我们区分了三个不同半径:业务半径、技术修改半径,以及理解和 Regression 半径。
在边界良好的系统里,这三个半径通常不会相距太远。局部业务变化,拥有足够局部的技术影响范围。
在 Big Ball of Mud 中,它们可能迅速分离。
在 Big Ball of Mud 中,变化会失去局部性。
问题未必是 Diff 特别大。
真正的问题不是 Diff 有多大,而是我们无法确定它究竟会影响什么。
于是,一次修改的经济含义也改变了。可见的编码工作只是总工作量的一部分。理解、协调、Regression、验证和额外保护可能占据越来越大的比重。
需求本身仍然很小。
是系统把它变大了。
专家拯救系统——也因此让系统能够继续维持原状
Section titled “专家拯救系统——也因此让系统能够继续维持原状”当显式结构越来越不能提供方向时,隐式知识的价值就会上升。
因此,在长期系统里常常会出现一些人,他们能够理解那些仅靠阅读代码很难快速重建的关系。他们知道历史决策、隐藏 Sonderfall、高风险区域、Release Ritual,以及所有没有出现在架构图里的依赖关系。
这些人非常有价值。
“没有这个架构师系统就活不下去”从来不是对 Expertise 的批评。复杂系统需要经验丰富的人,卓越的技术能力本身当然不是架构问题。
真正危险的是知识过度集中。
专家之所以不可替代,是因为系统很难理解;而系统又可能因为专家不可替代,而长期不必真正变得容易理解。
当困难任务总是落到同一批人手上时,他们会继续积累更多关于关键区域的知识。组织更加依赖他们。下一次出问题时,他们会更早被拉进来。其他开发者反而更少有机会建立同样的知识。
于是,一个没有人刻意设计的依赖关系,可以自己变得越来越稳定。
关键人物可以同时是系统中最有价值的人之一,也是系统最大的风险之一。
正确结论不是贬低专家,也不是把专家从系统里移除。
问题不在专家。
问题在知识垄断。
更多保护措施有帮助——也可能同时掩盖结构问题
Section titled “更多保护措施有帮助——也可能同时掩盖结构问题”一个难以修改的系统并不一定每天都崩溃。
组织甚至可能非常擅长补偿它的风险。
它们增加 Regression Test,建立额外 Review,让关键修改必须经过资深人员批准,为 Release 设计特殊流程,延长测试阶段,只允许特定开发者触碰高风险区域,记录 Workaround,并为已知故障模式建立 Incident 流程。
这些措施没有哪一个天然是坏事。
在现实条件下,很多措施甚至完全必要。更多测试可以阻止真实错误;Review 可以传播知识;谨慎的 Release 流程对于关键业务系统可能非常合理。
有意思的效应只在整体层面出现。
组织越成功地补偿结构不确定性,这种不确定性就越不需要以“明显技术故障”的形式暴露出来。
Big Ball of Mud 可以在技术上非常混乱,同时在运营上惊人地稳定。
这也是系列第一篇“没人愿意谈论的架构”里的核心观察之一。
系统不是简单地“尽管有这些额外措施仍然能够运行”。它的一部分稳定性,很可能恰恰来自人和流程不断补偿结构上缺乏可预测性。
这是组织的真实能力,但它也会把成本从代码结构转移到流程、知识、协调和额外验证上。
开发者看起来越来越慢——尽管他们并没有少工作
Section titled “开发者看起来越来越慢——尽管他们并没有少工作”从系统外部看,这种成本转移并不总是容易识别。
团队可以和过去一样专注、投入,却交付更少的新业务范围,因为越来越多容量必须花在“让修改安全发生”上:理解既有行为、重建影响范围、验证 Sonderfall、协调其他团队、防止 Regression、修复副作用、或者必须把关键人物拉进来确认。
产出下降并不一定意味着工作变少。越来越多工作可能只是为了补偿现有系统不断恶化的可变更性。
于是会产生一个危险的视角差异。
开发团队内部感受到的是不断增长的理解和安全成本,团队之外看到的却可能只是一个“效率问题”。
业务需求本身没有变大。
为什么现在要更久?
如果结构成本不可见,最容易出现的解释就是人:开发者变慢了、团队太大、估算不好、或者“技术工作”占用了太多时间。
这些解释有时当然可能是真的。
但在 Big Ball of Mud 中还存在另一种可能:
团队没有少工作。系统只是要求他们为同样的业务变化完成更多额外工作。
系统在经济上可能仍然合理——同时仍然是风险
Section titled “系统在经济上可能仍然合理——同时仍然是风险”即使得到上面的诊断,也不能自动推出“应该彻底重建”。
关于Big Ball of Mud 的经济学那篇文章刻意从反方开始:技术上高度侵蚀的系统,在经济上仍然完全可能是理性的选择。
如果产品接近生命周期末期,未来修改很少,维护团队已经缩小,替代方案确定,不会再增加重要 Integration,那么大规模重构可能意味着巨额投资和新的迁移风险,却根本来不及在剩余寿命内回收成本。
这种情况下,继续运行现有结构完全可能是理性选择。
架构不会因为“更漂亮”就自动产生商业价值。
但这类决策仍然有另一面:
“我们不再计划变化”不等于“未来不会被迫变化”。
Security、监管、操作系统、Browser、Cloud Platform、外部 API 和其他依赖都有自己的生命周期。并不是每一个未来修改都会提前出现在今天的 Roadmap 上。
所以,Big Ball of Mud 的经济意义不能只由技术状态决定。
Big Ball of Mud 在经济上有多严重,取决于组织未来还需要这个系统做什么。
完全相同的技术状态,对一个即将退役的产品可能可以接受,对一个战略核心产品则可能是重大风险。
这不是矛盾。
只是经济场景不同。
人会适应系统——也会因此参与稳定它
Section titled “人会适应系统——也会因此参与稳定它”对开发者来说,软件不是抽象技术对象,而是每天工作的环境。
当人们在同一个系统里工作多年,系统结构就会成为工作环境的一部分。
在“Big Ball of Mud 对人做了什么”中,我们因此没有只讨论 Code Quality。人会学会哪些区域危险、哪些路径安全、什么时候应该去找哪个人;他们会接受一些 Workaround,为隐式依赖建立自己的 Mental Model,或者逐渐降低对“哪些事情还真正能改变”的期待。
另一些人与这种工作方式发生更强冲突。他们清楚地看到结构问题,认为自己应该改善它,却同时发现实际决策权不足以支持这种改善。
这些反应都不适合被简化成人格类型。
人会变化。一个人可能最初强烈推动结构改善,后来变得更加务实;也可能一开始擅长导航,几年后反而成为改变结构的人。同一个环境,在职业生涯不同阶段可能被同一个人完全不同地体验。
从系统视角看,关键是另一点:
Big Ball of Mud 可以在技术上混乱,同时在社会层面非常稳定。
某个时刻,已经不只是软件为了适应需求和组织而变化。
人也开始为了适应软件而变化。
这种适应同样可以帮助系统继续运行。
它可以被改变——但不能靠一个人
Section titled “它可以被改变——但不能靠一个人”以上机制不意味着 Big Ball of Mud 无法改变。
局部 Refactoring 仍然有价值。Michael Feathers 关于 Legacy Code 的方法仍然有价值。Strangler 式重构可以逐步恢复边界。Requirements Engineering 可以帮助团队把历史实现细节与真正需要保留的业务行为区分开。Acceptance Test 和 E2E Test 可以在重建过程中形成系统外侧的保护框架。
前一篇“走出 Big Ball of Mud”更详细讨论了这些技术路径。
但它最重要的结论不是某一种方法。
Big Ball of Mud 不应该由一个人单独拯救。
这不是经验科学意义上的自然定律,而是一种架构立场。
当问题已经同时涉及技术结构、业务知识、决策权、运维流程和组织条件时,一个开发者仍然可以产生很大影响:识别边界、展示更好的方案、建立测试、启动第一段重建。
但一个人无法随意制造所有必要前提。
如果新的解决方案再次依赖某个人理解整个系统、做所有关键决定,并亲自确保每个团队都正确使用新结构,那么也许技术问题被改善了,但组织层面的模式又被复制了一次。
走出 Big Ball of Mud 不是英雄故事,而是共同承担的系统重建。

许多 Big Ball of Mud 的特征只有在纯技术视角下才显得矛盾。把技术、组织、经济和人的视角放在一起,才更能解释它为什么如此稳定。
一个被稳定下来的社会技术平衡
Section titled “一个被稳定下来的社会技术平衡”也许整组文章可以压缩成一个观察:
Big Ball of Mud 不是一个“什么都不能工作”的状态,而是一个为了继续修改系统,越来越多额外东西必须先工作起来的状态。
技术结构越来越难理解,于是人和组织用更多知识、测试、流程、协调和保障来回应。
这些机制让后续修改仍然能够发生。
产品因此继续创造价值。
彻底改变技术结构的即时压力反而可能下降。
于是,这些补偿机制本身逐渐成为系统稳定性的一部分。
作为这组文章的综合视角,一个长期存在的 Big Ball of Mud 可以谨慎地理解成一种被稳定下来的社会技术平衡。
这不是一套 Big Ball of Mud 的形式理论,只是对前面所有机制的一种总结。
技术结构影响工作方式;工作方式补偿技术结构;组织调整流程;专家积累知识;这些知识继续维持系统可运行;而补偿越成功,立即改变结构的压力可能越低。
Big Ball of Mud 不只是因为没人去改变它而存活。它也可能因为很多人已经非常擅长补偿它的后果而继续存活。
成本不会因此消失,只是可能被转移到人、流程、知识、协调、时间和风险上。
这些成本究竟增长多快、是否最终在经济上变成不可接受的问题,取决于具体系统。把它简单推导成“成本一定指数增长”同样不严谨,就像声称每个 Big Ball of Mud 最终一定完全失败一样。
很多系统根本不会走到那个终点,因为它们会更早被替代;另一些会逐步重建;还有一些会继续运行很多年。
这不是一则道德故事
Section titled “这不是一则道德故事”因此,这组文章不是“好架构师对抗坏 Management”的故事。
也不是“有纪律的开发者对抗会写烂代码的人”的故事。
它不是现代 Framework 对抗 Legacy,更不是把 Refactoring 描绘成天然比 Feature Development 更高尚。
Big Ball of Mud 的形成和存续来自更复杂的互动。
这不意味着所有决策都同样好,也不意味着没人犯错,更不意味着个人利益、权力结构或糟糕技术决策应该被忽略。
责任当然仍然存在。
只是“归责”本身并不能很好解释这个现象。
面对长期系统,更有价值的问题通常不是:
谁造成了这一切?
而是:
哪些技术和组织条件,让这个状态持续被重新生产?
然后才是:
其中哪些条件能够、也应该被改变?
到这里为止,这些仍然是关于系统的问题。
但在系列最后,还剩另一个视角。
那就是每天在这个系统里工作的个人。
从系统问题走向个人问题
Section titled “从系统问题走向个人问题”经验丰富的开发者或架构师可以识别一个 Big Ball of Mud。
他可以解释为什么边界失效,画出 Dependency,分析 Change Radius,识别知识垄断,并描述经济后果。也许他甚至知道一条技术上现实可行的改善路径。
但这种洞察本身并不会自动制造个人义务。
你没有义务仅仅因为看懂了一个 Big Ball of Mud,就必须去拯救它。
尤其是承担较高技术责任的人,很容易建立一个过于简单的等式:
我看到了问题,所以我必须解决它。
这组文章整体上恰恰反对这种简化。
真正显著的改变,根据范围不同,除了技术能力之外还需要同盟者、业务决策能力、组织行动空间、时间、经济可行性,以及至少足够的组织意愿,让变化拥有生存空间。
个人可以争取这些条件、影响这些条件,甚至亲自创造其中一部分。
但没人能完全控制它们。
于是,个人真正需要回答的问题也发生了变化。
与其问一个问题,不如问两个
Section titled “与其问一个问题,不如问两个”仅仅问:
这个系统能不能被改变?
是不够的。
至少还要再问:
在当前条件下,我能否以有意义的方式参与这种改变——而且我愿意这么做吗?
第一个问题更多关于系统本身。
第二个问题涉及自己的角色、影响力、职业期待和个人成本。
这两个问题不能被混在一起。
一个系统可能技术上可以改善,但当前组织并没有真正的改变意愿。反过来,一个组织可能愿意改变,但当前方案在技术上并不现实。也可能二者都具备,却和个人想投入的时间、精力与职业方向不再匹配。
正是在这里,“Change it, like it or leave it”才成为一种有用的语言。
Change it, like it or leave it
Section titled “Change it, like it or leave it”
三条路径没有天然高低之分。关键在于哪一种真正符合现实条件和个人选择。
Change it
Section titled “Change it”“Change it”意味着主动参与改变现状。
这可能是局部的:给高风险区域建立测试,减少依赖,恢复一个边界,抽出一个 Slice,改善 Observability,清理一条关键数据流。
也可能更大:推动模块化、建立长期重建计划、调整 Ownership,或者用 Strangler Strategy 逐步替代系统核心区域。
但“Change it”不应该等同于个人英雄主义。
如果真正改变依赖组织层面的投入,就需要组织层面的 Mandate。它需要业务决策、优先级、预算、参与者和时间。
否则,“Change it”很容易变成一个人无休止地在 Feature 之间偷偷做 Architecture Work,并不断承担一个系统问题的私人责任。
Like it
Section titled “Like it”“Like it”不是说你必须喜欢糟糕架构。
它意味着有意识地接受当前框架条件。
也许产品即将退役。也许不存在足够强的 Business Case 支持大规模重建。也许组织明确决定投资别处。也许你所在的角色本来就没有足够行动空间。
那么,一种专业选择可以是:
我理解这个系统的边界,也接受这个现实,并在这个现实中尽可能专业地工作。
接受并不等于 Resignation。它可以意味着不再每天重复争论一个已经被组织决定的结构冲突,而把精力集中在当前框架内真正能够改善和交付的事情上。
当然,这种接受必须对个人仍然可持续。如果它长期变成 Cynicism、彻底的心理退出,或变成你无法再接受的负担,那么“Like it”最终也不再准确描述你的选择。
Leave it
Section titled “Leave it”有时候,三个东西会长期无法同时匹配:系统的技术现实、组织条件,以及你对专业工作的基本要求。
如果有意义的改变在现实上不可行,而有意识的接受也无法持续,那么离开某个项目、团队、角色或组织,可以是一种完全正当的专业选择。
这既不自动是正确选择,也不是对留下来的人的评价。
它更不是失败。
不是每一个你能够识别的问题,都必须成为你个人一生的项目。
三种选择同样正当
Section titled “三种选择同样正当”很容易把三种路径排出一个隐含等级。
“Change it”似乎最勇敢,“Like it”像妥协,“Leave it”像失败。
这恰恰是错误结论。
三种选择都可能在不同上下文中理性而专业。
如果你负责一个战略核心产品,而且拥有真实改变 Mandate,那么“Change it”完全合理。
如果系统剩余寿命有限,组织已经决定替换它,那么专业地维持到退役,“Like it”可能正是经济上正确的选择。
如果你长期处在一个无法改变、同时又无法与自己的职业价值观共存的环境,离开也可能完全合理。
而且人不需要永远属于某一个类别。
今天正确的可能是“Change it”,两年后经济条件变化后可能是“Like it”。反过来,一个组织可能多年有意识地容忍现状,之后又真正建立改造 Mandate。
决策质量不取决于你选了哪一条,而取决于这个选择是否有意识地符合真实情况。
当个人和组织实际上选择了不同路径
Section titled “当个人和组织实际上选择了不同路径”最困难的情况之一,是个人选择与组织事实上的选择不一致。
一个组织也许早已明确或者事实上接受了 Big Ball of Mud。
它知道修改成本变高,知道已有风险,知道某些专家不可替代。它也许评估过多种方案,并决定当前不为大规模重建投资。
从组织视角看,答案其实已经是:
Like it.
这不意味着组织“喜欢”这个架构。它只意味着组织愿意承担已知缺点,因为当前还有更重要的投资。
与此同时,一个架构师仍然可能每天都在执行“Change it”。
他写下一份方案,准备下一轮分析,再次解释 Dependency Structure,把下一个 Feature 当作 Refactoring 机会,再试一次 Business Case,希望下一次更好的表达终于能够换来必要的 Mandate。
这些行为单独看都可能完全合理。
真正的问题是长期错位。
最危险的是一个人多年以为自己选择了第一条路,而组织其实早已选择了第二条。
这时,一个人不只是在处理困难的技术改造。他还在试图改变组织层面的根本决策,却可能根本没有相应 Mandate。
长期下去,这会产生巨大 Frustration,却并不意味着技术上一定是这个人错了,也不意味着组织一定是对的。
双方可能对系统状态有相同而准确的判断,却对“多少改变在经济、组织和个人层面值得做”得出不同答案。
所以必须把这几个层面分开。
有时真正缺少的不是一个更好的架构论证。
而是组织已经在另一个层面做出了决定。
不提供远程人生建议
Section titled “不提供远程人生建议”这篇文章无法替任何具体项目决定三条路径中的哪一条正确。
系统、组织和个人情境差异太大。
不存在这样的可靠规则:
Management 三次拒绝 Refactoring,你就应该离开。
也不存在这样的规则:
好架构师会一直战斗,直到组织改变。
更不存在:
接受 Legacy 就等于放弃。
三条路径不是 Checklist,也不是评分系统。
它们只是给一个经常被说得很模糊的决定提供语言。
我想改变这个现实吗?
我愿意有意识地在这个现实里工作吗?
还是我不想再成为这个现实的一部分?
答案取决于产品、行动空间、经济环境和个人优先级。
这组文章的终点
Section titled “这组文章的终点”这组文章从一个很难被公开谈论其架构真实状态的系统开始。
最初的画面是:组织知道哪些区域危险,经验丰富的人会为特定修改保驾护航,但所有人仍然不断追问——为什么开发越来越慢?
之后,我们从多个方向观察了 Big Ball of Mud。
我们看到它不是 Monolith 的同义词;它可以由大量局部合理决策逐步形成;它的边界会慢慢失效;很小的业务变化可能要求巨大的理解范围;Stakeholder 很难直接看到结构问题;组织同样会“编写”架构;关键人物可以同时是解决方案和风险;人会适应由此形成的工作环境;差的可变更性可以产生真实经济后果,却不自动意味着应该重建;而真正的重建也不应该变成下一场英雄故事。
所以最终并不存在一个漂亮的纯技术结论。
Big Ball of Mud 可以运行,可以创造经济价值,可以培养出卓越专家,也可以让组织发展出非常有效的补偿机制。它可以让一些人感到沮丧,也可以让另一些人的历史经验变得极其宝贵。它可能越来越昂贵、越来越难计划,也可能被重建、被替代,或者再继续运行很多年。
架构不会独自决定这些结果。人和组织同样参与决定。
Big Ball of Mud 并不是一个“什么都不能工作”的状态。
也许这正是整个系列最重要的认识:这类系统能够长期存在,是因为开发者学会理解它,专家补偿不确定性,测试和流程吸收风险,组织改变工作方式,而 Stakeholder 仍然从系统中得到真实价值。
这并没有让结构问题变得不重要,却解释了为什么它可以如此稳定。
Big Ball of Mud 是一种社会技术现象。
技术、组织、经济和人无法被完全拆开。代码影响工作,工作补偿代码;经济决策决定行动空间,组织结构塑造技术选择,人又学习如何在由这些选择形成的系统里工作。
你可以尝试改变这种现实。
可以有意识地接受它。
也可以决定不再成为它的一部分。
没有一种选择天然正确。真正重要的是,它是否符合真实情况以及你自己的优先级。
你可以理解一个系统的现实,但理解之后,你仍然必须决定自己愿意在这个现实里扮演什么角色。
Change it, like it or leave it.
也许这组文章最终最重要的不是教会你识别或重建 Big Ball of Mud,而是提醒:技术洞察不会自动产生个人义务。
不是每一个系统都必须由你拯救——甚至不是每一个系统都必须被拯救。
最后没有一个通用技术答案。只有一个有意识的决定:哪些现实你能够改变,哪些你愿意接受,以及哪些你应该离开。