從實戰角度看如何構建高質量的軟件:一線工程師的一份質量手記


概述###

這篇文章聚合了我六年開發生涯中所學到的、親身經歷的關於提升工程質量的絕大部分知識、技能與經驗。

要構建高質量高可用軟件,個人覺得,可以分四層來進行:

  • 代碼質量: 高質量軟件的基石。 任何設計、測試和工程方法都無法挽救爛代碼寫出來的系統。
  • 設計質量: 設計質量往往關乎軟件的全局性品質,比如穩定性、可擴展性、健壯性等。
  • 測試質量: 通過良好設計和實現的系統,需要測試質量來把關,保證代碼沒有重要BUG和變更不影響原有系統。
  • 工程質量: 在代碼、設計、測試質量的保證下,還需要工程手段(比如CodeReview, 持續集成、線上錯誤巡檢等)來聚合所有的環節,保證更好的輸出。

代碼質量###

代碼質量的提升,主要可以通過遵循良好的編程風格和習慣、追求和學習編寫優秀代碼、熟悉和避免常見編程錯誤與陷阱、注重細膩的代碼細節、持續小幅重構來實現。 代碼能力就像球員的腳法和控球技術,腳法不細膩的人很容易自潰防線。

由於編程實質上是一種嚴謹的邏輯表達活動,因此,訓練自然清晰的口頭和書面表達技能,嚴謹縝密的邏輯思考,也是間接提升代碼質量的方法。

設計質量###

設計質量的提升,需要豐富的開發設計經驗、對健壯性、穩定性、擴展性、可維護性、高壓力承載能力等系統質量指標的全面理解,更深入透明地理解系統的運行,以及仔細考量避開陷阱。設計質量就像球員對全場的理解和掌控能力,懂得很好的傳球和助攻。

設計質量需要理解不同系統的特性。中小型系統通常沒有太大的壓力負荷,主要做好性能、健壯性、可擴展性和可維護性的設計;對於大並發系統,需要考慮承受持續而平穩的高壓力負荷和峰值壓力。需要挖掘系統的薄弱點並加以改進完善。

設計質量有時也與產品策略有關。較寬松的產品策略,會給設計留出更多的選擇空間;而較苛刻的產品策略,則會限制設計的選擇,日后改造起來成本也較大。 比如只允許導出距當前N分鍾之前的訂單。 N 越大,導出設計的選擇空間越大,比如訪問備集群數據、離線計算等,可以提升整體集群訪問的穩定性,理解和維護成本也會大幅降低; 而 N 越小,會暗示商家更“即時”地導出,需要的實時性也越強,實際上並無必要。我以前還有覺得 N 設置小一些讓商家覺得系統的牛逼,現在覺得挺幼稚的想法。

軟件設計是一個需要持續拓展的領域。軟件的復雜度主要體現在對復雜業務及業務組合的綜合理解與領域建模,落地在性能、維護成本、可擴展性、可定制性、穩定性、安全性和透明監控的設計方案中。非一朝一夕之功,亦非固定模式可循。目前還在持續積累中。

測試質量###

測試質量的提升,主要可以通過單測、接口測試、對比測試、壓力測試等來保證。 對於開發人員來說,測試質量的提升主要靠兩點: 1. 編寫覆蓋性強的單測和接口測試的習慣和素養; 2. 開發盡可能自動化的測試用例和對比工具。 多多益善,有勝於無。

測試主要追求高效。高效意味着有效與效率。高效的測試用例和高效地創建高效測試用例。 高效的測試用例: 以有限的測試用例覆蓋核心流程和方法、主流程和方法、常用流程和方法、會造成資損的流程和方法、影響用戶使用的流程和方法。測試用例忌追求全面,但是要覆蓋足夠全面。高效地創建測試用例: 設計良好的測試框架,通過配置化的方式來快速增加測試用例,而不是需要編寫測試代碼。測試數據與測試代碼分離。

工程質量###

工程質量的提升,主要可以通過團隊開發規范、CodeReview、持續集成、錯誤日志巡檢等手段來保證。

質量評分建議###

  • 功能實現,可接受的性能 50分
  • 適當單測,覆蓋主流程和核心方法 60分
  • 適當的日志,覆蓋主要路徑和狀態 63分
  • 添加錯誤和異常處理,增強系統健壯性 68分
  • 代碼遵循良好的編程風格和慣用法,很少重復代碼 72分
  • 對象職責划分合理,交互比較清晰 75分
  • 性能達到比較優異,消除系統明顯薄弱點 80分
  • 有設計良好的公共接口、模塊和API及實現 83分
  • 為擴展變化預留了設計空間 85分
  • 有通過配置化和定制化實現需求的能力 88分
  • 代碼與設計流暢自然清晰 90分
  • 正常服務運行穩定,高壓力負荷下堅挺 92分
  • 可靠性超過99.99% 95分
  • 透明嚴密的系統監控與報警 97分
  • 故障自動恢復能力 99分
  • 無堅可摧,神一樣的系統 100分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM