從需求分類到多視圖架構(gòu)設(shè)計方法
溫昱
摘要:要開發(fā)出用戶滿意的軟件并不是件容易的事,軟件架構(gòu)師必須全面把握各種各樣的需求、權(quán)衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。本文從理解需求種類的復雜性談起,通過具體案例的分析,展示了如何通過RUP的4+1視圖方法,針對不同需求進行架構(gòu)設(shè)計,從而確保重要的需求一一被滿足。
呼喚架構(gòu)設(shè)計的多重視圖方法
靈感一閃,就想出了把大象放進冰箱的辦法,這自然好。但希望每個架構(gòu)設(shè)計策略都依靠靈感是不現(xiàn)實的——我們需要系統(tǒng)方法的指導。
需要架構(gòu)設(shè)計的多重視圖方法,從根本上來說是因為需求種類的復雜性所致。以工程領(lǐng)域的例子開道吧。比如設(shè)計一座跨江大橋:我們會考慮“連接南北的公路交通”這個“功能需求”,從而初步設(shè)計出理想化的橋墩支撐的公路橋方案;然后還要考慮造橋要面臨的“約束條件”,這個約束條件可能是“不能影響萬噸輪從橋下通過”,于是細化設(shè)計方案,規(guī)定橋墩的高度和橋墩之間的間距;另外還要顧及“大橋的使用期質(zhì)量屬性”,比如為了“能在湍急的江流中保持穩(wěn)固”,可以把大橋橋墩深深地建在巖石層之上,和大地渾然一體;其實,“建造期間的質(zhì)量屬性”也很值得考慮,比如在大橋的設(shè)計過程中考慮“施工方便性”的一些措施。
和工程領(lǐng)域的功能需求、約束條件、使用期質(zhì)量屬性、建造期間的質(zhì)量屬性等類似,軟件系統(tǒng)的需求種類也相當復雜,具體分類如圖1所示。
圖1 軟件需求分類的復雜性
超市系統(tǒng)案例:理解需求種類的復雜性
例子是最好的老師。為了更好地理解軟件需求種類的復雜性,我們來分析一個實際的例子。在表1中,我們列舉了一個典型的超市系統(tǒng)的需求子集,從這個例子中可以清晰地看到需求可以分為兩大類:功能需求和非功能需求。
非功能需求
|
功能需求
|
約束
|
運行期質(zhì)量屬性
|
開發(fā)期質(zhì)量屬性
|
項目預算有限
用戶的平均電腦操作水平偏低
要求能在Linux上運行
開發(fā)人員分散在不同地點
……
|
高性能
易用性
……
|
易理解性
模塊間松散耦合
……
|
提高收銀效率
任意商品項可單獨取消
通過收銀終端的按鍵組合,可以使收銀過程從“逐項錄入狀態(tài)”進入“選擇取消狀態(tài)”
……
|
表1 超市系統(tǒng)案例:理解需求種類的復雜性
簡單而言,功能需求就是“軟件有什么用,軟件需要做什么”。同時,注意把握功能需求的層次性是軟件需求的最佳實踐。以該超市系統(tǒng)為例:
l 超市老板希望通過軟件來“提高收銀效率”。
l 那么,你可能需要為收銀員提供一系列功能來促成這個目的,比如供收銀員使用的“任意商品項可單獨取消”功能有利于提供收銀效率(筆者曾在超市有過被迫整單取消然后一車商品重新掃描收費的痛苦經(jīng)歷)。
l 而具體到這個超市系統(tǒng),系統(tǒng)分析員可能會決定要提供的具體功能為:通過收銀終端的按鍵組合,可以使收銀過程從“逐項錄入狀態(tài)”進入“選擇取消狀態(tài)”,從而取消某項商品。
從上面的例子中我們還驚訝地發(fā)現(xiàn),非功能需求——人們最經(jīng)常忽視的一大類需求——包括的內(nèi)容非常寬、并且極其重要。非功能需求又可以分為如下三類:
l 約束。要開發(fā)出用戶滿意的軟件并不是件容易的事,而全面理解要設(shè)計的軟件系統(tǒng)所面臨的約束可以使你向成功邁進一步。約束性需求既包括企業(yè)級的商業(yè)考慮(例如“項目預算有限”),也包括最終用戶級的實際情況(例如“用戶的平均電腦操作水平偏低”);既可能包括具體技術(shù)的明確要求(例如“要求能在Linux上運行”),又可能需要考慮開發(fā)團隊的真實狀況(例如“開發(fā)人員分散在不同地點”)。這些約束性需求當然對架構(gòu)設(shè)計影響很大,比如受到“項目預算有限”的限制,架構(gòu)師就不應(yīng)選擇昂貴的技術(shù)或中間件等,而考慮到開發(fā)人員分散在不同地點”,就更應(yīng)注重軟件模塊職責劃分的合理性、松耦合性等等。
l 運行期質(zhì)量屬性。這類需求主要指軟件系統(tǒng)在運行期間表現(xiàn)出的質(zhì)量水平。運行期質(zhì)量屬性非常關(guān)鍵,因為它們直接影響著客戶對軟件系統(tǒng)的滿意度,大多數(shù)客戶也不會接受運行期質(zhì)量屬性拙劣的軟件系統(tǒng)。常見的運行期質(zhì)量屬性包括軟件系統(tǒng)的易用性、性能、可伸縮性、持續(xù)可用性、魯棒性、安全性等。在我們的超市系統(tǒng)的案例中,用戶對高性能提出了具體要求(真正的性能需求應(yīng)該量化,我們的表1沒體現(xiàn)),他們不能容忍金額合計超過2秒的延時。
l 開發(fā)期質(zhì)量屬性。這類非功能需求中的某些項人們倒是念念不忘,可惜很多人并沒有意識到“開發(fā)期質(zhì)量屬性”和“運行期質(zhì)量屬性”對架構(gòu)設(shè)計的影響到底有何不同。開發(fā)期質(zhì)量屬性是開發(fā)人員最為關(guān)心的,要達到怎樣的目標應(yīng)根據(jù)項目的具體情況而定,而過度設(shè)計(overengineering)會花費額外的代價。
什么是軟件架構(gòu)視圖
那么,什么是軟件架構(gòu)視圖呢?Philippe Kruchten在其著作《Rational統(tǒng)一過程引論》中寫道:
一個架構(gòu)視圖是對于從某一視角或某一點上看到的系統(tǒng)所做的簡化描述,描述中涵蓋了系統(tǒng)的某一特定方面,而省略了于此方面無關(guān)的實體。
也就是說,架構(gòu)要涵蓋的內(nèi)容和決策太多了,超過了人腦“一蹴而就”的能力范圍,因此采用“分而治之”的辦法從不同視角分別設(shè)計;同時,也為軟件架構(gòu)的理解、交流和歸檔提供了方便。
值得特別說明的,大多數(shù)書籍中都強調(diào)多視圖方法是軟件架構(gòu)歸檔的方法,其實不然。多視圖方法不僅僅是架構(gòu)歸檔技術(shù),更是指導我們進行架構(gòu)設(shè)計的思維方法。
Philippe Kruchten提出的4+1視圖方法
1995年,Philippe Kruchten在《IEEE Software》上發(fā)表了題為《The 4+1 View Model of Architecture》的論文,引起了業(yè)界的極大關(guān)注,并最終被RUP采納。如圖2所示。
圖2 Philippe Kruchten提出的4+1視圖方法
該方法的不同架構(gòu)視圖承載不同的架構(gòu)設(shè)計決策,支持不同的目標和用途:
l 邏輯視圖:當采用面向?qū)ο蟮脑O(shè)計方法時,邏輯視圖即對象模型。
l 開發(fā)視圖:描述軟件在開發(fā)環(huán)境下的靜態(tài)組織。
l 處理視圖:描述系統(tǒng)的并發(fā)和同步方面的設(shè)計。
l 物理視圖:描述軟件如何映射到硬件,反映系統(tǒng)在分布方面的設(shè)計。
運用4+1視圖方法:針對不同需求進行架構(gòu)設(shè)計
如前文所述,要開發(fā)出用戶滿意的軟件并不是件容易的事,軟件架構(gòu)師必須全面把握各種各樣的需求、權(quán)衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。
Philippe Kruchten提出的4+1視圖方法為軟件架構(gòu)師“一一征服需求”提供了良好基礎(chǔ),如圖3所示。
圖3 運用4+1視圖方法針對不同需求進行架構(gòu)設(shè)計
邏輯視圖。邏輯視圖關(guān)注功能,不僅包括用戶可見的功能,還包括為實現(xiàn)用戶功能而必須提供的“輔助功能模塊”;它們可能是邏輯層、功能模塊等。
開發(fā)視圖。開發(fā)視圖關(guān)注程序包,不僅包括要編寫的源程序,還包括可以直接使用的第三方SDK和現(xiàn)成框架、類庫,以及開發(fā)的系統(tǒng)將運行于其上的系統(tǒng)軟件或中間件。開發(fā)視圖和邏輯視圖之間可能存在一定的映射關(guān)系:比如邏輯層一般會映射到多個程序包等。
處理視圖。處理視圖關(guān)注進程、線程、對象等運行時概念,以及相關(guān)的并發(fā)、同步、通信等問題。處理視圖和開發(fā)視圖的關(guān)系:開發(fā)視圖一般偏重程序包在編譯時期的靜態(tài)依賴關(guān)系,而這些程序運行起來之后會表現(xiàn)為對象、線程、進程,處理視圖比較關(guān)注的正是這些運行時單元的交互問題。
物理視圖。物理視圖關(guān)注“目標程序及其依賴的運行庫和系統(tǒng)軟件”最終如何安裝或部署到物理機器,以及如何部署機器和網(wǎng)絡(luò)來配合軟件系統(tǒng)的可靠性、可伸縮性等要求。物理視圖和處理視圖的關(guān)系:處理視圖特別關(guān)注目標程序的動態(tài)執(zhí)行情況,而物理視圖重視目標程序的靜態(tài)位置問題;物理視圖是綜合考慮軟件系統(tǒng)和整個IT系統(tǒng)相互影響的架構(gòu)視圖。
設(shè)備調(diào)試系統(tǒng)案例概述
本文的以下部分,將研究一個案例:某型號設(shè)備調(diào)試系統(tǒng)。
設(shè)備調(diào)試員通過使用該系統(tǒng),可以察看設(shè)備狀態(tài)(設(shè)備的狀態(tài)信息由專用的數(shù)據(jù)采集器實時采集)、發(fā)送調(diào)試命令。該系統(tǒng)的用例圖如圖4所示。
圖4 設(shè)備調(diào)試系統(tǒng)的用例圖
經(jīng)過研制方和委托方的緊密配合,最終確定的需求可以總括地用表2來表示。
非功能需求
|
功能需求
|
約束
|
運行期質(zhì)量屬性
|
開發(fā)期質(zhì)量屬性
|
程序的嵌入式部分必須用C語言開發(fā)
一部分開發(fā)人員沒有嵌入式開發(fā)經(jīng)驗
|
高性能
|
易測試性
|
察看設(shè)備狀態(tài)
發(fā)送調(diào)試命令
|
表2 設(shè)備調(diào)試系統(tǒng)的需求
下面運用RUP推薦的4+1視圖方法,從不同視圖進行架構(gòu)設(shè)計,來分門別類地將不同需求一一滿足。
邏輯視圖:設(shè)計滿足功能需求的架構(gòu)
首先根據(jù)功能需求進行初步設(shè)計,進行大粒度的職責劃分。如圖5所示。
l 應(yīng)用層負責設(shè)備狀態(tài)的顯示,并提供模擬控制臺供用戶發(fā)送調(diào)試命令。
l 應(yīng)用層使用通訊層和嵌入層進行交互,但應(yīng)用層不知道通訊的細節(jié)。
l 通訊層負責在RS232協(xié)議之上實現(xiàn)一套專用的“應(yīng)用協(xié)議”。
l 當應(yīng)用層發(fā)送來包含調(diào)試指令的協(xié)議包,由通訊層負責按RS232協(xié)議將之傳遞給嵌入層。
l 當嵌入層發(fā)送來原始數(shù)據(jù),由通訊層將之解釋成應(yīng)用協(xié)議包發(fā)送給應(yīng)用層。
l 嵌入層負責對調(diào)試設(shè)備的具體控制,以及高頻度地從數(shù)據(jù)采集器讀取設(shè)備狀態(tài)數(shù)據(jù)。
l 設(shè)備控制指令的物理規(guī)格被封裝在嵌入層內(nèi)部,讀取數(shù)采器的具體細節(jié)也被封裝在嵌入層內(nèi)部。
圖5 設(shè)備調(diào)試系統(tǒng)架構(gòu)的邏輯視圖
開發(fā)視圖:設(shè)計滿足開發(fā)期質(zhì)量屬性的架構(gòu)
軟件架構(gòu)的開發(fā)視圖應(yīng)當為開發(fā)人員提供切實的指導。任何影響全局的設(shè)計決策都應(yīng)由架構(gòu)設(shè)計來完成,這些決策如果“漏”到了后邊,最終到了大規(guī)模并行開發(fā)階段才發(fā)現(xiàn),可能造成“程序員碰頭兒臨時決定”的情況大量出現(xiàn),軟件質(zhì)量必然將下降甚至導致項目失敗。
其中,采用哪些現(xiàn)成框架、哪些第三方SDK、乃至哪些中間件平臺,都應(yīng)該考慮是否由軟件架構(gòu)的開發(fā)視圖確定下來。圖6展示了設(shè)備調(diào)試系統(tǒng)的(一部分)軟件架構(gòu)開發(fā)視圖:應(yīng)用層將基于MFC設(shè)計實現(xiàn),而通訊層采用了某串口通訊的第三方SDK。
圖6 設(shè)備調(diào)試系統(tǒng)架構(gòu)的開發(fā)視圖
在說說約束性需求。約束應(yīng)該是每個架構(gòu)視圖都應(yīng)該關(guān)注和遵守的一些設(shè)計限制。例如,考慮到“一部分開發(fā)人員沒有嵌入式開發(fā)經(jīng)驗”這條約束情況,架構(gòu)師有必要明確說明系統(tǒng)的目標程序是如何編譯而來的:圖7展示了整個系統(tǒng)的桌面部分的目標程序pc-moduel.exe、以及嵌入式模塊rom-module.hex是如何編譯而來的。這個全局性的描述無疑對沒有經(jīng)驗的開發(fā)人員提供了實感,利于更全面地理解系統(tǒng)的軟件架構(gòu)。
圖7 設(shè)備調(diào)試系統(tǒng)架構(gòu)的開發(fā)視圖
處理視圖:設(shè)計滿足運行期質(zhì)量屬性的架構(gòu)
性能是軟件系統(tǒng)運行期間所表現(xiàn)出的一種質(zhì)量水平,一般用系統(tǒng)響應(yīng)時間和系統(tǒng)吞吐量來衡量。為了達到高性能的要求,軟件架構(gòu)師應(yīng)當針對軟件的運行時情況進行分析與設(shè)計,這就是我們所謂的軟件架構(gòu)的處理視圖的目標。處理視圖關(guān)注進程、線程、對象等運行時概念,以及相關(guān)的并發(fā)、同步、通信等問題。圖8展示了設(shè)備調(diào)試系統(tǒng)架構(gòu)的處理視圖。
可以看出,架構(gòu)師為了滿足高性能需求,采用了多線程的設(shè)計:
l 應(yīng)用層中的線程代表主程序的運行,它直接利用了MFC的主窗口線程。無論是用戶交互,還是串口的數(shù)據(jù)到達,均采取異步事件的方式處理,杜絕了任何“忙等待”無謂的耗時,也縮短了系統(tǒng)響應(yīng)時間。
l 通訊層有獨立的線程控制著“上上下下”的數(shù)據(jù),并設(shè)置了數(shù)據(jù)緩沖區(qū),使數(shù)據(jù)的接收和數(shù)據(jù)的處理相對獨立,從而數(shù)據(jù)接收不會因暫時的處理忙碌而停滯,增加了系統(tǒng)吞吐量。
l 嵌入層的設(shè)計中,分別通過時鐘中斷和RS232口中斷來激發(fā)相應(yīng)的處理邏輯,達到輪詢和收發(fā)數(shù)據(jù)的目的。
圖8 設(shè)備調(diào)試系統(tǒng)架構(gòu)的處理視圖
物理視圖:和部署相關(guān)的架構(gòu)決策
軟件最終要駐留、安裝或部署到硬件才能運行,而軟件架構(gòu)的物理視圖關(guān)注“目標程序及其依賴的運行庫和系統(tǒng)軟件”最終如何安裝或部署到物理機器,以及如何部署機器和網(wǎng)絡(luò)來配合軟件系統(tǒng)的可靠性、可伸縮性等要求。圖9所示的物理架構(gòu)視圖表達了設(shè)備調(diào)試系統(tǒng)軟件和硬件的映射關(guān)系。可以看出,嵌入部分駐留在調(diào)試機中(調(diào)試機是專用單板機),而PC機上是常見的桌面可執(zhí)行程序的形式。
圖9 設(shè)備調(diào)試系統(tǒng)架構(gòu)的物理視圖
我們還可能根據(jù)具體情況的需要,通過物理架構(gòu)視圖更明確地表達具體目標模塊及其通訊結(jié)構(gòu),如圖10所示。
圖10 設(shè)備調(diào)試系統(tǒng)架構(gòu)的物理視圖
小結(jié)與說明
所謂本立道生。深入理解軟件需求分類的復雜性,明確區(qū)分功能需求、約束、運行期質(zhì)量屬性、開發(fā)期質(zhì)量屬性等不同種類的需求就是“本”,因為各類需求對架構(gòu)設(shè)計的影響截然不同。本文通過具體案例的分析,展示了如何通過RUP的4+1視圖方法,針對不同需求進行架構(gòu)設(shè)計,從而確保重要的需求一一被滿足。
本文重點在于方法的解說,因此省略了對架構(gòu)設(shè)計中不少具體問題的說明,同時本文提供的說明架構(gòu)設(shè)計方案的模型也經(jīng)過了簡化。請讀者注意。
本博客為學習交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請注明出處,如有版權(quán)問題請及時通知。由于博客時間倉促,錯誤之處敬請諒解,有任何意見可給我留言,愿共同學習進步。