本書介紹了架構的設計過程及設計方法:屬性驅動設計(ADD)。書中通過介紹ADD的概念和應用實例,展示了如何執行架構設計,如何重新設計概念,可幫助讀者從“入門到精通”掌握軟件架構設計。第1章介紹了軟件架構設計和ADD方法的發展史,第2章討論軟件架構設計的細節,第3章詳細介紹ADD方法,第4~6章是幾個案例研究,第7章展示了其他一些設計方法,第8章深入討論了設計過程中的分析,第9章講解了實時過程如何適應組織級別的應用,第10章總結了全書的內容。
提起軟件架構,人們常常會想到模型—模型表示構成軟件架構的基本結構。偶爾,人們才會思考這些結構產生的過程,到底經過什么樣的思考過程才有了這些結構,也就是說,設計的過程是什么。設計是一種完成起來很復雜的活動,關于設計的主題也比較復雜,不容易寫清楚,因為這需要針對系統的方方面面來考慮并做出決策。這些方面往往很難表達,尤其當它們來自于以往實戰性的軟件開發項目時,從這樣的項目中得來的經驗和知識是很難言傳的。盡管如此,因為設計行為本身是建立軟件架構的基礎,所以它亟待被解釋。雖然經驗很難通過一本書來傳授,但是我們可以通過分享一種方法,來幫助讀者以系統化的方式完成設計過程。
本書的主旨是介紹設計過程和一種特殊的設計方法,這種方法稱為屬性驅動設計(Attribute-Driven Design,ADD)。我們相信這種方法非常有效,能幫助讀者以有原則、有紀律和可重復的方式完成設計。在本書中,列舉了屬性驅動設計及現實生活中的幾個有關屬性驅動設計的真實案例。我們將通過這些案例演示如何進行架構設計。即便你目前沒有足夠的設計經驗,我們會舉例說明如何借助該方法來復用設計概念,即那些歷經考驗的經典方案。
盡管屬性驅動設計十多年前已經提出,關于它的文字資料卻很少,也很少有資料可以提供屬性驅動設計的實例并對其具體實現過程加以解釋。因為公開信息的缺乏,人們很難使用該方法或將該方法傳授給他人。此外,一些已經發表的關于屬性驅動開發的文檔也都比較概括,很少涉及架構師日常使用的概念、實踐和技術。
我們已經跟職業架構師一起工作了多年,曾指導他們如何進行設計,以及如何在設計過程中學習。同時我們也學到了很多,例如,我們了解到職業架構師在設計過程的早期會考慮哪些技術因素,這一點在之前的屬性驅動設計版本中是沒有的。就因為這個原因,該方法被很多實踐者認為跟實際脫節。本書提供了一個修正過的屬性驅動設計新版本。在該版本中,我們試圖不遺余力地在理論和實踐之間架設橋梁,縮小理論和實踐之間的差距。
雖然我們已經教授了多年軟件架構和設計軟件,但是一路走來我們認識到,對沒有經驗的人來說,軟件架構和軟件設計太難了。這種認識促使我們去創建設計路線圖,可以肯定的是,這樣可以有效引導人們完成相關設計過程。我們同時設計了一種針對軟件設計教學的游戲,可以作為本書的配套部分。
本書面向的讀者首先是那些對軟件架構設計感興趣的人,尤其是那些必須展開這項設計任務現階段卻不得不使用某些臨時性方案的行業內人士,本書定會對他們別有益處。而對于有經驗的軟件架構設計者來說,他們已經有了一套逐步建立起來的設計方法,相信這些讀者也能通過本書找到新的思路。例如,如何用看板(Kanban)追蹤設計進度,如何利用基于策略的問卷調查分析一個設計理念,如何通過設計方法完成早期的評估預測。再者,對于已經在軟件工程學院熟知其他架構方法的讀者,則可以得到屬性驅動設計與其他設計方法的關聯信息。例如,與質量屬性工作坊(Quality Attribute Workshop,QAW),與架構權衡分析方法(Architecture Tradeoff Analysis,ATAM),以及與成本效益分析方法(Cost Benefit Analysis Method,CBAM)之間的聯系。最后,本書也適合計算機科學或者軟件工程專業的學生和老師閱讀。我們深信本書中列舉的案例研究可以幫助讀者理解如何更輕松地完成一系列的設計過程。可以肯定的是,我們已經在課程中運用了相似的案例,并且效果顯著。就像愛因斯坦所說的,“舉例不是教學時可供選擇的方式,而是唯一的方式。”
我們期望本書能夠讓讀者明白,設計其實是有套路可依的,按照這樣的方法或者套路,你能夠在今后的軟件架構設計中設計出更優秀的軟件產品。
本書各章內容如下:
第1章簡明地介紹了軟件架構和屬性驅動設計方法。
第2章討論軟件架構設計的細節,設計過程的主要輸入—架構驅動因子,以及設計的概念,這些概念會幫助你明白如何利用已經過驗證的方案來理清這些驅動因子有哪些。
第3章詳細介紹屬性驅動設計方法。重點討論屬性驅動設計方法的各個步驟,以及能夠用來完成這些步驟的多項技術。
第4章解釋了“綠地”(greenfield)系統的開發實例。在該案例研究中,我們盡力解釋如何將第3章描述的大多數概念運用到設計過程中,因此,你可以自然地認為該案例研究比較“學術”(雖然該案例源于真實存在的系統)。
第5章闡述第二個案例研究,該案例是與職業軟件架構師合作完成的,因而更加專業、更加詳細。它將以翔實的細節展示屬性驅動設計如何應用于涉及多種技術的大數據系統的設計中。該案例展示了如何在“新”領域中開發系統,而不是在第4章提到的傳統領域。
第6章是一個較短的案例研究,展示如何將屬性驅動設計應用于常見的遺留(或棕地,brownfield)系統的擴展設計中。該實例說明架構設計并非是在系統開發第一版時一次完成的,而是在開發過程的不同階段實施的。
第7章展示了其他一些設計方法。在屬性驅動設計的修正版本中,我們采納了其他設計過程研究者的想法,在此簡要總結了他們的方法,在向他們的工作致敬的同時,也比較了屬性驅動設計與其方法的不同。
第8章深入討論了分析這個主題(盡管這是一本關于設計的書)。分析本來就是設計的一部分,所以本章講述了一些技巧,它們既可以用于設計過程當中,又可以用于部分設計完成后。我們專門介紹了基于策略問卷調查方法的使用,該方法能幫助我們簡單有效地理解設計過程中的種種決定。
第9章展示了設計過程如何適應組織級別的應用。例如,在項目周期的最早期進行一些架構設計有助于評估目標。同時,還展示了屬性驅動設計如何與其他軟件開發方法協同工作。
第10章總結了全書內容。
本書附有兩個附錄。附錄A給出了各種設計概念的目錄,這些設計概念可用于特定的應用領域。該目錄集合了我們從各處收集的設計概念,反映了現實中那些經驗豐富、訓練有素的架構師是如何工作的。目錄包含了第4章案例研究中使用的設計概念的樣本。附錄B針對7個最常見的質量屬性提供了一套基于策略的問卷調查(詳見第8章),同時針對DevOps額外提供了一份問卷調查。
致謝希望能夠在此表達我們對審閱人員Marty Barrett、Roger Champagne、Siva Muthu、Robert Nord、Vishal Prabhu、Andriy Shapochka、David Sisk、Perla Velasco-Elizondo和Olaf Zimmermann的感謝,感謝他們慷慨地提出他們的觀點和意見。我們也要感謝Serge Haziyev和Olha Hrytsay,他們幫助我們完成了本書第5章。此外,如果漏掉Serge、Olha和Andriy在內的許多Softserve的架構師就是我們失職了,他們對整本著作提供了很多幫助。
Humberto希望感謝Quarksoft公司的主管和架構師小組。關于修改屬性驅動設計的很多想法和本書中的一個案例研究都來源于該方法在這家公司的實踐。感謝我有幸合作過和交換過意見的其他公司的架構師及開發者,我從他們身上學到了很多。我也希望感謝軟件工程學院,他們多年來一直邀請我和其他學者參加他們的精英教育研討會(ACE Educators Workshop)。我還要感謝我的母校,墨西哥首都伊斯塔帕拉帕自治大學,它一直在支持我。感謝我的同事Perla Velasco-Elizondo和Luis Castro,他們已經在架構之旅中陪伴我多年。感謝Alonso Leal,是他在多年前給了我成為一個職業架構師的機會。感謝Richard S. Hall,他教了我許多寫作本書時很有價值的技巧。最后,我要感謝我的合作者Rick,他是個好人,也是個好同事,很高興能和他一起工作并交換意見。
Rick希望感謝軟件工程學院的James Ivers和他的研究小組。我還要特別感謝Rod Nord悉心的審校和寶貴的建議。我也要感謝我的長期合作者和導師Len Bass,在許多年前他引領我開啟了軟件架構之旅。沒有Len,我不知道自己今天會在哪里。此外,我要感謝Linda Northrop,她多年來一直大力支持我的研究,并提供給我許多寶貴的機會。最后,我要感謝我的合作者Humberto,他總是朝氣蓬勃,和他共事是一件真正的樂事。
譯者序
前言
第1章 引言 1
1.1 寫作動機 1
1.2 軟件架構 2
1.2.1 軟件架構的重要性 2
1.2.2 生命周期活動 3
1.3 架構師的角色 5
1.4 ADD發展史 6
1.5 小結 7
1.6 擴展閱讀 8
第2章 架構設計 9
2.1 通用設計 9
2.2 軟件架構中的設計 10
2.2.1 架構設計 11
2.2.2 元素交互設計 11
2.2.3 元素內部設計 12
2.3 為什么架構設計如此重要 13
2.4 架構驅動因子 13
2.4.1 設計目的 14
2.4.2 質量屬性 15
2.4.3 主要功能 19
2.4.4 架構關注點 20
2.4.5 約束條件 21
2.5 設計概念:用于創建結構的構建塊 22
2.5.1 參考架構 22
2.5.2 架構的設計模式 24
2.5.3 部署模式 25
2.5.4 策略 26
2.5.5 外部開發組件 27
2.6 架構設計決策 30
2.7 小結 31
2.8 擴展閱讀 32
第3章 架構設計過程 34
3.1 原理性方法的必要性 34
3.2 屬性驅動設計 3.0 34
3.2.1 步驟1:評審輸入 35
3.2.2 步驟2:通過選擇驅動因子建立迭代目標 36
3.2.3 步驟3:選擇一個或多個系統元素來細化 37
3.2.4 步驟4:選擇一個或多個設計概念以滿足選中的驅動因子 37
3.2.5 步驟5:實例化架構元素、分配職責和定義接口 37
3.2.6 步驟6:草擬視圖和記錄設計決策 38
3.2.7 步驟7:分析當前設計、評審迭代目標、實現設計目的 38
3.2.8 按需迭代 39
3.3 根據系統類型遵循設計路線圖 39
3.3.1 成熟領域的綠地系統設計 39
3.3.2 新興領域的綠地系統設計 41
3.3.3 現存系統的設計(棕地) 42
3.4 識別和選擇設計概念 42
3.4.1 識別設計概念 42
3.4.2 選擇設計概念 43
3.5 結構生成 46
3.5.1 元素實例化 47
3.5.2 劃分職責和識別屬性 47
3.5.3 建立元素間的關系 48
3.6 定義接口 48
3.6.1 外部接口 48
3.6.2 內部接口 48
3.7 在設計中創建概要文檔 51
3.7.1 記錄視圖的草圖 51
3.7.2 記錄設計決策 53
3.8 追蹤設計進度 55
3.8.1 使用架構待辦事項清單 55
3.8.2 使用設計看板 55
3.9 小結 57
3.10 擴展閱讀 57
第4章 案例研究:FCAPS系統 59
4.1 商用案例 59
4.2 系統需求 60
4.2.1 用例模型 60
4.2.2 質量屬性場景 62
4.2.3 約束條件 62
4.2.4 架構關注點 62
4.3 設計過程 63
4.3.1 ADD 步驟1:評審輸入 63
4.3.2 迭代1:建立一個完整的系統架構 63
4.3.3 迭代2:識別支持基本功能的架構 70
4.3.4 迭代3:解決質量屬性場景的驅動因子(質量屬性-3) 77
4.4 小結 80
4.5 擴展閱讀 81
第5章 案例研究:大數據系統 82
5.1 商用案例 82
5.2 系統需求 83
5.2.1 用例模型 83
5.2.2 質量屬性場景 83
5.2.3 約束條件 84
5.2.4 架構關注點 84
5.3 設計過程 84
5.3.1 ADD方法的步驟1:評審輸入 85
5.3.2 迭代1:參考架構和系統整體結構 85
5.3.3 迭代2:技術選擇 91
5.3.4 迭代3:數據流元素的細化 99
5.3.5 迭代4:服務層的細化 104
5.4 小結 107
5.5 擴展閱讀 107
第6章 案例研究:銀行系統 109
6.1 商用案例 109
6.1.1 用例模型 110
6.1.2 質量屬性場景 111
6.1.3 約束條件 111
6.1.4 架構關注點 111
6.2 現有的架構文檔 112
6.2.1 模塊視圖 112
6.2.2 分配視圖 113
6.3 設計過程 114
6.3.1 ADD方法的步驟1:評審輸入 114
6.3.2 迭代1:支持新的驅動因子 114
6.4 小結 118
6.5 擴展閱讀 119
第7章 其他設計方法 120
7.1 一種軟件架構設計的通用模型 120
7.2 以架構為中心的設計方法 121
7.3 RUP中的架構活動 123
7.4 軟件架構設計的過程 124
7.5 一種實現架構與設計的方法 126
7.6 視點與視角方法 127
7.7 小結 129
7.8 擴展閱讀 129
第8章 設計過程中的分析 131
8.1 分析和設計 131
8.2 為何分析 133
8.3 分析方法 134
8.4 基于策略的分析 135
8.5 值得反思的問題 137
8.6 基于場景的設計評審 138
8.7 架構描述語言 141
8.8 小結 142
8.9 擴展閱讀 142
第9章 組織中的架構設計過程 144
9.1 架構設計與開發生命周期 144
9.1.1 售前階段的架構設計 145
9.1.2 開發運維階段的架構設計 146
9.2 組織方面的問題 150
9.2.1 個人設計還是團隊設計 150
9.2.2 在組織中應用一套設計概念目錄 151
9.3 小結 152
9.4 擴展閱讀 152
第10章 結束語 154
10.1 方法的必要性 154
10.2 下一步 155
10.3 擴展閱讀 156
附錄A 設計概念目錄 157
附錄B 基于策略的問卷調查 184
術語表 196