系统从根本上就是复杂地,因为它不仅仅包含事物的集合,还包含事物的连接关系。而连接关系增长的非常块。

如下所示, 3 个点的集合只有 3 个连接,9 个点的集合有 36 个连接,最右侧的集合有 27 个点,链接已经增长到了 351 个,这种现象被称为组合爆炸(Combinatorial Explosion)
系统连接的复杂度

直觉上,增长速度是指数级的,但是实际上是多项书的,但这不是这篇文章的重点。

#组合爆炸就是复杂性爆炸

当系统内组件的数量线性增长时,组件间的连接关系会呈指数增长,也因此系统的复杂度增长的会非常快。

#堆积如山的东西是不可预测的

系统之所以是系统,是因为它的组件能相互协同工作。随着系统的发展,理解一切是如何工作的,或者系统是否还仍然有效,变得越来越困难。这会让人感到难以理解、脆弱和不可预测。到那时,系统就正式变成了一坨 *

不可预测性尤其可怕。因为不可预测的结果可能是好的、坏的或可怕的。前一分钟可以是这三个的组合,下一分钟以上都不是。这就是混乱,混乱必然是不好的。

#避免复杂性的方法也会造成复杂性

人们已经磨练了很多工具来避免复杂性。但坏消息是治疗方法可能比疾病本身更糟糕。这并不是说这些工具本质上是不好的,而是它们具有经常被忽视的局限性。以下是一些局限性:

#拆分混淆了复杂性

尝试简化系统时,划分是首选方法。它是一个很好的工具,可以将一个大型的整体系统转变为一个由更小、更易于管理的子系统组成的系统。如下:

拆分为小组件

可以将系统的划分,与公司的组织结构划分类比。组织结构是将庞大的系统(人员),分解为更小、更容易理解的子系统(部门)的典型定义。

组织结构图一个问题是它们会在人与人之间制造人为障碍,使他们更难一起工作。这些分区实际上并不存在于人们的日常工作中,但无论如何都是为了简化的目标而创建的。团队变得孤立,过度专注于自己的目标,而失去了对更大方向的可见性。

在一个系统中也是如此,如果要保证所有模块的连接与拆分前一致,将变得非常困难。因此在实际的拆分中,很可能会造就一个脱节的系统,其中的各个元素感觉不像是在一起工作的。

#减少连接降低复杂度

仅仅因为系统中的两个部分可以连接,并不意味着它们应该连接。明确减少各个部分之间的连接是降低复杂性的另一种明确方法。如下是一个仍然是 27 个点,但每个点只和自己同侧的点相连的图,可以看到连接数大大减少了:
降低连接数

但整个解决方案不利的一面是,需要额外的认知负担来理解哪些部分相互连接以及如何连接,这个认知负担也会随着每个组件的每组选项的独特程度而增加。

另一个缺陷是,规则很可能会变得越来越复杂,一旦一个系统开始有 “做__,除非__,除非____” 的规则出现,就要假设已经有人无法连接这个规则了。

#抽象创造了复杂性的层次

另一个降低复杂性的尝试是,仅让系统的一个子集可以被使用:一个简单的公共系统向所有人开放,它由一个隐藏着的一个更大、更复杂的私有系统驱动。

如下所示:

抽象

这样的解决方案会减少认知负担,尤其是对于初学者而言。用户可以从强大的抽象系统中受益,但陷入麻烦的选择要少得多。

当然也有缺点。首先,公共和私有系统意味着需要处理更多的系统。其次,抽象可能会带来长期混乱的风险,因为人们开始发现他们没有获得所有的选择。这就引出了这样的问题:“还有哪些其他选项对我来说不可用?”、“为什么我不能使用它们?”并且,“为什么系统要按照与我不同的规则进行游戏?”

#降低复杂度的唯一真正办法

如果使用得当,上概述的工具可能会非常有效。但数学就是数学。线性地移除系统中的部分,连接会减少得更快。治疗复杂性的症状通常只是重新分配它。简而言之,避免复杂性陷阱的最佳方法就是完全避免复杂性。

#令人窒息的秩序 或 灾难性的混乱

很少有人承认混乱有吸引性,但为何它还是那么普遍呢?一个答案是:因为接受混乱很舒服。

避免混乱就是寻求冲突。 “是” 会助长复杂性爆炸,“不” 则让阻碍复杂度增长。 但 “不“ 会带来争议,这是痛苦的、排斥的、令人窒息的。“不” 不会让你成为聚会的焦点,而且通常需要令人难以置信的纪律才能维持。

尽管 “不” 可能会让人不舒服,但这最终是防止爆炸变成爆炸的最简单方法。

#Reference

Systems, math and explosions (in no particular order) (pjonori.blog)