陳麗 于霞 李曉利 余俊
(1.中國人民解放軍63892部隊 河南省洛陽市 471003 2.中國兵器工業(yè)導(dǎo)航與控制技術(shù)研究所 北京市 100000)
軟件設(shè)計是從軟件需求出發(fā),根據(jù)需求分析階段確定的能力需求設(shè)計軟件系統(tǒng)的整體架構(gòu)、功能模塊劃分、接口設(shè)計以及模塊實現(xiàn)的算法和數(shù)據(jù)結(jié)構(gòu)要求。如果說軟件需求階段編寫的軟件需求規(guī)格說明文檔記錄了軟件系統(tǒng)要“做什么”,那么在軟件設(shè)計階段就要明確軟件系統(tǒng)“如何做”才能滿足需求。軟件設(shè)計階段的輸出是軟件設(shè)計說明文檔。如果說用戶對你編寫的軟件需求規(guī)格說明文檔還能看懂“你在說什么,說的全不全,對不對”的話,到了編寫軟件設(shè)計說明時,部分用戶就已經(jīng)看不懂你編寫的軟件設(shè)計說明文檔是否滿足相關(guān)要求了。加上很多軟件設(shè)計說明是軟件編碼人員負(fù)責(zé)編寫的,標(biāo)準(zhǔn)如何要求,如何把軟件實現(xiàn)過程文檔化,也是很多軟件設(shè)計說明文檔編寫人員比較頭疼的問題。
為了幫助用戶讀懂軟件設(shè)計說明,也為了幫助軟件設(shè)計說明編寫者更好地落實標(biāo)準(zhǔn)要求,本文針對GJB438B-2009《軍用軟件開發(fā)文檔通用要求》中關(guān)于軟件設(shè)計說明文檔的要求,詳細(xì)闡述如何編寫軟件設(shè)計說明文檔中的重要章節(jié)。
軟件設(shè)計說明文檔中的主要章節(jié)和常出現(xiàn)問題的章節(jié)內(nèi)容有設(shè)計決策、體系結(jié)構(gòu)設(shè)計、執(zhí)行方案、接口設(shè)計和詳細(xì)設(shè)計等。本節(jié)基于結(jié)構(gòu)化方法分別對以上內(nèi)容如何編寫進(jìn)行詳細(xì)闡述。
在GJB438B中,要求本章需分條給出軟件的CSCI級設(shè)計決策。所謂CSCI設(shè)計決策,應(yīng)是從其行為方面進(jìn)行設(shè)計的決策,或者對其他影響組成該CSCI的軟件單位的選擇并進(jìn)行設(shè)計的決策。如果在需求中已經(jīng)明確了這些決策,或者有些決策需要推遲到軟件單元設(shè)計時指出,那么,應(yīng)在本章節(jié)相應(yīng)位置明確加以敘述。此外,若是這些決策依賴于系統(tǒng)的狀態(tài)或者方式,則應(yīng)該指明它們的依賴性。
顧名思義,“決策”就是要寫那些指導(dǎo)軟件設(shè)計的頂層思路。也就是說,在進(jìn)行決策時,應(yīng)忽略CSCI內(nèi)部的實現(xiàn),站在用戶的角度,詳細(xì)描述系統(tǒng)運轉(zhuǎn)時所要采用的方式方法,同時,還要說明影響CSCI軟件單元的選擇、設(shè)計的決策。根據(jù)標(biāo)準(zhǔn)要求,通常從以下幾方面進(jìn)行闡述:
CSCI將接收的輸入和將產(chǎn)生的輸出的設(shè)計決策。這個決策主要以CSCI為研究對象,描述外部環(huán)境對CSCI的影響,如其他系統(tǒng)、HWCI、CSCI和用戶的接口等對本CSCI的輸入和輸出。有時,上述信息可能會在接口設(shè)計說明中給出全部或者部分的說明,這種情況下,可以直接引用接口設(shè)計說明文檔即可。
CSCI對每一個輸入或者條件的行為設(shè)計決策作出響應(yīng)。決策關(guān)注的主要是CSCI的內(nèi)部響應(yīng)行為設(shè)計決策,主要包括內(nèi)容有:針對每個輸入或條件CSCI要執(zhí)行的動作、響應(yīng)的時間,及其他性能特性,選定的方程/算法/規(guī)則,模型化的物理系統(tǒng)的說明,以及CSCI對不允許的輸入或條件需要進(jìn)行的處理等。
CSCI數(shù)據(jù)顯示的設(shè)計決策。這個決策主要關(guān)注CSCI的數(shù)據(jù)庫或數(shù)據(jù)文件如何呈現(xiàn)給用戶的,如用文字、圖像、符號、表格、編輯框等。當(dāng)上述信息在數(shù)據(jù)庫設(shè)計說明中給出全部或部分的說明時,此處可以不必贅述,直接引用數(shù)據(jù)庫設(shè)計說明文檔即可。
CSCI安全性和保密性設(shè)計決策。這個決策主要從軟件為了滿足安全性和保密性要求而考慮將采取哪些措施選擇哪些方法。如對輸入信息進(jìn)行合法性檢查、防止信息誤刪除、數(shù)據(jù)庫訪問權(quán)限控制、數(shù)據(jù)傳輸?shù)募用芴幚淼却胧?/p>
其他CSCI設(shè)計決策。這個決策是除了上述分類說明的決策以外可能還有其他決策,應(yīng)在此處說明。如軟件靈活性設(shè)計決策、可用性和可維護(hù)性設(shè)計決策等。為了確保軟件的靈活性需求,通常采用模塊化的設(shè)計決策,易于擴(kuò)展和使用維護(hù)。
該章節(jié)設(shè)計決策應(yīng)與軟件需求規(guī)格說明中明確的相關(guān)內(nèi)容相一致。如果在軟件需求規(guī)格說明中明確了保密性和安全性需求,那么在設(shè)計說明的本章節(jié)就要考慮如何落實這些需求,首先在設(shè)計決策上要進(jìn)行考慮,然后指導(dǎo)后續(xù)的設(shè)計實現(xiàn)。
GJB438B標(biāo)準(zhǔn)規(guī)定該章節(jié)應(yīng)對CSCI體系結(jié)構(gòu)設(shè)計進(jìn)行分條描述。若是設(shè)計的全部或部分與系統(tǒng)的狀態(tài)或方式存在依賴關(guān)系,應(yīng)在文檔中明確說明。而且如果有其他設(shè)計約定,在此處應(yīng)明確說明或進(jìn)行引用。
體系結(jié)構(gòu)設(shè)計也稱“架構(gòu)設(shè)計”,是從高層抽象的角度刻畫組成CSCI的部件以及它們之間的邏輯關(guān)聯(lián)。基于結(jié)構(gòu)化方法設(shè)計CSCI的體系結(jié)構(gòu)是采用分層和部件的形式的表示。通常體系結(jié)構(gòu)分層有三層:用戶界面層、業(yè)務(wù)邏輯層、底層支撐層(也可稱為“設(shè)備驅(qū)動層”),如圖1所示。每一層包含若干CSCI的部件。分小節(jié)描述每個部件的用途、開發(fā)狀態(tài)、分配的需求和設(shè)計決策、分配的計算機資源等信息。標(biāo)識每個部件的軟件放置在哪個程序庫中。
圖1:體系結(jié)構(gòu)示意圖
本節(jié)主要從靜態(tài)角度刻畫CSCI的體系結(jié)構(gòu)和組成部件,下一節(jié)從動態(tài)角度進(jìn)一步闡述每個部件的運行關(guān)系。
本小節(jié)是上一節(jié)體系結(jié)構(gòu)設(shè)計中的一個小章節(jié)。之所以將其獨立成小節(jié),是因為該節(jié)在體系結(jié)構(gòu)設(shè)計章節(jié)的地位很重要,是CSCI體系結(jié)構(gòu)設(shè)計章節(jié)的主體內(nèi)容。
本節(jié)中需要對組成CSCI的所有軟件單元進(jìn)行明確的描述,并對明確的軟件單位賦予一個項目唯一的標(biāo)識符。此外,還需要說明軟件單元的靜態(tài)關(guān)系,如它們由哪些單元組成的。也要對軟件單元的用途進(jìn)行逐個說明,并指明與之相關(guān)的CSCI需求、CSCI級設(shè)計決策。另外,每個軟件單元的開發(fā)狀態(tài)或是類型,比如新研、重用還是改進(jìn),也應(yīng)一并說明。說明CSCI中每個軟件單元計劃使用的計算機硬件資源,如處理機能力、內(nèi)存能力、輸入輸出設(shè)備能力、輔助存儲能力等。這些說明應(yīng)該覆蓋在CSCI的資源使用需求中、軟件開發(fā)計劃的資源使用策劃中、以及影響該CSCI的系統(tǒng)級資源分配中等方面包含的全部的計算機硬件資源。若是在某一部分已經(jīng)給出了針對指定計算機硬件資源所有使用數(shù)據(jù),那么,在本節(jié)就可以直接引用。
在上一小節(jié)中我們重點介紹了體系架構(gòu)設(shè)計,本小節(jié)詳細(xì)介紹組成體系架構(gòu)的元素,即組件或部件的設(shè)計方法。我們都知道部件是由單元組成,單元可以由更小的單元組成。在概要設(shè)計過程中,應(yīng)盡早明確誰是配置項,誰是部件,誰是單元,然后按照這樣的粒度進(jìn)行后續(xù)的設(shè)計。
根據(jù)標(biāo)準(zhǔn)要求對部件進(jìn)行設(shè)計,首先要唯一標(biāo)識部件,并說明部件的用途。然后根據(jù)前面的設(shè)計,如決策設(shè)計、資源設(shè)計等,將這些設(shè)計分配到部件設(shè)計中。說明哪些部件應(yīng)滿足哪些設(shè)計決策,所需的計算機資源有哪些。以及這些部件將分配到哪個程序文件中。
在具體實現(xiàn)方式上,我們通常采用結(jié)構(gòu)圖(如圖2所示)加屬性表格的形式對其進(jìn)行表述。
圖2:CSCI的部件組成示意圖
GJB438標(biāo)準(zhǔn)要求在“執(zhí)行方案”小節(jié)中應(yīng)該對軟件單元間的執(zhí)行方案進(jìn)行說明,可運用語言描述或者采用圖表來說明軟件單元之間的動態(tài)關(guān)系。所謂動態(tài)關(guān)系,指的是在CSCI運行期間,軟件單元之間的相互作用的情況。結(jié)構(gòu)化的執(zhí)行方案表示方法通常采用執(zhí)行控制流程、數(shù)據(jù)流,面向?qū)ο蟮谋硎痉椒ㄍǔ2捎脮r序圖、動態(tài)控制序列,用以說明單元間的中斷處理、優(yōu)先關(guān)系、時序或排序關(guān)系、并發(fā)執(zhí)行、例外處理、對象/進(jìn)程/任務(wù)的動態(tài)創(chuàng)建或者刪除、動態(tài)分配與去除分配,以及動態(tài)行為的其他方面等。
根據(jù)標(biāo)準(zhǔn)要求本節(jié)詳細(xì)說明CSCI軟件單元間的執(zhí)行方案。因為軟件單元的粒度是不確定的,一個功能需求可以稱為一個部件也可以稱為一個單元,因此在實際編寫過程中,為了充分說明CSCI的運行過程,通常分為兩個層次來說明執(zhí)行方案:部件間執(zhí)行方案和部件內(nèi)執(zhí)行方案。
為了說明軟件部件間和軟件部件內(nèi)的相互作用,結(jié)構(gòu)化的方法通常采用流程圖(如圖3所示)和數(shù)據(jù)流圖(如圖4所示)的形式加以描述。描述的要素主要有:名稱和標(biāo)識、功能描述、輸入輸出、行為處理、性能參數(shù)、異常處理、優(yōu)先級順序等。此外如果部件與人機界面有關(guān),還應(yīng)增加人機界面示意圖。
圖3:流程圖示意圖
圖4:數(shù)據(jù)流圖示意圖
在GJB438B中關(guān)于接口的要求都是一樣的,無論是在需求規(guī)格說明文檔還是在設(shè)計說明文檔中。唯一區(qū)別是落實標(biāo)準(zhǔn)要求時,在需求規(guī)格說明中應(yīng)重點闡述外部接口特性,在軟件設(shè)計說明中要重點描述內(nèi)部接口特性,因為在軟件設(shè)計階段,關(guān)注的內(nèi)容就是軟件自身是如何實現(xiàn)的。
本節(jié)中,應(yīng)對每個接口賦予項目唯一的標(biāo)識符,可以通過編號、名稱、版本以及文檔引用等要素來標(biāo)識接口實體。接口標(biāo)識應(yīng)該能夠?qū)δ男嶓w具有固定的接口特性進(jìn)行說明,也就是需要將接口需求分配給接口實體;也應(yīng)說明哪些實體正在修改或是開發(fā),以此對接口需求分配進(jìn)行明確。
接口設(shè)計分為外部接口和內(nèi)部接口。外部接口在需求規(guī)格說明中已詳細(xì)描述,在此處可以將其拷貝過來,或者再簡要描述一下外部接口實體和傳遞的信息。在描述內(nèi)部接口時也應(yīng)詳細(xì)描述以下要素:接口類型、接口通信方法、接口協(xié)議、接口傳遞信息的數(shù)據(jù)和數(shù)據(jù)組合體,明確數(shù)據(jù)傳輸?shù)男旁春托潘蕖?/p>
接口的表示方式有接口圖(如圖5)和接口表(如表1)。
圖5:內(nèi)部接口的示意圖
表1:一種接口詳細(xì)信息示例表
原總裝軟件工程規(guī)范中將軟件設(shè)計分為概要設(shè)計說明和詳細(xì)設(shè)計說明,而GJB438B中只有軟件設(shè)計說明。但是大家通常這么認(rèn)為,軟件設(shè)計說明到此處為止,以上內(nèi)容屬軟件概要設(shè)計,如果甲方要求寫軟件概要設(shè)計說明,但是沒有提供具體模板時,可以將軟件設(shè)計說明中的詳細(xì)設(shè)計章節(jié)刪除算作軟件概要設(shè)計說明。但是從一份文檔的完整性上來講,如果對GJB438B中軟件設(shè)計說明文檔進(jìn)行了裁剪,而且裁剪的是技術(shù)內(nèi)容時,就不能說裁剪后的文檔仍然是遵循了GJB438B的標(biāo)準(zhǔn)規(guī)范。
在軟件工程領(lǐng)域要求“三分離”:需求、設(shè)計、實現(xiàn)三分離,如果將設(shè)計人員與實現(xiàn)人員進(jìn)行分離,那么本節(jié)內(nèi)容就尤為重要了。本節(jié)詳細(xì)設(shè)計是直接指導(dǎo)軟件編碼實現(xiàn)的重要依據(jù)。
標(biāo)準(zhǔn)中要求本節(jié)應(yīng)通過項目唯一標(biāo)識符來標(biāo)識軟件單元,并對軟件單元進(jìn)行說明。說明的主要內(nèi)容有:軟件單元設(shè)計決策,比如使用的算法;軟件單元設(shè)計中的任務(wù)約束、有關(guān)限定,或是非常規(guī)的特征;若是軟件單元使用的編程語言與之前明確的不一致,需要給出說明,并給出使用的理由;要對軟件軟件單元包含的過程性命令進(jìn)行說明或是列出組成過程性的命令組;當(dāng)軟件單元包含、接收或是輸出數(shù)據(jù)時,應(yīng)需要對其輸入輸出、數(shù)據(jù)元素組合體或是數(shù)據(jù)元素進(jìn)行說明。軟件單元的輸入數(shù)據(jù)、輸出數(shù)據(jù)應(yīng)該與局部數(shù)據(jù)分開進(jìn)行描述。若是軟件單元是一個數(shù)據(jù)庫,則應(yīng)該引用對應(yīng)的數(shù)據(jù)庫設(shè)計說明;當(dāng)軟件單元包含邏輯時,需要對該軟件單元所用到的邏輯給出說明。
詳細(xì)設(shè)計關(guān)注的是軟件單元間和單元內(nèi)部的具體實現(xiàn),是對體系結(jié)構(gòu)設(shè)計的進(jìn)一步細(xì)化和精化,是軟件設(shè)計的最后一個環(huán)節(jié)。在這個章節(jié)中要求關(guān)注的要素主要有:軟件單元的名稱和標(biāo)識、單元功能描述、輸入輸出、內(nèi)部函數(shù)、局部變量、數(shù)據(jù)結(jié)構(gòu)、處理流程、行為參數(shù)、異常處理等。
軟件單元的詳細(xì)設(shè)計粒度應(yīng)具體到函數(shù)層級。詳細(xì)說明軟件單元由哪些函數(shù)組成,函數(shù)的參數(shù)有哪些,參數(shù)的返回值是什么類型,函數(shù)需要的全局?jǐn)?shù)據(jù)或局部數(shù)據(jù)有哪些等等。此外,還包括函數(shù)的異常情況,即異常分支也應(yīng)在此考慮。前面設(shè)計的性能指標(biāo),尤其是安全性、可靠性、保密性等非功能指標(biāo),在軟件單位的詳細(xì)設(shè)計中應(yīng)重點考慮。因為如果此時不注意這些指標(biāo)對設(shè)計的影響,那么這些問題都將在最后軟件進(jìn)行軟件測試時暴露無疑,而且這種軟件問題在軟件編碼完成后再進(jìn)行修改,影響域是很大的。很多時候還出現(xiàn)越改越亂的情況。
采用結(jié)構(gòu)化方法描述單元的詳細(xì)設(shè)計時通常采用“一表加兩圖”的形式:用表格描述各個要素,用流程圖和數(shù)據(jù)流圖描述動態(tài)關(guān)系。
本文重點對GJB438B的《軟件設(shè)計說明》文檔中重要的和常出現(xiàn)問題的章節(jié)如何編寫進(jìn)行了詳細(xì)分析,筆者結(jié)合多年文檔審核經(jīng)驗和編寫經(jīng)驗,指明了在依據(jù)標(biāo)準(zhǔn)要求進(jìn)行編寫時應(yīng)注意的方面,給出了如何落實標(biāo)準(zhǔn)要求的具體的示例。
編寫軟件設(shè)計說明可以采用結(jié)構(gòu)化的方法來寫,也可以采用面向?qū)ο蟮姆椒▉韺?,對嵌入式軟件和FPGA軟件通常采用結(jié)構(gòu)化的描述方法會多些,其他軟件采用結(jié)構(gòu)化或面向?qū)ο蟮姆椒ǘ急容^多。這兩種方法各有優(yōu)點:結(jié)構(gòu)化方法描述簡單,容易上手,比較好理解,符合逐步細(xì)化的設(shè)計思路。面向?qū)ο蠓椒ㄒ笥幸欢ǖ腢ML基礎(chǔ),采用類和對象的描述方式進(jìn)行設(shè)計,易于組件封裝和重用。本文主要闡述了結(jié)構(gòu)化的方法,后續(xù)將闡述如何用面向?qū)ο蟮姆椒ň帉戃浖O(shè)計說明。