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

奧卡姆剃刀

在互聯(lián)網(wǎng)時(shí)代,相信幾乎每個(gè)人都聽(tīng)說(shuō)過(guò)「奧卡姆剃刀定律」,但是你真的懂它的意思嗎?更進(jìn)一步,你真的知道在實(shí)際中如何運(yùn)用奧卡姆剃刀定律嗎?

我們先看一下百度百科對(duì)它的定義:

奧卡姆剃刀定律(Occam's Razor, Ockham's Razor)又稱(chēng)“奧康的剃刀”,它是由14世紀(jì)英格蘭的邏輯學(xué)家、圣方濟(jì)各會(huì)修士奧卡姆的威廉(William of Occam,約1285年至1349年)提出。這個(gè)原理稱(chēng)為“如無(wú)必要,勿增實(shí)體”,即“簡(jiǎn)單有效原理”。正如他在《箴言書(shū)注》2卷15題說(shuō)“切勿浪費(fèi)較多東西去做,用較少的東西,同樣可以做好的事情?!?/p>

對(duì)于任何一個(gè)概念,看定義無(wú)疑是第一步也是重要的一步,但是“紙上得來(lái)終覺(jué)淺”,要想把一個(gè)概念吃透——真正掌握,必然要在實(shí)踐中反復(fù)去體悟才行。上面的定義雖然清晰,但也容易造成一些誤導(dǎo)。“簡(jiǎn)單有效原理”似乎在暗示奧卡姆剃刀定律就是極簡(jiǎn)主義,相信有很多人也是這么認(rèn)為的。

奧卡姆剃刀定律是極簡(jiǎn)主義嗎?

奧卡姆剃刀最初被用在自然科學(xué)的相關(guān)理論中,作為啟發(fā)技巧來(lái)使用,我們可以先從自然科學(xué)的一些例子中來(lái)理解它。在物理學(xué)里,物理學(xué)家通常都致力于用最簡(jiǎn)單的公式來(lái)闡述一個(gè)基本理論,這可以看作是對(duì)奧卡姆剃刀的一個(gè)應(yīng)用。我們熟知的很多物理定律都有非常簡(jiǎn)潔的形式,比如大名鼎鼎的牛頓第二定律:

F=ma

比如愛(ài)因斯坦質(zhì)能方程:

E=mc^2

比如,牛頓萬(wàn)有引力定律:

萬(wàn)有引力

在愛(ài)因斯坦出現(xiàn)之前,牛頓毫無(wú)疑問(wèn)是對(duì)人類(lèi)歷史影響最大的科學(xué)家。愛(ài)因斯坦的相對(duì)論打破了牛頓力學(xué)的規(guī)律,為物理學(xué)開(kāi)辟了一個(gè)新的天地。說(shuō)白了,相對(duì)論出來(lái)之后,萬(wàn)有引力定律就”不正確“了。不過(guò),你好像從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)牛頓力學(xué)是錯(cuò)的吧?其實(shí)理論沒(méi)有絕對(duì)的對(duì)錯(cuò),只有哪個(gè)更具有解釋性而已,相對(duì)論適合大質(zhì)量物質(zhì)之間的相互作用(比如太陽(yáng),黑洞),其重力場(chǎng)方程的公式如下:

愛(ài)因斯坦重力場(chǎng)方程

是不是要比萬(wàn)有引力定律的公式復(fù)雜多了???其實(shí)牛頓力學(xué)在你所能遇見(jiàn)的絕大多數(shù)場(chǎng)景里仍然都是”正確“的,根據(jù)奧卡姆剃刀原則,我們就沒(méi)必要在這種場(chǎng)景下使用廣義相對(duì)論。然而,舉個(gè)極端例子,當(dāng)處理黑洞問(wèn)題的時(shí)候你有必須得使用愛(ài)因斯坦的廣義相對(duì)論,雖然它“并不簡(jiǎn)單”。

奧卡姆剃刀定律說(shuō)的并不是“簡(jiǎn)單”=“有效”,也不會(huì)刻意追求“簡(jiǎn)單”,你可以理解為它追求的是相對(duì)簡(jiǎn)單:在能滿(mǎn)足需要的前提下,追求更簡(jiǎn)單的那一個(gè);而當(dāng)滿(mǎn)足需要的只有一種選擇時(shí),你根本用不到奧卡姆剃刀定律。

用來(lái)如果關(guān)于同一個(gè)問(wèn)題有許多種理論,每一種都能作出同樣準(zhǔn)確的預(yù)言,那么應(yīng)該挑選其中使用假定最少的。- wiki

所以,奧卡姆剃刀并不是極簡(jiǎn)主義,不是要刻意追求極簡(jiǎn),實(shí)際上奧卡姆剃刀是實(shí)用主義,實(shí)用優(yōu)先,在滿(mǎn)足需求的情況下絕不搞復(fù)雜的事情。回到我們的主題,在程序員的日常工作中,該怎么利用奧卡姆剃刀呢?

程序員手中的剃刀

構(gòu)建的角度/開(kāi)發(fā)

構(gòu)建指的是你創(chuàng)作一個(gè)東西,也就是程序員工作中的開(kāi)發(fā)任務(wù)。在開(kāi)發(fā)工作中我們需要用到奧卡姆剃刀,再重述一下前面的結(jié)論:奧卡姆剃刀是實(shí)用主義,實(shí)用優(yōu)先,在滿(mǎn)足需求的情況下絕不搞復(fù)雜的事情。一句話, 不要濫用你的技術(shù)。能用簡(jiǎn)單的手段解決的問(wèn)題,絕對(duì)不要用復(fù)雜的辦法。關(guān)于這個(gè)問(wèn)題已經(jīng)有無(wú)數(shù)的大牛和前輩給我們分享過(guò)了經(jīng)驗(yàn),如果你了解淘寶架構(gòu)的演變歷史(https://www.cnblogs.com/bianqi/p/12184331.html)就不難理解這個(gè)道理。架構(gòu)的設(shè)計(jì)最能體現(xiàn)奧卡姆剃刀原則,加入創(chuàng)業(yè)公司做一個(gè)網(wǎng)站,上來(lái)就做一個(gè)媲美淘寶的架構(gòu),雖然技術(shù)上你可能是很厲害,但你的公司肯定會(huì)完蛋了。這個(gè)極端的例子不難理解,而在實(shí)際的開(kāi)發(fā)中,有些權(quán)衡和取舍并沒(méi)有那么容易“一眼看穿”,所以需要你不斷用奧卡姆剃刀的思維去審視自己的工作。

解構(gòu)的角度/學(xué)習(xí)

根據(jù)邏輯學(xué),奧卡姆剃刀定律的逆反命題也一定成立。

原命題:如無(wú)必要,勿增實(shí)體。

逆反命題:如果增加了實(shí)體,證明一定有其必要性。

實(shí)際上我們常常忽略這個(gè)逆反命題的作用。程序員每天除了開(kāi)發(fā)任務(wù),還有大量的時(shí)間和精力需要用來(lái)學(xué)習(xí)新的技術(shù)。一個(gè)新技術(shù)的出現(xiàn),和舊的技術(shù)相比一定是解決了某些問(wèn)題。如果僅僅因?yàn)椤靶隆?,或者“高大上”,是不足以使一門(mén)新技術(shù)發(fā)展并流行起來(lái)的,這符合奧卡姆剃刀逆反定律。所以在學(xué)習(xí)新技術(shù)的時(shí)候,我們要時(shí)刻用這樣的思維來(lái)指導(dǎo)自己,比如:

  • MySQL已經(jīng)那么強(qiáng)大了,為什么最近這些年NoSQL數(shù)據(jù)庫(kù)很火,NoSQL的出現(xiàn)一定是解決了一些MySQL無(wú)法解決的事情,那是什么?
  • 面向?qū)ο缶幊倘绱似毡楹蛷?qiáng)大了,為什么還會(huì)有Scala這樣的函數(shù)式編程語(yǔ)言流行,函數(shù)式編程解決了什么問(wèn)題?
  • Hadoop不香嗎? 為啥Spark現(xiàn)在越來(lái)越火?要看Spark和Hadoop有什么區(qū)別,最好先看一下Spark解決了哪些Hadoop不能解決的核心問(wèn)題。

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


總之,應(yīng)用奧卡姆剃刀定律和奧卡姆剃刀的逆反定律作為指導(dǎo)思想,對(duì)我們的開(kāi)發(fā)和學(xué)習(xí)有很大的指導(dǎo)作用。所以說(shuō),每一位程序員手里都應(yīng)該有一把。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容