1. 軟件架構(gòu)設(shè)計(jì)的What & Why● 啥是軟件架構(gòu)(Software Architecture)? 軟件架構(gòu)是指在一定的設(shè)計(jì)原則基礎(chǔ)上,,從不同角度對組成系統(tǒng)的各部分進(jìn)行搭配和安排,,形成系統(tǒng)的多個(gè)結(jié)構(gòu)而組成架構(gòu),,它包括該系統(tǒng)的各個(gè)組件,,組件的外部可見屬性及組件之間的相互關(guān)系,。組件的外部可見屬性是指其他組件對該組件所做的假設(shè)。 軟件架構(gòu)設(shè)計(jì)就是從宏觀上說明一套軟件系統(tǒng)的組成與特性,。 軟件架構(gòu)設(shè)計(jì)是一系列有層次的決策 ,,比如:功能與展現(xiàn)的決策;技術(shù)架構(gòu)的決策,;自主研發(fā)還是合作,;商業(yè)軟件還是開源軟件 。
● 為啥要進(jìn)行軟件架構(gòu)設(shè)計(jì),? 業(yè)務(wù)需求層出不窮,;軟件系統(tǒng)越來越復(fù)雜;參與的人越來越多,;共性和特殊性的問題越來越多,;技術(shù)發(fā)展日異月新;……
2. 軟件架構(gòu)師2.1. 軟件架構(gòu)師是干什么的
2.2. 架構(gòu)師的素質(zhì)
2.3. 架構(gòu)師的分類隨著行業(yè)和社會(huì)的發(fā)展,,架構(gòu)師的定義和分類越來越廣泛和細(xì)分,,廣泛和細(xì)分其實(shí)并不矛盾,如果“廣泛”是x軸,,“細(xì)分”是y軸,,則二維坐標(biāo)系x和y軸中間的任一點(diǎn)就是一種架構(gòu)師類別。但總體來說,,或目前來說,,集合業(yè)界的大致認(rèn)知,總結(jié)如下:
3. 軟件需求
|
階段 |
需求階段 |
說明 |
什么人做什么事 |
可能產(chǎn)生的文檔 |
||
客戶方 |
實(shí)施方 |
客戶方 |
實(shí)施方 |
|||
1 |
業(yè)務(wù)需求 |
來自客戶的原始需求,,背景描述,業(yè)務(wù)訴求和期望目標(biāo),。 |
項(xiàng)目負(fù)責(zé)人或接口人描述需求或提供客戶方需求文檔,。 |
銷售或售前接觸客戶,聽取和記錄需求,。 |
工作說明書(SOW),,或邀標(biāo)書 |
售前的方案建議書 |
2 |
用戶需求 |
通常是在問題定義的基礎(chǔ)上進(jìn)行用戶訪談、調(diào)查,,對用戶使用的場景進(jìn)行整理,,從而建立從用戶角度的需求。 |
項(xiàng)目負(fù)責(zé)人或接口人接受訪談和調(diào)研,。 |
需求分析師或項(xiàng)目經(jīng)理等進(jìn)行需求調(diào)研,。 |
|
調(diào)研計(jì)劃、用戶需求調(diào)研提問庫,、調(diào)研日志,、用戶需求說明書 |
3 |
軟件需求 |
從系統(tǒng)實(shí)現(xiàn)的角度描述的需求,。開發(fā)人員(設(shè)計(jì)和分析人員)在業(yè)務(wù)需求、用戶需求的基礎(chǔ)上形成的,。 |
|
需求分析師或項(xiàng)目經(jīng)理,、架構(gòu)師等討論和細(xì)化需求,編寫需求文檔 |
|
SRS(Software Requirement Specification)軟件需求規(guī)格說明書 |
另外,,也有McCall軟件質(zhì)量模型:
注:在架構(gòu)設(shè)計(jì)中,,對非功能性需求的重視程度,也會(huì)影響架構(gòu)設(shè)計(jì)的好與劣,;但也要平衡過渡設(shè)計(jì)和適可而止的關(guān)系,。
業(yè)界軟件架構(gòu)設(shè)計(jì)的方法論很多,各有各自的應(yīng)用場景和特點(diǎn),,下文結(jié)合ADMEMS(Architecture Design Method has been Extended to Method System)架構(gòu)設(shè)計(jì)方法論說明軟件架構(gòu)的過程:
架構(gòu)階段 |
目標(biāo) |
方式方法 |
現(xiàn)實(shí)工作場景 |
預(yù)架構(gòu)階段 |
全面理解需求,;需求結(jié)構(gòu)化,摒棄“需求列表”,,建立二維需求觀(ADMEMS矩陣),。 |
使用ADMEMS矩陣方法,捋清需求間關(guān)系和發(fā)現(xiàn)衍生需求,。 |
1,、與人:與項(xiàng)目經(jīng)理、需求分析師等內(nèi)部需求人員了解需求,;與客戶了解需求(不建議架構(gòu)師做需求分析師角色),。 |
概念架構(gòu) |
高層組件及其關(guān)系 |
1、初步設(shè)計(jì),,基于關(guān)鍵功能,,借助魯棒圖進(jìn)行以發(fā)現(xiàn)職責(zé)為目的的初步設(shè)計(jì)(不是必須)。 |
1、參與內(nèi)部討論:項(xiàng)目可行性分析,、討論,,從需求、技術(shù),、人力,、風(fēng)險(xiǎn)等角度提供建議。 |
細(xì)化架構(gòu) |
|
5視圖法 |
在項(xiàng)目概要設(shè)計(jì)階段,進(jìn)行架構(gòu)設(shè)計(jì),,制定規(guī)范和約定,,為詳細(xì)設(shè)計(jì)提供指導(dǎo)。 |
實(shí)現(xiàn) |
詳細(xì)設(shè)計(jì) |
架構(gòu)設(shè)計(jì)形成詳細(xì)設(shè)計(jì)文檔 |
在項(xiàng)目實(shí)現(xiàn)階段,,對開發(fā)人員提供規(guī)范指引和技術(shù)支持,。 |
注:架構(gòu)設(shè)計(jì)的過程和內(nèi)容的不是固定不變的,現(xiàn)實(shí)中,,比如售前提供解決方案中,,很多時(shí)候需要架構(gòu)師提供細(xì)化架構(gòu)中才會(huì)深思的邏輯架構(gòu)、物理架構(gòu)等,,這時(shí)候,,架構(gòu)師就需要有螺旋思維和跳躍思維的方式,就像武功中,,招式是死的,,人是活的,要學(xué)會(huì)靈活運(yùn)用,。
多視圖方法是業(yè)界廣泛認(rèn)同的一種架構(gòu)設(shè)計(jì)思路,,包括:
● SEI的3視圖法:
模塊視圖、組件-連接器視圖,、分配視圖,。
● 西門子的4視圖法:
概念視圖,、模塊視圖、代碼視圖,、執(zhí)行視圖,。
● RUP的4+1視圖法:
用例視圖、邏輯視圖,、開發(fā)視圖,、進(jìn)程視圖、物理視圖,。
● 聯(lián)邦企業(yè)架構(gòu)框架:
技術(shù)架構(gòu)視圖,、信息架構(gòu)視圖、應(yīng)用架構(gòu)視圖,、業(yè)務(wù)架構(gòu)視圖,。
● ……
5視圖法分析的意義:
● 全面分析軟件系統(tǒng)方方面面的問題
● 盡早地發(fā)現(xiàn)和排除項(xiàng)目風(fēng)險(xiǎn)與不確定因素
● 從不同角度去展現(xiàn)要設(shè)計(jì)的軟件系統(tǒng)
● 為項(xiàng)目進(jìn)行中不同的干系人提供指導(dǎo):
-- 邏輯架構(gòu)描述系統(tǒng)功能,并指導(dǎo)系統(tǒng)測試
-- 開發(fā)架構(gòu)規(guī)范軟件的層次及代碼風(fēng)格
-- 數(shù)據(jù)架構(gòu)指導(dǎo)數(shù)據(jù)庫的設(shè)計(jì)
-- 運(yùn)行架構(gòu)定義了一些關(guān)鍵過程的設(shè)計(jì)
-- 物理架構(gòu)明確軟件如何部署與實(shí)施
兩種觀念:
觀念 |
設(shè)計(jì)步驟 |
觀念一 |
順序進(jìn)行: 1,、邏輯架構(gòu),。 2、開發(fā)架構(gòu) 3,、數(shù)據(jù)架構(gòu) 4,、運(yùn)行架構(gòu) 5、物理架構(gòu) |
觀念二 |
5個(gè)視圖是穿插進(jìn)行設(shè)計(jì)的,,對復(fù)雜系統(tǒng)而言,,根本不可能將邏輯視圖設(shè)計(jì)完了后再考慮其它視圖。 |
筆者觀念 |
觀念一和觀念二的情況在現(xiàn)實(shí)狀況中都可能存在,,要根據(jù)具體情況具體分析,,但總體而言,5視圖穿插進(jìn)行思考更有利于思考的全局性和完整性,。 |
以下5視圖表格中的工具和方法每個(gè)架構(gòu)師或略有差異,,以下僅為參考。
邏輯架構(gòu)的重點(diǎn)是考慮軟件功能性需求,。
No. |
考慮的方面 |
產(chǎn)出物 |
工具 |
說明 |
1 |
系統(tǒng)功能劃分為幾個(gè)子系統(tǒng)與功能模塊,? |
系統(tǒng)功能樹 |
樹型結(jié)構(gòu)圖 |
|
2 |
向什么用戶提供什么樣的功能? |
用例模型 |
UML用例圖 |
體現(xiàn)用戶和行為 |
3 |
每個(gè)功能都是怎樣的操作流程與分支,? |
用例描述 |
用例描述表
|
含輸入輸出,、事件流分析; 不要有界面描述 |
UML活動(dòng)圖 |
進(jìn)行業(yè)務(wù)流程分析,,包括泳道圖 |
|||
4 |
如何通過界面與用戶交互,?怎樣交互? |
魯棒分析 |
魯棒圖 |
通過對“用例描述表”進(jìn)行原文分析法揀出名詞和動(dòng)詞 |
5 |
應(yīng)當(dāng)設(shè)計(jì)哪些類與界面,?怎樣設(shè)計(jì),? |
領(lǐng)域模型 |
UML類圖 |
|
6 |
與哪些外部系統(tǒng)接口,?怎樣接口? |
接口描述 |
UML類圖 |
|
開發(fā)架構(gòu)重點(diǎn)關(guān)注的是開發(fā)編碼實(shí)現(xiàn)方面的問題,。
No. |
考慮的方面 |
產(chǎn)出物 |
工具 |
說明 |
1 |
分層結(jié)構(gòu)設(shè)計(jì) |
分層架構(gòu)圖(開發(fā)架構(gòu)圖) |
各種繪圖工具 |
好的分層結(jié)構(gòu)支持自動(dòng)化測試 |
2 |
開發(fā)技術(shù)選項(xiàng) |
開發(fā)語言 開發(fā)框架 開發(fā)工具 |
|
考慮商用產(chǎn)品,、開源框架、自研框架 |
3 |
模塊劃分 |
源碼工程,;Project目錄結(jié)構(gòu),; 分包(分庫) |
|
|
4 |
開發(fā)規(guī)范 |
開發(fā)/編碼規(guī)范文檔; |
|
|
5 |
軟件質(zhì)量屬性 |
分析和決策結(jié)果 |
|
考慮運(yùn)行期和開發(fā)期軟件質(zhì)量屬性,,并權(quán)衡利弊進(jìn)行決策,。 |
數(shù)據(jù)架構(gòu)不僅僅要考慮開發(fā)中涉及到的數(shù)據(jù)庫,實(shí)體模型,,也要考慮物理架構(gòu)中數(shù)據(jù)存儲(chǔ)的設(shè)計(jì),。
No. |
考慮的方面 |
產(chǎn)出物 |
工具 |
說明 |
1 |
數(shù)據(jù)是集中還是分布存儲(chǔ)的?如何考慮分布式存儲(chǔ),? |
數(shù)據(jù)架構(gòu)圖 |
|
|
2 |
領(lǐng)域模型到數(shù)據(jù)庫表的轉(zhuǎn)換,?表結(jié)構(gòu)關(guān)系的設(shè)計(jì)? |
邏輯模型 物理模型 ER圖 |
Power Designer Visio |
|
3 |
實(shí)體如何設(shè)計(jì),?充血模型和貧血模型,? |
UML類圖 |
|
|
4 |
使用什么數(shù)據(jù)庫?關(guān)系型還是非關(guān)系型,? |
選型結(jié)果 |
|
|
關(guān)系型數(shù)據(jù)庫 |
非關(guān)系型數(shù)據(jù)庫(NoSQL) |
Oracle(首次發(fā)行:1980年) MySQL(首次發(fā)行:1995) MS SQL Server(首次發(fā)行:1989) PostgreSQL(首次發(fā)行:1989) IBM DB2(首次發(fā)行:1983) Microsoft Access(首次發(fā)行:1992) Sybase ASE(首次發(fā)行:1987) SQLite(首次發(fā)行:2000) …… |
MongoDB(首次發(fā)行:2009) Cassandra(首次發(fā)行:2008) Apache CouchDB db4o BaseX …… |
運(yùn)行架構(gòu)關(guān)注的不再是全局而是局部,,著重關(guān)注那些關(guān)鍵點(diǎn)與難點(diǎn),常常需要技術(shù)攻關(guān)與預(yù)研,。主要考慮控制流、通訊機(jī)制,、資源爭用,、鎖機(jī)制、同步異步,、并發(fā),、串行,同時(shí)也要考慮質(zhì)量屬性,。
No. |
考慮的方面 |
產(chǎn)出物 |
工具 |
說明 |
1 |
運(yùn)行:同步vs.異步,;并發(fā)vs.串行 |
考慮開發(fā)架構(gòu)中代碼的實(shí)現(xiàn)。 |
|
|
2 |
交互:對象間交互,;狀態(tài)轉(zhuǎn)換 |
考慮開發(fā)架構(gòu)的合理性,,到類、到接口,、到代碼,。 |
|
|
3 |
質(zhì)量:安全,;可靠;可伸縮 |
考慮開發(fā)架構(gòu)的合理性 |
|
|
4 |
性能:響應(yīng)時(shí)間,;吞吐量 |
估算: 在線人數(shù),、并發(fā)人數(shù); 每秒事務(wù)量,; 響應(yīng)時(shí)間,。 |
|
|
物理架構(gòu)主要考慮硬件選擇和拓?fù)浣Y(jié)構(gòu),軟件到硬件的映射,,軟硬件的相互影響,。
|
考慮的方面 |
產(chǎn)出物 |
工具 |
說明 |
1 |
網(wǎng)絡(luò)方面:網(wǎng)絡(luò)拓?fù)洌痪W(wǎng)絡(luò)設(shè)備,;安全機(jī)制 |
拓?fù)鋱D 安全規(guī)范 |
|
|
2 |
性能方面:可靠性,、可伸縮性 |
需要什么樣設(shè)備性能 |
|
|
3 |
部署方面:集中式還是分布式;組件部署 |
部署圖
|
|
|
需求驅(qū)動(dòng)了架構(gòu)設(shè)計(jì)?
質(zhì)量屬性了驅(qū)動(dòng)了架構(gòu)設(shè)計(jì)(ADD),?
領(lǐng)域驅(qū)動(dòng)了架構(gòu)設(shè)計(jì)(DDD),?
風(fēng)險(xiǎn)驅(qū)動(dòng)了架構(gòu)設(shè)計(jì)?
質(zhì)疑驅(qū)動(dòng)了架構(gòu)設(shè)計(jì),?
……
到底是誰驅(qū)動(dòng)了架構(gòu)設(shè)計(jì),?我們以船舶設(shè)計(jì)建造為例,來看這些問題:
目標(biāo)和結(jié)果 à |
問題 à |
回答 à |
小結(jié) |
|
設(shè)計(jì)和制造一艘遠(yuǎn)洋貨輪,,能經(jīng)歷數(shù)月海上顛簸和長途跋涉,,并保證貨物的安全和完整,最后能順利抵達(dá)目標(biāo)港口,。 |
我們?yōu)槭裁匆O(shè)計(jì)和制造這樣的大船,? |
市場有這個(gè)需求; 獲利很豐厚,; 解決就業(yè),; …… |
不管是外部需求還是內(nèi)部的需求,都是需求,。不正是需求驅(qū)動(dòng)嗎,? |
|
如何保證貨船能長途航行并經(jīng)受波濤和風(fēng)雨? |
船要造的結(jié)實(shí),; |
魯棒性 |
這些不正是質(zhì)量屬性驅(qū)動(dòng)設(shè)計(jì)嗎,? |
|
引擎設(shè)計(jì)的強(qiáng)勁; |
性能 |
|||
船的燃料充足,; |
持續(xù)可用性 |
|||
裝備衛(wèi)星電話,、GPS,、雷達(dá)等設(shè)備 |
互操作性 |
|||
貨物和人員要安全 |
安全性 |
|||
船舶設(shè)計(jì)師怎么設(shè)計(jì)這樣的船舶? |
現(xiàn)在都會(huì)通過計(jì)算機(jī)進(jìn)行船舶的CAD和3D模型設(shè)計(jì),。 |
是不是佷似領(lǐng)域模型驅(qū)動(dòng)了設(shè)計(jì),? |
||
造船一定有很多風(fēng)險(xiǎn)吧? |
那是,,比如訂貨方客戶有時(shí)提出改裝船舶的意見(需求變化的風(fēng)險(xiǎn)),;有時(shí)某些工藝成品率不穩(wěn)定(質(zhì)量風(fēng)險(xiǎn));等等,。 |
所有可能的風(fēng)險(xiǎn)點(diǎn)在設(shè)計(jì)時(shí)都要考慮到,,做好預(yù)案,才能保證架構(gòu)設(shè)計(jì)的可行性和靈活性,,風(fēng)險(xiǎn)驅(qū)動(dòng)了架構(gòu)設(shè)計(jì),。 |
||
上面怎么提了那么多問題,其實(shí)還有很多問題,,比如…… |
嗯,,你現(xiàn)在有不少疑問了。 |
不斷的質(zhì)疑架構(gòu)設(shè)計(jì)中可能存在各種問題,,有質(zhì)疑才有思考,,才有解決方案,從而推動(dòng)架構(gòu)設(shè)計(jì)的不斷完善,。 |
總結(jié):
以上幾個(gè)方面都能驅(qū)動(dòng)架構(gòu)設(shè)計(jì),,并不是零和的規(guī)則,而是一個(gè)立方體從不同方向看的問題,。以上方面有些是指導(dǎo)思想,,有些是行動(dòng)方式,有的兼而有之,,闡述方式看似不同,,終極目標(biāo)還是造出大船(實(shí)現(xiàn)需求),造出好船(質(zhì)量屬性),,怎么造(領(lǐng)域模型),造的順利(風(fēng)險(xiǎn)控制),,挑不出毛?。軜?gòu)師自己先質(zhì)疑問題并解決了)。
● 高開高走落不到實(shí)處
● 理想與現(xiàn)實(shí)需要折中
● 遺漏關(guān)鍵性約束與非功能需求
● 為虛無的未來埋單而過度設(shè)計(jì)
● 過早做出關(guān)鍵性決策
● 客戶說啥就是啥成為醬油哥
● 埋頭干活兒缺乏前瞻性
● 架構(gòu)設(shè)計(jì)還要考慮系統(tǒng)可測性
● 架構(gòu)設(shè)計(jì)不要企圖一步到位
溫昱的《一線架構(gòu)師實(shí)踐指南》
|