在軟件開發過程中,都避免不了進行概要設計、詳細設計等過程,這和軟件測試過程中進行測試計划測試方案設計很類似。
這篇博客,就說說敏捷設計的一些內容,以及拙劣設計對軟件應用的嚴重影響。
我們日常接觸到的軟件項目是一個抽象的概念,它和程序包括形狀、結構以及每一個模塊、類和方法都有關。可以通過很多媒介和語言去描述它,但它最終體現為源代碼——源代碼就是設計。
應該知道的一件事是:軟件都是有生命周期的。當出現以下任何一點時,就表明軟件正在步入聲明晚期。
一、拙劣設計的表現
1、僵化性(Rigidity)
僵化性指的是難以對軟件進行改動,即使是簡單的改動。單一的改動可能會導致有依賴關系的模塊出現不可預知的變化,可以將其稱之為:業務和技術的屏障!最常見的具體表現為:需求變更!
2、脆弱性(Fragility)
脆弱性指的是進行一個改動時,程序的許多地方可能會出問題。常見的表現是出問題的地方與改動的地方並沒有概念上的關聯,修正這些問題就會引起更多的問題,這樣會導致技術負債不斷變大!
3、牢固性(Immobility)
牢固性是指設計難以重用。比如設計中包含了對其他系統有用的部分,要將其從系統中剝離出來所需要的努力和風險太大。
PS:這也是這幾年微服務和DevOps越來越流行的原因。
4、粘滯性(Viscosity)
粘滯性有2中表現形式:
①軟件的粘滯性:對軟件進行改動有很多方法,有些可以保持設計,有些會破壞設計。當可以保持系統設計的方法比生硬方法更難以使用時,就表明系統具有較高的粘滯性。
敏捷設計的目標是:軟件設計應該可以容易的進行那些保持設計的變動。
②環境的粘滯性:開發環境的遲鈍、低效,就會產生環境的粘滯性。比如編譯花費時間長,比如代碼管理需要花費幾個小時去check in僅僅幾個文件,這樣都很難保持項目中的軟件設計。
敏捷設計目標是:創建易於保持系統設計的軟件環境。
5、復雜性(Complexity)
復雜性則指的是設計中包含了當前沒有用的組成部分。它還有不必要的復雜性。我們在進行軟件設計時經常為了保持代碼的靈活性和擴展性,而設置本次迭代並不會用到的結構設計,這樣會使得
軟件變得復雜,並且難以理解。
6、重復性(Repetition)
濫用重復的代碼,這是軟件設計重復性表現最頻繁的方式。代碼設計應該是抽象、簡潔的。當系統中重復的代碼較多時,會使得系統難以改動,且難以閱讀,出現問題時也需要對其進行一一修正。
但每個重復體之間都有細微的差別,所以修正的方式也不同,這樣會導致大量重復的工作,降低了工作效率。應該努力做正確的、產生更多價值的事情,而不是造輪子。
7、晦澀性(Opacity)
晦澀性指的是模塊難以理解。如果模塊代碼難以理解閱讀,隨着時間變化而代碼進行演化,會變得越來越難以理解。所以,編程是一門藝術,代碼應該是優雅、易讀的。
二、為什么設計會變得拙劣?
需要知道的一點:需求是項目中最不穩定的因素。如果我們的軟件設計由於持續的、大量的需求變更而變得拙劣,那就表明我們的設計和實踐本身是具有缺陷的。
三、保持盡可能好的設計
敏捷開發人員應致力於保持設計盡可能的適當、干凈。不斷優化設計,不是幾周甚至幾個月才進行一次的事情,而應該貫穿與軟件的整個項目周期,經常性的去優化。
源代碼是設計最重要的指表示,所以它同樣要保持干凈。這也是一種職業素養。
四、什么是敏捷設計
敏捷設計時一個過程,不是一個事件。它是一個持續的應用原則、模式以及實踐來改進軟件的結果和可讀性的過程。它致力於保持系統設計在任何時間都盡可能的簡單、干凈以及富有表現力!