當(dāng)程序員談?wù)撻_(kāi)發(fā)設(shè)計(jì)時(shí),常常會(huì)聊到非常多的定律,而Github上的一個(gè)名為「hacker-laws」的倉(cāng)庫(kù)收錄了一些最常見(jiàn)的定律、原則等,獲得了16.3k的Star。
還記得所有AI教程必提的「奧卡姆剃刀原則」嗎?即:如無(wú)必要,勿增實(shí)體。這條原則也被收藏,還有一些不太常見(jiàn)的費(fèi)茨法則、蓋爾定律、康威定律等,都被一一收入囊中。
寫(xiě)代碼累了困了?這些法則讓工作事半功倍
90-9-1法則(1%法則)
90-9-1 法則表明,在諸如維基這樣的互聯(lián)網(wǎng)社區(qū)中,90% 的用戶(hù)只看內(nèi)容并不參與互動(dòng),9% 的用戶(hù)會(huì)參與討論,而只有 1% 的用戶(hù)會(huì)創(chuàng)造內(nèi)容。
現(xiàn)實(shí)世界的例子:2014 年,對(duì)四個(gè)健康的數(shù)字社交網(wǎng)絡(luò)進(jìn)行的一項(xiàng)研究發(fā)現(xiàn),排名前 1% 的人創(chuàng)造了 73% 的帖子,緊隨其后的 9% 平均占 25%,其余的 90% 的人平均占 2%。
類(lèi)似的,帕累托法則也指出:生活中大多數(shù)事情不是均勻分布的。這個(gè)原則也被稱(chēng)為二八法則,重要的少數(shù)法則和因素稀疏原則。
技術(shù)成熟度曲線法則
技術(shù)成熟度曲線是高德納咨詢(xún)公司對(duì)技術(shù)最初興起和發(fā)展的視覺(jué)展現(xiàn)。一圖勝千言:
簡(jiǎn)而言之,這個(gè)曲線表明,新技術(shù)及其潛在影響通常會(huì)引發(fā)一輪浪潮。團(tuán)隊(duì)快速使用這些新技術(shù),但有時(shí)會(huì)對(duì)結(jié)果感到失望,這可能是因?yàn)樵摷夹g(shù)還不夠成熟,或者現(xiàn)實(shí)應(yīng)用還沒(méi)有完全實(shí)現(xiàn)。
經(jīng)過(guò)一段時(shí)間后,技術(shù)的能力提高了,使用它的實(shí)際機(jī)會(huì)會(huì)增加,最終團(tuán)隊(duì)也可以提高工作效率。
羅伊·阿馬拉簡(jiǎn)潔地總結(jié)了這一點(diǎn):我們傾向于高估技術(shù)短期內(nèi)的影響,并低估其長(zhǎng)期效應(yīng)。
破窗效應(yīng)
在破窗理論中認(rèn)為,一些明顯的犯罪跡象(或缺乏環(huán)保意識(shí))會(huì)導(dǎo)致進(jìn)一步的、更嚴(yán)重的犯罪(或環(huán)境的進(jìn)一步惡化)。
破窗理論已應(yīng)用于軟件開(kāi)發(fā)中,它表明劣質(zhì)代碼可能會(huì)影響后續(xù)優(yōu)化的效率,從而進(jìn)一步造成代碼劣化;隨著時(shí)間的推移,這種效應(yīng)將會(huì)導(dǎo)致代碼質(zhì)量大幅下降。
沒(méi)那么常見(jiàn)的法則,但也暗藏工作秘訣
阿姆達(dá)爾定律
阿姆達(dá)爾定律是一個(gè)顯示計(jì)算任務(wù)潛在加速能力的公式。這種能力可以通過(guò)增加系統(tǒng)資源來(lái)實(shí)現(xiàn),通常用于并行計(jì)算中。
它可以預(yù)測(cè)增加處理器數(shù)量的實(shí)際好處,然而增加處理器數(shù)量會(huì)受到程序并行性的限制。
舉例說(shuō)明:如果程序由兩部分組成,A部分必須由單個(gè)處理器執(zhí)行,B部分可以并行運(yùn)行。那么向執(zhí)行程序的系統(tǒng)添加多個(gè)處理器只能獲得有限的好處。
它可以極大地提升部分 B 的運(yùn)行速度,但部分 A 的運(yùn)行速度將保持不變。
下圖展示了一些運(yùn)行速度的提升潛能的例子:
可以看出,50% 并行化的程序在使用大于 10 個(gè)處理單元之后的速度提升收效甚微,而 95% 并行化的程序在使用超過(guò)一千個(gè)處理單元之后仍然可以顯著提升速度。
隨著摩爾定律逐漸失效,單個(gè)處理器的速度增加緩慢,并行化是提高性能的關(guān)鍵。
圖形編程是一個(gè)極好的例子,現(xiàn)代著色器可以并行渲染單個(gè)像素或片段。這也是現(xiàn)代顯卡通常具有數(shù)千個(gè)處理核心(GPU 單元)的原因。
德墨忒爾定律
得墨忒耳定律又稱(chēng)最少知識(shí)原則,是一條與面向?qū)ο笳Z(yǔ)言有關(guān)的軟件設(shè)計(jì)原則。
該定律表明,軟件的一個(gè)單元應(yīng)該只與其直接合作者交談。
比如對(duì)象 A 引用了對(duì)象 B,對(duì)象 B 引用了對(duì)象 C,則 A 可以直接調(diào)用 B 的方法,但不應(yīng)直接調(diào)用 C 的方法。所以如果 C 有一個(gè) dothing() 的方法,A 不應(yīng)該直接調(diào)用,而是用 B.getC().doThis()。
遵循這一定律可以限制代碼更改的范圍,使其以后更容易維護(hù)、更安全。
坎寧漢姆定律
在網(wǎng)絡(luò)上想得到正確答案的最好方法不是提問(wèn)題,而是發(fā)布一個(gè)錯(cuò)誤的答案。
除了以上的這些法則,該倉(cāng)庫(kù)還給出了很多的原則。
職場(chǎng)相關(guān)原則
死海效應(yīng)原則:在任何一個(gè)組織中,工程師的技能、才華和效能往往與他們?cè)诠镜臅r(shí)間呈反比。
能力強(qiáng)的人更有可能離開(kāi),能力差的人反而會(huì)留下。
呆伯特原則:公司會(huì)傾向于系統(tǒng)地將工作能力差的員工提升到管理層,以使他們脫離工作流程。
技術(shù)相關(guān)的原則:
單一功能原則:每個(gè)模塊或者類(lèi)只應(yīng)該有一項(xiàng)功能。
開(kāi)閉原則:實(shí)體應(yīng)開(kāi)放擴(kuò)展并關(guān)閉修改。
里氏替換原則:可以在不破壞系統(tǒng)的情況下,用子類(lèi)型替換類(lèi)型。
接口隔離原則:不應(yīng)強(qiáng)制任何客戶(hù)端依賴(lài)于它不使用的方法。
依賴(lài)翻轉(zhuǎn)原則:高級(jí)模塊不應(yīng)該依賴(lài)于低級(jí)實(shí)現(xiàn)。
還有一些具有哲學(xué)意味的原則:
魯棒性原則:在自己所做的事情上要保守, 在接受別人的事情上要自由。
你不需要它法則:只有當(dāng)你需要某些東西的時(shí)候,才去實(shí)現(xiàn)它們,而不是在你預(yù)見(jiàn)的時(shí)候。
KISS原則:保持簡(jiǎn)單和直白。
還有很多的法則和原則沒(méi)有一一指出,需要的小伙伴請(qǐng)點(diǎn)擊下面的鏈接打開(kāi)查看。
參考鏈接:
https://github.com/nusr/hacker-laws-zh