分享

系统架构2:分解-管理复杂的利器

 新用户36625prl 2021-11-23

看到上面两张图,你有什么感受?你最直观的可能是:一个比较有条理,一个比较杂乱。它们实现的功能可能是完全相同,但是如果出现了故障,检查起来,可能困难程度就不同了。我们在《为什么需要生物学思维》:有限认知,如何应对日益复杂系统?提到了通过生物学思维应对复杂性,本文继续分享应对复杂的一种比较传统,但是很有效的方法——分解。

1 复杂VS难懂

在英文中有两个词很精确地表述了上述现象:Complex和Complicated,不翻译过来是复杂和难懂。复杂指的组成系统的要素或者实体,高度相关,相连和混杂。而难懂则是指是否超出了人的观察和理解能力,上面的图片中,本质上都是比较复杂的,但是后者明显比前者更好懂。

生命是什么?中,我们明白复杂化系统提高动态稳定的重要方法,在《为什么需要生物学思维》:有限认知,如何应对日益复杂系统?我们分享了系统越来越复杂的两个重要原因——吸积和交互,在这里再补充一个——功能需求越来越多,以前的手机只需要能通话就行,现在的手机通话已经退居次要地位,而功能的增加通常也会导致复杂度的增加,我在工作中深有体会,一个公司中,工程的人最怕市场的人不断加功能或者需求,比如你看别人的车能跳舞,我们可不可以比他们更炫,不经跳舞,还会唱歌?

虽然在《为什么需要生物学思维》:有限认知,如何应对日益复杂系统?中,我们提到用生物学思维应对复杂系统,但是在建构系统的时候,还是要有人懂这个系统,那就需要区分三种不同的复杂度概念。

2 三种复杂度

在《系统架构》中提到三种复杂度:必要复杂度,实际复杂和表面复杂度。

必要复杂度:系统保持一定功能和性能的最低复杂度;

实际复杂度:实际实现功能时的复杂度;

表面复杂度:看上去的复杂程度。

比如,我们为汽车选择动力系统的时候,可以是纯内燃机(自然吸气,涡轮增压等)、纯电动和混动,如果只是为了能让车动起来,那么是存在一个最小复杂度的动力系统,这就是必要复杂度;而我们实际开发和设计动力系统,因为存在一些不够优化的设计,导致实际复杂度高于必要复杂度,表面复杂度和前两种常常是相反的,因为表面复杂度是人们常常接触到的复杂度,为了提高人们的使用界面的简洁,常常背后是异常复杂的,比如苹果手机,我们使用时很简单,小孩不用教都能学会,但是背后需要复杂的系统支撑。

还有一个工作中常见的现象,就是在沟通中,呈现同样的问题和信息,有的人只需要用1页PPT就能把问题讲的清晰明了,而有的人可能用了几十页,还是让人一头雾水。为什么?我的观察是,1页纸看上去很简洁清晰,但是背后可能进行大量的整理和思考,将复杂化留给了自己;而后面的几十页,看似做了很多工作,但只是大量信息的堆砌,将复杂的处理留给了听众。

复杂是难以避免的,但我们的认知有限,所以,需要在复杂和难懂之间做平衡。正如《系统架构》中提到:好的系统架构就是具备必要复杂度,同时又不难懂的系统。有什么好用的工具?分解。

3 如何分解?

3.1 分解方向

分解的时候通常有两个不同的方向:上下和内外。上下分解有可以分为自顶向向下和自底向上,最典型的就是产品开发中的V字型开发,从整体分解到部件,再从部件组装为整体。

内外,就是从内到外,或者从外到内,最典型的就是中国人的关系——由亲到疏,以及我们常说的“修齐治平”,当然这两种分解分解方向也可以交替使用。

3.2 二下一上

这是《系统架构》中提到的一种重要的分解原则:

如果要判断Level1分解是否合适,必须深入到Level2中。

这里把Level0看成是将要被分解的整体,Level1是分解后的第一级,Level1是分解后的第二级。为什么这个原则重要?因为分解后,如果能够让组内的元素耦合度比较高,而组之间的耦合度低,有利于模块化,并减低沟通成本,而Level1分组所需要的信息,包含在Level2的互动中。

而我认为,如果有必要,甚至要再往下多分解几层,那么我们最多可以分到什么程度呢?最后合理的应该保持在几层呢?

3.3 原子部件和模块

我们可以分解到什么程度?古希腊人用“原子”表示不可再分,在系统分解中,我们将其定义为“原子部件”,这个定义比较模糊,用途不同,指代的不同。比如,对于整车厂,到零件就可以了,典型的如螺栓,但对于螺栓零件公司,可能还需要再分解为1字头、十字头,什么螺纹等,比如是用一字头还是十字。《系统架构》中提到一个基本判断原则:不能再拆解了,一经拆解就失去了意义。

如果每个系统,我们都分解到原子部件,很容易超出人们的理解程度,所以需要降低其表面的复杂度,一个重要的方法就是模块化,将原子部件集成为各个模块。我们在使用的模块的时候,常常不需要关心模块内部的具体内容,只需要知道模块的功能和结构,典型的就是芯片的使用,对大多数使用芯片的人,关心的只是输入和输出。

模块不仅可以降低表面复杂度,而且对系统修理也比较容易,常常只需要更换换掉的模块就可以。那是不是模块化越多越好,其实也不然,因为如果模块太多,那么你就要定义很多的接口,而接口的数量的增加其实也会增加复杂度,另外,模块通常就意味着里面有一些模糊的东西你不知道,存在黑箱,你是不清楚里面究竟发生了什么?

3.4 分解面

对于分解而言,除了前面提到的方向和深度,还有一个重要方面是——分解面(也叫分解平面),通俗讲就是我们从哪个角度进行分解,比如对人群,我们可以按照年龄、性别,职业等进行分解,分解面的选择,不仅影响人们的理解程度,也会影响系统最后功能的涌现以及架构的美观程度。

以汽车为例,我们可以按照构成部分,将其分为车身,底盘,电驱动等,也可以按照性能/功能分为加速性能,制动性能,储物功能,舒适性能都等。在金字塔原理:结构思考,清晰表达中,我们也分享了多种分类的方式,它们也是典型的分解面。

在《系统架构》中提到了13种常见的分解面,最典型的如形式、功能、设计自由度等。

总结

表面越简洁,可能底层越复杂。为了实现特定的功能,一定的复杂度是必须的,这被称为必要复杂度,而实际系统的复杂度常常超出必要复杂度。而人的认知能力有限,在保持必要复杂度同时,又不能让其难懂(表面复杂度)。在这个过程中,分解是重要的手段,分解需要考虑:方向,分解深度和分解面的选择

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多