在打造一项新服务时,人们常会想从一开始就画出一套功能齐全的完美系统。会员管理、支付、推荐、统计,一次性设计、一次性完成,看起来要高效得多。然而,起步越宏大的项目,最终越常常无法正常运转。用一句话概括这一现象的经验法则,就是“加尔定律(Gall's Law)”。
简单来说,加尔定律是指“能正常运转的复杂系统,总是从能正常运转的简单系统成长而来”这一原则。它是美国儿科医生兼作家约翰·加尔(John Gall)在研究系统失败方式时提出的,如今在软件设计和产品开发领域经常被引用。
本文将依次介绍加尔定律的由来、定律中三句话的含义、实际案例,以及在实践中遵循这一定律的方法。

系统从简单成长为复杂的原理
一位儿科医生写下的系统故事

约翰·加尔是在美国密歇根州安娜堡为孩子们看诊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) 警惕仓促造出的庞大
如今借助人工智能编程工具,可以在转瞬之间造出庞大的系统,但组装得快,并不意味着就能避开加尔所说的失败。速度越快,从小处起步的原则就越重要。
加尔定律并不是说不要构建复杂系统,而是提醒我们,通往复杂有一条正确的路径。比起宏大而漂亮的蓝图,一个今天就能正常运转的小系统,能带你走得更远。
先做小、让它正常运转,再一步步扩展——这就是打造坚实系统的第一步。