在軟件工程中,需求分析指的是在建立一個新的或改變一個現(xiàn)存的電腦系統(tǒng)時描寫新系統(tǒng)的目的、范圍和定義時所要做的所有的工作。需求分析是軟件工程中的一個關(guān)鍵過程。
在這個過程中,系統(tǒng)分析員和軟件工程師確定顧客的需要。只有在確定了這些需要后他們才能夠分析和尋求新系統(tǒng)的解決方法。在軟件工程的歷史中,很長時間里人們一直認(rèn)為需求分析是整個軟件工程中最簡單的一個步驟,但在過去十年中越來越多的人認(rèn)識到它是整個過程中最關(guān)鍵的一個過程。假如在需求分析時分析者們未能正確地認(rèn)識到顧客的需要的話,那么最后的軟件實際上不可能達(dá)到顧客的需要,或者軟件無法在規(guī)定的時間里完工。
目錄
1 挑戰(zhàn)
1.1 主要困難
1.2 持有關(guān)鍵信息的人
1.3 軟件開發(fā)者
1.4 解決方法
2 主要技術(shù)
2.1 采訪持重要信息的人
2.2 需求工作會
2.3 將需求列成合同式的文件
2.4 原型(Prototype)
2.5 用例(Use Case)
2.6 確認(rèn)持關(guān)鍵信息者
挑戰(zhàn)
除此之外他們還要考慮一個項目的
·是否可行
·是否在規(guī)定的時間里可以完成
·價格上是否負(fù)擔(dān)得起
·是否合法
·是否符合道德
一個新項目開始的時候人們往往還非常興奮,往往試圖輕視需求分析的必要性。但對過去項目的分析證明一個徹底的和無情的需求分析可以降低一個項目的耗費和降低其技術(shù)風(fēng)險。
主要困難
隨著工程師越來越對需求分析的重視今天我們對需求分析的主要困難也理解得比較清楚: 需求分析需要由有充分的經(jīng)驗、技術(shù)知識和語言技巧的專家來完成;顧客一開始所提出的需要往往不完全、太樂觀以及過分受老的系統(tǒng)或過程的影響;使用復(fù)雜的工具和不同的技術(shù)來進(jìn)行需求分析往往會打消獲得一個完整的和細(xì)致的結(jié)果的希望。
持有關(guān)鍵信息的人
顧客有可能防止需求分析順利進(jìn)行有以下幾種可能性:
·顧客不明白他自己需要什么
·顧客不愿將他們的需要固定在一系列寫在紙上的條例中
·在價格和時間確定后顧客堅持要求新的需要
·分析者與顧客的通訊太緩慢
·顧客不參加回顧或無法參加回顧
軟件開發(fā)者
但是軟件開發(fā)者也有他們的責(zé)任。由于軟件開發(fā)者收錢來開發(fā)他們的軟件,他們的責(zé)任就更加不可推脫了。由軟件開發(fā)者導(dǎo)致的困難有:
·軟件工程師與他們的顧客往往使用不同的詞匯。有時他們以為互相之間完全達(dá)成協(xié)議,但是在展示最終結(jié)果時卻發(fā)現(xiàn)并非如此。開發(fā)者有義務(wù)克服這個困難,他們拿了顧客的錢,因此有這個義務(wù)。
·軟件開發(fā)者往往喜歡將顧客的需要改變得能使它們符合一個已存在的系統(tǒng)或模式,而不愿按照顧客的需要來發(fā)展一個新的系統(tǒng)。
·需求分析往往是由程序員完成的,而不是由作業(yè)分析員完成的。程序員往往缺乏理解實際事物的運行過程和商業(yè)過程的技巧。
解決方法
解決這些困難的一個方法是使用專業(yè)的作業(yè)或系統(tǒng)分析員,這些專業(yè)人員通過專門訓(xùn)練來填補商業(yè)和電腦世界之間的鴻溝的。這個方法可以達(dá)到一定的效果,但從顧客方面來說要找到相應(yīng)的有類似技巧的人就相當(dāng)困難了。此外今天為需求分析所使用的方法依然還有很大的缺陷,它們還不夠有效。
1990年代以來新的技術(shù)有制作原型、統(tǒng)一建模語言、用例和敏捷軟件開發(fā)等方法。
主要技術(shù)
需求分析有可能在一個項目中成為一個漫長、艱巨的工作。需求分析專家與他們的顧客交談、記錄他們的交談結(jié)果、分析他們收集的信息,從中提取互相矛盾的地方,總結(jié)出一個總體觀念,然后再與顧客交談他們發(fā)現(xiàn)的問題。這個過程可以不斷重復(fù),在有些項目中這個過程可以伴隨著整個在有些項目中這個過程可以伴隨著整個生命周期。
·與顧客的交談不夠多和不夠徹底,一些重要的需求被忽視;
·顧客的反應(yīng)不說明問題,顧客對新系統(tǒng)的特征不滿。
·為了使所有這些討論有條理、有組織和有效地被記錄下來,這些討論的過程和其內(nèi)容的演化也必須被記錄下來。
分析員可以使用不同的技術(shù)來從顧客手中獲得需求。比較老的方式有采訪顧客,或者與顧客一起開座談會,列舉顧客的需求。比較新的技術(shù)有建立模型和使用用例。在最佳狀態(tài)下在采納了不同的技術(shù)后他們可以完全理解顧客的需要和與持重要信息的人建立了必要的聯(lián)系。
采訪持重要信息的人
采訪持重要信息的人是需求分析中一個必不可少的過程。但在一個大的系統(tǒng)中許多人必須被采訪,這需要許多時間和金錢,但最重要的是這個過程最可能顯示現(xiàn)有的業(yè)務(wù)流程與新系統(tǒng)中的業(yè)務(wù)流程之間的差別。不同的顧客有可能有不同的或甚至相對的需求,在這種情況下分析員必須協(xié)調(diào)各方的需要。
需求工作會
出于上述原因一般假如一個系統(tǒng)非常復(fù)雜的話需求分析最常用的方法是召開需求工作會,在需求工作會上分析員和持重要信息的人一起分析系統(tǒng)的需要和發(fā)展解決方案。
這樣的工作會最好不要再采訪對象的工作場進(jìn)行,這樣采訪對象不會被打擾。工作會有一個負(fù)責(zé)人來保持會議的進(jìn)程,一個記錄員來記錄會議的討論,投影儀和相應(yīng)的軟件是常用的工具。一般需要進(jìn)行多次會議后才能得到最終結(jié)果。
一般認(rèn)為需求工作會可以節(jié)省不少時間,因此是一個非常有用的工具,但是往往很難同時將所有的持重要信息的人聚集到一起。
將需求列成合同式的文件
最常見的紀(jì)錄需求分析的方式是將顧客需求列入一個合同式的表。一個復(fù)雜的系統(tǒng)的文件可以數(shù)百頁長。現(xiàn)代的分析員不愿使用這樣的列表,因為它們被證明相當(dāng)無用,但它們依然相當(dāng)常見。
優(yōu)點:
·提供一份需求的清單。
·提供一份顧客和開發(fā)者間的合同。
·對一個大的系統(tǒng)來說它提供了一份高級的描寫。
缺點:
·這些列表可以長達(dá)上百頁,實際上沒有人能夠完整地閱讀這樣的文件來獲得一個完整的系統(tǒng)理解。
·列表中的需求一般都很抽象和缺乏列出的需求互相之間的關(guān)聯(lián)
·這樣的列表一般表示不出列出的需求之間怎樣組成一個整體。
·從列表中很難看出哪些需求更重要。
·抽象后的列表為讀者提供了許多理解的余地,因此不同的讀者對文件的理解可能不同。一個項目越大,讀者越多,理解的方式就越多。
·從抽象后的列表中很難看出它是否完全。它們往往忽視了許多細(xì)節(jié)。
·顧客和開發(fā)者對這個列表的理解往往完全不同。
·這樣的合同式的列表給顧客一個錯誤的安全的感覺,好像他們的要求都已列入了。但是由于這些列表本身對細(xì)節(jié)問題不能細(xì)述因此許多關(guān)鍵的細(xì)節(jié)問題實際上并未列出和解決。這些問題一直到后來軟件開發(fā)時才被發(fā)現(xiàn)。那時開發(fā)者一般要與顧客再次討論這些問題并試圖按他們的意愿和條件來解決這些問題。
·這個列表對此后的系統(tǒng)設(shè)計不提供任何幫助,它們的結(jié)構(gòu)無法直接進(jìn)入新軟件。
從1980年代中開始,越來越多的人將作原型看作是解決需求分析的困難的辦法。原型模擬最終軟件的屏幕顯示,這樣用戶可以看到最終軟件將是什么樣,而實際上在這些屏幕顯示的背后還一切都空著呢。這樣顧客可以在系統(tǒng)還沒有建立之前就做出設(shè)計決定。當(dāng)原型首次被使用的時候它們的效果被視為非常驚人。引入原型往往提高顧客與開發(fā)者之間的信息交換。原型的屏幕顯示后來往往很少被改變,因此可以大大地降低費用。
但此后十多年的實際應(yīng)用證明雖然原型是一種有用的技術(shù),但它也有它的缺陷:
·經(jīng)理人員在看到原型后往往不理解為什么到還要一段時間后最終設(shè)計才能完成。
·設(shè)計師往往將拼湊在一起的原型碼用到后來真正的系統(tǒng)中,因為他們怕在再次編碼時“浪費時間”。
·原型幫助解決設(shè)計決定和用戶界面的設(shè)計,但是它們并不提供任何關(guān)于需求的信息。
·設(shè)計師和顧客有可能花費太多的時間和精力來設(shè)計用戶界面,而忽視對作業(yè)過程的關(guān)心。
用例(Use Case)
用例是一種紀(jì)錄新系統(tǒng)或軟件更換時的需求的技術(shù)。每個用例包含一個系統(tǒng)在作業(yè)時與用戶或與其它系統(tǒng)之間交換信息的場景。一般用例避免使用術(shù)語,而盡量使用顧客、用戶或他們的專家的語言。一般用例由軟件開發(fā)者和顧客一起寫成。
在1990年代中用例很快地成為了紀(jì)錄需求分析的最主要的方式。尤其在它的發(fā)源地,在面向?qū)ο蟮某绦蛟O(shè)計中它的普及性非常高。但用例不僅可以用在面向?qū)ο蟮某绦蛟O(shè)計系統(tǒng)中,實際上用例本身并非面向?qū)ο蟮摹?p style="TEXT-INDENT: 2em">每個用例集中于描寫如何來完成一個作業(yè)目標(biāo)或任務(wù)。對傳統(tǒng)的軟件工程來說每個用例描寫系統(tǒng)的一個特點。對大多數(shù)軟件項目來說一個新的系統(tǒng)有多個(往往十幾個)用例。不同的軟件項目的格式或項目的進(jìn)展都可能影響用例的細(xì)節(jié)性。
用例描述系統(tǒng)在運行時與外部執(zhí)行者之間的信息交換。外部執(zhí)行者是任何系統(tǒng)外的、與系統(tǒng)交換信息的物件或人物。它們可以是用戶、用戶的角色或其它系統(tǒng)。
用例將系統(tǒng)當(dāng)作一個“黑匣子”,它從外部來看與系統(tǒng)之間的信息交換(包括系統(tǒng)的回答)。這樣它簡化對系統(tǒng)的需求的描寫而且防止對系統(tǒng)的工作方式作任何過早的假設(shè)。
每個用例應(yīng)該符合下述條件:
·描寫完成作業(yè)目標(biāo)的作業(yè)任務(wù)
·不包含任何編程碼
·有一定的細(xì)致性
·足夠短,一個程序員應(yīng)該可以在一個版本的工作中獨立完成這個用例所描寫的作業(yè)過程。