跳至正文
杂学书库让好奇心有所归处
简体中文

从小做起才能大规模运转:加尔定律(Gall's Law)

在打造一项新服务时,人们常会想从一开始就画出一套功能齐全的完美系统。会员管理、支付、推荐、统计,一次性设计、一次性完成,看起来要高效得多。然而,起步越宏大的项目,最终越常常无法正常运转。用一句话概括这一现象的经验法则,就是“加尔定律(Gall's Law)”。

简单来说,加尔定律是指“能正常运转的复杂系统,总是从能正常运转的简单系统成长而来”这一原则。它是美国儿科医生兼作家约翰·加尔(John Gall)在研究系统失败方式时提出的,如今在软件设计和产品开发领域经常被引用。

本文将依次介绍加尔定律的由来、定律中三句话的含义、实际案例,以及在实践中遵循这一定律的方法。

加尔定律示意图:在一个虚拟的活动报名系统中,先做出报名和名单确认都能正常运行的小流程,再加入通知功能,并重新测试整个流程。仅靠简单并不能保证成功。
用虚拟的活动报名系统来解释加尔定律的示意图。来源:John Gall,Systemantics(1977),p.52。这是一条经验法则,而不是保证成功的公式。

系统从简单成长为复杂的原理

一位儿科医生写下的系统故事

在明亮的20世纪70年代诊室里,一位身穿白大褂的年长儿科医生坐在木桌前,在空文件夹和小齿轮模型旁做笔记

约翰·加尔是在美国密歇根州安娜堡为孩子们看诊40多年的儿科医生,还曾在密歇根大学担任儿科临床副教授。他的本职是儿童的发育与行为问题,但他另外抽出时间,收集了大大小小的系统为何无法如预期运转的案例。

  • 第一本书(General Systemantics):1975年,他把多年收集的失败案例和教训汇编成《一般系统学》一书出版。
  • 再版(Systemantics):两年后的1977年,该书以《系统学:系统如何运转,尤其是如何失败》为题再次出版,广为流传。
  • 修订版(The Systems Bible):1986年出版了篇幅几乎翻倍的第2版,2002年又以《系统圣经》为题出版了第3版。

这本书像墨菲定律或彼得原理一样,用简短而机智的句子阐释系统的特性。其中最著名的一句话,后来被人们称为“加尔定律”。但在书中,它其实并没有这个名字。


构成定律的三句话

在明亮的桌面上,从左到右依次摆放着用几块木积木搭成的小塔、稍大一些的结构,以及在同一底座上长成的大型积木城堡

加尔定律通常被概括为一句话来说,但原文其实是由三句话连在一起构成的。

(1) 成功的复杂系统有一个简单的起点
追溯一个能正常运转的复杂系统,总能找到一个能正常运转的简单系统。也就是说,复杂性并不是从一开始就设计出来的,而是在保持运转的状态下一点点积累的结果。

(2) 一开始就做得复杂的系统,连修补都无济于事
加尔断言,从零开始一次性设计出的复杂系统无法运转,无论怎样修修补补也救不活。因为没有人能事先完全知道各个部分会如何相互交织、相互作用。纸面上看似完美的设计,一旦真正开始咬合运转,意想不到的冲突就会在各处同时爆发。

(3) 必须从简单的东西重新开始
那么解决办法只有一个:重新建立一个能运转的简单系统,再从那里重新成长。即使已经投入的努力令人惋惜,与其抱着无法运转的庞大设计不放,不如从小处重新开始,最终反而更快。

不过,加尔在这几句话之前加了一个前提:简单的系统也可能运转,也可能不运转。简单并不能保证成功,他想说的是,成功的复杂系统,其起点是简单的。


体现这一定律的案例

在阳光明媚的草地上,一棵小树苗生长在枝叶伸展的大树旁

随着系统设计者的引用,加尔定律传播到了信息技术领域。系统设计者肯·奥尔(Ken Orr)早在1981年就介绍过这句话,从1991年起,面向对象设计大师格雷迪·布奇(Grady Booch)也在多本著作中反复引用。

从小处起步、逐渐成长的万维网

万维网起源于用链接把文档与文档连接起来的极其简单的结构。最初它只是研究人员分享资料的工具,但在这个能运转的骨架之上,图片、搜索、购物、视频相继加入,最终成为今天这个庞大的系统。正因为一开始没有规定好所有用途,新功能反而能够自然地扎根。

一开始就设计得庞大的标准

相反,那些一开始就试图涵盖所有情况的复杂技术规范,往往难以在实际中站稳脚跟。用于连接不同程序的分布式对象标准CORBA,常被作为以庞大规范起步却未能广泛普及的例子。


在实践中遵循加尔定律的方法

在明亮的办公室里,一个小型开发团队聚在贴着一小排便利贴的白板前,指着笔记本电脑屏幕交谈

加尔定律与短周期开发、频繁修改的敏捷开发(Agile Software Development)非常契合。尤其是极限编程(Extreme Programming),主张先做出最简单的东西,功能以后再加。

(1) 先做出最小的成品
即使功能不多,也要先推出一个从头到尾真正能运转的最小产品。一边观察用户的反应一边只添加需要的东西,就能减少在无用设计上花费的精力。

(2) 始终保持可运转的状态
每次添加功能时,都要确认系统仍能正常运转。与其一次性大改,不如小步修改并立即测试,这样也更容易找到问题的原因。

(3) 警惕仓促造出的庞大
如今借助人工智能编程工具,可以在转瞬之间造出庞大的系统,但组装得快,并不意味着就能避开加尔所说的失败。速度越快,从小处起步的原则就越重要。


加尔定律并不是说不要构建复杂系统,而是提醒我们,通往复杂有一条正确的路径。比起宏大而漂亮的蓝图,一个今天就能正常运转的小系统,能带你走得更远。

先做小、让它正常运转,再一步步扩展——这就是打造坚实系统的第一步。