Github标星1.6W+,程序员不得不知的“潜规则”又火了,早知道就不会秃头了
大家好,我是你們的 前端章魚貓,一個不喜歡前端、又不喜歡吃魚的超級貓 ~
當程序員談論開發設計時,常常會聊到非常多的定律,而 GitHub 上的一個名為「hacker-laws」的倉庫收錄了一些最常見的定律、原則等,獲得了 16.5k 的 Star。
還記得所有AI教程必提的「奧卡姆剃刀原則」嗎?即:如無必要,勿增實體。
這條原則也被收藏,還有一些不太常見的費茨法則、蓋爾定律、康威定律等,都被一一收入囊中。
寫代碼累了困了?這些法則讓工作事半功倍。
前端 GitHub 地址:https://github.com/biaochenxuying/FrontEndGitHub
以下為【前端GitHub】的第 3 期內容。
定律
90-9-1 法則(1% 法則)
90-9-1 法則表明,在諸如維基這樣的互聯網社區中,90% 的用戶只看內容并不參與互動,9% 的用戶會參與討論,而只有 1% 的用戶會創造內容。
現實世界的例子:2014 年,對四個健康的數字社交網絡進行的一項研究發現,排名前 1% 的人創造了 73% 的帖子,緊隨其后的 9% 平均占 25%,其余的 90% 的人平均占 2%。
類似的,帕累托法則也指出:生活中大多數事情不是均勻分布的。這個原則也被稱為二八法則,重要的少數法則和因素稀疏原則。
帕累托法則 (The Pareto Principle or The 80/20 Rule)
生活中大多數事情不是均勻分布的。
帕累托法則可以幫你認識到大多數結果來自少數投入:
某個軟件的 80% 代碼只占了總分配時間的 20%(相反,最難的 20% 代碼部分占用了 80% 的時間)
20% 的努力產生了 80% 的結果
20% 的工作創造了 80% 的收入
20% 的錯誤導致了 80% 的崩潰
20% 的功能導致了 80% 的使用量
在 20 世紀 40 年代,公認為質量控制之父的美國羅馬尼亞工程師約瑟夫·朱蘭博士,開始將帕累托法則應用于質量問題。
這個原則也被稱為二八法則,重要的少數法則和因素稀疏原則。
現實的例子:
微軟 2002 年的報告表明,修復最常出現的 20% 錯誤,將消除 Windows 和 Office 中 80% 的 錯誤和崩潰。
彼得原理 (The Peter Principle)
在等級制度中,人往往會被提升到他們的“無法勝任的水平”。
這是由勞倫斯·彼得提出的一個管理概念。彼得原理認為,擅長工作的人會得到提升,直到他們達到不再成功的水平 (即他們所“無法勝任的水平”)?;诖?#xff0c;由于他們資歷更高,被公司開除的可能性較小 (除非他們表現非常糟糕)。而且他們將繼續擔任幾乎沒有本職技能的職位,即使那些原本讓他們成功的能力在新工作中并無必要。
有的工程師對此特別感興趣,它們最初從事的是深度的技術工作,但走上了管理其他工程師的職業道路——這意味著需要一個完全不同的技能樹。
技術成熟度曲線法則
技術成熟度曲線是高德納咨詢公司對技術最初興起和發展的視覺展現。一圖勝千言:
簡而言之,這個曲線表明,新技術及其潛在影響通常會引發一輪浪潮。
團隊快速使用這些新技術,但有時會對結果感到失望,這可能是因為該技術還不夠成熟,或者現實應用還沒有完全實現。
經過一段時間后,技術的能力提高了,使用它的實際機會會增加,最終團隊也可以提高工作效率。
羅伊·阿馬拉簡潔地總結了這一點:我們傾向于高估技術短期內的影響,并低估其長期效應。
破窗效應
在破窗理論中認為,一些明顯的犯罪跡象(或缺乏環保意識)會導致進一步的、更嚴重的犯罪(或環境的進一步惡化)。
破窗理論已應用于軟件開發中,它表明劣質代碼可能會影響后續優化的效率,從而進一步造成代碼劣化;隨著時間的推移,這種效應將會導致代碼質量大幅下降。
沒那么常見的法則,但也暗藏工作秘訣
阿姆達爾定律
阿姆達爾定律是一個顯示計算任務潛在加速能力的公式。這種能力可以通過增加系統資源來實現,通常用于并行計算中。
它可以預測增加處理器數量的實際好處,然而增加處理器數量會受到程序并行性的限制。
舉例說明:如果程序由兩部分組成,A部分必須由單個處理器執行,B部分可以并行運行。那么向執行程序的系統添加多個處理器只能獲得有限的好處。
它可以極大地提升部分 B 的運行速度,但部分 A 的運行速度將保持不變。
下圖展示了一些運行速度的提升潛能的例子:
可以看出,50% 并行化的程序在使用大于 10 個處理單元之后的速度提升收效甚微,而 95% 并行化的程序在使用超過一千個處理單元之后仍然可以顯著提升速度。
隨著摩爾定律逐漸失效,單個處理器的速度增加緩慢,并行化是提高性能的關鍵。
圖形編程是一個極好的例子,現代著色器可以并行渲染單個像素或片段。這也是現代顯卡通常具有數千個處理核心(GPU 單元)的原因。
林納斯定律
足夠多的眼睛,就可讓所有問題浮現。
簡單地說,能夠看到問題的人越多,有人解決過相關的問題或事情的可能性就越高。
最初該定律是用來描述開源模型對于項目的價值的,并適用于任意的軟件項目。同時它也可以擴展到開發流程之中——更多的代碼審查、更多的靜態分析和多重測試可以讓問題更加明顯和容易識別。
林納斯定律的一個更正式的說法如下:
如果有足夠大的測試員和聯合開發人員基礎,那么幾乎每個問題都能很快被特征化,從而讓以前遇到過類似問題的人解決。
德墨忒爾定律
得墨忒耳定律又稱最少知識原則,是一條與面向對象語言有關的軟件設計原則。
該定律表明,軟件的一個單元應該只與其直接合作者交談。
比如對象 A 引用了對象 B,對象 B 引用了對象 C,則 A 可以直接調用 B 的方法,但不應直接調用 C 的方法。所以如果 C 有一個 dothing()?的方法,A 不應該直接調用,而是用 B.getC().doThis()。
遵循這一定律可以限制代碼更改的范圍,使其以后更容易維護、更安全。
墨菲定律 (Murphy's Law / Sod's Law)
凡是可能出錯的事就一定會出錯。
墨菲定律?說明了如果一件事有可能出錯,那么就一定會出錯。
這是一句開發人員間的俗語,在開發、測試甚至在生產中都有可能會發生一些令人意想不到的事情。而這一定律也可以參考在英式英語中更為常見的?索德定理?:
如果某件事可能出錯,那么它一定會在最糟糕的時候發生。
奧卡姆剃刀 (Occam's Razor)
如無必要,勿增實體。
奧卡姆剃刀指出,在幾種可能的解決方案之中,最有可能的解決方案便是概念和假設最少的那個。因為這個解決方案最為簡單,只解決了問題,并且沒有引入額外的復雜度和可能的負面后果。
坎寧漢姆定律
在網絡上想得到正確答案的最好方法不是提問題,而是發布一個錯誤的答案。
帕金森定理 (Parkinson's Law)
在工作能夠完成的時限內,工作量會一直增加,直到所有可用時間都被填滿為止。
基于官僚機構的研究背景,該定律被應用于軟件開發中。該理論認為,團隊在截止日期之前效率低下,然后在截止日期前趕緊完成工作,從而使實際截止日期變得隨意。
將這個定理與侯世達定律相結合,則會獲得更加悲觀的觀點:為了在規定時間內完成工作,工作將增多,花費比預期更長的時間。
職場相關的原則
除了以上的這些法則,該倉庫還給出了很多的原則。
死海效應原則
"... 那些更有才華,更有效率的 IT 工程師最有可能離開——消失 ... (而那些傾向于)留下來的“剩下的人”——是最沒有才華和效率的 IT 工程師。"
死海效應表明,在任何一個組織中,工程師的技能、才華和效能往往與他們在公司的時間呈反比。
通常情況下,技術好的工程師很容易在其他的地方找到工作,并且他們往往也會這樣做。而技能過時或技術薄弱的工程師則會留在公司,因為其他地方很難找到工作。如果這些工程師在公司里獲得了加薪,他們會更愿意留在公司,因為在其他地方找到同等薪酬的工作會很有挑戰性。
呆伯特原則
公司會傾向于系統地將工作能力差的員工提升到管理層,以使他們脫離工作流程,從而限制他們所能造成的損害。
技術相關的原則
單一功能原則
每個模塊或者類只應該有一項功能。
SOLID 的第一個原則。這個原則表明模塊或者類只應該做一件事。實際上,這意味著對程序功能的單個小更改,應該只需要更改一個組件。例如,更改密碼驗證復雜性的方式應該只需要更改程序的一部分。
理論上講,這使代碼更健壯,更容易更改。知道正在更改的組件只有一個功能,這意味著測試更改更容易。使用前面的例子,更改密碼復雜性組件應該只影響與密碼復雜性相關的功能。變更具有許多功能的組件可能要困難得多。
開閉原則
實體應開放擴展并關閉修改。
SOLID 的第二個原則。這個原則指出實體(可以是類、模塊、函數等)應該能夠使它們的行為易于擴展,但是它們的擴展行為不應該被修改。
舉一個假設的例子,想象一個能夠將 Markdown 轉換為 HTML 的模塊。如果可以擴展模塊,而不修改內部模塊來處理新的 markdown 特征,而無需修改內部模塊,則可以認為是開放擴展。如果用戶不能修改處理現有 Markdown 特征的模塊,那么它被認為是關閉修改。
這個原則與面向對象編程緊密相關,讓我們可以設計對象以便于擴展,但是可以避免以意想不到的方式改變其現有對象的行為。
里氏替換原則
可以在不破壞系統的情況下,用子類型替換類型。
SOLID 的第三個原則。該原則指出,如果組件依賴于類型,那么它應該能夠使用該類型的子類型,而不會導致系統失敗或者必須知道該子類型的詳細信息。
舉個例子,假設我們有一個方法,讀取 XML 文檔。如果該方法使用基類型?file,則從?file?派生的任何內容,都能用在該方法中。如果?file?支持反向查找,并且 xml 解析器使用該函數,但是派生類型?network file?嘗試反向查找時失敗,則?network file?將違反該原則。
該原則與面向對象編程緊密相關,必須仔細建模、層次結構,以避免讓系統用戶混淆。
接口隔離原則
不應強制任何客戶端依賴于它不使用的方法。
SOLID 的第四個原則。該原則指出組件的消費者不應該依賴于它實際上不使用的組件函數。
舉一個例子,假設我們有一個方法,讀取 XML 文檔。它只需要讀取文件中的字節,向前移動或向后移動。如果由于一個與文件結構不相關的功能發生更改(例如更新文件安全性的權限模型),需要更新此方法,則該原則已失效。文件最好實現?可查詢流?接口,并讓 XML 讀取器使用該接口。
該原則與面向對象編程緊密相關,其中接口,層次結構和抽象類型用于不同組件的 minimise the coupling。Duck typing 是一種通過消除顯式接口來強制執行該原則的方法。
依賴翻轉原則
高級模塊不應該依賴于低級實現。
SOLID 的第五個原則。該原則指出,更高級別的協調組件不應該知道其依賴項的詳細信息。
舉個例子,假設我們有一個從網站讀取元數據的程序。我們假設主要組件必須知道下載網頁內容的組件,以及可以讀取元數據的組件。如果我們考慮依賴反轉,主要組件將僅依賴于可以獲取字節數據的抽象組件,然后是一個能夠從字節流中讀取元數據的抽象組件,主要組件不需要了解 TCP、IP、HTTP、HTML 等。
這個原則很復雜,因為它似乎可以反轉系統的預期依賴性(因此得名)。實踐中,這也意味著,單獨的編排組件必須確保抽象類型的正確實現被使用(例如在前面的例子中,必須提供元數據讀取器組件、HTTP 文件下載功能和 HTML 元標簽讀取器)。然后,這涉及諸如 Inversion of Control 和 Dependency Injection 之類的模式。
切斯特森圍欄 (Chesterson's Fence)
在了解現有情況背后的原因之前,不應該進行改進。
該原則與軟件工程中的消除技術負債 (Technical debt) 相關。程序的每一行最初都是出于某種原因編寫的,因此根據切斯特森圍欄原則,在更改或刪除代碼之前,即使看起來似乎是多余的或不正確的,也應該嘗試完全理解代碼的上下文和含義。
該原則的名字來源于一則故事。一個男人橫穿馬路中央的柵欄,他向市長抱怨這道柵欄沒有用還擋路,并要求拆除它。市長問他為什么要在那里建柵欄,那個人回答說不知道。市長接著說:“如果你不知道它的用途,我肯定不會讓你把它拆了。你去查查它的用途,之后我可能會允許你拆掉它?!?/p>
哲學意味的原則
魯棒性原則
在自己所做的事情上要保守, 在接受別人的事情上要自由。
通常應用于服務器應用程序開發中,該原則指出,你發送給其他人的內容應盡可能最小且符合要求,并且處理不符合要求的輸入。
該原則的目標是構建穩健的系統。如果可以理解意圖,它們可以處理不良的輸入。但是,接受錯誤格式的輸入可能存在安全隱患,特別是此類的輸入未經過充分測試。
不要重復你自己原則
系統中,每一塊知識都必須是單一、明確而權威的。
DRY 是 Do not Repeat Yourself 的縮寫。這個原則旨在幫助開發人員減少代碼的重復性,并將公共代碼保存在一個地方。最初由安德魯·亨特和戴夫·托馬斯在 1999 年出版的《程序員修煉之道》中引用。
與 DRY 相反的是 WET(功能實現兩次或者喜歡打字 Write Everything Twice or We Enjoy Typing)。
實際上,如果你在兩個或更多的地方有相同的功能,你可以使用 DRY 原則將它們合并為一個,并在任何你需要的地方重復使用。
你不需要它法則
只有當你需要某些東西的時候,才去實現它們,而不是在你預見的時候。
極限編程原則告誡開發人員,他們應該只實現當前所需的功能,并避免實現未來需要的功能,僅在必要時才實現。
遵守這一原則可以減小代碼庫大小,同時避免時間和生產力浪費在沒有價值的功能上。
KISS原則
保持簡單和直白。
KISS 原則指明了如果大多數的系統能夠保持簡單而非復雜化,那么他們便能夠工作在最佳狀態。因此,簡單性應該是設計時的關鍵指標,同時也要避免不必要的復雜度。這個短語最初出自 1960 年的美國海軍飛機工程師凱利 · 約翰遜 (Kelly Johnson)。
這一原則的最好例證便是約翰遜給設計工程師一些實用工具的故事。那時的他們正面臨著一個挑戰,即他們參與設計的噴氣式飛機必須能夠讓普通的機械師在戰場上僅僅用這些工具進行維修,因此,“直白”這個詞應指的是損壞的事物本身和修復用工具的復雜度兩者之間的關系,而非工程師們自身的能力水平。
最后
還有很多的法則和原則沒有一一指出,需要的小伙伴請點擊下面的鏈接打開查看。
hacker-laws 中文地址:https://github.com/nusr/hacker-laws-zh
前端 GitHub 地址:https://github.com/biaochenxuying/FrontEndGitHub
平時如何發現好的開源項目,可以看看這篇文章:GitHub 上能挖礦的神仙技巧 - 如何發現優秀開源項目。
覺得有用 ?喜歡就收藏,順便點個贊吧,你的支持是我最大的鼓勵!
在公眾號后臺回復:電子書 ,可以獲得 160 本前端精華書籍哦。
往期精文
全球最火的WEB開發學習路線!沒有之一!3 天就在GitHub收獲了接近 1w 點贊
GitHub上最火的、最值得前端學習的數據結構與算法項目!沒有之一
總結
以上是生活随笔為你收集整理的Github标星1.6W+,程序员不得不知的“潜规则”又火了,早知道就不会秃头了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub 上值得前端学习的数据结构与
- 下一篇: 10 个 GitHub 上超火的 CSS