英文原文:Coding Alone In The Dark
“程式碼異味”【注1】是描述人們在檢查程式碼時立即看到設計之初導致的潛在問題。Martin Fowler 把它描述為“通常是系統深層次問題的一種表象”。它經常和貼上的程式碼、反模式、過度複雜等觀念聯絡在一起。我個人喜歡如下表述:一個人很少需要審視程式碼,來了解其中可能存在的問題。如今,關於怎樣檢測程式碼異味的文章不下數百篇。一些工具可以輸出指標,讓你知道哪些地方可以優化。你懂的……
今天我想討論另一種程式碼異味:完全被唯一一個人設計和開發的程式碼,從來沒有被其他人看到或評審過的程式碼,在黑暗中輸出的程式碼差不多總是有種程式碼味道。(開源明確地被排除在外了)。這不代表,它就是糟糕的程式碼,但是如果被其他人檢視和討論,程式碼常常可以被優化和接近完美。根據我這麼多年做為軟體開發者的經驗,即使這個規則可能存在一些特例,我個人還從來沒有看到這個理論失敗過。如果你正獨自編碼,那麼你正在做著錯誤的事情。
在意識到你的程式碼不會被其他人看到時,大量的不去尋求捷徑的自我約束就會消失。文件數量減少、規則不會被優化、重構可能不會去完成。或許你輸出了可執行的程式碼,但是如果你誠實地問自己一個問題:“如果明天我的程式碼開源給數千個開發者,有需要修改的地方嗎?”,然後你將加入一大把 TODO 清單。
另一方面,在其他人的“目光下”程式設計會帶來正能量。當你為其他人而不是自己寫程式碼時,你將更加小心。你將更加在意細節,比如你命名變數的方式。你將確保邏輯和演算法被實現了、且測試正確。你的程式碼對於任何人更易讀懂。一旦你的程式碼公開給其他人分析,它就隨著時間而提高。來自其他人的反饋讓你成為更加謙虛、出色的程式設計師。我相信,這是開原始碼開發所帶來的真理。
在大部分私營企業,為將來設計程式碼的通常有多個人。程式碼審查的優先順序高於功能測試。每個人都懂得采取額外步驟的 ROI(投資回報率)。然而,總是由於時間緊張、由於自負、甚至更糟糕的是因為害怕被鄙視,程式碼最終充滿了瑕疵,過河拆橋,最終被留在了軟體裡而沒有看一眼。
雖然我有很多場合可以避免把程式碼放在大家眼前,但是我從來沒有一個好的、充分理由來這樣做。時間不夠?害怕其他開發者說的話?懶惰?自負?我本人多次產生過所有這些感情。徵求和接受反饋是不容易的。碰到你認為不錯、而其他人認為還有改善空間的情況,是比較受傷的。意識到你不得不投入更多時間來優化你認為完成了的程式碼,也是不爽的。沒有人喜歡被告知他自己錯了。常常阻礙我們編寫更優雅程式碼的,不是其他開發者,而是自負和自我評價。
你很可能在想:“噢耶,你說得很明顯了:程式碼審查提高程式碼質量……云云”。是的,的確如此。但是開發者做起來卻不是一件自然的事兒!我們開發者大部分是原始人。我們喜歡獨處的舒適性,我們需要經歷併產生自己的舒適性。把我們的程式碼放在聚光燈下是不自然的。我有多少次聽到和看到,被單獨留下的開發者以信任和自治的名義,開發和釋出程式碼,等意識到他們寫的程式碼是糟糕的、不穩定的、且傾向於一坨屎的時候,已經太晚了。就在數週前,我被一個勢利之徒建立的資料庫結構絆住了,他在我們公司只呆了幾個月。該資料庫包含了一堆由 3 個字母組成的表,每個表有 20-30 個欄位,而每個欄位也是 3 個字母……沒人知道欄位裡儲存的是什麼。由於這個開發者有著較高的資歷,6 個月來沒有和大家交流過。他留下的只是神祕、未優化和非邏輯的程式碼。他是錯在了沒有把程式碼展示給別人看嗎?同事是錯在沒有要求嗎?當一個團隊不能肩並肩輸出高質量程式碼時,這更像是團隊問題而非個人問題。開發者不應該覺得分享程式碼是被強制的。他們應該出於自願,因為他們明白這能夠給他/她自己的程式碼技巧和程式碼本身帶來顯著的積極影響。
不要在黑暗中獨自程式設計。談論你的程式碼,寫一些關於你的程式碼方面的東西。分享它,讓你的同事去看看,一起探討和批評。讓每個人都參與到這個過程。資歷淺的開發者有機會批評老同事輸出的程式碼時,將增加自信。他將從分析優秀程式碼中受益。“我已看透一切的”、高階開發者有機會以不同的視角看待問題,並獲得巨大收穫。當有機會時,要花時間來審查你同事的程式碼。找到哪些可以做得更好,總結你看到的有價值的地方,討論你發現的問題並給出建設性意見。
優美的程式碼從來不會出自黑暗,它總是從分析和批評的火焰中得到昇華。
- 注1:程式開發領域,程式碼中的任何可能導致深層次問題的症狀都可以叫做程式碼異味.通常,在對程式碼做簡短的反饋迭代時,程式碼異味會暴露出一些深層次的問題,這裡的反饋迭代,是指以一種小範圍的、可控的方式重構程式碼。基於這些暴露的問題,人們會進一步的檢查設計和程式碼中是否還存在別的程式碼異味,然後再做進一步的重構。該術語似乎由 Kent Beck 於 90 年代後期,在 WardsWiki 上首次使用。http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E5%BC%82%E5%91%B3
來自:部落格園
評論(1)