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