系统架构的重要性

拆分和集成问题

I claim that you want to start communicating between independent modules no sooner than you absolutely HAVE to, and that you should avoid splitting things up until you really need to, because that communication complexity often swamps the complexity of the actual pieces involved in it.

—— Linus


这是 Linus 03年关于集成问题的一些讨论。

让我们认识到一种现象,

复杂系统拆分成模块,似乎并没有降低整个系统的复杂度。


它降低的只是子系统的复杂度。


而整个系统的复杂度,

反而会由于拆分后的模块之间,不得不进行交互

变得更加复杂。


为什么会这样呢?

因为,消息传递可以看做是一种计算过程


消息传递

Alan Kay当时在向别人解释面向对象编程的时候谈到,

面向对象,原意是将对象类比为生物学中的细胞,计算过程通过对象之间交换信息来完成。


I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages.

—— Dr. Alan Kay on the Meaning of “Object-Oriented Programming”


这样结果就很清晰了,在使用面向对象编程时候,

将系统划分成多个对象,只是第一步,

剩下的工作是,使用传递消息的方式,用这些对象完成计算任务。


状态

与之类似的想法,还有 Wolfram 提出的 元胞自动机


A cellular automaton is a collection of "colored" cells on a grid of specified shape that evolves through a number of discrete time steps according to a set of rules based on the states of neighboring cells.


整个系统的最终状态,是计算执行后的结果,

将系统拆分成子系统之后,计算任务并不是完全由子系统承担了,

事实上,子系统承担了一部分,子系统之间的信息传递过程承担了另一部分。


系统并不是其组成物的简单加总,而是这些组成物之间互动的产物。—— Russell Ackoff

整体大于其各部分之和。 —— Aristotle


系统架构

对于开发复杂系统的团队,

有一个能在系统子系统层面进行管控的角色,

就变得异常重要了。


Ta不但负责系统的拆分,更重要的是,

明确系统拆分后,各组成部分之间的交互过程


担任这个角色的人员,常被称为系统架构师

下面我们来看一些反模式


静默失败

子系统或模块之间的边界处,经常会出现静默失败的情形,

由于是整个系统一起提供了产品功能,

单独子系统的健壮性,其实并没有如实反映到最终产品中。


如果上层系统对静默失败没有防范,那么这简直一定会成为一个缺陷

这代表着业务处理逻辑并不全面。


现在我们看到,这是一个只能从系统层面寻求解决方案的问题,

子系统或模块之间的交互方式,没有一个明确的方式,

是产生这类问题的主要原因。


外部服务的稳定性

现代软件系统越来越复杂,很多系统还会依赖一些在线提供服务的外部系统,

这些外部系统在不通知用户的情况下进行重启,或者由于某种原因停止服务,

对上层系统的危害将是十分严重的。


在底层系统失控时,上层系统应该做出哪些反应,

这应当是系统架构师的关注的事情,

如果没有明确的举措,故障将不是偶然的,而是被设计好的


值得一提的是,这里我们并不是说强行让外部系统变得稳定,

而是说,应当具有明确的应对措施


接口约定

接口不只是传递了数据,我认为更重要的是传递了信息

被调用者所有内部实现的信息,被封装到了接口之下,用户不用关心接口之外的东西,

接口反映了被调用者期望调用者知道的一切。


这是很理想化的,

实际上以上所说的接口包含了接口文档


系统架构师应当让子系统的维护者们,在不必相互理解细节的情况下还能顺利工作,

所以,与其说拆分实现了功能独立性

不如说,拆分实现了信息独立性


那些能有效降低维护者之间信息沟通的拆分方式,才是更好的。

Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.

—— Conway's law


结语

系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各自的功能之和。

系统思维,就是把某个疑问,某种状况或某个难题明确的视为一个系统,也就是视为一组相互关联的实体。

—— 《系统架构:复杂系统的产品设计与开发


如果我们开发过复杂系统,就也有可能遇到过上述集成层面的问题,

当然没有被列举的问题还有很多,

但是这恰好印证了文中开头所阐释的那一点,拆分并不会降低整个系统的复杂度。


完成拆分之后,子系统或模块之间的信息传递,才是重中之重。


怎样让这些信息传递过程,运行的更可靠更稳定,

才是提高整个产品功能稳定性的关键点。