奥卡姆剃刀(Occam's Razor, Ockham's Razor)是由14世纪逻辑学家奥卡姆的威廉提出的一个原理。奥卡姆(Ockham)在英格兰的萨里郡,那是他出生的地方(后人习惯称之为 "William of Occam")。这个原理称为"如无必要,勿增实体":
Entities should not be multiplied unnecessarily
此外,还有更多的关于"奥卡姆剃刀"原理的阐释:
解释任何事情都不应当增加不必要的实体数。
One should not increase, beyond what is necessary, the number of entities required to explain anything.
如果某一原因既真又足以解释自然事物的特性,则我们不应当接受比这更多的原因。
We are to admit no more causes of natural things than such as are both true and sufficient to explain their appearances.(Isaac Newton)
当你有两个处于竞争地位的理论能得出同样的结论,那么简单的那个更好。
When you have two competing theories which make exactly the same predictions, the one that is simpler is the better.
威廉使用这个原理证明了许多结论,包括“通过思辨不能得出上帝存在的结论”。这使他不受罗马教皇的欢迎[1]。在科学领域,“奥卡姆剃刀”作为一种“parsimony of explanations”的原则,具有很大的影响,爱因斯坦、霍金都明确地表示使用了这条法则来进行阐释和分析。对于商业以及生活中,作为一种简单的实用主义原则同样备受推崇,这方面的介绍可以参见附录部分的资料[2]。
在软件开发中,使用"Occam's Razor"原理是判断过度设计的一条好的法则,我们常常为了不必要的灵活性而使系统变得复杂。另一种我常见到的情况是在进行Unit Test Case设计时,很多人并非依据代码覆盖和逻辑覆盖的原则,而是简单的数据量增加或者写多处同一种情况的测试代码,测试者一厢情愿的认为这会帮助发现更多的Bug,但这只会让人难以理解测试设计的思路。
两个关于"简单"的相关性话题:
Simple is beauty
我看一个代码设计的好不好,最初的判断通常来自于直觉,它的基础就是"Simple is beauty"。之所有说是自觉,是因为"简单"并没有一个客观的标准,依靠提供者的信息和阅读者的感觉。如果从设计中我能够捕获设计者的思想,获得设计的关键抽象,在头脑中可以形成很清楚的结构图,它们的每一部分职责清楚,个体的概念明确,之间的联系也容易理解,这会给看的人一种愉悦的感觉。当然,好的设计有很多的因素,但这是最基础的"特质"[3]。而如果情况相反,则通常都是不好的设计,意味着还没有搞清楚事物本身的特征和之间联系,或者缺乏抽象和描述能力。自然界和社会的客观规律总是有章可循,但却呈现出复杂的表象,需要设计者具有很强的抽象能力来提取事物的"本质",简化这种复杂度。人的记忆力是有限的,很难理解过多概念的系统,但人却具有很强的逻辑思维能力,善于理解抽象特征,所以,如果一个设计提供的是表象的复杂度,通常很难理解,也可能意味着没有建立好的抽象。
简单并非简陋
上面提到的情况其实指的是一个系统的设计超过了它不该具备的复杂性,也就是说我们完全可能满足同样的要求下,通过分析抽象获得更简单的设计。但正如Fred Brooks所说,有的事物是本质复杂的[4]。如果一个系统打算完成10项功能,那只完成了其中5项功能的系统相比较完成了全部功能系统要简单。
本质复杂度有时候很难通过设计达到某一种简化,而常常需要通过减少一些功能来达到简单的目的。一项功能的存在总是有其价值的,如果没有原则的简化,也许系统的设计是简单了,但因为缺少了必要的功能可能使系统无法使用或极其难以使用,简而言之,"简单并非简陋"。
要简化系统的本质复杂性,需要考虑系统的使用价值和其它制约的平衡,比如时间、财务等资源性因素,以及系统设计复杂性。系统可以完成的功能就像巫师的口袋,是看不见底的,有时候为了努力保持系统设计的简单,删减一些不必要的功能是明智的。
关于这方面,我的另一个经验原则是:
当一个功能的价值没有明确时,尽量选择简单的方案。
正如人们说的,“软件开发是权衡的艺术”,要敢于舍弃,更要善于舍弃。
------
[1].引自 《What is Occam's Razor? 》 英文版, "三思科学"上的中文版:奥卡姆剃刀(Phil Gibbs 著,杉原广 补充,柯南译)
[2].《奥卡姆剃刀:影响全球精英命运的思维法则》,作者:罗耶 编译,中国民航出版社
[3].参见C.Alexzander的"建筑的永恒之道",Alexzander认为好的建筑都具有某种无名"特质"。
[4].参见Fred Brooks的 "No Silver Bullet:Essence and Accidents of Software Engineering"
See Also
------