對大多數(shù)人來說,若要建一幢數(shù)百萬元的房子,他一定會與建房者詳細(xì)討論各種細(xì)節(jié),他們都明白完工以后的修改會造成損失,以及變更細(xì)節(jié)的危害性。然而,涉及到軟件開發(fā),人們卻變得“大大咧咧”起來。軟件項(xiàng)目中百分之四十至百分之六十的問題都是在需求分析階段埋下的“禍根”(leffingwell 1997)。可許多組織仍在那些基本的項(xiàng)目功能上采用一些不合規(guī)范的方法,這樣導(dǎo)致的后果便是一條鴻溝(期望差異)—開發(fā)者開發(fā)的與用戶所想得到的軟件存在著巨大期望差異。
在軟件工程中,所有的風(fēng)險(xiǎn)承擔(dān)者(stakeholder)(這個詞很有意思,原義是賭金保管者。我看過很多的翻譯,有翻譯成涉眾的,也有的翻譯成參與者的,但是我想他的主要意思就是和這個項(xiàng)目有密切相關(guān)利益的人)都感興趣的就是需求分析階段。這些風(fēng)險(xiǎn)承擔(dān)者包括客戶、用戶、業(yè)務(wù)或需求分析員(負(fù)責(zé)收集客戶需求并編寫文檔,以及負(fù)責(zé)客戶與開發(fā)機(jī)構(gòu)之間聯(lián)系溝通的人)、開發(fā)人員、測試人員、用戶文檔編寫者、項(xiàng)目管理者和客戶管理者。這部分工作若處理好了,能開發(fā)出很出色的產(chǎn)品,同時會使客戶感到滿意,開發(fā)者也倍感滿足、充實(shí)。若處理不好,則會導(dǎo)致誤解、挫折、障礙以及潛在質(zhì)量和業(yè)務(wù)價(jià)值上的威脅。因?yàn)樾枨蠓治龅於塑浖こ毯晚?xiàng)目管理的基礎(chǔ),所以所有風(fēng)險(xiǎn)承擔(dān)者最好是采用有效的需求分析過程。 軟件需求的定義
ieee軟件工程標(biāo)準(zhǔn)詞匯表(1997年)中定義需求為:
(1)用戶解決問題或達(dá)到目標(biāo)所需的條件或權(quán)能(capability)。
(2)系統(tǒng)或系統(tǒng)部件要滿足合同、標(biāo)準(zhǔn)、規(guī)范或其它正式規(guī)定文檔所需具有的條件或權(quán)能。
(3)一種反映上面(1)或(2)所描述的條件或權(quán)能的文檔說明。
需求的層次
下面這些定義是需求工程領(lǐng)域中常見術(shù)語的定義說明。
軟件需求包括三個不同的層次—業(yè)務(wù)需求、用戶需求和功能需求—也包括非功能需求。業(yè)務(wù)需求( business requirement)反映了組織機(jī)構(gòu)或客戶對系統(tǒng)、產(chǎn)品高層次的目標(biāo)要求,它們在項(xiàng)目視圖與范圍文檔中予以說明。用戶需求(user requirement) 文檔描述了用戶使用產(chǎn)品必須要完成的任務(wù),這在使用實(shí)例(use case)文檔或方案腳本(scenario)說明中予以說明。功能需求(functional requirement)定義了開發(fā)人員必須實(shí)現(xiàn)的軟件功能,使得用戶能完成他們的任務(wù),從而滿足了業(yè)務(wù)需求。所謂特性(feature)是指邏輯上相關(guān)的功能需求的集合,給用戶提供處理能力并滿足業(yè)務(wù)需求。軟件需求各組成部分之間的關(guān)系如圖所示。
作為補(bǔ)充,軟件需求規(guī)格說明還應(yīng)包括非功能需求,它描述了系統(tǒng)展現(xiàn)給用戶的行為和執(zhí)行的操作等。它包括產(chǎn)品必須遵從的標(biāo)準(zhǔn)、規(guī)范和合約;外部界面的具體細(xì)節(jié);性能要求;設(shè)計(jì)或?qū)崿F(xiàn)的約束條件及質(zhì)量屬性。所謂約束是指對開發(fā)人員在軟件產(chǎn)品設(shè)計(jì)和構(gòu)造上的限制。質(zhì)量屬性是通過多種角度對產(chǎn)品的特點(diǎn)進(jìn)行描述,從而反映產(chǎn)品功能。多角度描述產(chǎn)品對用戶和開發(fā)人員都極為重要。 值得注意的一點(diǎn)是,需求并未包括設(shè)計(jì)細(xì)節(jié)、實(shí)現(xiàn)細(xì)節(jié)、項(xiàng)目計(jì)劃信息或測試信息。需求與這些沒有關(guān)系,它關(guān)注的是充分說明你究竟想開發(fā)什么。
frederick brooks在他1987年的經(jīng)典的文章“no silver bullet:essence and accidents ofsoftware engineering ”中充分說明了需求過程在軟件項(xiàng)目中扮演的重要角色:
開發(fā)軟件系統(tǒng)最為困難的部分就是準(zhǔn)確說明開發(fā)什么。最為困難的概念性工作便是編寫出詳細(xì)技術(shù)需求,這包括所有面向用戶、面向機(jī)器和其它軟件系統(tǒng)的接口。同時這也是一旦做錯,將最終會給系統(tǒng)帶來極大損害的部分,并且以后再對它進(jìn)行修改也極為困難。
為什么這么說呢,因?yàn)樵诖蠖鄶?shù)的軟件系統(tǒng)中,最終用戶可能都不清楚他的需求是什么,這是千真萬確的。如果你的用戶告訴你需求就是這些了,不要相信他,繼續(xù)刨根問底,直到你們都筋疲力盡了。
雖然聽上去有些不可思議,但這是教訓(xùn)之談,在我從事的項(xiàng)目之中,沒有一個用戶在軟件接近完成的時候打電話對我說,我看了你們的軟件,我想我必須改動一些地方。在那些日子中,我甚至得了一種電話鈴音恐懼癥。
需求風(fēng)險(xiǎn)
下面列出了在做需求分析時一些很危險(xiǎn)的做法,如果你發(fā)現(xiàn)你的一些做法與之相似,那么,給自己一些時間,好好思考一下,這些做法會對你的軟件產(chǎn)生致命的影響。
1. 無足夠用戶參與
客戶經(jīng)常不明白為什么收集需求和確保需求質(zhì)量需花費(fèi)那么多功夫,開發(fā)人員可能也不重視用戶的參與。究其原因:一是因?yàn)榕c用戶合作不如編寫代碼有意思;二是因?yàn)殚_發(fā)人員覺得已經(jīng)明白用戶的需求了。在某些情況下,與實(shí)際使用產(chǎn)品的用戶直接接觸很困難,而客戶也不太明白自己的真正需求。但還是應(yīng)讓具有代表性的用戶在項(xiàng)目早期直接參與到開發(fā)隊(duì)伍中,并一同經(jīng)歷整個開發(fā)過程。 最重要的就是用戶必須要重視他的軟件,必須讓他明白:如果失敗,他的損失最大(當(dāng)然你的損失也不小,但這時候你必須讓他重視這項(xiàng)工作)。如果用戶不夠重視,想辦法解決,否則你就不用再繼續(xù)了。
2. 用戶需求的不斷增加
在開發(fā)中若不斷地補(bǔ)充需求,項(xiàng)目就越變越龐大以致超過其計(jì)劃及預(yù)算范圍。這使得問題更難解決。實(shí)際上,問題根源在于用戶需求的改變和開發(fā)者對新需求所作的修改。要想把需求變更范圍控制到最小,必須一開始就對項(xiàng)目視圖、范圍、目標(biāo)、約束限制和成功標(biāo)準(zhǔn)給予明確說明,并將此說明作為評價(jià)需求變更和新特性的參照框架。說明中包括了對每種變更進(jìn)行變更影響因素分析的變更控制過程,有助于所有風(fēng)險(xiǎn)承擔(dān)者明白業(yè)務(wù)決策的合理性,即為何進(jìn)行某些變更,相應(yīng)消耗的時間、資源或特性上的折中。
產(chǎn)品開發(fā)中不斷延續(xù)的變更會使其整體結(jié)構(gòu)日漸紊亂,補(bǔ)丁代碼也使得整個程序難以理解和維護(hù)。插入補(bǔ)丁代碼使模塊違背強(qiáng)內(nèi)聚、松耦合的設(shè)計(jì)原則,特別是如果項(xiàng)目配置管理工作不完善的話,收回變更和刪除特性會帶來問題。如果你盡早地區(qū)別這些可能帶來變更的特性,你就能開發(fā)一個更為健壯的結(jié)構(gòu),并能更好地適應(yīng)它。這樣設(shè)計(jì)階段需求變更不會直接導(dǎo)致補(bǔ)丁代碼,同時也有利于減少因變更導(dǎo)致質(zhì)量的下降。
最糟糕的莫過于用戶覺得如果不再加點(diǎn)什么功能就對不起自己。我曾經(jīng)看過一個數(shù)據(jù)倉庫的一期工程,在設(shè)計(jì)階段沒有很好的定義范圍,當(dāng)我向項(xiàng)目管理者提出這個問題的時候,他認(rèn)為都已經(jīng)說好了,合同上也寫清楚了,并沒有加以重視。可是最后,用戶提出的修改意見已經(jīng)遠(yuǎn)遠(yuǎn)超出了范圍,項(xiàng)目時間也延長了一倍。整個的項(xiàng)目組成員疲憊不堪,可是卻不斷的接到用戶投訴說項(xiàng)目失敗。
3. 模棱兩可的需求
模棱兩可是需求規(guī)格說明中最為可怕的問題(lawrence 1996)。它的一層含義是指諸多讀者對需求說明產(chǎn)生了不同的理解;另一層含義是指單個讀者能用不止一個方式來解釋某個需求說明。
模棱兩可的需求會使不同的風(fēng)險(xiǎn)承擔(dān)者產(chǎn)生不同的期望,它會使開發(fā)人員為錯誤問題而浪費(fèi)時間,并且使測試者與開發(fā)者所期望的不一致。一位系統(tǒng)測試人員曾告訴我,她所在的測試組經(jīng)常對需求理解有誤,以致不得不重寫許多測試用例并重做許多測試。
模棱兩可的需求帶來不可避免的后果便是返工—重做一些你認(rèn)為已做好的事情。返工會耗費(fèi)開發(fā)總費(fèi)用的40%,而70%~85%的重做是由于需求方面的錯誤所導(dǎo)致的(leffingwell 1997)。想像一下如果你能減少一半的返工會是怎樣的情況?你能更快地開發(fā)出產(chǎn)品,在同樣的時間內(nèi)開發(fā)更多、更好的產(chǎn)品,甚至能偶爾回家休息休息。
處理模棱兩可需求的一種方法是組織好負(fù)責(zé)從不同角度審查需求的隊(duì)伍。僅僅簡單瀏覽一下需求文檔是不能解決模棱兩可問題的。如果不同的評審者從不同的角度對需求說明給予解釋,但每個評審人員都真正了解需求文檔,這樣二義性就不會直到項(xiàng)目后期才被發(fā)現(xiàn),那時再發(fā)現(xiàn)的話會使得更正代價(jià)很大。
4. 不必要的特性
“畫蛇添足”是指開發(fā)人員力圖增加一些“用戶欣賞”但需求規(guī)格說明中并未涉及的新功能。經(jīng)常發(fā)生的情況是用戶并不認(rèn)為這些功能性很有用,以致在其上耗費(fèi)的努力“白搭”了。
開發(fā)人員應(yīng)當(dāng)為客戶構(gòu)思方案并為他們提供一些具有創(chuàng)新意識的思路,具體提供哪些功能要在客戶所需與開發(fā)人員在允許時限內(nèi)的技術(shù)可行性之間求得平衡,開發(fā)人員應(yīng)努力使功能簡單易用,而不要未經(jīng)客戶同意,擅自脫離客戶要求,自作主張。
同樣,客戶有時也可能要求一些看上去很“酷”,但缺乏實(shí)用價(jià)值的功能,而實(shí)現(xiàn)這些功能只能徒耗時間和成本。為了將“畫蛇添足”的危害盡量減小,應(yīng)確信:你明白為什么要包括這些功能,以及這些功能的“來龍去脈”,這樣使得需求分析過程始終是注重那些能使用戶完成他們業(yè)務(wù)任務(wù)的核心功能。
時刻記?。很浖晒Φ臉?biāo)準(zhǔn)是是否解決用戶的問題,而不是它有多cool的功能。
5. 過于精簡的規(guī)格說明
有時,客戶并不明白需求分析有如此重要,于是只作一份簡略之至的規(guī)格說明,僅涉及了產(chǎn)品概念上的內(nèi)容,然后讓開發(fā)人員在項(xiàng)目進(jìn)展中去完善,結(jié)果很可能出現(xiàn)的是開發(fā)人員先建立產(chǎn)品的結(jié)構(gòu)之后再完成需求說明。這種方法可能適合于尖端研究性的產(chǎn)品或需求本身就十分靈活的情況(mcconnell 1996),不過商業(yè)應(yīng)用大多都不是這種情況。在大多數(shù)情況下,這會給開發(fā)人員帶來挫折(使他們在不正確的假設(shè)前提和極其有限的指導(dǎo)下工作),也會給客戶帶來煩惱(他們無法得到他們所設(shè)想的產(chǎn)品)。
6. 忽略了用戶分類
大多數(shù)產(chǎn)品是由不同的人使用其不同的特性,使用頻繁程度也有所差異,使用者受教育程度和經(jīng)驗(yàn)水平也不盡相同。如果你不能在項(xiàng)目早期就針對所有這些主要用戶進(jìn)行分類的話,必然導(dǎo)致有的用戶對產(chǎn)品感到失望。例如,菜單驅(qū)動操作對高級用戶太低效了,但含義不清的命令和快捷鍵又會使不熟練的用戶感到困難。
7. 不準(zhǔn)確的計(jì)劃
“上述是我對新產(chǎn)品的看法,好,現(xiàn)在你能告訴我你什么時候能完成嗎?”許多開發(fā)人員都遇到這種難題。對需求分析缺乏理解會導(dǎo)致過分樂觀的估計(jì),而當(dāng)不可避免的超支發(fā)生時,會帶來頗多麻煩。據(jù)報(bào)道,導(dǎo)致需求過程中軟件成本估計(jì)極不準(zhǔn)確的原因主要有以下五點(diǎn):頻繁的需求變更、遺漏的需求、與用戶交流不夠、質(zhì)量低下的需求規(guī)格說明和不完善的需求分析(davis 1995)。
對不準(zhǔn)確的要求所提問題的正確響應(yīng)是“等我真正明白你的需求時,我就會來告訴你”?;诓怀浞中畔⒑臀唇?jīng)深思的對需求不成熟的估計(jì)很容易為一些因素左右。要作出估計(jì)時,最好還是給出一個范圍(如最好的情況下,很可能的,最壞情況下)或一個可信賴的程度(我有9 0 %的把握,我能在8周內(nèi)完成)。未經(jīng)準(zhǔn)備的估計(jì)通常是作為一種猜測給出的,聽者卻認(rèn)為是一種承諾。因此我們要盡力給出可達(dá)到的目標(biāo)并堅(jiān)持完成它。
什么是優(yōu)秀的需求
討論軟件需求的文章有很多,對于需求的標(biāo)準(zhǔn)也不盡相同,這里我想用nasa的軟件開發(fā)過程中的概念,軟件需求過程的標(biāo)準(zhǔn)是:清楚(clear)、完整(complete)、一致(consistent)、可測試(testable),此外還有其他的概念,如可跟蹤的、可修改的等等。
清楚:目前大多數(shù)的需求分析采用的仍然是自然語言(因?yàn)槿绻捎眯问交Z言的話,和用戶的溝通將成為一個大問題,這意味著客戶在開發(fā)軟件之前必須先進(jìn)行形式化語言培訓(xùn),這是不現(xiàn)實(shí)的)。自然語言對需求分析最大的弊病就是它的二義性。所以我們不得不對需求分析中采用的語言做某些限制。例如盡量采用主語+動作的簡單表達(dá)方式。說白了,需求分析中的描述讓人看上去像是剛學(xué)習(xí)寫作的小孩子就對了,千萬不要采用疑問句、修飾這些華麗的表達(dá)方式。
除了語言的二義性之外,主意不要使用行話,就是計(jì)算機(jī)術(shù)語。需求分析最重要的是和用戶溝通,可是用戶多半不是計(jì)算機(jī)的專業(yè)人士,如果在需求分析中使用了行話,就會造成用戶理解上的困難。
打個比方,如果你要做一個銀行的信用卡系統(tǒng),你就可以這樣描述軟件需求:銀行的卡部管理信用卡,每張信用卡只屬于一個帳戶。信用卡有卡號、余額。一張信用卡有多筆的交易記錄。
完整:再也沒有什么比軟件開發(fā)接近完成是發(fā)現(xiàn)遺漏了一項(xiàng)需求更糟的事情了。需求的完整性是非常非常重要的,想象一下遺漏需求而不得不返工,這簡直就是惡夢。可是令人遺憾的是,需求的遺漏是很經(jīng)常發(fā)生的事情,不僅僅是你的問題,更多的問題發(fā)生在用戶那里,他們不知道該做些什么。要做到需求的完整性是很艱難的一件事情,它涉及到需求分析過程的各方各面,貫穿了整個過程,從最初的計(jì)劃制定到最后的需求評審。至于完整性的詳細(xì)討論,我們會在下面的章節(jié)中討論,現(xiàn)在你只需要拼命的想象缺乏完整性的壞處,直到你出了一身的冷汗。出了嗎?好,那我們繼續(xù)。
一致:一致性也是一個比較大的概念,很難用幾句話講清楚。還記得我們在開始的時候提到的需求的層次嗎?簡單的來說,就是用戶需求必須和業(yè)務(wù)需求一致,功能需求必須和用戶需求一致。嚴(yán)格的遵守不同層次間的一致性關(guān)系,就可以保證最后開發(fā)出來的軟件系統(tǒng)不會偏離最初的實(shí)現(xiàn)目標(biāo)。在實(shí)現(xiàn)過程中,我們還必須把一致性關(guān)系細(xì)化。比如說用戶需求不能超出先前指定的范圍。
可測試:大家覺得一個項(xiàng)目的測試從什么時候開始呢?有人說從編碼完成后開始。更清楚一點(diǎn)的說是編碼的時候同時進(jìn)行單元測試,編碼完成后進(jìn)行系統(tǒng)測試。這些都沒有錯。但是實(shí)際上測試是從需求分析過程就開始了。需求分析是測試計(jì)劃的輸入和參照。這就要求需求分析是可測試的。什么是可測試呢?“我們要用新的系統(tǒng)完成報(bào)表自動化處理”,你覺得這個需求是可測試的嗎?當(dāng)然不是,報(bào)表包括哪些?自動化處理的標(biāo)準(zhǔn)是什么?這些在需求中都沒有說明。因此這項(xiàng)需求是無法測試的,就是不具有可測試性。說到這里,大家可能就會明白之前的需求的幾項(xiàng)標(biāo)準(zhǔn)都是為了保證需求的可測試性的。事實(shí)就是這樣,只有系統(tǒng)的所有需求是可以被測試的,才能夠保證軟件始終圍繞著用戶的需要,保證軟件系統(tǒng)是成功的。大家真正在應(yīng)用一些科學(xué)的方法的時候也應(yīng)該記住,任何的方法都是為了保證軟件的成功,不要偏離這個目標(biāo),千萬不要走火入魔了,呵呵,很容易的。
該文章在 2010/5/12 23:43:55 編輯過