每個程式設計師都該知道的 5 個定律
定律-或稱法則,可以指導我們並讓我們在同伴的錯誤中學習。這篇文章中,我將介紹我每次設計或實現軟體時出現在我腦海的五大定律。其中有些和開發有關,有些和系統組織有關。它們可以幫助你成為合格的軟體工程師。
墨菲定律
“凡是可能出錯,就一定出錯。”
這條定律來源於 Edward Murphy —— 一名航天工程師在 50 年代初對火箭測試失敗的迴應。這條定律給我們的啟示是永遠在系統關鍵地方使用防禦性設計,因為系統某些地方總會出錯!
這條定律很容易引入軟體工程領域。當你將軟體暴露給終端使用者,他們會創造性地輸入一些出人意料的內容,使系統宕機。所以你需要讓你的軟體足夠健壯,能夠檢測並警告非預期行為。
當你在機器上執行軟體時,任何地方都有可能發生問題 —— 從硬碟上的系統到資料中心的電力供應。所以你必須確保你設計的架構在每個層級都可以應對故障。
我曾經有機會領略過幾次墨菲定律。 舉個例子,我曾經在一個批處理框架中使用字串“null”來表示空值,我並不認為這有問題,直到有個名字叫“Null”的使用者提交了一個交易訂單,我們的報表流程中斷了幾個小時…… 還有一次,在另一個專案中。當所有東西都準備好部署到生產環境了,突然 Azure 基礎設施故障導致我們執行自動化指令碼的伺服器宕機了。
現實世界中的經驗教訓提醒著我生活的艱難 —— “凡事可能出錯,就一定出錯”。 所以,心中牢記墨菲定律,設計健壯的軟體。
Knuth 定律
“在(至少大部分)程式設計中,過早優化是萬惡之源。”
這條定律是高德納(Donald Knuth) 的經典語錄之一,它告誡我們不要過早優化應用程式中的程式碼,直到必須優化時再優化。
的確,簡單易讀的原始碼可以滿足 99% 的效能需要,並能提高應用的可維護性。最開始使用簡單的解決方案也讓後期效能出現問題時更容易迭代和改進。
垃圾自動回收的程式語言中,字串的連線常常是過早優化的例子。在 Java 或 C# 中,String 物件是不可變的,我們學會使用其他結構動態建立字串,比如 StringBuilder。但事實上直到你分析完個應用程式前,你並不知道 String 物件建立了多少次並對效能的產生多大影響。所以首先編寫儘可能整潔的程式碼,之後在必須的時候再優化,往往這樣做更有意義。
然而,這條規則並不應該阻止你去學習程式語言的效能權衡和正確的資料結構。並且,正如所有其他效能問題,你在優化前要測量開銷。
North 定律
“每一個決定都是一次權衡”
好吧,我承認這是取自 Dan North 的演講 Decisions,Decisions,它目前還不是公認的定律。 但這條語錄影響了我做的每個決定,所以我把它放在這。
開發者日復一日的生活中,我們每天都做無數個大大小小的決定。從命名變數到自動化(手動)任務,再到定義平臺架構。
這條語錄強調無論你做的選擇是什麼,你總會放棄一個或多個選項
但這不是最重要的。 最重要的是理智地做出決定,瞭解其他選項,清楚你為什麼不選擇它們。你要始終根據當前你掌握的資訊來權衡並做出決定。
但是如果後來你瞭解到新的資訊,並發現之前的決定是錯誤的,這也沒關係。關鍵是記清楚你為什麼做出那個決定,重新評估新的選項之後再做出新的理智的決定。
重複一遍
“每一個決定都是一次權衡”
所以,做出選擇並對所有選項心知肚明。
Conway 定律
“系統設計的架構受限於生產設計,反映出公司組織的溝通架構”
在 60 年代,一位名叫 Melvin Conway 的工程師注意到公司組織結構影響到他們開發的系統的設計。他用一篇論文描述了這個觀點,並命名為“Conway 定律”。
這條定律很適用於軟體開發領域,甚至體現到程式碼層面上。交付軟體元件的各個團隊組織結構直接影響到元件的設計。
舉個例子,一個集中式的開發者團隊會開發出各元件耦合的整體應用。另一方面,分散式的團隊會開發出單獨的(微)服務,每一部分關注點分離清晰。
這些設計沒有好壞之分,但它們都是受到團隊溝通方式的影響。在全球有大量獨立開發者的開源專案,通常是模組化和可重用庫,這就是很有說服力的例子。
如今,將大的整合應用解耦成微服務已成趨勢。這很棒,因為這可以加速交付使用專案。但你也應該牢記 Conway定律,在公司組織構建中投入與技術開發同樣多的工作。
瑣碎定律(帕金森瑣碎定律)
“組織成員投入大量精力到瑣碎的事情上。”
這條定律論點是在會議中花費的時間與事情的價值成反比。的確是這樣,人們更願意把注意力和觀點放在他們熟悉的事物上,而不是複雜的問題上。
帕金森給出一個例子,一場會議中,成員們討論兩件事:為公司建核反應堆和為員工建車棚。建反應堆是一件巨大而複雜的任務,沒有人能完全掌控全域性。他們完全信賴流程和系統專家,並很快接受了專案。
另一邊,建車棚是一般人都可以做的,每個人都可以對顏色有意見。事實上,每個會議成員都會表達自己的意見,使得建車棚的決議所花費的時間遠遠超過建反應堆的。
這條定律在軟體行業十分出名,這個故事隨後也被稱為車棚效應
舉個例子,開發者會花費更多時間到討論正確縮排或函式命名,而不是討論類的職責或應用架構。這是因為每個人都能認知幾個字元的變動,但專案架構的變動則需要巨大的認知負載
你能注意到的車棚效應的另一個例子是 Scrum 演示。不要誤會我,我喜歡演示,我認為這是一個很好的機會來面對使用者並獲得對應用程式的反饋。但通常 Scrum 演示過程中的討論會轉向瑣碎問題,而不是審視全域性。這些討論也很重要,但你應該注意權衡更重要更復雜的問題。
一旦你瞭解這種規律,你將在會議和交流中發覺這種行為。 我並不是讓你在每次討論中避免“小”問題,提高你的意識可以幫助你關注真正的問題,併為這些會議做好準備。
結論
這五條定律只是我們行業中總結出的教訓中一些例子。隨著軟體開發經驗的增長,我們將會學會更多。 儘管其中某些定律現在看起來是常識,我始終堅信瞭解這些原則可以幫助你識別這些模式並做出反應。
相關推薦
每個程式設計師都該知道的 5 個定律
定律-或稱法則,可以指導我們並讓我們在同伴的錯誤中學習。這篇文章中,我將介紹我每次設計或實現軟體時出現在我腦海的五大定律。其中有些和開發有關,有些和系統組織有關。它們可以幫助你成為合格的軟體工程師。 墨菲定律 “凡是可能出錯,就一定出錯。” 這條定律來源於 Edward Murphy —— 一名
每個程式設計師都應該知道的 15 個最佳 PHP 庫
1. PChart PChart是一個令人印象深刻的PHP庫,可以以一種視覺化圖表的形式生成文字資料。資料可以展示為柱狀圖,餅狀圖,以及其他格式。使用SQL查詢可以幫助PHP指令碼建立令人驚歎的圖表和圖形。 2. PHP CAPTCHA PHP CAPTCHA是另一個偉
每個程式設計師都應該知道的8個Linux命令
cat cat – 連線檔案,並輸出結果 sort sort – 檔案裡的文字按行排序 grep grep, egrep, fgrep – 打印出匹配條件的文字行 cut cut – 刪除檔案中字元行上的某些區域 sed se
linux 每個程式設計師都應該知道的8個Linux命令
每個程式設計師,在職業生涯的某個時刻,總會發現自己需要知道一些Linux方面的知識。我並不是說你應該成為一個Linux專家,我的意思是,當面對linux命令列任務時,你應該能很熟練的完成。事實上,學會了下面8個命令,我基本上能完成任何需要完成的任務。 注意:下
每個程式設計師都該學習的5種開發語言
轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://dzone.com/articles/5-programming-languages-every-master-developer-sho 我曾在某
每個程式設計師都該有個自己的部落格,分享我的四種部落格搭建教程!
![](https://img-blog.csdnimg.cn/20210125093223682.jpg) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) > 沉澱、分享、成長,讓自己和他人都能有所收穫!
小黃鴨除錯法,每個程式設計師都要知道的
花了一下午(或一天)在試圖解決某個 Bug,後來才知道解決方案很簡單,當時就是沒有想到。 有個同事正好路過,看到你愁眉苦臉的,問你“怎麼了呀?” “噢,是這樣的。我遇到了一個問題,點選這個控制元件的時……” 當你正準備和同事詳細解釋的時候,突然靈光一現,你話都沒說完
每個程式設計師都需要知道一些遊戲網路知識
作為一個程式設計師,你有沒有想象過多人遊戲是如何實現的? 在外行人看來遊戲很神奇:兩個或者更多的玩家在網路上分享共同的經歷,就像他們真實的存在於相同的虛擬的世界一樣。遊戲看起來猶如一個巨大的魔術,奇妙而又刺激,但作為一個開發人員我們知道,真實的情況和我們所看到的並不一樣,那
每個程式設計師都應該知道的
http://projectmona.com/bits-of-brilliance-session-five/ 裡面內容很雜但很豐富,是UIUC教授Jeff Erickson在程式設計方面的個人收集(其他收集可以參見:http://projectmona.com/bits-
(不斷更新)每個程式設計師都應該知道的那些事兒
http://projectmona.com/bits-of-brilliance-session-five/裡面內容很雜但很豐富,是UIUC教授Jeff Erickson在程式設計方面的個人收集(其他收集可以參見:http://projectmona.com/bits-of
每個Java程式設計師都應該知道的5個JVM命令列標誌
JVM是多數開發人員視為理所當然的Java功能和效能背後的重負荷機器。然而,我們很少有人能理解JVM是如何進行工作的—像任務分配和垃圾收集、轉動執行緒、開啟和關閉檔案、中斷和/或JIT編譯Java位元組碼,等等。 不熟悉JVM將不僅會影響應用程式效能,而且當J
鳳凰大廳源碼代理每個程序員都該知道的 5 個定律
分布 軟件工程師 出現問題 經驗教訓 數據結構 團隊溝通 自己的 開發者 重用 定律或稱法則,可以指導我們並讓我們在同伴的錯誤中學習。鳳凰大廳源碼代理(h5.hxforum.com)聯系方式170618633533企鵝2952777280 (http://yhgj8004.
程式設計師最喜歡的5個開發工具,每個人都會喜歡它!
Atom Atom是github專為程式設計師設計的跨平臺文字編輯器,它支援巨集,自動分屏功能,並與檔案管理器整合。 (1)、免費 (2)、git原生支援 (3)、豐富的外掛 (4)、自定義介面 Emacs (1)、瀏覽網頁以觀看視訊併發送和接收電子郵件。 (2)、偵錯程式 (3)、玩遊戲,
每個程式設計師都應該學習的5種程式語言
瞭解一種或者真正的編碼語言是很好的,但作為一個真正的多語言開發人員是如何實現真正的主要狀態。 我在某處讀到程式設計師應該每年學習一種新的程式語言(我認為它的程式碼完整,但不確定),但如果你不能這樣做,我建議你至少學習以下五種程式語言,以便在你的職業生涯中取得好成績。 。
提高程式設計師工作效率的5個工具
這份清單是我們期待已久的,這些高效的工具對於程式設計師是大有幫助的,你一旦開始使用,就會離不開它們。 1.Git 以前是有不少的版本控制工具,有好用的,同時也有不太好用的,但總的來說它們都沒有很好的發展。這時候Git出現了,還有GitHub,EGit,一旦你用上了這個神奇的工具,估計你就很難
每個程式設計師都應當瞭解的11句話
1.技術只是解決問題的選擇,而不是解決問題的根本 我們可以因為掌握了最新的JavaScript框架ahem、Angular的IoC容器技術或者某些程式語言甚至作業系統而歡欣雀躍,但是這些東西並不是作為程式設計師的我們用來解決問題的根本——它們只是用於幫助我們解決問題的簡單工具。 我們必須非常謹慎
細數程式設計師的十個日常習慣,據說真程式設計師都是佔六個以上的!
程式設計師日常工作都是寫需求、改Bug、看別人的程式碼、改別人的程式碼。別看說得簡單,但是每一件事都是需要非常長時間來實現的。不然程式設計師拿著高薪豈不是說不過去?而長年的程式設計生涯中,有很多程式設計師漸漸有了以下一些習慣: 0、計數從0開始。 1、Ctrl+C+V+Z+S是按得最
#為什麼程式設計師都喜歡用兩個大屏顯示器?網友:一個複製一個貼上
如今的程式設計師似乎對辦公電腦的配置要求非常高,連一些相對普通的配置都不入他們的“法眼”!都要比較先進的配置。不過想想也是,畢竟電腦是他們天天打交道的玩意。然而筆者卻發現,程式設計師的辦公桌上好像都有兩個顯示器!不由地有些羨慕,那麼,為什麼程式設計師都喜歡用兩個顯示器呢? 如果有想學習java的
[轉]國外程式設計師推薦:每個程式設計師都應該讀的非程式設計書
五年前有網友在 Stackoverflow 發帖提問:『程式設計師應該讀哪些非程式設計方面的書?』。有很多程式設計師響應,他們在推薦的同時也寫下了自己的評語。本文摘編其中 29 本書,下面就按照各書的推薦數排列。另外,本月初我們在伯樂頭條也發起了相同的討論帖《你最喜歡的非程式設計書是哪一本?》,已有很多的朋友
程式猿養生方法(每個程式設計師都應該看一看)
前言 程式設計師職業生涯中,健康問題尤為突出。隨著時間的流逝,夢想可能漸漸暗淡,激情可能慢慢消退,但是,有一點卻很肯定,我們的身體大不如前,視力下降,慢性腸胃炎,頸椎病,失眠,神經衰弱,此類慢性疾病接踵而來。 身體是自己的,也是一輩子的事情,人的自我恢復能力並不是很強;所以我向來不建議為了事業,而犧牲身體。