以完美主義的名義,拖延癥在公開掠奪

簡評:一個系統的迭代開發可以持續幾年甚至更久,而某行代碼的生命周期則短很多,一次到位的開發不現實也沒有必要。代碼的正確性、安全性比美觀更重要,不要將時間浪費到編寫完美代碼上。

不同代碼重要性的優先級不同

Michael Feathers 在研究代碼隨時間發生的變化中,發現了代碼的生命線。

通常,每個系統都有許多一次寫成就幾乎不再修改的代碼。但是依然有一小部分代碼,包括最重要最有用的代碼,會被經常修改,重構甚至重寫數次。

隨著開發者對一個系統、一類問題或者一個架構方案的深入了解,應該能夠更加輕易地知道或者預測到哪些代碼會不停改動,哪些代碼幾乎永遠不變。換句話說,有的代碼比其他代碼更重要。

是否應該努力去寫完美代碼?

從第一個 hello world 開始,我們就知道應該努力寫簡潔的代碼,保持代碼的一致性和易讀性。于是一些強迫癥患者的程序員便開始癡迷于優雅完美的代碼,每時每刻都在斟酌重構代碼的每一個細節。

有的代碼只需要寫一次,以后就再也不需要作任何變動,但有些代碼并非如此。試想,這些需要不斷改變的代碼,代碼寫得那么完美卻在下一秒立馬就被 delete 豈不是太過浪費?而且也沒有必要這么做。

You Can't Write Perfect Software. Did that hurt? It shouldn't. Accept it as an axiom of life. Embrace it. Celebrate it. Because perfect software doesn't exist. No one in the brief history of computing has ever written a piece of perfect software. It's unlikely that you'll be the first. And unless you accept this as a fact, you'll end up wasting time and energy chasing an impossible dream.” — Andrew Hunt, The Pragmatic Programmer: from Journeyman to Master

只寫一次的代碼首要并非美觀或優雅,而是正確性和易讀性。因為在整個系統的生命周期中,它們雖然不再修改,但是可能需要被閱讀很多次。不一定非要緊湊,干凈即可。

在這些代碼中,一定程度上的拷貝和粘貼等操作也是可以接受的。它們不需要反復斟酌,除非你需要修改它,否則即使周圍代碼都在變,也不需要對這些代碼重構。對于這些代碼,沒必要花費過多時間。

至于那些頻繁修改的代碼,苦苦思索最優雅的方案更是在浪費時間,本來它們就可能在幾天后被修改或重寫。同樣,每次修改都癡迷于代碼的重構,或者重構那些不需要修改的代碼試圖使其變得更好也是沒有必要的。

代碼永遠都可以變得更好,但這永遠不是最重要的方面。我們關注的重點應該是 —— 這些代碼是否實現了所需功能?能否正確高效地運行?能否處理異常數據而不崩潰?即使異常,調試時是否方便?所有這些和美觀優雅無關的地方,才更應該是代碼質量優劣的衡量標準。

務實地進行編碼和重構

精益開發的核心思想是:不要把時間浪費到不重要的事情上。應該用這個原則指導我們如何編寫代碼,如何重構代碼,如何進行代碼審查以及如何進行代碼測試。

為了完成工作,只進行必要的代碼重構,Martin Fowler 稱之為機會主義重構和有預備的重構。這足以使代碼修改起來更加簡單和安全。如果你不是在修改代碼,代碼看起來是什么樣其實無關緊要。

在代碼審查中只關注真正重要的部分,這些代碼是否正確?是否是防御性的代碼?是否安全?你能否理解它的思路?修改起來是否安全?

不要糾結于代碼的風格(除非代碼風格誤導了你對代碼的理解),把格式化代碼的工作交給 IDE。沒有必要去爭論這些代碼能否“更加面向對象”。只要它有道理,至于是使用這用模式還是別的模式,并不重要。同樣,至于你是否喜歡,也不重要,盡管你可以用更好的方式完成它,除非你是在教對平臺或者語言不熟悉的新手,需要在代碼審查中完成監督工作。

測試用例的編寫很重要,需要覆蓋到主要的執行路徑和重要的異常情況。測試用例能夠用最少的工作量給你盡可能多的信息和信心,具體是采用大而全的測試還是小而精的測試則無關緊要。至于是在寫代碼之前寫測試用例還是在寫代碼之后寫測試用例也不重要,只要測試用例有效即可。

不僅僅是關于代碼

在軟件領域里,建筑師和工程師的概念從來都不適用,我們不是設計建造屹立數年或者數百年大橋或者摩天大樓,我們構建的是更加具有可塑性的、更加抽象的,同時生命周期也更加短暫的東西。軟件之所以稱為“軟件”,就是因為編寫代碼是為了修改。

After five years of use and modification, the source for a successful software program is often completely unrecognizable from its original form, while a successful building after five years is virtually untouched.— Kevin Tate, Sustainable Software Development

迭代開發教會我們不斷嘗試并檢查嘗試的結果 —— 是否解決了問題,如果沒有解決問題,如何去改進?

我們正在構建的軟件是永遠做不完的。盡管設計和編碼是正確的,那也可能只是一時正確,一旦需求發生變化,就會被更加適合的設計和編碼替代。

我們需要寫好的代碼:易懂,能夠正確運行,有安全保障的代碼。我們需要對它進行重構和代碼審查,并且編寫有效的測試用例。但是要記住,其中的一些代碼或者全部代碼可能很快就被丟掉,甚至再也不會被用到。我們需要意識到,我們的一部分工作可能要被浪費掉并且對此進行優化。

只做哪些需要被完成的事情,不要浪費時間試圖去編寫完美代碼。

原文鏈接:Don't Waste Time Writing Perfect Code
“本譯文僅供個人研習之用,謝絕任何轉載及用于任何商業用途。本譯文所涉法律后果均由本人承擔。本人同意簡書平臺在接獲有關著作權人的通知后,刪除文章。”
推薦閱讀:
Github | 程序員七大生產力工具
程序員常犯的五個非技術性錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 文章來自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鵬閱讀 9,213評論 2 126
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,764評論 25 708
  • 1.問:你在測試中發現了一個 bug ,但是開發經理認為這不是一個 bug ,你應該怎樣解決。 首先,將問題提...
    qianyewhy閱讀 9,286評論 4 123
  • 本帖主要表達了作者心中的喜悅之情,畢竟這是人生第一道題被系統肯定。做這道題所用的時間與效率是成反比的。在51nod...
    隱藏的記號閱讀 1,065評論 2 1
  • 泠泠長風度千古 獨行明月繁花處 問我來時留情我 重重飛花香幾度 移步尋景不知處 奈何歸去不知路 醉里探花夢無阻 只...
    墨跡gjf閱讀 216評論 1 1