當(dāng)用戶使用軟件的時(shí)候,發(fā)現(xiàn)軟件的功能與自己的需求不一致,往往第一個(gè)反應(yīng)就是:這需求是怎么做的?其實(shí),每個(gè)人都知道做軟件要做需求分析,然而很多人對(duì)需求分析的重視程度卻不夠。由于前期的需求做得不充分而導(dǎo)致的后果,只有到軟件測(cè)試和交付的時(shí)候才顯現(xiàn)出來(lái),而這個(gè)時(shí)候再糾正,代價(jià)就相當(dāng)慘重了。下面就以筆者做過(guò)的一些歐美項(xiàng)目中成功和失敗的經(jīng)驗(yàn)為例,探討一下軟件開(kāi)發(fā)周期中的需求分析。
一 什么是需求分析
結(jié)構(gòu)化軟件開(kāi)發(fā)一般分為分析、設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、驗(yàn)收與運(yùn)行等階段。開(kāi)發(fā)前,會(huì)進(jìn)行前期的可行性研究;在運(yùn)行開(kāi)始以后,還要進(jìn)行后期維護(hù)。需求分析是結(jié)構(gòu)化開(kāi)發(fā)中的重要階段。通常情況下,國(guó)內(nèi)軟件開(kāi)發(fā)公司在做歐美和日本的項(xiàng)目時(shí),對(duì)前期的可行性研究參與得較少,一般都是對(duì)方已經(jīng)做完可行性研究,國(guó)內(nèi)軟件開(kāi)發(fā)公司從需求分析開(kāi)始做起,直到軟件開(kāi)發(fā)后的運(yùn)行和維護(hù)。
所謂“需求分析”,是指對(duì)要解決的問(wèn)題進(jìn)行詳細(xì)的分析,弄清楚客戶的需求,包括需要輸入什么數(shù)據(jù),要得到什么結(jié)果,最后應(yīng)輸出什么,等等。可以說(shuō),軟件工程當(dāng)中的“需求分析”就是確定要計(jì)算機(jī)“做什么”。
二 需求分析的重要性
從需求分析的定義上,就可以看出需求分析在軟件開(kāi)發(fā)過(guò)程中的重要性了。需求分析做得不對(duì),后面的步驟做得再好,也只能是南轅北轍,無(wú)法滿足客戶的要求。研究表明,改正產(chǎn)品付諸應(yīng)用后所發(fā)現(xiàn)的一個(gè)需求方面的缺陷,比在需求階段改正這個(gè)錯(cuò)誤要多付出大約100倍的成本。而另一項(xiàng)研究發(fā)現(xiàn),在需求開(kāi)發(fā)階段發(fā)現(xiàn)的一個(gè)錯(cuò)誤,平均僅需要花30分鐘修復(fù),但若在系統(tǒng)測(cè)試時(shí)發(fā)現(xiàn)則需要5—17個(gè)小時(shí)來(lái)修復(fù)。
只有通過(guò)軟件需求分析,才能把軟件功能和性能的總體概念描述為具體的軟件需求規(guī)格說(shuō)明,從而奠定軟件開(kāi)發(fā)的基礎(chǔ)。軟件需求分析工作也是一個(gè)不斷認(rèn)識(shí)和逐步細(xì)化的過(guò)程。該過(guò)程將軟件設(shè)計(jì)階段所確定的軟件范圍逐步細(xì)化到可詳細(xì)定義的程度,并分析出各種不同的軟件元素,然后為這些元素找到可行的解決方法。
先以筆者之前做的加拿大項(xiàng)目失敗的需求分析為例。由于和客戶簽訂了合同,5個(gè)月必須交付軟件,開(kāi)發(fā)時(shí)間緊迫,導(dǎo)致項(xiàng)目計(jì)劃時(shí)做需求分析的時(shí)間只給了2周時(shí)間(理由是客戶的文檔已經(jīng)提供好了,照著做即可)。結(jié)果,由于前期對(duì)客戶文檔理解得不是很清楚,導(dǎo)致開(kāi)發(fā)進(jìn)行到3個(gè)月的時(shí)候發(fā)現(xiàn)需求上有爭(zhēng)議。在和客戶確認(rèn)后得出結(jié)論:如果要滿足客戶的要求,則需要對(duì)整體架構(gòu)進(jìn)行修改。雖然最后按期交付了軟件,但是整個(gè)項(xiàng)目組最后兩個(gè)月每天都在加班,包括周末,而且軟件質(zhì)量也沒(méi)有得到客戶的充分認(rèn)可。
再以之前做過(guò)的一個(gè)美國(guó)項(xiàng)目為例。筆者作為需求分析人員在軟件開(kāi)發(fā)開(kāi)始階段到美國(guó)與客戶做軟件需求分析。在了解客戶需求的同時(shí),筆者盡量了解客戶為什么要這么做,幫客戶一起想需求,以便我們開(kāi)發(fā)的軟件能夠更好地為客戶服務(wù)。每天開(kāi)完會(huì)后,筆者把客戶的需求整理好,發(fā)給國(guó)內(nèi)的同事進(jìn)行研究分析,建立簡(jiǎn)單的基礎(chǔ)模型并研究技術(shù)可行性。需求分析結(jié)束回國(guó)后,筆者保持每周至少3次電話會(huì)議與客戶進(jìn)行溝通,隨時(shí)了解客戶的需求。正因?yàn)樵谇捌陔A段進(jìn)行了這種細(xì)致的需求分析,項(xiàng)目組在很少加班的情況下,不但按時(shí)交付了項(xiàng)目,并且得到客戶的充分認(rèn)可。
三 軟件需求分析的任務(wù)
需求分析所要做的工作是深入描述軟件的功能和性能,確定軟件設(shè)計(jì)的限制范圍和軟件同其他系統(tǒng)元素的接口細(xì)節(jié),定義軟件的其他有效性需求。
分析員通過(guò)需求分析,逐步細(xì)化對(duì)軟件的要求,描述軟件要處理的數(shù)據(jù)域,并給軟件開(kāi)發(fā)提供一種可轉(zhuǎn)化為數(shù)據(jù)設(shè)計(jì)、結(jié)構(gòu)設(shè)計(jì)和過(guò)程設(shè)計(jì)的數(shù)據(jù)與功能表示。在軟件開(kāi)發(fā)結(jié)束后,制定的軟件需求規(guī)格說(shuō)明還要為評(píng)價(jià)軟件質(zhì)量提供依據(jù)。這里需提到很重要的一點(diǎn)是,需求分析后的軟件需求規(guī)格說(shuō)明書上一定要有客戶的確認(rèn)簽字,這是必不可少的環(huán)節(jié),關(guān)系到以后軟件開(kāi)發(fā)的成敗。
通常,軟件開(kāi)發(fā)項(xiàng)目是要實(shí)現(xiàn)目標(biāo)系統(tǒng)的物理模型,即確定待開(kāi)發(fā)軟件系統(tǒng)的系統(tǒng)元素,并將功能和數(shù)據(jù)結(jié)構(gòu)分配到這些系統(tǒng)元素中,它是軟件實(shí)現(xiàn)的基礎(chǔ)。但是,目標(biāo)系統(tǒng)的具體物理模型是由它的邏輯模型經(jīng)實(shí)例化,即具體到某個(gè)業(yè)務(wù)領(lǐng)域而得到的。與物理模型不同,邏輯模型忽視實(shí)現(xiàn)機(jī)制與細(xì)節(jié),只描述系統(tǒng)要完成的功能和要處理的數(shù)據(jù)。作為目標(biāo)系統(tǒng)的參考,需求分析的任務(wù)就是借助當(dāng)前系統(tǒng)的邏輯模型導(dǎo)出目標(biāo)系統(tǒng)的邏輯模型,解決目標(biāo)系統(tǒng)的“做什么”問(wèn)題。通常用數(shù)據(jù)流圖、E-R圖、狀態(tài)轉(zhuǎn)換圖、數(shù)據(jù)字典和主要的處理算法描述這個(gè)邏輯模型。
在軟件分析過(guò)程中,應(yīng)盡可能地讓更多的人參與進(jìn)來(lái),而不僅僅是軟件分析師自己。在之前的美國(guó)項(xiàng)目中,在前期分析時(shí)軟件開(kāi)發(fā)的核心技術(shù)人員和測(cè)試人員就已經(jīng)進(jìn)入項(xiàng)目組,每天技術(shù)人員會(huì)對(duì)分析的結(jié)果提出技術(shù)實(shí)現(xiàn)的難點(diǎn)以及改進(jìn)的方法,筆者在隨后的會(huì)議上就會(huì)和客戶進(jìn)行討論,盡量在滿足客戶需求的同時(shí),使用更簡(jiǎn)單可行的技術(shù),這樣就為以后的開(kāi)發(fā)奠定了基礎(chǔ),使開(kāi)發(fā)時(shí)的工作量大大減少。測(cè)試人員也在需求時(shí)提出從測(cè)試角度看到的問(wèn)題,同樣在需求分析階段得到解決,節(jié)省了大量的開(kāi)發(fā)時(shí)間。
四 進(jìn)行需求分析的注意事項(xiàng)
1.需求分析是分析人員與用戶共同的責(zé)任。用戶必須對(duì)軟件功能和性能提出初步要求,并澄清一些模糊概念。而需求分析人員則要認(rèn)真了解用戶的要求,細(xì)致地進(jìn)行調(diào)查分析,把用戶“做什么”的要求最終轉(zhuǎn)換成一個(gè)完全的、精細(xì)的軟件邏輯模型,并寫出軟件的需求規(guī)格說(shuō)明,準(zhǔn)確地表達(dá)用戶的要求。在加拿大的項(xiàng)目中,由于時(shí)間緊迫,一些模糊問(wèn)題沒(méi)有及時(shí)澄清,導(dǎo)致最后返工,影響了項(xiàng)目進(jìn)度。
2.需求分析階段研究的對(duì)象是軟件項(xiàng)目的用戶要求。需要注意的是,必須理解用戶的各項(xiàng)要求,但又不能全盤接受所有的要求。因?yàn)椴⒎撬杏脩舻囊蠖际呛侠淼?。?duì)其中模糊的要求需要進(jìn)行澄清,然后才能決定是否采納。對(duì)于那些無(wú)法實(shí)現(xiàn)的要求應(yīng)向用戶做出充分的解釋,以求諒解。在美國(guó)的項(xiàng)目中,針對(duì)客戶提出的需求,了解客戶的意圖后,發(fā)現(xiàn)技術(shù)上實(shí)現(xiàn)有很大難度。我們了解到這個(gè)需求對(duì)客戶來(lái)說(shuō)不是十分重要,于是和客戶商量出一個(gè)折中的解決方案,繞過(guò)技術(shù)難點(diǎn),并且沒(méi)有降低客戶滿意度。
3.分析人員要使用符合客戶語(yǔ)言習(xí)慣的表達(dá),應(yīng)主動(dòng)積極了解客戶業(yè)務(wù)和相關(guān)知識(shí)。需求討論集中于業(yè)務(wù)需求和任務(wù),因此要使用術(shù)語(yǔ)??蛻魬?yīng)將有關(guān)術(shù)語(yǔ)教給分析人員,而客戶不一定要懂得計(jì)算機(jī)行業(yè)的術(shù)語(yǔ)。由于通常情況下客戶對(duì)計(jì)算機(jī)術(shù)語(yǔ)了解不多,需求分析人員應(yīng)該盡量將計(jì)算機(jī)術(shù)語(yǔ)轉(zhuǎn)化成通俗易懂的語(yǔ)言,這樣便于和客戶溝通。而對(duì)于客戶方面的術(shù)語(yǔ),一方面不懂的時(shí)候一定要問(wèn);另一方面也要多學(xué)習(xí)。筆者在美國(guó)做的項(xiàng)目涉及航空制造業(yè),在去美國(guó)之前特意花了一些時(shí)間在網(wǎng)上瀏覽相關(guān)材料以及工業(yè)術(shù)語(yǔ),在進(jìn)行需求分析的時(shí)候確實(shí)起到了一定的作用。
4.對(duì)用戶進(jìn)行正確分類。組織中的用戶在很多方面存在差異,根據(jù)用戶的特點(diǎn),可對(duì)用戶進(jìn)行一定的分類。將用戶分類并歸納各自特點(diǎn),詳細(xì)描述他們的個(gè)性特點(diǎn)及任務(wù)狀況,將有助于需求的獲取和分析。不同的問(wèn)題需要詢問(wèn)不同的人,對(duì)于操作細(xì)節(jié)的問(wèn)題,要和實(shí)際負(fù)責(zé)操作的用戶進(jìn)行溝通;而對(duì)于關(guān)乎全局的問(wèn)題,則要和相應(yīng)的管理層用戶進(jìn)行溝通。這是項(xiàng)目管理中的一個(gè)重要組成,叫做“干系人分析”。在做需求分析之前干系人分析一定要做好。筆者到美國(guó)前,曾通過(guò)美國(guó)方面的聯(lián)系人、本公司的銷售人員等,把整個(gè)項(xiàng)目中每個(gè)人的角色都已經(jīng)分析清楚。到了美國(guó)后,知道有什么問(wèn)題問(wèn)什么人,不知道問(wèn)誰(shuí)的時(shí)候找到總負(fù)責(zé)人,不但節(jié)省了大量時(shí)間,而且避免了很多可能出現(xiàn)的問(wèn)題。
綜上所述,需求分析是軟件開(kāi)發(fā)周期中的重要階段,關(guān)系到軟件開(kāi)發(fā)的成敗。我們?cè)谲浖_(kāi)發(fā)中應(yīng)該充分重視這一階段,盡量將問(wèn)題在這一階段解決好,為后期的軟件開(kāi)發(fā)打好堅(jiān)實(shí)的基礎(chǔ),使項(xiàng)目能夠保質(zhì)保量的完成。