風(fēng)險驅(qū)動、敏捷迭代的架構(gòu)設(shè)計與開發(fā)
軟件架構(gòu)將隨著軟件產(chǎn)品和系統(tǒng)的生命周期而演化,其生命期往往超過了一個項目、一次發(fā)布,甚至有可能長達數(shù)年之久,因而軟件架構(gòu)無論對于客戶還是開發(fā)商來說都是一項極其重要的資產(chǎn)。
軟件架構(gòu)的設(shè)計應(yīng)該遵循什么樣的開發(fā)過程?或者說,有沒有更好的、成熟的軟件架構(gòu)設(shè)計和開發(fā)過程?回答是,21世紀的軟件架構(gòu)設(shè)計應(yīng)該優(yōu)先采用敏捷迭代的開發(fā)方式和方法。與傳統(tǒng)做法不同,敏捷迭代開發(fā)主張軟件架構(gòu)采用演進式設(shè)計(evolutionary design),一個軟件產(chǎn)品或系統(tǒng)的架構(gòu)是通過多次迭代,乃至多次發(fā)布,在開發(fā)生命周期中逐步建立和完善起來的。
好的軟件架構(gòu)不是一蹴而就的。在架構(gòu)設(shè)計開發(fā)過程中,我們應(yīng)該盡量避免瀑布式思維,通過一個“架構(gòu)設(shè)計階段”來完成系統(tǒng)的架構(gòu)設(shè)計乃至詳細設(shè)計,然后再根據(jù)架構(gòu)圖紙和模型,在“編碼實現(xiàn)階段”按圖索驥進行架構(gòu)的編碼與實現(xiàn)。這種傳統(tǒng)做法的錯誤在于認為軟件架構(gòu)就是圖紙上的模型,而不是真正可以高質(zhì)量執(zhí)行的源代碼。幾十年的軟件工程實踐表明,沒有經(jīng)過代碼實現(xiàn)、測試、用戶確認過的架構(gòu)設(shè)計,往往會存在著不可靠的臆想、猜測和過度設(shè)計、過度工程,極易造成浪費和返工,導(dǎo)致較高的失敗率。
風(fēng)險是任何可能阻礙和導(dǎo)致軟件產(chǎn)品/系統(tǒng)研發(fā)失敗的潛在因素和問題。軟件架構(gòu)是軟件產(chǎn)品和系統(tǒng)研發(fā)的主要矛盾和主要技術(shù)風(fēng)險,軟件架構(gòu)的質(zhì)量決定了整個軟件系統(tǒng)和產(chǎn)品的質(zhì)量。不確定性往往是軟件架構(gòu)設(shè)計當(dāng)中一種的潛在風(fēng)險。因此,軟件架構(gòu)的設(shè)計與開發(fā)應(yīng)該遵循風(fēng)險驅(qū)動的原則,在整個開發(fā)生命周期內(nèi)至始至終維護一張風(fēng)險問題清單,隨著迭代的前進,根據(jù)風(fēng)險的實時動態(tài)變化,首先化解和處理最主要的架構(gòu)風(fēng)險,再依次化解和處理次要的架構(gòu)風(fēng)險。
架構(gòu)設(shè)計的可視化建模
軟件架構(gòu)設(shè)計的難度源于軟件設(shè)計問題本身的復(fù)雜性,一個復(fù)雜的軟件系統(tǒng)往往存在大量復(fù)雜的、難于被人類所理解的細節(jié)和不確定因素。抽象與建模是人類自誕生以來就已掌握的理解復(fù)雜事物的方法,因而人類所從事的軟件設(shè)計工作本質(zhì)上也是一個不斷建模的過程。我們可以通過各種抽象的模型和視圖,從各個不同層次、宏觀和微觀的角度來理解復(fù)雜的軟件架構(gòu),以保證作出正確和有效的設(shè)計。
有人認為:“軟件架構(gòu)就是源代碼(source codes)”以及“源代碼就是設(shè)計”.這種說法其實是片面的。什么是真正的軟件?我們知道,最終可以在電腦上執(zhí)行的真正的軟件其實是二進制代碼0和1,借助編譯器我們把高級編程語言翻譯成底層的匯編語言、機器語言等,沒有人能直接、完整地看到二進制程序在CPU上的實際運行狀況(runtime),人們大多只能通過各種調(diào)試工具、窗口視圖等方式來間接地動態(tài)觀察這些真正的軟件的運行片段。因此,Java、C#、C++ 等等設(shè)計時(design time)源代碼在本質(zhì)上也是一種模型,雖然是一種經(jīng)處理后可執(zhí)行的靜態(tài)模型,但顯然它們并不是真實軟件和軟件架構(gòu)的全部?梢姡创a模型(有時也叫實現(xiàn)模型)與UML模型其實都是軟件架構(gòu)的一種模型(邏輯反映),差別就在于抽象層次的不同。完整的軟件架構(gòu)(建筑)不僅僅包括源代碼(實現(xiàn)模型),還包括了需求模型、分析模型、設(shè)計模型、實現(xiàn)模型和測試模型等等許多模型,軟件架構(gòu)本身就是一組模型的集合。
UML、SysML是當(dāng)前國際上流行的軟件/系統(tǒng)架構(gòu)可視化建模語言。在編寫實際的代碼之前,利用包圖、類圖、活動圖、交互圖、狀態(tài)圖等等各種標準圖形符號對軟件架構(gòu)進行建模,探討和交流各種可行的設(shè)計方案,發(fā)現(xiàn)潛在的設(shè)計問題,保證具體編碼實現(xiàn)之前抽象設(shè)計的正確性,被實踐證明是一種非常有效和高效、敏捷的工作方式。