下面是15條來自軟件開發(fā)實踐中的基本規(guī)律法則:
奧卡姆剃刀
這個著名的格言可以追溯到14世紀(jì)的哲學(xué)家和修士William_of_Ockham,奧卡姆剃刀(Occam's razor)通常描述為:
在有多個相互競爭性的理論中,選擇那個最少的假設(shè)解釋的理論(因為假設(shè)越多,錯誤的概率越多)。
這個原理最早至少能追溯到亞里士多德的“自然界選擇最短的道路”。在大多數(shù)情況下,如果我們可以選擇理論,那么無疑選擇越簡單的越好。
但是這個原理被人們還總結(jié)簡單有效原理:如無必要,勿增實體。切勿浪費較多東西去做,用較少的東西,同樣可以做好的事情。也就是將復(fù)雜事情簡單化。
這種解釋其實偏離了奧卡姆剃刀的原話,奧卡姆剃刀的原話中有一個前提是,存在多個相互競爭性理論的情況下,傾向于選擇簡單那一個。這句話的意思不等同于“如無必要,勿增實體”,因為后者的假設(shè)前提是“如無必要”,這個前提與奧卡姆剃刀原話的前提不是同一的,因為是否必要是非常主觀的,假設(shè)當(dāng)前只有一個方案,那么主觀者會認(rèn)為沒有必要再探索其他方案了;如果過了一段時間,其他人又提出一個簡單方案,這個主觀者會認(rèn)為已經(jīng)沒有必要再考慮第二個方案,盡管按照奧卡姆剃刀原意還是需要將這兩個方案進行比較,有可能第二個方案更簡單,能夠入選。
在多個方案中選擇簡單的,不代表否定進行多個方案的論證,如同我們進行軟件開發(fā)與設(shè)計,如果僅僅認(rèn)為功能足夠可以運行了,沒有必要再加入過多設(shè)計,設(shè)計模式和其他最佳實踐是多余的,這種懶惰認(rèn)識反而是有害的,相反,設(shè)計模式和最佳實踐或者面向?qū)ο蠡蛘吆瘮?shù)式方案有可能是出其意外地簡單巧妙。這些如果你不首先進行復(fù)雜化,又如何能夠在復(fù)雜基礎(chǔ)上真正獲得簡單的解決方案呢?
Hanlon的剃刀(Hanlon's razor)
Never attribute to malice what can be adequately explained by stupidity,如果能夠使用無知解釋,就無需歸因于惡意。
軟件測試中經(jīng)常讓程序員懊惱的是測試員或用戶總是挑選自己的死穴進行測試,其實大部分情況下他們不是惡意或故意的,而是對你的程序邏輯的無知導(dǎo)致,這種無知的測試正是軟件測試的無盲點測試。
現(xiàn)實生活中也是經(jīng)常有這樣情況,很多人出于無知,或者無意識地犯錯,那么我們就不能再歸因于他們出于惡意,因為惡意必須是意識到了再去故意違反,所以,在法律上,故意殺人與正當(dāng)防衛(wèi)的無意殺人在量刑上是區(qū)別對待的。
Hanlon的剃刀也是讓我們寬宏原諒別人的一個約定俗成的理由。
帕累托原則(二八定律 80/20定律)
“80%的影響源于20%的原因。”1897年,意大利經(jīng)濟學(xué)者帕累托發(fā)現(xiàn):20%的人占有80%的社會財富。
在軟件開發(fā)調(diào)試中,我們會發(fā)現(xiàn)大量問題和Bug,也許你會感到泄氣,但是奇怪的是,當(dāng)你解決一個問題后,會發(fā)現(xiàn)其他很多錯誤竟然消失了,這說明,大部分的問題其實都是由一些共同原因引起的。
簡而言之,立刻解決許多問題的最快方法是找到共同的根源并修復(fù)他們。
達(dá)克效應(yīng)(鄧寧-克魯格效應(yīng)(Dunning-Kruger effect)
"非熟練專業(yè)人員經(jīng)常會對自己的能力產(chǎn)生認(rèn)知偏差,以為自己的能力比他們實際能力要強大得多“
這個定律認(rèn)為相對不熟練的人會遭受虛幻的優(yōu)越感,錯誤地評估他們的真實能力,用中國俗語解釋:滿瓶不動半瓶搖。當(dāng)然一些研究表明,不同的社會文化也在其中發(fā)揮作用。例如,東方人往往會低估自己的能力,不斷尋找機會提高自己和他人。
類似概念有:儒家孔子認(rèn)為”知之為知之不知為不知“,蘇格拉底認(rèn)為“真正的知識是知道自己的無知的程度“。老子:知人者智,自知者明。
林納斯定律
雷蒙德的名言,“足夠多的眼睛,就可讓所有問題浮現(xiàn)。”(Given enough eyeballs, all bugs are shallow)
換句話說,如果你不能找到問題,就去尋求他人的幫助。 這也是為什么需要結(jié)對編程和軟件測試的原因。
健壯性原則(又名Postel法則/伯斯塔爾法則)
在軟件開發(fā)中有一個基本思想,特別是API設(shè)計等領(lǐng)域,可以簡明地表達(dá)為健壯性:
嚴(yán)以律己,寬以待人。
最早這個規(guī)范是針對TCP協(xié)議設(shè)計的,當(dāng)代碼發(fā)送命令或數(shù)據(jù)到其他機器時應(yīng)該完全符合規(guī)格,但代碼接收其他輸入應(yīng)該可以接受非標(biāo)準(zhǔn)一致的輸入,只要這個輸入意思清楚。
在函數(shù)式編程中,這個原理表現(xiàn)為輸入類型是逆變的(contravariant),而輸出類型應(yīng)該是協(xié)變的(covariant)。在程序員中,產(chǎn)生兼容的功能,原理是推廣[引文需要]的形式在輸出型的輸入類型和協(xié)變是逆變。
Eagleson定律
程序員離開項目一段時間后再去看看自己的代碼,心里經(jīng)??赡芰R娘,這是哪個白癡寫的代碼?
自己的代碼如果六個月以上沒有沒有再看,如同其他人編寫一樣。
記住,下次你再加入一個項目你已經(jīng)離開好幾個月。 代碼是 不再你的代碼 ;它是別人的,你現(xiàn)在負(fù)責(zé)改善。
彼得原理
彼得原理是管理心理學(xué)的一種心理學(xué)效應(yīng),指每個員工不斷遷升,最終趨向于上升到他所不能勝任的崗位。對一個組織而言,一旦組織中的相當(dāng)部分人員被推到了其不稱職的職位,就會造成組織的人浮于事,效率低下,導(dǎo)致平庸者出人頭地,發(fā)展停滯。
呆伯特的原則
漫畫的主人公呆伯特,是一位白領(lǐng)工人、電氣工程師,也是全世界聞名的倒霉蛋,其上司愚蠢、官僚。其原則是:
沒有能力的員工將比有能力的員工更能提拔到管理崗位,從而將他們從實際工作中去除,以減少他們可能造成的危害。
霍夫斯塔特定律
實際花費的時間總是超過你的預(yù)期,所以,你只能加班,唉,程序員加班很苦逼啊。
90-90 規(guī)則
因為事情總是出錯,因為人是出了名的不擅長估算自己的技術(shù)水平:
"百分之90開發(fā)時間花在90%代碼上,剩余的10%代碼量卻又花費了90%的開發(fā)時間“
這也許解釋了為什么那么多軟件項目最后超出預(yù)算
帕金森定律
是官僚主義或官僚主義現(xiàn)象的一種別稱,被稱為二十世紀(jì)西方文化三大發(fā)現(xiàn)之一,“官場病”、“組織麻痹病”或者“大企業(yè)病”:
工作量總是會填滿其所需的時間。
總是有做不完的工作,
塞爾定律(Sayre's Law)
爭議的強度總是和價值成反比。也就是說:重要性越少的事情,人們越有熱情去爭議。
帕金森瑣碎定律
管理學(xué)上,帕金森發(fā)現(xiàn)一種稱為瑣碎定律現(xiàn)象。在討論非常專業(yè)而且金額龐大的事情時,一般人由于缺乏專業(yè)知識,不敢隨便發(fā)言,以免失言,貽笑大方,因此多半都會肯定(或逃避)該重大方案,而提些與主題無關(guān)的雞毛蒜皮小事。相對的,對于簡單的瑣碎小事,由于平常大家都會接觸到而且有相當(dāng)?shù)恼J(rèn)識,反而意見特別多,帕金森稱此現(xiàn)象為瑣碎定律。
在任何議程項目上所花費的時間與金錢之和成反比。
好辯定律
人們越理解某事物,他們就越愿意去爭論,他們也越好這口。