遵循嚴格的代碼規範, 學習好的編程模式, 避免常見的編程錯誤, 持續小步重構改進, 嚴格測試與必要文檔,
理解所寫的每一行代碼, 正確使用 API, 代碼 Review , 追求更好的解決方案, 注重總體設計 。
做爲一名合格的程序員, 須要知足的兩個最基本要求:
假設咱們是一段代碼的使用者, 對代碼的要求會是怎樣的?
代碼有必要的文檔, 詳細說明了它的主要意圖及設計思想;
代碼出色地完成了它所聲稱的工做, 對於不合法狀況可以給出合理的返回結果或友好提示; 可以應對大數據量;
代碼穩固, 在異常狀況下依然堅挺, 至少能夠給出友好提示, 或降級運行;
一般狀況下, 主要考慮如下質量屬性: 正確性、性能、 健壯性、 可維護性。
編寫可信賴的代碼, 須要採用多種方法和手段去逐步逼近。 如下是一些好的作法:
1. 肯定一種嚴格的代碼風格和規範, 嚴格遵行它。
良好的代碼風格不會保證程序的正確性, 但能保證代碼清爽易讀,更容易找出錯誤;
2. 掌握好的編程理念和模式,
儘量使用習慣用法和推薦用法。
a. 自頂向下, 意圖導航;
b. 搭建原型, 逐步細化;
c. 接口與實現分離解耦;
d. 構造與使用分離解耦;
e. 事件與處理器鏈分離解耦;
f. 「一個事實」原則; 「對修改關閉, 對擴展開放」原則; KISS 原則;
g. 充分利用已有成熟庫和組件;
h. 經過封裝, 屏蔽低層複雜性, 使用容易理解的高層語義構建程序;
i. First Make it Right, Then Make it Good.
推薦書籍:《 Effective Java 》, 《代碼整潔之道》, 《Writing solid code》、 《編寫可讀代碼的藝術》,《代碼大全》, 《Unix / Linux 設計思想》,《敏捷技能修煉》, 《程序設計實踐》(K&R) 。
3. 熟悉常見錯誤代碼模式, 避免犯相同的錯誤。
聰明的人從別人的錯誤中汲取教訓。 《Code Quality: The Open Source Perspective》 這本書從代碼層面深刻討論了各類編程錯誤。
根據二八定律, 80% 的 BUG 是由 20% 的編程錯誤引發的, 所以, 熟悉這 20% 的編程錯誤並避免之, 就能避免 80% 的BUG 。此外, 有些 BUG 多是由系統集成致使的, 屬於更精微的層面, 另當別論。 充分利用編譯器及靜態代碼分析工具檢測代碼。
c. 使用設計模式優化結構;
d. 充分使用短小函數;
a. 優先級: 關鍵部件 》 經常使用部件 》 不經常使用部件;
6.
深刻理解實現原理和細節,準確理解和使用 API, 理解代碼所作的事情。
a. 完整理解 API 含義, 而不是隻知其一;不知其二的狀況下調用;
b. 檢測 API 返回值並做出合理的措施;
c. 理解本身所編寫的每一行代碼, 它是如何與框架進行交互的;
7. 代碼講解,有助於發現所犯的錯誤, 也能鍛鍊口頭表達能力。
a. 團隊成員之間進行代碼 Review;
b. 給本身講解所編寫的代碼;
8. 思考更好的表達方式和方案, 追求更好的可維護性。
a. 使用多線程併發處理 IO 調用, 而不是迭代;
b. 使用異步調用改善響應流暢性;
c. 使用 API 接口代替數據庫查詢;
d. 對於簡單方案的性能較低的實現方式, 思考更有效率的實現方式;
e. 對於代碼中不太清晰的地方, 逐步替換爲更清晰的實現;
9. 閱讀優秀開源項目代碼, 潛移默化地汲取優秀的作法、思路和方案。
10. 關注總體設計、細緻編程、考慮周全。
有些問題是由總體設計引入的, 好比總體的錯誤處理, 沒法經過局部層面來解決。
不當的架構設計會使代碼修改和擴展變得困難, 迫使開發者編寫大量臨時方案去解決某個具體問題; 日積月累, 整個系統就會愈來愈腐爛, 愈來愈難以維護。 始終保持簡潔有效的架構設計。
造成開發與測試的良性循環,創建高質量編程的一套方法和習慣(包括開發時間估算), 對每個功能都能遵守這種方法和習慣。
時間與質量的平衡。
後記參考
什麼是不可信賴的代碼
2. 不能(正確有效地)完成代碼文檔所聲稱的事情;
逼近高質量的基本方法
這就有幾個問題要思考一下, 能夠根據這幾個問題按圖索驥, 一步步地逼近高質量編程。
1. 這段代碼想要完成什麼樣的工做? 要求怎樣的輸入, 能夠預期得到怎樣的輸出(輸入-輸出模型)?
2. 什麼是合法狀況, 什麼是不合法狀況? 如何統一處理, 減小這種合法性檢測的時間成本?
3. 代碼所要應對的數據量有多大? 是否可能存在時間或空間上的性能瓶頸? 若是有, 須要仔細設計好的結構和算法去解決;
4. 代碼所運行其中的環境如何(數據庫操做/網絡調用/文件讀寫)? 可能發生怎樣的異常,致使什麼錯誤? 如何進行異常處理?
5. 如何保證代碼可讀? 是否有可擴展性需求? 若是有, 須要在哪些方面提供靈活性?
1. 編寫文檔, 描述所要完成的工做, 輸入是什麼, 輸出是什麼; 這是一個自我表達的過程, 有助於清晰思路;
3. 編寫代碼, 持續小步重構、改進, 必要的時候同步更新文檔, 經過測試用例;
4. 代碼Review. 添加新的測試用例或需求, 持續改善。
以上採用的是「文檔與測試導引」 的方法。既要寫文檔, 又要寫測試, 這種方法看上去工做量大, 實際上反而多是一種捷徑。 實際上, 文檔、測試、開發三者的本質都是表達, 彼此會是相輔相成的。 固然, 與「測試驅動論」或「文檔驅動論」不一樣, 編寫文檔以及經過測試用例並非最終目的, 只是一種檢驗途徑。 還須要盡力去編寫可讀性良好的代碼。