我曾經接受過一個關于優秀代碼标準的電話采訪。當時,我腦海中閃過的第一個念頭就是:可維護性。如果代碼難以被其他開發人員了解,維護或是擴充,都不能稱其為優秀的代碼。然後,我想到另外一些标準:高效,優雅 (簡練,适當運用語言結構,環境适用性) ,子產品化,适當的面向對象設計,等等。
當然,能夠在沒發生錯誤和沒有安全漏洞等問題的情況下運作代碼,這是優秀代碼理所當然擁有的特質。
在《 Code Complete 》一書中,作者 Steve McConnel 在代碼的可維護性上充分地支援了我的觀點:
這本書所要做的另外一件事情就是,強調代碼的易讀性。而在獨立編寫代碼的背後,其實隐藏着能與其他開發者順利溝通的深層次目标。
計算機可不管你的代碼是否好懂,雖然它看起來是能讀懂你的程式,事實上計算機是在二進制環境下運作程式的。而編寫可讀性強的語言,則有利于其他開發者讀懂你的程式。是以下這些對代碼的可讀性有着積極的影響:
1、易于了解性
2、複查性
3、錯誤率
4、Debug
5、可修改性
6、開發時間 - 上述因素的總和
7、擴充品質 - 上述因素的總和
編寫可讀性強的代碼,事實上也不會花費更多的時間,至少在開發的最後階段是這樣的。可讀性強的代碼能讓你更容易看懂自己寫了些什麼,這也是為什麼要如此做的重要原因。而且,我們在檢視代碼時往往會順便檢查代碼,這樣也有利于糾正錯誤。可讀性強的代碼在閱讀時會被修正,也更容易使别人把你的代碼應用到類似的程式中。
……
編寫可讀性強的代碼是開發過程中的不二選擇。傾向花費大量時間寫代碼,卻忽視閱讀上的便利性,本身是一種錯誤的體制。開發人員應該盡力編寫優秀的代碼,因為這是一勞永逸這事,也不必因為糟糕的代碼而花費更多精力。
另外,來自 MSDN END BRACKET 欄目的作者 Paul DiLascia ,也列出了優秀代碼應有的物質:
不管你用什麼語言進行開發,所有的優秀代碼都會展示出共有的經典品質:簡練,易于了解,子產品化,層次性,設計良好,高效,優雅,并且清晰。
簡練。這意味着能用五行代碼解決的問題,絕不用十行代碼。這也意味着,必須花費更多的精力來保證代碼的簡練,而不是生産令人費解的代碼;這還意味着,你所厭惡的事情,是連篇累牍的開放性代碼和函數。簡練——即結構好,可執行,設計優秀——可以讓你的代碼更易于了解,也減少了錯誤的發生。
可讀性強。正如其字,這說明你的代碼應該更能讓其他人看懂。要做到可讀性強,就得多寫注釋,符合大衆習慣,不要自作聰明地命名變量,比如說,用 taxrate 代替 rt 。
子產品化。這意味,你得像宇宙的構成一樣來開發程式。世界是由分子構成的,而這些分子又同原子,電子,核子,誇克,和連線 (如果你相信的話) 組成。類似的,優秀的程式也是由小子產品建立成大的系統,而這些小子產品又由更小的部分來組成。你完全可以隻使用移動,插入和删除三個簡單的應用,來編寫一個文本編輯器。就像原子的構成方式一樣,軟體的元件也應該具有複用性。
層次性。程式得像蛋糕内部一樣層次分明。應用運作在架構之上,架構運作在系統之上,而系統又運作在硬體之上。就算是應用程式的内部,也應該有層次。進階層通路低級層,而且事件正好相反(向下通路,向上傳回) ,低級層不應該知道進階層在幹些什麼。事件/回報的基本特性,就是向上發出無指向性通知。如果你的文檔直接通路了架構,那可就有危險了。子產品和層次由 API 來定義,這樣就限定了各自的運作範圍。是以,設計就變得由為重要了。
設計良好。在開發程式之前,要先花些時間來設計你的程式,因為思考的代價要小于調試。優秀的開發準則就是,花一半時間來設計。你得寫一份功能說明 (這個程式是用來幹嘛的) 和一個深層藍圖,而 API 的功能也應該整理成文。
高效。程式不但要運作快,而且要節省資源,它不能牽扯到文檔,資料連接配接等等。程式隻做它該做的事,不能胡亂地裝載和撤銷線程。在運作層上,你可以在測試之後才優化程式;但是在進階層,你必須先計劃好執行過程。如果設計中要求伺服器有大批量的延遲,最好用一個 DOG ( Data Output Gate ,資料輸出門)。
優雅。和漂亮是一個概念,它難以描述卻顯而易見。優雅綜合了簡練,高效和簡明等概念,同時還能讓人感受到高貴的氣質。舉個例子,優雅就是使用表格,或者是用遞歸來編寫程式:
{
return n==0 ? 1 : n * factorial(n-1);
}
清晰。清晰是優秀代碼的基本,也是其他要素的品質保證。相對于普通機械,計算機建立更為複雜的系統的能力要強得多。對于程式設計來說,最基礎的挑戰就是減少複雜度。簡單、可讀性強、子產品化、層次、設計良好、高效、優雅,都是久經考驗達成簡練代碼的方法,這些可以有效地減少代碼的複雜度。
清晰的代碼,良好的設計,明确的目标,你必須真正地了解到自己在每個步驟所要做的事情,否則就會一事無成。差勁的程式,往往不是因為程式設計技術水準的問題,而是因為沒有一個明确的目标。是以,設計是開發的關鍵,能讓保持自己的目标。如果不能寫出設計計劃,不能向其他人解釋開發目标,其實說明你連自己在做什麼都不知道。
什麼才是“優秀代碼”最重要的特點?顯然,就像軟體工程裡所面臨的問題一樣,是代碼的平衡性。編寫代碼時,我們總是會努力保證複雜與簡練之間的平衡:選擇折衷的方式來編寫代碼,通過不斷地測試來達成我們所期望的目标。
這樣,優秀的代碼才會完美地達成上文中所提到的所有特質。下次寫程式或是看别人的代碼時,好好地想想這些問題吧。
作者介紹
Eran Kampf 有 8 年多的軟體開發和研究經驗。曾經以進階軟體開發者的身份工作于 IDF 的 elite geospatial-intelligence 部門。現在在 SAP 擔任 R&D 工程師,在 SAP 和 Microsoft 合作開發的項目中工作。