每一位程序員手中都應該有一把「奧卡姆剃刀」

每一位程序員手中都應該有一把「奧卡姆剃刀」

在互聯網時代,相信幾乎每個人都聽說過「奧卡姆剃刀定律」,但是你真的懂它的意思嗎?更進一步,你真的知道在實際中如何運用奧卡姆剃刀定律嗎?

奧卡姆剃刀定律(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不能解決的核心問題。

在很多問題上你都可以這樣去思考,如果你真的能搞清楚新技術中增加的“實體”有哪些“必要性”,那一定會起到提綱挈領的作用,讓你對新技術有一個宏觀的把握,從而對其理解的更加透徹、深刻。


總之,應用奧卡姆剃刀定律和奧卡姆剃刀的逆反定律作為指導思想,對我們的開發和學習有很大的指導作用。所以說,每一位程序員手裡都應該有一把。

如果你喜歡我的文章,可以在任一平臺搜索【黑客悟理】關注我,非常感謝!


分享到:


相關文章: