概述###
這篇文章聚合了我六年開發生涯中所學到的、親身經歷的關於提升工程質量的絕大部分知識、技能與經驗。
要構建高質量高可用軟件,個人覺得,可以分四層來進行:
- 代碼質量: 高質量軟件的基石。 任何設計、測試和工程方法都無法挽救爛代碼寫出來的系統。
- 設計質量: 設計質量往往關乎軟件的全局性品質,比如穩定性、可擴展性、健壯性等。
- 測試質量: 通過良好設計和實現的系統,需要測試質量來把關,保證代碼沒有重要BUG和變更不影響原有系統。
- 工程質量: 在代碼、設計、測試質量的保證下,還需要工程手段(比如CodeReview, 持續集成、線上錯誤巡檢等)來聚合所有的環節,保證更好的輸出。
代碼質量###
代碼質量的提升,主要可以通過遵循良好的編程風格和習慣、追求和學習編寫優秀代碼、熟悉和避免常見編程錯誤與陷阱、注重細膩的代碼細節、持續小幅重構來實現。 代碼能力就像球員的腳法和控球技術,腳法不細膩的人很容易自潰防線。
由於編程實質上是一種嚴謹的邏輯表達活動,因此,訓練自然清晰的口頭和書面表達技能,嚴謹縝密的邏輯思考,也是間接提升代碼質量的方法。
設計質量###
設計質量的提升,需要豐富的開發設計經驗、對健壯性、穩定性、擴展性、可維護性、高壓力承載能力等系統質量指標的全面理解,更深入透明地理解系統的運行,以及仔細考量避開陷阱。設計質量就像球員對全場的理解和掌控能力,懂得很好的傳球和助攻。
設計質量需要理解不同系統的特性。中小型系統通常沒有太大的壓力負荷,主要做好性能、健壯性、可擴展性和可維護性的設計;對於大並發系統,需要考慮承受持續而平穩的高壓力負荷和峰值壓力。需要挖掘系統的薄弱點並加以改進完善。
設計質量有時也與產品策略有關。較寬松的產品策略,會給設計留出更多的選擇空間;而較苛刻的產品策略,則會限制設計的選擇,日后改造起來成本也較大。 比如只允許導出距當前N分鍾之前的訂單。 N 越大,導出設計的選擇空間越大,比如訪問備集群數據、離線計算等,可以提升整體集群訪問的穩定性,理解和維護成本也會大幅降低; 而 N 越小,會暗示商家更“即時”地導出,需要的實時性也越強,實際上並無必要。我以前還有覺得 N 設置小一些讓商家覺得系統的牛逼,現在覺得挺幼稚的想法。
軟件設計是一個需要持續拓展的領域。軟件的復雜度主要體現在對復雜業務及業務組合的綜合理解與領域建模,落地在性能、維護成本、可擴展性、可定制性、穩定性、安全性和透明監控的設計方案中。非一朝一夕之功,亦非固定模式可循。目前還在持續積累中。
- Web服務端軟件的服務品質概要
- 設計方案考量的准則與細則
- 因修改報表名稱引發的“慘案”
- 批量發貨阻塞啟示:深挖系統薄弱點
- 訂單導出應對大流量訂單導出時的設計問題
- HBase指定大量列集合的場景下並發拉取數據時卡住的問題排查
- 通用訂單搜索的API設計得失錄
- 有贊訂單導出的配置化實踐
測試質量###
測試質量的提升,主要可以通過單測、接口測試、對比測試、壓力測試等來保證。 對於開發人員來說,測試質量的提升主要靠兩點: 1. 編寫覆蓋性強的單測和接口測試的習慣和素養; 2. 開發盡可能自動化的測試用例和對比工具。 多多益善,有勝於無。
測試主要追求高效。高效意味着有效與效率。高效的測試用例和高效地創建高效測試用例。 高效的測試用例: 以有限的測試用例覆蓋核心流程和方法、主流程和方法、常用流程和方法、會造成資損的流程和方法、影響用戶使用的流程和方法。測試用例忌追求全面,但是要覆蓋足夠全面。高效地創建測試用例: 設計良好的測試框架,通過配置化的方式來快速增加測試用例,而不是需要編寫測試代碼。測試數據與測試代碼分離。
- 訂單搜索分頁失效的教訓:怠惰必受懲罰
- 使用Groovy+Spock輕松寫出更簡潔的單測
- 深入探究單元測試編寫
- 使用Java函數接口及lambda表達式隔離和模擬外部依賴更容易滴單測
- 使用Groovy+Spock構建可配置的接口測試用例集
- 基於Groovy+HttpRestful的超輕量級的接口測試用例配置的設計方案及DEMO實現
- 預發和線上的自動化對比工具微框架
- 輸入輸出無依賴型函數的GroovySpock單測模板的自動生成工具(上)
- 克服“測試怠惰”的習慣
工程質量###
工程質量的提升,主要可以通過團隊開發規范、CodeReview、持續集成、錯誤日志巡檢等手段來保證。
質量評分建議###
- 功能實現,可接受的性能 50分
- 適當單測,覆蓋主流程和核心方法 60分
- 適當的日志,覆蓋主要路徑和狀態 63分
- 添加錯誤和異常處理,增強系統健壯性 68分
- 代碼遵循良好的編程風格和慣用法,很少重復代碼 72分
- 對象職責划分合理,交互比較清晰 75分
- 性能達到比較優異,消除系統明顯薄弱點 80分
- 有設計良好的公共接口、模塊和API及實現 83分
- 為擴展變化預留了設計空間 85分
- 有通過配置化和定制化實現需求的能力 88分
- 代碼與設計流暢自然清晰 90分
- 正常服務運行穩定,高壓力負荷下堅挺 92分
- 可靠性超過99.99% 95分
- 透明嚴密的系統監控與報警 97分
- 故障自動恢復能力 99分
- 無堅可摧,神一樣的系統 100分