每一位程序员手中都应该有一把「奥卡姆剃刀」
在互联网时代,相信几乎每个人都听说过「奥卡姆剃刀定律」,但是你真的懂它的意思吗?更进一步,你真的知道在实际中如何运用奥卡姆剃刀定律吗?
我们先看一下百度百科对它的定义:
奥卡姆剃刀定律(Occam’s Razor, Ockham’s Razor)又称“奥康的剃刀”,它是由14世纪英格兰的逻辑学家、圣方济各会修士奥卡姆的威廉(William of Occam,约1285年至1349年)提出。这个原理称为“如无必要,勿增实体”,即“简单有效原理”。正如他在《箴言书注》2卷15题说“切勿浪费较多东西去做,用较少的东西,同样可以做好的事情。”
对于任何一个概念,看定义无疑是第一步也是重要的一步,但是“纸上得来终觉浅”,要想把一个概念吃透——真正掌握,必然要在实践中反复去体悟才行。上面的定义虽然清晰,但也容易造成一些误导。“简单有效原理”似乎在暗示奥卡姆剃刀定律就是极简主义,相信有很多人也是这么认为的。
奥卡姆剃刀定律是极简主义吗?
奥卡姆剃刀最初被用在自然科学的相关理论中,作为启发技巧来使用,我们可以先从自然科学的一些例子中来理解它。在物理学里,物理学家通常都致力于用最简单的公式来阐述一个基本理论,这可以看作是对奥卡姆剃刀的一个应用。我们熟知的很多物理定律都有非常简洁的形式,比如大名鼎鼎的牛顿第二定律:
比如爱因斯坦质能方程:
比如,牛顿万有引力定律:
在爱因斯坦出现之前,牛顿毫无疑问是对人类历史影响最大的科学家。爱因斯坦的相对论打破了牛顿力学的规律,为物理学开辟了一个新的天地。说白了,相对论出来之后,万有引力定律就”不正确“了。不过,你好像从来没有听说过牛顿力学是错的吧?其实理论没有绝对的对错,只有哪个更具有解释性而已,相对论适合大质量物质之间的相互作用(比如太阳,黑洞),其重力场方程的公式如下:
是不是要比万有引力定律的公式复杂多了🙂?其实牛顿力学在你所能遇见的绝大多数场景里仍然都是”正确“的,根据奥卡姆剃刀原则,我们就没必要在这种场景下使用广义相对论。然而,举个极端例子,当处理黑洞问题的时候你有必须得使用爱因斯坦的广义相对论,虽然它“并不简单”。
奥卡姆剃刀定律说的并不是“简单”=“有效”,也不会刻意追求“简单”,你可以理解为它追求的是相对简单:在能满足需要的前提下,追求更简单的那一个;而当满足需要的只有一种选择时,你根本用不到奥卡姆剃刀定律。
用来如果关于同一个问题有许多种理论,每一种都能作出同样准确的预言,那么应该挑选其中使用假定最少的。- wiki
所以,奥卡姆剃刀并不是极简主义,不是要刻意追求极简,实际上奥卡姆剃刀是实用主义,实用优先,在满足需求的情况下绝不搞复杂的事情。回到我们的主题,在程序员的日常工作中,该怎么利用奥卡姆剃刀呢?
程序员手中的剃刀
构建的角度/开发
构建指的是你创作一个东西,也就是程序员工作中的开发任务。在开发工作中我们需要用到奥卡姆剃刀,再重述一下前面的结论:奥卡姆剃刀是实用主义,实用优先,在满足需求的情况下绝不搞复杂的事情。一句话, 不要滥用你的技术。能用简单的手段解决的问题,绝对不要用复杂的办法。关于这个问题已经有无数的大牛和前辈给我们分享过了经验,如果你了解淘宝架构的演变历史(https://www.cnblogs.com/bianqi/p/12184331.html)就不难理解这个道理。架构的设计最能体现奥卡姆剃刀原则,加入创业公司做一个网站,上来就做一个媲美淘宝的架构,虽然技术上你可能是很厉害,但你的公司肯定会完蛋了。这个极端的例子不难理解,而在实际的开发中,有些权衡和取舍并没有那么容易“一眼看穿”,所以需要你不断用奥卡姆剃刀的思维去审视自己的工作。
解构的角度/学习
根据逻辑学,奥卡姆剃刀定律的逆反命题也一定成立。
原命题:如无必要,勿增实体。
逆反命题:如果增加了实体,证明一定有其必要性。
实际上我们常常忽略这个逆反命题的作用。程序员每天除了开发任务,还有大量的时间和精力需要用来学习新的技术。一个新技术的出现,和旧的技术相比一定是解决了某些问题。如果仅仅因为“新”,或者“高大上”,是不足以使一门新技术发展并流行起来的,这符合奥卡姆剃刀逆反定律。所以在学习新技术的时候,我们要时刻用这样的思维来指导自己,比如:
- MySQL已经那么强大了,为什么最近这些年NoSQL数据库很火,NoSQL的出现一定是解决了一些MySQL无法解决的事情,那是什么?
- 面向对象编程如此普遍和强大了,为什么还会有Scala这样的函数式编程语言流行,函数式编程解决了什么问题?
- Hadoop不香吗? 为啥Spark现在越来越火?要看Spark和Hadoop有什么区别,最好先看一下Spark解决了哪些Hadoop不能解决的核心问题。
在很多问题上你都可以这样去思考,如果你真的能搞清楚新技术中增加的“实体”有哪些“必要性”,那一定会起到提纲挈领的作用,让你对新技术有一个宏观的把握,从而对其理解的更加透彻、深刻。
总之,应用奥卡姆剃刀定律和奥卡姆剃刀的逆反定律作为指导思想,对我们的开发和学习有很大的指导作用。所以说,每一位程序员手里都应该有一把。