摘要:軟件體系架構(gòu)(SA)是軟件工程專業(yè)主修課程。本文通過(guò)五子棋軟件開(kāi)發(fā)案例,介紹我們給軟件工程專業(yè)學(xué)生教授SA課程方面的經(jīng)驗(yàn)。通過(guò)需求分析加深對(duì)軟件系統(tǒng)的理解,在此基礎(chǔ)上確定軟件質(zhì)量屬性的優(yōu)先級(jí)和所采用的、用來(lái)實(shí)現(xiàn)這些質(zhì)量屬性的戰(zhàn)術(shù)。設(shè)計(jì)合適的五子棋軟件架構(gòu)以滿足質(zhì)量屬性要求,并對(duì)架構(gòu)進(jìn)行評(píng)估。
關(guān)鍵詞:軟件體系架構(gòu);案例教學(xué);本科課程;統(tǒng)一建模語(yǔ)言;軟件工程
軟件體系架構(gòu) SA(Software Architecture)是軟件工程專業(yè)本科生的一門主修課程,通常在大學(xué)三年級(jí)開(kāi)設(shè)。該門課程實(shí)踐性強(qiáng)、涉及內(nèi)容豐富,如何讓學(xué)生在短短一學(xué)期內(nèi)、在缺乏實(shí)踐經(jīng)驗(yàn)的情況下,理解掌握架構(gòu)設(shè)計(jì)方法,就成為一個(gè)亟待解決的問(wèn)題。根據(jù)學(xué)生特點(diǎn),我們選擇五子棋人機(jī)交互軟件FIR(Five-in-a-Row)作為案例進(jìn)行教學(xué)。五子棋趣味性強(qiáng)、規(guī)則簡(jiǎn)單、老少皆宜,同時(shí),極具挑戰(zhàn)性。設(shè)計(jì)這樣一個(gè)軟件會(huì)用到學(xué)生學(xué)過(guò)的很多課程知識(shí),包括數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計(jì)與分析、高級(jí)程序設(shè)計(jì)語(yǔ)言,等等;初級(jí)版本的FIR程序代碼量約4 000至5 000行,這樣規(guī)模的軟件,如果不進(jìn)行架構(gòu)設(shè)計(jì)就直接來(lái)寫,是很困難的。因此,我們認(rèn)為這是一個(gè)極佳的教學(xué)案例。
在案例教學(xué)中,我們采用質(zhì)量屬性驅(qū)動(dòng)ADD
(Attribute Driven Design)方法[1] 165-185來(lái)設(shè)計(jì)架構(gòu),用UML(Unified Modeling Language)語(yǔ)言描述架構(gòu)[2],遵循統(tǒng)一過(guò)程RUP(Rational Unified Process)方法開(kāi)發(fā)軟件。以下第1節(jié)對(duì)功能需求進(jìn)行描述和分析;第2節(jié)深入理解系統(tǒng)功能和運(yùn)行時(shí)狀態(tài);第3節(jié)分析質(zhì)量屬性和戰(zhàn)術(shù);第4節(jié)設(shè)計(jì)架構(gòu);第5節(jié)評(píng)估架構(gòu);第6節(jié)介紹代碼開(kāi)發(fā)及“架構(gòu)-代碼”一致性檢查;第7節(jié)總結(jié)全文。
1需求描述和分析
需求分析一般在立項(xiàng)階段進(jìn)行(RUP中,需求分析在每一次迭代中都可能進(jìn)行),它的作用是使學(xué)生在編碼前初步了解系統(tǒng)功能以及功能模塊之間的關(guān)系,為確定質(zhì)量屬性和決策架構(gòu)做準(zhǔn)備。這個(gè)FIR軟件,主要以算法研究和教學(xué)為目的,初期版本計(jì)劃用時(shí)1月左右開(kāi)發(fā)完成。
圖1是學(xué)生根據(jù)需求描述設(shè)計(jì)的FIR軟件的頂層用例和內(nèi)部用例,只要稍有下棋經(jīng)驗(yàn)及機(jī)器博弈方面的知識(shí)就能夠完成。這時(shí)的用例圖不需要十分精確,因?yàn)殡S著后面內(nèi)容的進(jìn)行,用例圖會(huì)不斷進(jìn)行調(diào)整。
2對(duì)系統(tǒng)功能及狀態(tài)的深入理解
需求用例圖讓學(xué)生對(duì)系統(tǒng)各功能場(chǎng)景有了初步解,然而模塊之間具體如何交互,到目前為止仍不明朗——必須在架構(gòu)決策之前搞清楚其主要部分,這樣得到的架構(gòu)才可能合理。為此,我們選擇了典型的雙人對(duì)戰(zhàn)場(chǎng)景,讓學(xué)生弄清楚各模塊之間的交互關(guān)系,然后利用UML順序圖和協(xié)作圖描述場(chǎng)景。參考圖2和圖3。
這種(對(duì)系統(tǒng)功能的)理解還可以通過(guò)完成其他場(chǎng)景的順序圖和協(xié)作圖來(lái)持續(xù)強(qiáng)化加深。但場(chǎng)景隨條件不同有很多,不可能都這樣來(lái)做——這個(gè)問(wèn)題可由有限狀態(tài)機(jī)圖來(lái)解決。圖4是我們指導(dǎo)學(xué)生設(shè)計(jì)的FIR系統(tǒng)有限狀態(tài)機(jī),其中包括一個(gè)頂層有限狀態(tài)機(jī)和3個(gè)內(nèi)部狀態(tài)機(jī)。通過(guò)此環(huán)節(jié),學(xué)生弄清楚了系統(tǒng)運(yùn)行時(shí)所處狀態(tài)及變遷條件,結(jié)合前面的順序圖和協(xié)作圖,進(jìn)一步明確了系統(tǒng)模塊功能的劃分和交互。
3質(zhì)量屬性及戰(zhàn)術(shù)
深入了解系統(tǒng)功能及運(yùn)行時(shí)狀態(tài)后,下面著手分析系統(tǒng)的質(zhì)量屬性及相應(yīng)戰(zhàn)術(shù)。
3.1質(zhì)量屬性優(yōu)先級(jí)
本軟件質(zhì)量屬性場(chǎng)景主要有兩個(gè):算法研究平臺(tái)、教學(xué)案例。表1是學(xué)生根據(jù)系統(tǒng)功能和質(zhì)量屬性場(chǎng)景列出的質(zhì)量屬性優(yōu)先級(jí),分高(High)、中(Middle)、
低(Low)三個(gè)等級(jí)。由于算法研究主要追求更有效的搜索算法,因此把性能列為高等級(jí)質(zhì)量屬性。其余質(zhì)量屬性處于相對(duì)次要的地位。
3.2實(shí)現(xiàn)質(zhì)量屬性所采用的戰(zhàn)術(shù)
這一小節(jié)涉及內(nèi)容較為抽象,因此在確定戰(zhàn)術(shù)時(shí),教師與學(xué)生一起進(jìn)行討論。
針對(duì)性能屬性需求,最終決定從3方面戰(zhàn)術(shù)著手:控制資源需求、對(duì)資源進(jìn)行管理和對(duì)資源競(jìng)爭(zhēng)進(jìn)行仲裁[1] 120-135。分別采用提高計(jì)算效率、引入并發(fā)、合理調(diào)度的戰(zhàn)術(shù)。其中,提高計(jì)算效率的主要措施是通過(guò)發(fā)現(xiàn)更多的知識(shí)來(lái)建立更有效的估值函數(shù),然后利用剪枝技術(shù)提高算法搜索效率;另外還采用數(shù)據(jù)庫(kù)(End Game Database)技術(shù)進(jìn)一步提高搜索效率。引入并發(fā)涉及兩方面:一是分離人機(jī)交互部分和搜索部分,二是通過(guò)增加計(jì)算資源(并發(fā)線程)來(lái)提高搜索效率。
針對(duì)可修改質(zhì)量屬性,主要采用局部化變更戰(zhàn)術(shù)和防止連鎖反應(yīng)戰(zhàn)術(shù)。局部化變更戰(zhàn)術(shù)包括抽象通用服務(wù)、保持語(yǔ)義一致性、預(yù)期可能變更等;防止連鎖反應(yīng)戰(zhàn)術(shù)包括信息隱藏和維持現(xiàn)有接口。
針對(duì)易用性質(zhì)量屬性,采用n6+HyHU4ANRe3SF49a1Bhg==了支持用戶主動(dòng)(實(shí)現(xiàn)回退、重新開(kāi)始等功能)、維持用戶模型(對(duì)某些任務(wù)做預(yù)先計(jì)算、給出提示信息和增加幫助功能等)戰(zhàn)術(shù)。
4架構(gòu)分析和表述
前面完成了需求分析、功能狀態(tài)分析、質(zhì)量屬性及戰(zhàn)術(shù)分析。接下來(lái)的任務(wù)就是根據(jù)戰(zhàn)術(shù)來(lái)創(chuàng)建或選用合適的軟件構(gòu)架。
架構(gòu)風(fēng)格可以看做是一整套預(yù)制好的決策。我們已清楚地了解到FIR是一個(gè)典型的人機(jī)交互軟件系統(tǒng),這方面有許多成熟架構(gòu)風(fēng)格可以選用:PAC(表示-抽象-控制模型)、MVC(模型-視圖-控制器)、seeheim(塞海姆)等。最終通過(guò)集體討論選擇了MVC作為FIR的架構(gòu)。該架構(gòu)風(fēng)格把交互過(guò)程分為3部分:輸入、處理、輸出,分別由控制器、模型、視圖來(lái)負(fù)責(zé),避免了系統(tǒng)核心函數(shù)和用戶界面函數(shù)緊密交織帶來(lái)的可修改性和擴(kuò)展性問(wèn)題,可以很方便地添加新的搜索模塊、增加新的界面功能,非常適合FIR系統(tǒng)。架構(gòu)的UML描述見(jiàn)圖5。
根據(jù)ADD架構(gòu)設(shè)計(jì)方法,在確定了頂層(即系統(tǒng)本身)及最初幾層架構(gòu)后,接下來(lái)就是分解求精架構(gòu)的各個(gè)模塊,針對(duì)這些模塊,再選擇架構(gòu)驅(qū)動(dòng)因素、戰(zhàn)術(shù)和模式,繼續(xù)分解求精直至系統(tǒng)分解為某適當(dāng)?shù)牧6葹橹?。這部分內(nèi)容受空間限制略去。
5評(píng)估架構(gòu)
完成架構(gòu)設(shè)計(jì)后,我們并沒(méi)有立即開(kāi)始詳細(xì)設(shè)計(jì)及編碼工作,而是與學(xué)生一起針對(duì)所選架構(gòu)進(jìn)行評(píng)估。評(píng)估能發(fā)現(xiàn)一些潛在風(fēng)險(xiǎn),對(duì)大型軟件系統(tǒng)尤其重要。
表2根據(jù)架構(gòu)評(píng)估權(quán)衡分析方法(ATAM) [1] 276-303,列出了FIR軟件架構(gòu)的質(zhì)量效用樹(shù)。限于空間,表中僅展示了性能、可修改性部分的質(zhì)量效用樹(shù)。
針對(duì)質(zhì)量效用樹(shù)的高優(yōu)先級(jí)場(chǎng)景如VCF_搜索,我們討論了所采用的架構(gòu)決策點(diǎn)和權(quán)衡點(diǎn),包括提高計(jì)算效率(使用了一種Cache技術(shù))、引入并發(fā)(見(jiàn)圖6)等等。
6代碼開(kāi)發(fā)和架構(gòu)—代碼一致性檢測(cè)
6.1代碼開(kāi)發(fā)
當(dāng)架構(gòu)層次分解穩(wěn)定后,就可以將各個(gè)模塊分配給開(kāi)發(fā)小組在確定了接口規(guī)范及通訊消息協(xié)議后,我們將學(xué)生分組,分別負(fù)責(zé)不同模塊的代碼開(kāi)發(fā)工作:數(shù)據(jù)庫(kù)小組、人機(jī)交互界面小組、搜索函數(shù)模塊小組(數(shù)個(gè))、集成和測(cè)試小組等等。定期開(kāi)會(huì)交流進(jìn)展情況,由教師負(fù)責(zé)全局統(tǒng)籌管理。其中某些實(shí)現(xiàn)困難的模塊,由教師事先完成。圖7是FIR軟件進(jìn)行VCF(Victory by Continue Fours)計(jì)算的一個(gè)實(shí)戰(zhàn)場(chǎng)景。
6.2架構(gòu)-代碼的一致性檢測(cè)
軟件系統(tǒng)最終性能不僅受SA影響,還受限于編碼質(zhì)量,因此,對(duì)SA與系統(tǒng)實(shí)際功能是否一致需進(jìn)行檢查。迄今,未見(jiàn)參考文獻(xiàn)介紹如何在代碼中跟蹤具體戰(zhàn)術(shù)或架構(gòu)風(fēng)格。為此,架構(gòu)設(shè)計(jì)時(shí),我們根據(jù)實(shí)際需要制定了一些功能場(chǎng)景的效能目標(biāo),然后在代碼完成后檢測(cè)這些目標(biāo)的實(shí)現(xiàn)情況。這部分工作已經(jīng)記錄于表2中。以性能質(zhì)量屬性為例,在架構(gòu)設(shè)計(jì)時(shí)要求完成一次除VCF、VCT等高級(jí)搜索外的人機(jī)交互操作不超過(guò)10ms響應(yīng)時(shí)間,參考表2的“性能”行,其中,第4層場(chǎng)景求精列的括號(hào)中數(shù)字顯示了實(shí)測(cè)運(yùn)行時(shí)間,滿足設(shè)計(jì)架構(gòu)時(shí)設(shè)定的目標(biāo)(見(jiàn)第3層場(chǎng)景概念列和第4層場(chǎng)景求精列的括號(hào)外部分)。
7結(jié)語(yǔ)
好的案例勝過(guò)千言萬(wàn)語(yǔ),通過(guò)親身參與全過(guò)程的軟件開(kāi)發(fā),學(xué)生理解了軟件架構(gòu)對(duì)于軟件開(kāi)發(fā)的重要性,掌握了一種架構(gòu)設(shè)計(jì)方法,并深刻體會(huì)到從架構(gòu)到編碼再到最終軟件所付出巨大努力。
在這個(gè)案例中,學(xué)生會(huì)碰到各式各樣的問(wèn)題。教師應(yīng)當(dāng)以發(fā)揮學(xué)生主動(dòng)性為主,以自己出手代辦為輔,充分利用學(xué)生渴求知識(shí)、思維活躍的特點(diǎn)以及對(duì)棋的興趣,引導(dǎo)他們獨(dú)立解決問(wèn)題。隨著問(wèn)題的解決,學(xué)生不但融會(huì)貫通了本課程及以前課程所學(xué)知識(shí),還獲得了很大的成就感和自信心,激發(fā)了學(xué)習(xí)興趣。
今后,我們計(jì)劃讓學(xué)生利用課余時(shí)間,并根據(jù)自身興趣參與國(guó)內(nèi)外舉辦的機(jī)器博弈競(jìng)賽或工業(yè)級(jí)項(xiàng)目產(chǎn)品開(kāi)發(fā),以此作為課堂教學(xué)的有益補(bǔ)充。
參考文獻(xiàn):
[1] L.B