如何从架构角度应对复杂性?

软件系统中的复杂性永远不会真正消失。就像物理学中的能量一样,它不能被摧毁——只能被转化、重定向或重新分配。我们做出的每一个架构决策要么会转移复杂性,要​​么会改变其形式。

我们可以做的是影响这种复杂性如何体现并影响我们的系统。正如降噪技术不会消除声波而是引入抵消模式一样,我们的架构决策可以放大或抑制系统中波动的复杂性波。

并非所有的复杂性都是平等的:

  • 有些复杂性自然而然地从问题领域中浮现出来:我们正在解决的业务问题的本质复杂性。这是我们必须接受和理解的复杂性。这是我们需要清晰听到的声音。
  • 然后是偶然的复杂性:相当于不必要的噪音。这来自我们的解决方案、我们的选择、我们的工具,有时甚至来自我们组织本身。这是我们可以而且应该积极管理的复杂性。

我们做出的每一个架构决策都会对不同类型的复杂性起到放大器或阻尼器的作用。

考虑一下我们探索过的不同模式如何影响复杂性:

抑制复杂性的模式

放大复杂性模式(误用时)

  • 共享内核可以通过跨边界创建紧密耦合来放大复杂性
  • 大泥球通过不受限制的相互作用放大了复杂性
  • 过早推出的微服务会以更难管理的方式分散复杂性,例如,当从进程转移到网络时,不明确的通信模式会被大大放大。

复杂性的三个维度
复杂性体现在我们系统的不同方面:

  • 协调复杂性:我们组织工作和管理依赖关系的方式可以减弱或增强复杂性。康威定律不仅仅是一种观察——它是一种我们必须积极管理的复杂性关系。
  • 沟通复杂性:我们选择的信息流模式对系统复杂性有着深远的影响。同步与异步、点对点与广播——每种选择都有其自己的复杂性特征。
  • 一致性复杂性:我们如何跨系统边界维护事实,既可以简化我们的架构,也可以使其复杂化。有时,接受最终一致性可以大大降低系统复杂性。

组织复杂性:隐藏的放大器
最强大的复杂性调节器之一根本不是技术性的,而是组织性的。

康威定律的作用是双向的:

  • 组织可能会因团队结构不协调而加剧复杂性
  • 他们可以通过边界设计团队拓扑扑协调来抑制这种现象。

结论:
目标不是消除复杂性,而是有意识地管理复杂性。每次你认为已经消除了复杂性时,都要检查它实际上可能转移到了哪里。有时看似复杂性降低实际上只是复杂性重新分配。

随着我们进一步探索不同的架构风格和模式,我们将研究每种风格和模式如何处理复杂性:

  • 整体架构如何集中复杂性管理
  • 分布式架构如何跨不同维度分散复杂性
  • 随着系统的发展,进化架构模式如何帮助我们管理复杂性
就像国际象棋大师会提前思考几步一样,架构师必须考虑今天的复杂性决策将如何影响明天的选择。每个架构选择都会打开一些路径,同时关闭其他路径,而这些决策的真正影响通常只有在系统演进的几步之后才会显现出来。

架构的成功不在于消除复杂性,而在于:

  1. 认识到哪些复杂性对你的领域至关重要
  2. 选择系统中复杂性存在的位置
  3. 了解不同模式如何影响复杂性流动
  4. 管理不同类型的复杂性之间的权衡