需求分析是軟件生命周期中相當重要的一個階段男杈。根據(jù) Standish Group 對 23000 個項目進行的研究結(jié)果表明悯蝉, 28% 的項目徹底失敗厢破, 46% 的項目超出經(jīng)費預算或者超出工期仅颇,只有約 26% 的項目獲得成功受神。需求分析工作在整個軟件開發(fā)生命周期中有著十分重要的意義剖膳。而在這些高達 74% 的不成功項目中魏颓,有約 60% 的失敗是源于需求問題,也就是差不多有一半的項目都遇到了這個問題吱晒,這一可怕的現(xiàn)象引起人們對需求分析的高度重視甸饱。
需求分析階段的主要任務(wù)是通過開發(fā)人員與用戶之間的廣泛交流,不斷澄清一些模糊的概念仑濒,最終形成一個完整的 叹话、 清晰的 、 一致的需求說明墩瞳。
而當明確了用戶的需求之后驼壶,下一步的任務(wù)就是對未來的軟件系統(tǒng)進行設(shè)計,它是確定系統(tǒng)實現(xiàn)的關(guān)鍵工作喉酌。需求分析和設(shè)計的方法對軟件開發(fā)過程而言是十分重要的热凹,因此必須扎實地掌握它。
需求分析與軟件設(shè)計是軟件生存期中最重要的兩個步驟泪电,需求分析解決的是 “ 做什么 ” 的問題般妙,系統(tǒng)設(shè)計則是解決 “ 怎么做 ” 的問題。
1 需求分析的任務(wù)與過程
需求分析所要做的工作是深入描述軟件的功能和性能相速,確定軟件設(shè)計的限制和軟件同其他系統(tǒng)元素的接口細節(jié)碟渺,定義軟件的其他有效性需求,細化軟件要處理的數(shù)據(jù)域突诬。用一句話概括就是:需求分析主要是確定待開發(fā)軟件的功能 苫拍、 性能 芜繁、 數(shù)據(jù) 、 界面等要求绒极。
1.1 需求分析階段的工作
需求分析的實現(xiàn)步驟通常包括:獲取當前系統(tǒng)的物理模型骏令,抽象出當前系統(tǒng)的邏輯模型,建立目標系統(tǒng)的邏輯模型三個部分集峦。具體來說伏社,需求分析階段的工作可以分成4個方面:
(1)問題識別
用于發(fā)現(xiàn)需求 、 描述需求,主要包括功能需求 、 性能需求 涕俗、 環(huán)境需求 、 可靠性需求 聪黎、 安全保密需求 、 用戶界面需求 备恤、 資源使用需求 稿饰、 軟件成本消耗與開發(fā)進度需求,以此來預先估計以后系統(tǒng)可能達到的目標露泊。
(2)分析與綜合
也就是對問題進行分析喉镰,然后在此基礎(chǔ)上整合出解決方案。這個步驟經(jīng)常是反復進行的惭笑,常用的方法有面向數(shù)據(jù)流的結(jié)構(gòu)化分析方法( Structured Analysis 侣姆, SA ),面向數(shù)據(jù)結(jié)構(gòu)的 Jackson 方法沉噩,面向?qū)ο蟮姆治龇椒ǎ?Object Oriented Analysis 捺宗, OOA ),以及用于建立動態(tài)模型的狀態(tài)遷移圖和 Petri 網(wǎng)川蒙。
Petri 網(wǎng)是對離散并行系統(tǒng)的數(shù)學表示蚜厉。它適合于描述異步的 、 并發(fā)的計算機系統(tǒng)模型畜眨。 Petri 網(wǎng)既有嚴格的數(shù)學表述方式昼牛,也有直觀的圖形表達方式,既有豐富的系統(tǒng)描述手段和系統(tǒng)行為分析技術(shù)康聂,又為計算機科學提供堅實的概念基礎(chǔ)匾嘱。
(3)編制需求分析的文檔
也就是對已經(jīng)確定的需求進行文檔化描述,該文檔通常稱為 “ 需求規(guī)格說明書 ”早抠。
(4)需求分析與評審
它是需求分析工作的最后一步,主要是對功能的正確性 撬讽、 完整性和清晰性蕊连,以及其他需求給予評價悬垃。
1.2 需求的分類
什么是軟件的需求呢?軟件需求就是系統(tǒng)必須完成的事及必須具備的品質(zhì)甘苍。具體來說尝蠕,軟件需求包括功能需求 、 非功能需求和設(shè)計約束三方面內(nèi)容载庭。各種需求的概念示意圖如圖 1 所示看彼。
SRS,即需求規(guī)格說明書(Software Requirements Specification)囚聚。
- 功能需求:是指系統(tǒng)必須完成的那些事靖榕,即為了向它的用戶提供有用的功能,產(chǎn)品必須執(zhí)行的動作顽铸。
- 非功能需求:是指產(chǎn)品必須具備的屬性或品質(zhì)茁计,如性能、響應(yīng)時間谓松、可靠性星压、容錯性、擴展性等鬼譬。
- 設(shè)計約束:也稱為限制條件娜膘、補充規(guī)約,這通常是對解決方案的一些約束說明优质,例如必須采用國有自主知識版權(quán)的數(shù)據(jù)庫系統(tǒng)竣贪,必須在 UNIX 操作系統(tǒng)之下運行等。
除了這三種需求之外盆赤,還有業(yè)務(wù)需求 贾富、 用戶需求 、 系統(tǒng)需求這三個處于不同層面的概念牺六,充分地理解這樣的模型才能夠更加清晰地理清需求的脈絡(luò)颤枪。
- 業(yè)務(wù)需求(Business Requirement):是指反映組織機構(gòu)或客戶對系統(tǒng)、產(chǎn)品高層次的目標要求淑际,通常問題定義本身就是業(yè)務(wù)需求畏纲。
- 用戶需求(User Requirement):是指描述用戶使用產(chǎn)品必須要完成什么任務(wù),怎么完成的需求春缕,通常是在問題定義的基礎(chǔ)上進行用戶訪談盗胀、調(diào)查,對用戶使用的場景進行整理锄贼,從而建立從用戶角度出發(fā)的需求票灰。
- 系統(tǒng)需求(System Requirement):是從系統(tǒng)的角度來說明軟件的需求,它包括用特性說明的功能需求、質(zhì)量屬性屑迂、非功能需求及設(shè)計約束浸策。
分析師經(jīng)常圍繞著 “ 功能需求 ” 來展開工作,而功能需求大部分都是從 “ 系統(tǒng)需求 ” 的角度來分析與理解的惹盼,也就是用 “ 開發(fā)人員 ” 的視角來理解需求庸汗。但要想真正地得到完整的需求,僅戴上 “ 開發(fā)人員 ” 的眼鏡是不夠的手报,還需要 “ 領(lǐng)域?qū)<?” 的眼鏡蚯舱,要從更高的角度來理解需求,這就是 “ 業(yè)務(wù)需求 ” 掩蛤;同時還應(yīng)該更好地深入用戶枉昏,了解他們的使用場景,了解他們的想法盏档,這就是 “ 用戶需求 ” 凶掰。這是一個理解層次的問題,并不僅僅是簡單的概念蜈亩。
1.3 需求工程
需求工程就是包括創(chuàng)建和維護系統(tǒng)需求文檔所必需的一切活動的過程懦窘,主要包括需求開發(fā)和需求管理兩大工作。
(1)需求開發(fā):包括需求捕獲 稚配、 需求分析 畅涂、 編寫規(guī)格說明書和需求驗證4個階段。在這個階段需要完成確定產(chǎn)品所期望的用戶類型 道川、 獲取每種用戶類型的需求 午衰、 了解實際用戶任務(wù)和目標及這些任務(wù)所支持的業(yè)務(wù)需求 、 分析源于用戶的信息 冒萄、 對需求進行優(yōu)先級分類 臊岸、 將所收集的需求編寫成為軟件規(guī)格說明書和需求分析模型 、 對需求進行評審等工作尊流。
(2)需求管理:通常包括定義需求基線 帅戒、 處理需求變更 、 需求跟蹤等方面的工作崖技。這兩個方面是相輔相成的逻住,需求開發(fā)是主線,是目標迎献;需求管理是支持瞎访,是保障。換句話說吁恍,需求開發(fā)是努力更清晰 扒秸、 更明確地掌握客戶對系統(tǒng)的需求播演;而需求管理則是對需求的變化進行管理的過程。
1.4 需求分析方法
需求分析的方法可謂種類繁多鸦采,不過如果按照分解方式的不同宾巍,可以很容易地劃分出幾種類型。
(1)結(jié)構(gòu)化分析方法
最初的分析方法都不成體系渔伯,而且通常都只包括一些籠統(tǒng)的告誡,在 20 世紀 70 年代分析技術(shù)發(fā)展的分水嶺終于出現(xiàn)了肄程。這時人們開始嘗試使用標準化的方法锣吼,開發(fā)和推出各種名為 “ 結(jié)構(gòu)化分析 ” 的方法論,而 Tom DeMacro 則是這個領(lǐng)域最有代表性和權(quán)威性的專家蓝厌。
(2)軟系統(tǒng)方法
這是一個過渡性的方法論玄叠,并未真正流行過,它的出現(xiàn)只是證明了結(jié)構(gòu)化分析方法的一些不足拓提。因為結(jié)構(gòu)化分析方法采用的相對形式化的模型不僅與社會觀格格不入读恃,而且在解決 “ 不確定性 ” 時顯得十分無力。最有代表性的軟系統(tǒng)方法是 Checkland 方法代态。
(3)面向?qū)ο蠓治龇椒?/strong>
在 20 世紀 90 年代寺惫,結(jié)構(gòu)化方法的不足在面對多變的商業(yè)世界時,顯得更加蒼白無力蹦疑,這就催使了 OOA 的迅速發(fā)展西雀。
(4)面向問題域的分析(Problem Domain Oriented Analysis, PDOA)
現(xiàn)在又發(fā)現(xiàn)面向?qū)ο蠓治龇椒ㄒ泊嬖谥芏嗟牟蛔闱复荩瑧?yīng)運而生了一些新的方法論艇肴, PDOA 就是其中一種。不過現(xiàn)在還在研究階段叁温,并未廣泛應(yīng)用再悼。
2 如何進行系統(tǒng)設(shè)計
當設(shè)計者拿到一個需求,他如何開展系統(tǒng)設(shè)計呢膝但?許多想進入系統(tǒng)分析與設(shè)計的年輕人以為自己知道了面向?qū)ο?冲九、 統(tǒng)一建模語言 、 設(shè)計模式等新鮮深奧的名詞就可以進行設(shè)計了锰镀,可是掌握工具和技能絕不是成為優(yōu)秀設(shè)計者的充分條件娘侍,甚至也不是必要條件。遺憾的是這里沒有捷徑泳炉,只有設(shè)計者在實踐中不斷學習和總結(jié)憾筏。而在實踐中,系統(tǒng)設(shè)計與其說是在設(shè)計花鹅,不如說是在選擇和妥協(xié)氧腰。
妥協(xié),就是在各個系統(tǒng)目標之間找到一個平衡點。系統(tǒng)目標包括但不限制于功能 古拴、 性能 箩帚、 健壯性 、 開發(fā)周期 黄痪、 交付日期等紧帕。不幸的是,這些目標往往是矛盾的桅打,提高軟件性能直接意味著開發(fā)周期的增加 是嗜、 交付日期的推遲,盲目地增加功能可能導致性能降低挺尾,維護成本提高鹅搪。軟件設(shè)計者的難題在于在如此眾多的目標之間找到這個平衡點,并且明確知道如何設(shè)計能實現(xiàn)這個平衡遭铺,既可以讓投資者覺得在預算之內(nèi)丽柿,又能讓用戶相對滿意魂挂「μ猓可行性分析階段應(yīng)該已經(jīng)論述了這樣一個平衡點,可是如果設(shè)計者發(fā)現(xiàn)沒有這樣一個平衡點幔睬,如同沒有一個設(shè)計者能讓人騎著自行車到月球上去麻顶,那么設(shè)計者只能提出放棄某個方面的過度要求,否則系統(tǒng)要遭受必然失敗的命運矫钓。
更多的情況是沒有經(jīng)驗的設(shè)計者不知道是否存在這些平衡點,更不知道如何利用合理的設(shè)計及有效的工具來達到平衡。因此設(shè)計者需要了解可以解決問題的各種方案蚕键,并清楚知道各個方案的效果 锣光、 成本 替废、 缺點兽赁,以及這些方案的區(qū)別,并在各種方案中進行選擇。而這些,不是一個人能在一兩天了解的映穗。
沒有一個設(shè)計者會完全重新開始設(shè)計一個系統(tǒng)蚁滋,他們總參考多個與目標系統(tǒng)相類似的系統(tǒng)梢卸,再從中進行甄別 肮塞、 取舍和補充來作為新系統(tǒng)的設(shè)計。人們發(fā)現(xiàn)一個優(yōu)秀的設(shè)計者似乎能在聽完需求后就立即構(gòu)想出目標系統(tǒng)的框架涧黄,這并不是因為他聰明或者比不知所措的設(shè)計者新手多一個腦袋,而是因為他在平時已經(jīng)了解大量的系統(tǒng),對各種設(shè)計的優(yōu)缺點 月帝、 局限性也了然于胸簸搞,能夠把以前的設(shè)計根據(jù)需要再次使用。所以要成為優(yōu)秀的設(shè)計者殉簸,了解 爽雄、 掌握 焰檩、 消化 兜叨、 總結(jié)前人和自己以前的設(shè)計成果是最好的方法茫死,這似乎也是唯一的方法。
設(shè)計者的苦惱有時候和編程人員一樣雄卷。計算機系統(tǒng)的發(fā)展如此迅速妒潭,解決方案也越來越多冯凹,如同編程語言的發(fā)展匈庭,同時鸽扁,隨著人類社會的進步巩那,投資者和客戶也提出了越來越高的要求裆赵,這又需要設(shè)計者不斷學習 页藻、 創(chuàng)造新的方案筒繁。但系統(tǒng)設(shè)計也并非沒有規(guī)律可以遵循,如同幸福的家庭都很相似堵泽,不幸的家庭各有各的不幸滋戳,人們在實踐中發(fā)現(xiàn)優(yōu)秀的系統(tǒng)設(shè)計一般在以下幾個方面都很出色努隙。
(1)組件的獨立性钦椭。審視自己設(shè)計的系統(tǒng)唠帝,是否做到了高內(nèi)聚、低耦合?
(2)例外的識別和處理拗踢。誰能保證系統(tǒng)使用者都精確按照使用說明書使用双吆?
(3)防錯和容錯淮蜈。當網(wǎng)絡(luò)中斷俯画、數(shù)據(jù)庫崩潰這樣的災難性事件發(fā)生時艰垂,系統(tǒng)也跟著崩潰嗎埋虹?
而且,更幸運的是胰柑,也有一些技術(shù)能夠改進系統(tǒng)設(shè)計柬讨,這些方法包括:降低復雜性 袍啡、 通過合約進行設(shè)計 境输、 原型化設(shè)計 、 錯誤樹分析等辩越。
3 軟件設(shè)計的任務(wù)與活動
軟件設(shè)計是一個把軟件需求變換成軟件表示的過程黔攒。最初這種表示只是描繪出軟件的總體框架蒋院,然后再進一步細化欺旧,并在此框架中填入細節(jié)辞友。
3.1 軟件設(shè)計步驟
軟件設(shè)計的兩個階段從工程管理角度称龙,軟件設(shè)計可以分為兩個步驟:
(1)概要設(shè)計:也稱為高層設(shè)計,將軟件需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟件的系統(tǒng)結(jié)構(gòu)鲫尊。例如疫向,如果采用結(jié)構(gòu)化設(shè)計搔驼,則將從宏觀的角度將軟件劃分成各個組成模塊,并確定模塊的功能及模塊之間的調(diào)用關(guān)系糯耍。
(2)詳細設(shè)計:也稱為低層設(shè)計温技,將對結(jié)構(gòu)表示進行細化哗伯,得到詳細的數(shù)據(jù)結(jié)構(gòu)與算法。同樣的系任,如果采用結(jié)構(gòu)化設(shè)計俩滥,則詳細設(shè)計的任務(wù)就是為每個模塊進行設(shè)計霜旧。
3.2 主要的設(shè)計方法比較
在結(jié)構(gòu)化設(shè)計風行的時代挂据,主流的設(shè)計方法還包括 Jackson 方法和 Parnas 方法儿普。
結(jié)構(gòu)化方法側(cè)重于 “ 模塊相對獨立且功能單一崎逃,使模塊間聯(lián)系弱 、 模塊內(nèi)聯(lián)系強 ” 眉孩;而 Jackson 方法則是從數(shù)據(jù)結(jié)構(gòu)導出模塊結(jié)構(gòu)个绍; Parnas 方法的主要思想則是將可能引起變化的因素隱藏在有關(guān)模塊內(nèi)部勒葱,使這些因素變化時的影響范圍受到限制,它只提供了重要的設(shè)計準則巴柿,但沒有規(guī)定出具體的工作步驟凛虽。
而近年來,對象技術(shù)憑借其對數(shù)據(jù)的高效封裝及良好的消息機制广恢,實現(xiàn)了高內(nèi)聚 凯旋、 低耦合的系統(tǒng)設(shè)計,成了現(xiàn)代軟件設(shè)計的主流方法學袁波。