對(duì)大多數(shù)人來(lái)說(shuō),若要建一幢數(shù)百萬(wàn)元的房子,他一定會(huì)與建房者詳細(xì)討論各種細(xì)節(jié),他們都明白完工以后的修改會(huì)造成損失,以及變更細(xì)節(jié)的危害性。然而,涉及到軟件開(kāi)發(fā),人們卻變得“大大咧咧”起來(lái)。軟件項(xiàng)目中百分之四十至百分之六十的問(wèn)題都是在需求分析階段埋下的“禍根”(Leffingwell 1997)??稍S多組織仍在那些基本的項(xiàng)目功能上采用一些不合規(guī)范的方法,這樣導(dǎo)致的后果便是一條鴻溝(期望差異)—開(kāi)發(fā)者開(kāi)發(fā)的與用戶所想得到的軟件存在著巨大期望差異。
在軟件工程中,所有的風(fēng)險(xiǎn)承擔(dān)者(stakeholder)(這個(gè)詞很有意思,原義是賭金保管者。我看過(guò)很多的翻譯,有翻譯成涉眾的,也有的翻譯成參與者的,但是我想他的主要意思就是和這個(gè)項(xiàng)目有密切相關(guān)利益的人)都感興趣的就是需求分析階段。這些風(fēng)險(xiǎn)承擔(dān)者包括客戶、用戶、業(yè)務(wù)或需求分析員(負(fù)責(zé)收集客戶需求并編寫(xiě)文檔,以及負(fù)責(zé)客戶與開(kāi)發(fā)機(jī)構(gòu)之間聯(lián)系溝通的人)、開(kāi)發(fā)人員、測(cè)試人員、用戶文檔編寫(xiě)者、項(xiàng)目管理者和客戶管理者。這部分工作若處理好了,能開(kāi)發(fā)出很出色的產(chǎn)品,同時(shí)會(huì)使客戶感到滿意,開(kāi)發(fā)者也倍感滿足、充實(shí)。若處理不好,則會(huì)導(dǎo)致誤解、挫折、障礙以及潛在質(zhì)量和業(yè)務(wù)價(jià)值上的威脅。因?yàn)樾枨蠓治龅於塑浖こ毯晚?xiàng)目管理的基礎(chǔ),所以所有風(fēng)險(xiǎn)承擔(dān)者最好是采用有效的需求分析過(guò)程。
軟件需求的定義
IEEE軟件工程標(biāo)準(zhǔn)詞匯表(1997年)中定義需求為:
(1)用戶解決問(wèn)題或達(dá)到目標(biāo)所需的條件或權(quán)能(Capability)。
(2)系統(tǒng)或系統(tǒng)部件要滿足合同、標(biāo)準(zhǔn)、規(guī)范或其它正式規(guī)定文檔所需具有的條件或權(quán)能。
(3)一種反映上面(1)或(2)所描述的條件或權(quán)能的文檔說(shuō)明。
需求的層次
下面這些定義是需求工程領(lǐng)域中常見(jiàn)術(shù)語(yǔ)的定義說(shuō)明。
軟件需求包括三個(gè)不同的層次—業(yè)務(wù)需求、用戶需求和功能需求—也包括非功能需求。業(yè)務(wù)需求( business requirement)反映了組織機(jī)構(gòu)或客戶對(duì)系統(tǒng)、產(chǎn)品高層次的目標(biāo)要求,它們?cè)陧?xiàng)目視圖與范圍文檔中予以說(shuō)明。用戶需求(user requirement) 文檔描述了用戶使用產(chǎn)品必須要完成的任務(wù),這在使用實(shí)例(use case)文檔或方案腳本(scenario)說(shuō)明中予以說(shuō)明。功能需求(functional requirement)定義了開(kāi)發(fā)人員必須實(shí)現(xiàn)的軟件功能,使得用戶能完成他們的任務(wù),從而滿足了業(yè)務(wù)需求。所謂特性(feature)是指邏輯上相關(guān)的功能需求的集合,給用戶提供處理能力并滿足業(yè)務(wù)需求。軟件需求各組成部分之間的關(guān)系如圖所示。
作為補(bǔ)充,軟件需求規(guī)格說(shuō)明還應(yīng)包括非功能需求,它描述了系統(tǒng)展現(xiàn)給用戶的行為和執(zhí)行的操作等。它包括產(chǎn)品必須遵從的標(biāo)準(zhǔn)、規(guī)范和合約;外部界面的具體細(xì)節(jié);性能要求;設(shè)計(jì)或?qū)崿F(xiàn)的約束條件及質(zhì)量屬性。所謂約束是指對(duì)開(kāi)發(fā)人員在軟件產(chǎn)品設(shè)計(jì)和構(gòu)造上的限制。質(zhì)量屬性是通過(guò)多種角度對(duì)產(chǎn)品的特點(diǎn)進(jìn)行描述,從而反映產(chǎn)品功能。多角度描述產(chǎn)品對(duì)用戶和開(kāi)發(fā)人員都極為重要。
值得注意的一點(diǎn)是,需求并未包括設(shè)計(jì)細(xì)節(jié)、實(shí)現(xiàn)細(xì)節(jié)、項(xiàng)目計(jì)劃信息或測(cè)試信息。需求與這些沒(méi)有關(guān)系,它關(guān)注的是充分說(shuō)明你究竟想開(kāi)發(fā)什么。
Frederick Brooks在他1987年的經(jīng)典的文章“No Silver Bullet:Essence and Accidents ofSoftware Engineering ”中充分說(shuō)明了需求過(guò)程在軟件項(xiàng)目中扮演的重要角色:
開(kāi)發(fā)軟件系統(tǒng)最為困難的部分就是準(zhǔn)確說(shuō)明開(kāi)發(fā)什么。最為困難的概念性工作便是編寫(xiě)出詳細(xì)技術(shù)需求,這包括所有面向用戶、面向機(jī)器和其它軟件系統(tǒng)的接口。同時(shí)這也是一旦做錯(cuò),將最終會(huì)給