架构设计中,有些「坑」是前人反复踩过、并最终总结出来的。它们看起来像是解决问题的方案,但在特定的上下文中,却会产生毁灭性的后果。

今天,雪狼给各位准备了一份架构反模式清单。如果你在你的系统中看到了这些影子,请务必警惕。

1. 大泥球 (Big Ball of Mud)#

  • 定义:系统缺乏清晰的结构,模块边界消融,逻辑交织在一起。
  • 症状:修改一个小功能,需要改动十几个不相关的文件;没人敢说自己了解整个系统的调用链路。
  • 规避:严格分层,明确定义模块间的通信契约,引入限界上下文(Bounded Context)。

2. 金锤 (Golden Hammer)#

  • 定义:手里拿着锤子,看什么都像钉子。无论业务场景如何,统统使用自己最熟悉的单一技术解决。
  • 症状:过度使用 NoSQL 存储强事务数据,或者在一个简单的单体应用里强行引入复杂的服务网格(Service Mesh)。
  • 规避:博采众长,坚持「没有银弹」的工程思维,针对不同场景选择最合适的工具(Tooling for the Job)。

3. 软编码 (Soft Coding)#

  • 定义:因为害怕修改代码,而将大量的业务逻辑通过复杂的配置、规则引擎甚至脚本甚至数据库里的开关来实现。
  • 症状:配置文件比代码还长;业务人员无法理解配置,最后还是程序员在改「软代码」,且没有编译期检查。
  • 规避:代码即逻辑。核心业务逻辑应当是清晰的、类型安全的。只有真正的「变参数」才应配置化。

4. 盲目解耦 (Blind Decoupling)#

  • 定义:为了解耦而解耦,在不需要的地方引入了过多的抽象层、消息队列或中介者。
  • 症状:追踪一个简单的函数调用需要跨越五六个接口和两三个消息中间件;开发效率极低。
  • 规避:拥抱「内聚」。有些东西放在一起比分开更高效。只有当变更频率、生命周期确实不同时才考虑解耦。

5. 僵尸服务 (Zombie Service)#

  • 定义:那些活着却毫无业务价值的服务,仅因为「不敢删」而一直跑在生产环境。
  • 症状:服务器 CPU 跑得很欢,但查日志发现全是心跳检查,没一个真实请求。
  • 规避:建立功能下线流程。利用灰度发布和全链路监控,定期「除草」。

6. 厨房槽 (Kitchen Sink)#

  • 定义:一个类或一个方法像家里的厨房水槽一样,什么都往里塞。
  • 症状:几千行的「上帝类」,方法参数多达十几个。
  • 规避:单一职责原则(SRP)。一个组件只应该有一个引起它变化的原因。

7. 死亡之手 (Dead Hand)#

  • 定义:系统严重依赖于某位已经离职的「大牛」留下的、没有文档、没有测试且逻辑诡异的底层框架。
  • 症状:只要那个框架出 Bug,整个团队只能大眼瞪小眼,没人敢动。
  • 规避:去个人化。推广代码评审、编写架构文档,并确保核心组件有充分的单元测试。

文生图:一个由各种危险警示标志构成的拼贴画,背景是一个充满裂纹的、不稳定的地基。每个标志代表一种反模式。风格:简洁、现代扁平。

结语#

反模式并非洪水猛兽,它们是软件演化过程中的自然产物。

正如《道德经》所言:「天下皆知美之为美,斯恶已;皆知善之为善,斯不善已。」

了解「丑」,是为了更好地守护「美」。希望这份清单能成为你架构之路上的「照妖镜」,助你避开深坑,直抵优雅。