很多专家都对简单和复杂进行过讨论。但他们经常混淆各种术语,使讨论本身显得不够“简单”。现在我想稍加整理。什么是“简单”呢?
提起简单,你会很容易想到这样的场景:让某个人去尝试解释或理解某个事物——这对他来说是一个负担。容易理解和解释的东西就是简单的,与之相对应的就是繁杂的 。
如果想讨论简单,那么理解复杂的和繁杂的之间的区别不无裨益。不理解二者的区别,意味着你可能会用错误的方法来处理正确的问题(或正确的方法处理错误的问题)。
我认为这其中的区别要使用两个维度来解释,具体参见图3.2。纵坐标指的是系统的结构和我们如何正确理解它。
简单的 =容易理解
繁杂的 =非常难以理解
横坐标指的是系统行为和我们的预测能力。
有序的 =完全可以预测的
复杂的 =在某种程度上可以预测(但会有很多出乎意料的事情发生)
混沌的 =极其难以预料的
我的内衣很简单。我很容易理解它们的工作原理。但是我的手表是精密繁杂的。如果把它拆开,我需要很长时间才能了解其设计原理和组件。但是我的手表或我的内衣都没有什么让人吃惊的(至少对我而言)。它们是有序的、可以预料的系统。
图3.2 系统的结构-行为模型
一个三人软件开发团队也是简单的。只需要开几次会议,提供一些晚餐,外加几杯啤酒,就可以了解这个团队的每一个人了。一个城市是不简单的、繁杂的。出租车司机需要几年时间才能熟悉这个城市的所有街道、胡同、宾馆和饭店。但同时,团队和城市又都是复杂的。不管你有多了解它们,总会有意想不到的事情发生它们身上。在某种程度上,它们是可预测的,但是你永远不清楚明天会发生什么。
双摆(两个摆锤互相连接)也是一个简单的系统,容易制作也很容易理解。但由于对钟摆的初始设置具有高度敏感性,所以它进行的是不可预料的混沌运动。股票市场也是混沌的。根据定义,它们是不可预测的,否则每个人都知道怎么利用股票交易来赚钱,从而导致整个系统崩盘。但是,股票市场又不像钟摆那样,它是相当繁杂的。在这个世界上,有太多不同的行业以及不同类型的金融资产和交易,这些东西对我这样的普通人来说,是完全无法理解的。
这与其他模型是如何区分的?
斯诺登(David Snowden),一名知识管理学者,提出了一种称作Cynefin 的架构(见图3.3a)。它描述的是一个环境类型学,分为四类:简单、繁杂的、复杂和混沌(第五类叫失序,被放到中间),用于指导决策和政策的制定[Snowden 2010b]。
管理学教授史泰西(Ralph Stacey)创建了一个类似的模型,叫“认同度&确定性矩阵”(The Agreement & Certainty Matrix)(见图3.3b),它展示了四个领域:简单、繁杂的、复杂和混乱(混沌)。它基于两个维度:认同度和不确定性。
在第16章中,你会看到所有的模型都是错的,但有些还是有用的。这里提到的三个模型都是错误的,但每一个都有用。我的模型与另外两个模型的主要区别就是我没有将繁杂的和复杂视为两个独立的领域。我的“结构—行为模型”识别出六个领域而非4个,并且在繁杂的和复杂的系统方面有一些重叠。如果感觉这有用,可以用我的模型进行系统评估。如果觉得没用,就使用另外两个,它们也不错。
图3.3a Cynefin模型
图3.3b 认同度&确定性矩阵模型
“繁杂的”指的是系统的构造错综复杂而无法理解,除非你是一个专家。而“复杂和混沌”指的是系统行为——这在一定或很大程度上是不可预料的。繁杂的东西不一定复杂,就像一个车库里的两辆汽车一样。复杂也不一定是繁杂的,就像两个人在一个卧室里。
简单化, 目的是使结构更容易理解(在我的模型中将其从顶端移到底部)。
线性化 ,目的是使行为更容易预测(在我的模型中将其从右边移到左边)。
不幸的是,人们经常将线性化(外行人这样定义)与简单化混为一谈。这就是混乱的开端。
软件系统中的复杂性指的是什么?
很多人认为,软件应该尽量简单。当软件不够简单的时候,有些人就会要求“减少复杂性。”
这有点乱,因为“减少复杂性”中的“复杂性”这个词不符合“复杂性”的科学本义。同时也无法区分软件系统的结构和行为。
但是,我的良知告诉我,我必须承认一点:“复杂”和“繁杂”这两个词早在科学家开始赋予它们不同的含义之前就已经存在了。所以在这一点上,门外汉是正确的,科学家反而错了。
但是,如果要求专家理解你的软件结构,我更喜欢说它是繁杂的。当软件行为无法完全预测时(比如在人工智能、神经网络或多人游戏中),我就认为软件是复杂。
简单的、结构良好的软件可能具有非常复杂的行为,而繁杂、混乱的软件仍旧可以正常运行,并且不出任何意外。