最近主题阅读马文 · 明斯基 (Marvin Minsky) 和西摩 · 佩珀特(Seymour Papert) 两位人工智能大师,关于思维,关于教育的书籍。其中马文被称为「人工智能之父」。两人都非常重视过程模块化。

复杂问题的解决需要系统性,也很少一次做对,要通过调试改进。调试就是捉虫(虫是程序没有按期望运行的部分)。对于捉虫这种事来说,最糟糕的情况就是有好几个虫同时存在。

因此捉虫最有效的方法就是让每个单元小到不可能有超过一个的虫(西摩 · 佩珀特,2019)。

那么,把过程打碎成自然的,功能性的单元,为这些单元之间划定界限越明确,就越容易找到虫(西摩 · 佩珀特,2019)。这是我们为什么要模块化,以及模块化的核心。

在我的《直面不确定性》一书中,第一个模型就是「模块化思维」,我将全文放到公众号,六千余字,当我们碰到复杂问题时,进行模块化处理,问题就比原来简单数倍。

屏幕阅读长文太累,可以购买纸质书,各电商平台和书店都能买到。

人工智能之父的问题解决策略:模块化 - 知乎 - 图1


小时候家里有一台双桶洗衣机,双桶顾名思义就是有两个桶,一个桶负责洗涤,另一个桶负责脱水,脱水时得将衣服从洗衣桶中捞出放到脱水桶中。虽需人工介入,但比照现在的全自动洗衣机,操作相当简单。这台洗衣机只有两个按钮,一个是洗衣定时开关,另一个是脱水定时开关。

这样将一个任务用两个独立单元实现不但界面简单,还有其他很多好处,我会在后面详细介绍。如果你仔细观察,这样的处理方式在生活中特别常见,我再举一个例子。

有小孩的家庭会选购辅食机,辅食机有两个功能,一是蒸熟食物,另一个是搅拌食物。(建议你在电商网站搜索 “辅食机” 三个字,找到辅食机的图片获得直观感受。)要实现这两个功能,对应着两种方案,一种是在一个缸中完成蒸熟和搅拌,这是一体机。还有一种是分体式的, 和双桶洗衣机原理相似,用两个缸,一个缸中装水,另一个缸中放食物,两缸之间有个气孔,装水的缸有加热功能,加热时蒸汽跑到第二个缸中蒸熟食物。此外,给第二个缸底安装一个搅拌器就能将食物搅碎。

第二种方案将一个任务分解成两个不同的步骤,用两套不同的装置合作完成。就是模块化的解决方式(跟玩积木很像,所以模块化又叫积木化),这种对复杂任务分解成不同模块,既能降低制造难度和生产成本,还提高了稳定性和生产效率(像双桶洗衣机两个桶就可以同时工作,一边洗一边脱水)。

为什么将一个整体分成多个单元可以提高效率、降低成本呢?

我们来看两个钟表匠的故事:

在古代有两个钟表匠,一个叫王二,另一个叫李三,他们两人手艺都非常棒,能制作出由 1000 多个零件组成的手表。王二在做手表时,如果放下手中的活,比如去接客户的订货电话,手表就会散架,以前的工作全白费了,他就得从头开始组装手表。

越多的顾客喜欢王二做的手表,就会给他打越多的电话,生意忙不过来本是好事,可手表匠王二却高兴不起来,因为他的工作不断被打断,也越难找到整块不间断的时间组装好一只手表。

组装工作被打断这种情况李三同样也遇到了,但李三提前对手表组装工作做了规划。他的方法是:先将十几个零件组装成一个构件,然后再用这些构件去组合成一只完整的手表。

因此当李三放下手中的活去接电话后,他不需要从头开始组装 1000 多个零件才能完成一只手表,他只需要重新组装刚才没有完成的那个构件。

假如这两个钟表匠在组装零件时,每 10 次有一次被打断,那么平均下来,王二完成一只手表花费的时间是李三所需时间的 4000 倍。

—— 本故事改编自西蒙的著名论文《复杂性的架构》

这个故事里是说的是独立一个人,用这种先组装构件,再合成整体的方式就能充分利用间断时间提高效率。它更适合多人合作的情境,在明确的社会分工体系下,不同的人制作不同的构件,能在短时间内制作出复杂的产品。

可以说,要解决一个复杂的系统或复杂的过程,必然的也是唯一的方法就是对复杂系统或复杂过程进行分解,它是人类处理复杂性的原始努力。但是光分解还不行,还得有本事把他们整合在一起,保证功能的一体化,这个分解再整合的过程就是模块化(Modularization)。

在模块化系统中,每个模块是系统的一个独立单元,模块内部各要素紧密相连,而与其他单元要素的联系相对较弱。

比如上面我们说的辅食机就有两个模块,一个模块加热产生蒸汽,另一个模块搅拌蒸熟后的食物,两者之间靠一个通气孔连接实现我们的需求。

由上面的几个例子我们发现:

• 模块化能帮助我们处理复杂的事情;

• 模块化让并行操作成为一种可能;

• 模块化有利于我们应对不确定性。

这是模块化带给我们的三个好处。

模块化既是分解又是整合

既然模块化有这样大的好处,那对一个系统或过程该如何模块化呢?

前面我们说在模块的过程中,首先要将一个复杂的任务分解为多个关联较弱的单独模块,最后为实现整个系统的功能要求,还要将不同的模块整合到一起。这就意味着你不但要制造出火车头,火车的车厢,还得把它们连接起来组成能运输东西的完整火车。请思考一下,如果你要设计一列火车,会怎么做?先设计什么,后设计什么,花点时间思考这个问题并写下你的答案。

我们来看专家是如何思考这个问题的,现代模块化理论的提出者,哈佛大学商学院鲍德温教授认为模块化系统应由下面三个要素组成:

人工智能之父的问题解决策略:模块化 - 知乎 - 图2

• 设计规则:每个模块间的相互依赖性形成一定的规则;

• 模块:每个模块都要遵循统一的设计规则,而内部可以独立设计;

• 系统集成与检测: 监测并协调各个模块组件集合成整体后的不适合部分。

这里需注意一点,模块是可以递归的,即能够 “大盒套小盒”,也就是说模块还可以分解为多个子模块,如有必要,子模块仍然可以进一步分解。将复杂事物分层是帮助我们认清它的一个有效努力,但也不应分太多层,层数太多,设计规则会变复杂,最后整合时发生矛盾的可能性就成倍增加。

依据这个思路,我们尝试回答前面设计火车的问题,首先从整体上规划,明确火车功能,确定风格,接着考虑火车头和车厢之间的连接方式。然后设计每个模块(车头和车厢),车头在保证满足功能的前提下有一定的灵活性,车厢内部风格也不一定要与车头的一致。于是在统一的规则指导下,火车头和车厢就可以交给不同的单位或个人设计。最后有了模块细节后,还需要各方在一起碰方案,这就是开协调会,预先检测和评估系统集成的效果。我们逐个分析这三个步骤:

第一步,设计规则

首先来看设计规则,在模块化过程中,设计规则是纲领,是指导方针,鲍德温教授说明确的规则有三种:

• 结构:确定系统有哪些模块构成,即怎样将模块分解,分类,以及他们如何发挥各自作用;

• 界面:定义模块的边界,模块排序方式,空间、时间的安排,模块间的关系以及信息传递方式;

• 标准:检验模块是否符合设计规则,对模块性能测验和评定。

除明确的规则外,还有一种 “隐形的设计规则”,这种规则只在模块内部有效,而对设计其他模块没有影响。而模块内部的决策,可被代替或者事后再定,因此也就没有必要与同它平行的模块知道,我们选择将它 “隐藏起来”。

那可以通过什么方式获得明确规定的规则呢,这其实是一个博弈的结果,而最好的博弈规则应是正和博弈,即参与双方都能获益,有三种方法:

一种是自上而下的制定,有点像计划经济,比如网友线下聚会,每个人可以看成是一个模块,组织人员不问会员意见,规定会员按照地域坐在一起,山东的坐一桌,北京的坐一桌,河北的坐一桌。这就是典型的自上而下制定规则的方式。“”

还有一种就是自下而上,有点像自由的市场经济,成员间相互协商,共同协调达成一致。比如有人提议大家根据爱好坐到一块,喜欢骑车的在一块,喜欢摄影的在一块,喜欢阅读的在一块,大家有共同的兴趣,有了共同话题。

第三种方式就是先规定一种方式,比如用第一种按地域的方式,主办方观察到相同地域没有共同话题,大家很无聊,于是就迅速调整,按照爱好坐。这是先制定一种规则,然后根据反馈主动调整的方式,有点像软件设计中的迭代。

三种规则的形成方式各有特色,不能简单的判断哪一种方式好,哪一种方式不好。可以根据系统的复杂程度,可控程度和所处阶段灵活运用。规则设计的目标是追求最理想的模块化结构,使整个系统做到最优。这里我再引入一个编程中的概念。学过编程的可能听说过 “高内聚低耦合” 这个概念。即在编程中考虑模块化时需尽量满足:”高内聚”, 模块内部紧密联系,功能完备,只要求实现一个主要功能;“低耦合”, 与外部连接应尽量简单,接口要少且标准统一,提高模块的独立性和复用性。

我们可以借鉴编程中的这个概念,在设计规则和分解模块时,尽量做到 “高内聚低耦合”。

第二步,操作模块

规则有了,那具体如何操作模块呢?鲍德温教授的《设计规则》一书总结了六种不同的模块操作程序:

  1. 分解:将任务或系统分解为多个模块;

  2. 替代:用某个模块去替代另一模块;

  3. 排除:去除某个模块;

  4. 扩展:增加某个模块;

  5. 归纳:将多个模块中相同要素归纳合并到一起,组成一个新的模块,这意味将原来的隐藏信息移动到设计层级,使之对其他模块组可见;有点像一个公司中,原来每个项目组都有一个人负责营销,现在将各项目组营销人员整合起来,组成一个新的营销部门,负责所有项目组的营销任务。

  6. 移植:系统中的某个模块还负责其他同级模块的一些功能,有挣脱该层级的需求,于是就将它升级到上一层。这就像在企业中,一个小组长是多面手,既管营销,又管生产,都干的很好,小组长这个职位已经不能充分发挥它的才能,领导就升迁他做了副经理。

其中分解和替代是互补的,排除和扩展也是互补的,具体操作中还要满足 MECE(相互独立,完全穷尽)原则。怎样形象的理解和记忆这六个模块操作程序呢,你可以假想摆积木。比如你将一个完整的形状拆解为不同的积木块(分解),找到新的积木来替换旧的积木(替代),将一个不好用的积木扔到一边(排除),增加一个积木块(扩展),将多个积木块组合成一个新的形状(归纳),让这个刚组成的形状成为另一个更大的形状的一部分(移植)。

第三步,系统集成与检测

模块化系统中最后一个要素是系统集成与检测。如果高质量的完成了规则设计和模块操作,那么系统集成会很顺利。但结果总跟预想的不一样,因此需要对各模块检查验收,以及协调和消除各模块间的摩擦。一般来说,系统集成与检测是平行于其他模块的一个实现特殊功能的模块。这有点像建筑施工中监理单位的工作,监理和施工单位是平行的,负责检查各单位工作的完成质量和进度,也协调过程中遇到的问题,保证项目既快又好地竣工。

成为规则设计还是模块供应者

由上面我们对模块的分析就可以看出,在一个模块化系统中,主要有两种角色,一种是规则的设计者,还有一种是模块的供应者。选择做哪一种呢?有一句在管理界很流行的话:

一流的企业做标准,二流的企业做品牌,三流的企业做产品。

因此一流企业做标准,就是设计规则,但设计规则不是想设计就能设计的,它需要从更广更高的维度看待整个系统,也需要更强的实力。如果实力不够,就只能做品牌,做产品,做一个模块供应者。

在合作中,设计规则的人有更大的话语权,成功后也能获得更多的利益,同时也要承担巨大的失败风险。模块供应者虽然在整个系统中话语权不及规则设计者。但如果你提供的是一个关键模块,也能直接影响设计规则使其对自身有利。更重要的是,你面临的不确定性要小,比较安全。

这有点像创业者和打工者的区别,创业者是一个规则设计者,有很大的自由度,但需要应对更多的不确定性,承担更大的风险。而打工者在一个企业中是模块的供应者,自由度小,但无需承担大的风险,收入比较稳定。当然,从另一个角度或者更大的尺度来看,我们每个人既是模块供应者,也是规则的设计者。

模块化思维在生活中的体现

模块化在生活中随处可见,我们来看几个具体例子:

一、韩信的模块化带兵

孙子兵法中《兵势篇》中第一句:

凡治众如治寡,分数是也。

什么意思呢,就是说如果你想率领大部队和带一个班一样容易,凭借的是 “分数”,分数就是对部队编制,对人员进行模块化,比如十个人组成一个班,三个班组成一个排,三个排再组成一个连…… 这样就能在战斗中让每个模块执行不同的作战任务。

“韩信点兵,多多益善” 为什么韩信带兵多多益善,而刘邦说他最多能带十万兵,就是因为韩信善于 “分数”,能将人员模块化,给每个模块安排不同的作战任务。

二、星巴克门店的模块化设计

星巴克是一个非常知名的咖啡餐饮品牌,门店数量仅次于麦当劳,是世界第二多连锁门店的餐饮企业。1994 年,星巴克在快速扩张过程中遇到了门店装修难题,首先是速度,门店装修进度太慢,跟不上开店速度,还有一个是风格,就是怎样保证在品牌调性不变的基础上,让各门店看上去有些变化,没那么单调。

怎么解决这个问题呢?困难的事要找专业的人来做。当时的星巴克的老总花 150 万美元请来了门店设计专家莱特 · 马西,马西很有经验,他也主持设计过迪士尼的各种门店。马西根据星巴克的要求,同团队合作获得了一个方案,就是根据咖啡生产历程,分为种植、烘焙、调制、饮用四个阶段,每个阶段对应一个主题色,比如生长种植阶段对应着绿色,这样就有四种主题色。另外,星巴克有三类不同样式的家具,这样就有四种主题颜色,三种家具样式,排列组合后,门店装修风格就有 12 种。

有了这 12 种风格后,星巴克门店装修就很简单了,只需要从仓库中取用提前制作好的模块,现场搭配。在使用了这种模块化装修方案后,单个门店的装修时长从原来 24 周缩短到只需 8 周,装修金额也从 35 万美元减少到 29 万美元。别看每家门店只省了 6 万美元,但装修时间却缩短到原来的三分之一,店早开一天,就能早一天有销售。而由于星巴克门店特别多,从 1995 年——2000 年这 5 年间,就为星巴克省下了一亿多美元。只花了 150 万美金的设计费用,却节约了一亿多美金。这就是模块化的力量。

三、模块化写作

再举一个例子,这本书其实也是模块化的产物。写一本书并不是一个容易的工作,如果一开始我就想着要写十几万字,就会被吓到,可能就放弃了。

这本书怎么完成的呢?是我操作模块的成果。在写书稿前,我在微信公众号行为设计学已经更新了几十个模型,平时我还做笔记。有了这些基础材料后,我再制定一个规则,也就是本书的主题,然后再设计结构,整本书的框架,章节安排等。有了这个总体设计规则后,具体写作过程就相对容易了,每天抽出一点时间整理思路,寻找合适的素材,对素材模块进行增加删除,排列组合等操作,就形成了一本书。你看,一个本来很复杂,很难完成的任务,采用模块化的方式后,完成起来好像简单了许多。

这种模块化的写作方式也不是我创造的,很多大师级作家都用这种写作方式。他们会积累很多知识卡片,而每个卡片就是一个模块。

英国学者赫伯特 · 斯宾塞就很善于利用卡片,在他去世后,大家发现他花心血积累了几十万张卡片,这些卡片用了科学方法编排,能方便地查找。二十世纪著名的俄裔美籍作家纳博科夫也异常热爱卡片写作,《纳博科夫传》开卷就展示了他用卡片写作的场景照片,在一次 BBC 的采访中,记者问他怎样写作,有什么创作方法时,纳博科夫这样回答:

我现在发现索引卡片真的是进行写作的绝佳纸张,我并不从开头写起,一章接一章地写到结尾。我只是对画面上的空白进行填充,完成我脑海中相当清晰的拼图玩具,这儿取出一块,那儿取出一块,拼出一角天空,再拼出山水景物,再拼出 —— 我不知道,也许是喝得醉醺醺的猎手。

中文世界里,钱钟书也是卡片写作的践行者,与钱同时代的夏承熹曾有这样一段话:“阅钱钟书《谈艺录》,博文强记,殊堪爱佩。但疑其书乃积卡片而成,取证稠叠,无优游不迫之致。近人著书每多此病。”

他是在批评钱钟书的文章 “乃积卡片而成,取证稠叠”,也从侧面印证了钱对卡片的娴熟和喜爱。夏承熹虽批评钱的卡片写作法,但钱的书籍广受大众喜爱,而夏的文章几乎无人可知。

这也就是模块化写作的好处,它通过积累丰富的素材,以灵活的结构激发和促进作者远距离联想,创作出有新意有特色密度大的作品。如果你想要写一本书,或一篇高质量的文章,请尝试模块化写作,在平时有感想时就写几句,碰到相关的素材也收集下来,日积月累有了一定的卡片后,你发现写作并没有那么难。以前只能使用纸质卡片,整理查找都不太容易,我们现在有各种手机 App,能随时随地方便的记录,一张照片,一个想法,看到想到后马上记录下来,并打上标签,以后查找也轻松。

模块化是我们解决复杂问题的基本方法

模块化是我们解决复杂问题的基本方法,它跟我们熟悉的拆解有些相似,但也不仅仅是简单的拆解。模块化不是将问题拆分 为若干独立个体逐一解决, 而是在保持问题整体性的同时着手处理各部分。在模块化过程中,首先要定一个规则,然后再根据规则,进行分解、替代、排除、扩展、归纳、移植等方式操作。最后还要对各模块做检测,以便于它们能系统性整合在一起。

模块化只是解决问题的方法,我们不应为了模块化而模块化,我们的最终目标不是想要一列火车,而是为了将东西从一个地方运输到另一个地方。

√ 公众号「行为设计学」

非常理想,特别现实。产品化自己,建立睡觉时也能赚钱的认知财富系统,过一种幸福完整的人生。

感谢你的阅读,你的点赞是对我的最大鼓励。
https://zhuanlan.zhihu.com/p/166677501