「GitHub金牌」程式設計師必讀職場15大定律和7大原則

2020-12-14 新智元

新智元報導

來源:GitHub

編輯:金磊

【新智元導讀】作一個優秀的程式設計師,除了要會寫代碼,還要懂得職場的15大定律和7大原則。昨日,GitHub趨勢榜第一的項目便總結了這些定律和原則。總有一款適合你。

總有一款適合你。

作為程式設計師,你除了會敲代碼,還得知曉屬於你的定律。今日GitHub便有一個項目總結了與開發人員相關的15大定律和7大原則。

項目地址:

https://github.com/dwmkerr/hacker-laws

該項目目錄如下:

簡介定律

阿姆達爾定律(Amdahl's Law)布魯克定律(Brooks's Law)康威定律(Conway's Law)侯世達定律(Hofstadter's Law)阿瑪拉定律的「炒作周期」(The Hype Cycle & Amara's Law)海勒姆定律(Hyrum's Law)摩爾定律(Moore's Law)帕金森定律(Parkinson's Law)普特定律(Putt's Law)泰斯勒定律(複雜性守恆定律,Tesler's Law)抽象化漏洞定律(The Law of Leaky Abstractions)瑣碎定律(The Law of Triviality)Unix哲學(The Unix Philosophy)Spotify模型(The Spotify Model)Wadler定律(Wadler's Law)

原則

魯棒性原則(The Robustness Principle,Postel's Law)SOLID單一職責原則(The Single Responsibility Principle)開放封閉原則(The Open/Closed Principle)李氏替換原則(The Liskov Substitution Principle)接口分離原則(The Interface Segregation Principle)依賴倒置原則(The Dependency Inversion Principle)TODO

那麼接下來,我們就對這些定律和原則進行一一解讀。

開發人員需知的15大定律

阿姆達爾定律(Amdahl's Law)

維基百科中對此定律的解讀是:

阿姆達爾定律,一個計算機科學界的經驗法則,因吉恩·阿姆達爾而得名。它代表了處理器並行運算之後效率提升的能力。並行計算中的加速比是用並行前的執行速度和並行後的執行速度之比來表示的,它表示了在並行化之後的效率提升情況。阿姆達爾定律是固定負載(計算總量不變時)時的量化標準。

此處舉個例子來說明:如果一個程序由兩部分組成,一部分A(必須由一個處理器執行)和一部分B(可以並行執行),那麼我們可以看到,向執行程序的系統添加多個處理器只能帶來有限的好處。它可以極大地提高B部分的速度,但是A部分的速度將保持不變。

下圖顯示了速度可能改進的一些示例:

可以看出,即使是一個50%可並行的程序,在超過10個處理單元的情況下也幾乎沒有什麼好處,而一個95%可並行的程序,在超過1000個處理單元的情況下,仍然可以顯著提高速度。

隨著摩爾定律(Moore’s Law)的放緩,以及單個處理器速度的加速放緩,並行化是提高性能的關鍵。圖形編程是一個很好的例子(使用現代基於著色器的計算,單個像素或片段可以並行呈現),這就是為什麼現代顯卡通常有成千上萬的處理核心(gpu或著色器單元)。

布魯克定律(Brooks's Law)

維基百科中對此定律的解讀是:

將人力資源添加到一個後期軟體開發項目中會使它更晚。

這條定律表明,在許多情況下,試圖通過增加更多的人來加速已經晚了的項目,將使交付日期更晚。該定律楚地表明這是一種過度簡化,但一般的推理是,鑑於新資源的增加時間和通信開銷,在短期內的速度會降低。而且,許多任務可能不是可分的,即容易在更多資源之間分配,這意味著潛在的速度增長也更低。

交付工作中常見的一句話,「九個女人不能在一個月內生孩子」是與布魯克斯定律有關,特別是某些工作不可分割或平行的事實。

康威定律(Conway's Law)

維基百科中對此定律的解讀是:

這條法律表明,一個系統的技術邊界將反映組織的結構。

設計系統的組織受限於設計這些組織的通信結構的副本。

這條定律表明,一個系統的技術邊界將反映組織的結構。康威定律表明,如果一個組織是由許多小的、不相連的單元組成的,那麼它所生產的軟體將是如此。如果一個組織更多地圍繞功能或服務的「垂直領域」構建,軟體系統也會反映出這一點。

侯世達定律(Hofstadter's Law)

維基百科中對此定律的解讀是:

即使考慮了侯世達定律,它也總是比你想像的要花更長的時間。

當你在估計某件事需要多長時間的時候,你可能聽說過這個定律。在軟體開發中,我們往往不擅長準確地估計某個東西需要多長時間才能交付,這似乎是一個老生常談的事實。

阿瑪拉定律的「炒作周期」(The Hype Cycle & Amara's Law)

維基百科中對此定律的解讀是:

我們傾向於過高估計技術在短期內的影響,並低估長期效應。

Hype Cycle(炒作周期)是技術隨著時間的推移而產生的興奮和發展的直觀表現,最初由Gartner開發。最好用視覺效果來表現:

簡而言之,這一周期表明,人們通常對新技術及其潛在影響感到興奮。團隊經常快速地投入到這些技術中,有時會對結果感到失望。這可能是因為技術還不夠成熟,或者現實世界的應用還沒有完全實現。經過一段時間,技術的能力和使用它的實際機會都會增加,團隊最終會變得富有成效。羅伊阿馬拉(Roy Amara)的名言最簡潔地概括了這一點——「我們往往高估了一項技術的短期效果,而低估了長期效果。」

海勒姆定律(Hyrum's Law)

維基百科中對此定律的解讀是:

有足夠數量的API用戶,您在公約中承諾的並不重要:系統的所有可觀察行為都將取決於某人。

Hyrum定律指出,當一個API有足夠多的消費者時,這個API的所有行為(甚至那些沒有被定義為公約的一部分的行為)最終都會被某人所依賴。一個簡單的例子可能是非功能元素,比如API的響應時間。一個更微妙的例子可能是依賴於對錯誤消息應用正則表達式來確定API錯誤類型的消費者。

即使API的公約沒有聲明關於消息內容的任何內容,表明用戶應該使用相關的錯誤代碼,一些用戶也可能使用消息,更改消息實際上會破壞這些用戶的API。

摩爾定律(Moore's Law)

維基百科中對此定律的解讀是:

集成電路中的電晶體數量大約每兩年翻一番。

摩爾的預測經常被用來說明半導體和晶片技術進步的絕對速度。事實證明,從上世紀70年代到本世紀頭十年末,摩爾的預測是非常準確的。近年來,這一趨勢發生了輕微的變化,部分原因是對組件小型化程度的物理限制。然而,並行化的進步,以及半導體技術和量子計算領域潛在的革命性變化,可能意味著摩爾定律在未來幾十年仍將適用。

帕金森定律(Parkinson's Law)

維基百科中對此定律的解讀是:

工作量不斷增大,以填補滿足工作所需的截止時間。

在其最初的背景下,這個定律是基於對官僚機構的研究。它可能被"悲觀"地應用於軟體開發計劃,理論是團隊在截止日期之前效率低下,然後在截止日期前趕緊完成工作,從而使得實際截止日期變得有些隨意。

如果將這一定律與侯世達定律結合起來,就會得出一個更加悲觀的觀點——工作量將會增大,以填補完成它所需要的時間,而且仍然比預期的要長。

普特定律(Putt's Law)

維基百科中對此定律的解讀是:

技術由兩類人主導,一類人懂他們不並需要管理的事務,另一類人管理者他們不懂的事務。

普特定律往往遵循普特推理(Putt's Corollary):

隨著時間的推移,每一個技術層次都會發展出一種能力倒置。

這些陳述表明,由於各種選擇標準和群體組織方式的趨勢,技術組織的工作層面將有一些技術人員,以及一些不了解複雜性和挑戰的管理角色的人員。

然而需要強調的是,此類定律是廣泛的概括,可能適用於某些類型的組織,而不適用於其他類型的組織。

泰斯勒定律(複雜性守恆定律,Tesler's Law)

維基百科中對此定律的解讀是:

這條定律表明,一個系統中有一定程度的複雜性是無法降低的。

系統中的某些複雜性是「無意的」。 這是由於結構不良、錯誤或者只是解決問題的糟糕建模造成的。 可以減少(或消除)這種「無意」的複雜性。然而,一些複雜性是「內在的」,這是所解決問題內在複雜性的結果。這種複雜性可以轉移,但不能消除。

這個定律中一個有趣的點,即使簡化了整個系統,內在的複雜性也沒有減少,而是轉移到了用戶身上,用戶必須以更複雜的方式行事。

抽象化漏洞定律(The Law of Leaky Abstractions)

維基百科中對此定律的解讀是:

在某種程度上,所有非平凡(non-trivial)抽象都是有漏洞的。

該定律指出,抽象化(通常用於計算以簡化複雜系統的工作)在某些情況下會「洩漏」底層系統的元素,這使得抽象化的行為方式出人意料。

加載文件並讀取其內容就是一個例子。文件系統API是較低層內核系統的抽象,內核系統本身是與更改磁碟片(或SSD的快閃記憶體)上的數據相關的物理進程的抽象。在大多數情況下,將文件處理為二進位數據流的抽象是可行的。然而,對於磁驅動器,順序讀取數據的速度將明顯快於隨機訪問(由於頁面錯誤的開銷增加),但是對於SSD驅動器,不會出現這種開銷。處理這種情況需要了解底層細節(例如,資料庫索引文件的結構是為了減少隨機訪問的開銷),開發人員可能需要了解抽象的「洩漏」實現細節。

當引入更多抽象時,上面的示例可能會變得更加複雜。Linux作業系統允許通過網絡訪問文件,但在本地表示為「普通」文件。如果存在網絡故障,這個抽象將會「洩漏」。如果開發人員將這些文件視為「正常」文件,而沒有考慮到它們可能會受到網絡延遲和故障的影響,那麼解決方案就會有bug。

瑣碎定律(The Law of Triviality)

維基百科中對此定律的解讀是:

這一定律表明,團體將把更多的時間和精力放在瑣碎或表面現象上,而不是嚴肅和實質性的問題。

Unix哲學(The Unix Philosophy)

維基百科中對此定律的解讀是:

Unix哲學是軟體組件應該很小,並且專注於做好一件特定的事情。通過將小的、簡單的、定義良好的單元組合在一起,而不是使用大型的、複雜的、多用途的程序,可以更容易地構建系統。

像「微服務體系結構」這樣的現代實踐可以被看作是這條定律的一個應用,此處,服務是小的、集中的,並且只做一件特定的事情,允許由簡單的構建塊組成複雜的行為。

Spotify模型(The Spotify Model)

維基百科中對此定律的解讀是:

Spotify模型是團隊和組織結構的一種方法,已被「Spotify」推廣。在這個模型中,團隊是圍繞功能而不是技術來組織的。

Spotify模型還普及了部落、公會、分會等組織結構的其它組成部分。

Wadler定律(Wadler's Law)

維基百科中對此定律的解讀是:

在任何語言設計中,討論這個列表中某個特性所花費的總時間與它位置的冪成正比。0.語義1.語法2.詞彙語法3.注釋的詞彙語法

類似於「瑣碎定律」,Wadler定律指出,在設計一種語言時,與這些特徵的重要性相比,花在語言結構上的時間是不成比例的。

相關焦點

  • GitHub上最火的程式設計師簡歷項目與模版下載
    )大佬們的簡歷編寫技巧簡歷這麼寫才能獲得面試官的青睞前端簡歷到底怎麼寫才能成為大廠敲門磚(贈思維導圖)簡歷模版大放送1.包括PHP程式設計師簡歷模板、iOS程式設計師簡歷模板、Android程式設計師簡歷模板、Web前端程式設計師簡歷模板、Java程式設計師簡歷模板、C/C++程式設計師簡歷模板、NodeJS程式設計師簡歷模板、架構師簡歷模板以及通用程式設計師簡歷模板https://github.com/geekcompany/ResumeSample2.
  • GitHub最熱!碼代碼不得不知的所有定律法則
    當談到開發問題時,人們總會談論各種定律。但對於大多數人來說,總有一些是你不了解的,這個問題就需要使用程式設計師最喜歡的方法解決了:最近 GitHub 上的一個「定律合集」項目突然登上了趨勢榜第二位,Star 數上千,該項目對一些最常見的定律進行了概括,詳情見下文。大家都是資深程式設計師,以後就不要老念叨「真香定律」了。
  • 推薦 10 本程式設計師必讀的算法書
    它不是一本導論,而是面向有經驗的程式設計師。書中側重為對基本算法比較熟悉的程式設計師介紹了一些算法設計的知識。你應該先看一本導論再來學習這本書。7.《算法導論:一種新的途徑》 Udi Manber加入課程學習,你將獲得 4 大權益 、 2 大福利、 299 元
  • 程式設計師必讀書單
    換句話說:優秀的程式設計師應該掌握哪些關鍵概念?哪些書籍來可以幫助程式設計師掌握這些關鍵概念?這即是這篇文章的出發點——我試圖通過 程式設計師必讀書單 這篇文章來回答上面兩個問題。標準進入必讀書單之前,我先介紹下書單裡的書籍選擇標準和領域選擇標準。
  • Laravel-基礎「程式設計師培養之路第五十三天」
    PHP >= 7.0.0PHP OpenSSL 擴展PHP PDO 擴展PHP Mbstring 擴展PHP Tokenizer 擴展PHP XML 擴展2.安裝 Composer下載地址:github(點擊 Composer-Setup.exe 按鈕)3.下載 Laravelcomposer global require "laravel/installer"第二節 配置在使用前,要確保以下幾個內容的配置是正確的,配置有問題會影響我們的項目開發。1.
  • 懶程式設計師和他的 dotfiles
    dot 即「點」的意思,意思是以點開頭的文件。如果你不是程式設計師,你大概會說,我咋從來沒見過這種文件啊?因為這些文件通常都是隱藏文件,平常一般看不到,比如 .git 目錄。但這裡說的 dotfiles 主要是指用戶 home 目錄下的點文件,這類文件一般是一些配置文件,比如 vim 的配置文件 .vimrc,zsh 的配置文件 .zshrc 等。
  • 「每天懂一點趣味心理學」最適合職場後浪的心理效應:蘑菇定律
    什麼是蘑菇定律?蘑菇定律是20世紀70年代由國外的一批年輕電腦程式員總結出來的。彼時正處在電腦行業的開端,程式設計師的工作並不被人們理解和重視,而他們不修邊幅的樣子也常常被詬病為工作態度不認真。於是,這些年輕的程式設計師就以直男思維來激勵自己:要像蘑菇一樣生活。沒有陽光,就在心中植入陽光;有了陽光,不要忘記自己曾經棲身陰暗的角落。初入世者,常常會被置於陰暗的角落,不受重視或打雜跑腿,接受各種無端的批評、指責、得不到必要的指導和提攜,處於自生自滅過程中。但是,蘑菇生長必須經歷這樣一個過程,人的成長也肯定會經歷這樣一個過程。
  • GitHub最火爆!碼代碼不得不知的所有定律法則
    /dwmkerr/hacker-laws) 的的中文翻譯,對開發人員有用的定律,理論,原則和模式(Laws, Theories, Principles and Patterns that developers will find useful.)。
  • 國內GitHub 被爆造假,IT 培訓行業的「速成班」要負多大責任?
    作為全球最大的開源社區,GitHub 對於程式設計師群體而言像是空氣般重要的存在,從代碼託管、項目管理到面試加成,可以說貫穿了程式設計師的職場生涯。文章核心內容一石激起千層浪,在多名圈內大 V 對文章進行轉載後,底下評論基本上都是一片譴責之聲,大家都認為造假行為「玷汙」了純粹的技術社區。
  • 2017年度盤點:15個最流行的GitHub機器學習項目
    數據流圖用「結點」(node)和「邊」(edge)組成的有向圖來描述數學運算。「結點」一般用來表示施加的數學操作,但也可以表示數據輸入的起點和輸出的終點,或者是讀取/寫入持久變量(persistent variable)的終點。邊表示結點之間的輸入/輸出關係。這些數據邊可以傳送維度可動態調整的多維數據數組,即張量(tensor)。
  • GitHub官方代碼掃描工具上線,免費查找漏洞
    有程式設計師調侃:「我不是在寫代碼,我是在寫 Bug。」從現在開始,你在 GitHub 上傳的代碼可以免費使用 Bug 篩查程序了。早發現,早報告,早診斷…… 以及早修復。去年 9 月,GitHub 收購代碼分析平臺企業 Semmle,宣布將在 GitHub 的開發者工作流程中引入代碼安全性流程。
  • AI「復活」《延禧攻略》眾生相
    接下來是富察皇后的畫像和劇照。AI較為逼真地還原了畫像中皇后的臉型。而這次,修復後的畫像,嘴也能動起來「說話」。當然,缺不了《延禧攻略》的女1號——魏瓔珞。除此之外,Jack Cui還修復了嘉妃和舒妃這兩位後宮佳麗的音容笑貌。「復活術」背後的黑科技僅根據古代畫像,Jack Cui是如何讓它們變得活靈活現的呢?
  • 2019年第一季度GitHub上最熱門的開源項目
    https://github.com/charlax/professional-programming Star 9952這是一個關於全棧工程師的開源項目,該已經創建3年了,但直到最近才在GitHub上大火,目前,該列表裡涵蓋了必讀編程書籍、必讀文章、其他資源清單、主題、概念五大模塊,其中主題又分為40個小節,項目的創建者charlax表示,創建這個項目的目的主要是為了幫助大家成為一個真正的全棧工程師
  • 時間管理工具2:二八定律,職場必讀管理法則
    職場中,一天八個小時,經常是一項工作還未完成又開始了新的工作,事情永遠做不完。有的人是加班去做,有的人直接拖到第二天去做,第一種對身體傷害大,第二種人犯了拖延症。對以後的升職加薪也是極為不利的,本篇章重點介紹二八定律,原則是要事第一,用80%的時間做重點的20%的事件,分清楚出工作中的主次。
  • Google 程式設計師整了個東北方言程式語言
    1 月 30 日,「程式設計師的那些事」公號還發了一張趣圖,調侃程式設計師自我隔離太久做的瘋狂項目。前幾天,我們在 GitHub 刷到了一個有趣的項目:dongbei據老萬寫文稱,這和年前被吐槽換皮的「木蘭程式語言」大有關係。看到有人吐槽「木蘭語言」沒有技術含量,老萬內心是這樣的:
  • 用YouTube產品,為你解讀交互7大定律
    本期以YouTube這個產品為例,為你解讀互動設計7大定律在YouTube的應用。Fitts定律廣泛應用於UX和UI設計。例如,該定律影響了交互式按鈕變大的慣例(特別是在手指操作的行動裝置上), 因為較小的按鈕不容易被點擊。
  • 【福利大放送】不止是Android,Github超高影響力開源大放送,學習開發必備教科書
    2、oh-my-zshhttps://github.com/robbyrussell/oh-my-zsh        俗話說,不會用 shell 的程式設計師不是真正的程式設計師,所以建議每個程式設計師都懂點 shell,有用不說,裝逼利器啊!
  • 程式設計師必讀經典長文:用十年時間自學編程
    在亞馬遜使用「title: teach, yourself, hours, since: 2000」進行高級搜索,我發現了 512 本這樣的書。在排在前十名的書籍中,有九本是編程書籍,剩下一本是關於財務管理的。用「teach yourself」代替「learn」,或者用「day」代替「hours」產生的結果類似。
  • 「每周CV論文推薦」初學深度學習人臉識別和驗證必讀文章
    在這個專欄裡,還是本著有三AI一貫的原則,專注於讓大家能夠系統性完成學習,所以我們推薦的文章也必定是同一主題的。人臉識別和驗證是當前人臉圖像在身份認證領域中最廣泛的應用,今天給大家介紹入門深度學習人臉識別必讀的文章。
  • GitHub 為編程世界帶來了什麼改變?
    GitHub 的數據去年十月份,也是就是「極客時間」上線的那個月,GitHub 發布了 2017 年度的 Octoverse 觀察報告,有很多數據非常值得關注。比如:GitHub 目前已經擁有 2400 萬用戶,橫跨 200 個國家,其中 130 萬為學生開發者。另外,GitHub 上還擁有 150 萬組織和 6700 萬 Repositories。