辛辛苦苦的熬了幾個(gè)月,軟件開(kāi)發(fā)終于快要告一段落了。系統(tǒng)功能已經(jīng)基本完成了,在準(zhǔn)備按部就班的完成最后的測(cè)試時(shí),客戶突然提出要改變某些非功能性需求。這對(duì)于軟件開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),不亞于晴天驚雷,這也是讓所有軟件開(kāi)發(fā)人員感到最恐怖的事情之一。因?yàn)樵诙鄶?shù)情況下,對(duì)非功能性需求的變更都會(huì)演變成一個(gè)對(duì)系統(tǒng)無(wú)休止的修改過(guò)程,最終會(huì)把客戶和開(kāi)發(fā)團(tuán)隊(duì)都拖進(jìn)泥潭而難以自拔。
需求變更本應(yīng)是客戶的權(quán)力,如果確是需要變更,當(dāng)然要滿足客戶需要。但問(wèn)題是不能讓變更權(quán)力濫用,把一些無(wú)關(guān)痛癢的非功能性需求變更寵慣養(yǎng)成堂而皇之的變更。對(duì)于非功能性需求客戶總會(huì)有新的想法,項(xiàng)目好像總沒(méi)有辦法終結(jié)。以前當(dāng)出現(xiàn)這種情況時(shí),我總覺(jué)得很沮喪,覺(jué)得自己非常不幸,怎樣會(huì)碰上這樣的客戶。可在讀了《設(shè)計(jì)模式精解(Design Patterns Explained)》一書(shū)的一段話后,我恍然大悟,這不是我的錯(cuò),世界原來(lái)就是這樣子的啊,永遠(yuǎn)不變的就是變化。
令人煩惱的非功能性需求變更
在軟件開(kāi)發(fā)中,大家都會(huì)遇到過(guò)這樣的問(wèn)題:客戶的一個(gè)新想法,就推翻了之前與客戶經(jīng)過(guò)再三討論而確認(rèn)定下來(lái)的需求。如果是功能性需求變更還會(huì)讓人容易接受一些,畢竟功能性需求不實(shí)現(xiàn)的話,是會(huì)大大影響到軟件產(chǎn)品的質(zhì)量。但現(xiàn)在我所負(fù)責(zé)的這個(gè)開(kāi)發(fā)項(xiàng)目中遇到的都是一些非功能性的變更,而且許多是看起來(lái)無(wú)關(guān)痛癢的、雞毛蒜皮的變更。
(1)什么是非功能性需求?
在IEEE中,軟件需求的定義是:用戶解決問(wèn)題或達(dá)到目標(biāo)所需的條件或功能。一般包含業(yè)務(wù)需求、用戶需求、功能需求、行業(yè)隱含需求和一些非功能性需求。業(yè)務(wù)需求反映了客戶對(duì)系統(tǒng)、產(chǎn)品高層次的目標(biāo)要求;功能需求定義了開(kāi)發(fā)人員必須實(shí)現(xiàn)的軟件功能。所謂非功能性需求,是指為滿足用戶業(yè)務(wù)需求而必須具有除功能需求以外的特性。包括系統(tǒng)性能、可靠性、可維護(hù)性、易用性和對(duì)技術(shù)和對(duì)業(yè)務(wù)適應(yīng)性等。其中最常見(jiàn)的是軟件界面、操作方便等一系列要求。
(2)非功能性需求變更的特點(diǎn)
讓我們從客戶角度和開(kāi)發(fā)人員角度去看看非功能性需求的特點(diǎn)。首先,有些非功能性小需求從客戶角度看起來(lái)工作量不大,但是實(shí)際上開(kāi)發(fā)人員要耗費(fèi)比較長(zhǎng)的時(shí)間去完成這些小功能。其次,許多非功能性需求,如界面美觀、操作方便等都是客戶頭腦一熱、或領(lǐng)導(dǎo)一拍腦袋就部署下去的需求,往往是原來(lái)在需求分析階段所沒(méi)有注意的內(nèi)容。
其實(shí),非功能性需求是常常被輕視,甚至被忽視的。原因是非功能性需求描述很困難,它很難像功能性需求那樣,可以通過(guò)結(jié)構(gòu)化和量化的詞語(yǔ)來(lái)描述清楚。在描述這類(lèi)需求時(shí)候,我們經(jīng)常采用軟件性能要好、操作要方便、軟件界面要美觀大方等較模糊的描述詞語(yǔ)。例如,易用性就同時(shí)涉及到美工和UI界面、人機(jī)工程、交互式設(shè)計(jì)、心理學(xué)、用戶行為模式等內(nèi)容。這類(lèi)描述詞語(yǔ)都是脫離了軟件的執(zhí)行環(huán)境,是對(duì)人和相關(guān)的場(chǎng)景的描述,因此很難體現(xiàn)到軟件架構(gòu)設(shè)計(jì)和具體的實(shí)現(xiàn)中。
為什么非功能性需求變更會(huì)頻繁發(fā)生?
為什么非功能性需求不能固定下來(lái)呢?或定下來(lái)后就不許變了呢?通常有許多人會(huì)問(wèn)這樣的問(wèn)題。實(shí)際上,當(dāng)他變成了客戶時(shí),他可能就不會(huì)問(wèn)這個(gè)問(wèn)題了。
(1)非功能性需求容易產(chǎn)生理解分歧
在軟件需求分析階段,客戶和開(kāi)發(fā)人員對(duì)非功能性需求的理解呈現(xiàn)"大體上共識(shí)多,細(xì)節(jié)上差異多"的特點(diǎn)。一般跟分析員的知識(shí)、背景,還有客戶表述的標(biāo)準(zhǔn)程度、雙方的交流情況有關(guān)。即使通過(guò)反復(fù)溝通,但是以實(shí)踐經(jīng)驗(yàn)來(lái)看非功能性需求的描述還是永遠(yuǎn)不夠清晰、不夠明確的,主要是因?yàn)樵谶@個(gè)階段所謂的產(chǎn)品還只存在于大家的大腦構(gòu)思中。
作為一個(gè)客戶,大多數(shù)情況下是不懂技術(shù)的,但他所需要的軟件在他的心里還是有一個(gè)印象的。他會(huì)想象出軟件的樣子和功能,然后通過(guò)口頭或者筆頭的方式告訴需求分析人員。簡(jiǎn)單的說(shuō),就是在這個(gè)階段用戶往往不能確切地定義自己需要什么。用戶常常以為自己清楚,但實(shí)際上他們提出的需求只是依據(jù)當(dāng)前的工作所需,或者是他們想象出來(lái)的東西。結(jié)果是當(dāng)客戶向需求分析人員提出需求的時(shí)候,往往是通過(guò)自己的想法用自然語(yǔ)言來(lái)表達(dá)的,這樣的表達(dá)結(jié)果對(duì)于真實(shí)的需求來(lái)說(shuō)只是一種描述,甚至只是某個(gè)角度的描述,但遠(yuǎn)遠(yuǎn)不能保證這樣的描述可以得到百分之百的正確理解。
當(dāng)客戶提出要求之后,在雙方認(rèn)為理解大概沒(méi)有分歧的時(shí)候,開(kāi)發(fā)人員就開(kāi)始工作了。但隨著開(kāi)發(fā)工作的不斷進(jìn)展,系統(tǒng)開(kāi)始展現(xiàn)雛形,客戶對(duì)系統(tǒng)的了解也逐步深入。這個(gè)時(shí)候,客戶就會(huì)對(duì)系統(tǒng)的界面、操作、功能、性能等有一些了解,就有可能提出需求變更要求,而且這些要求很多是基于主觀的、人為的因素。總之,他們了解得越多,新的要求也就會(huì)越多。
(2)沒(méi)有明確的需求變更管理流程
在軟件開(kāi)發(fā)中的常識(shí)是,一旦發(fā)生需求變更不要一味的抱怨,也不要一味地去迎合客戶的新需求,而是要管理和控制需求變更。但令人不解的是我們常常看到變更的提出、討論和執(zhí)行常常只停留在口頭上。這樣做有兩個(gè)弊端:首先是時(shí)間一長(zhǎng),無(wú)論是當(dāng)事人還是開(kāi)發(fā)團(tuán)隊(duì)都說(shuō)不清楚變更是因何發(fā)生以及結(jié)果怎么樣了。顯然,這對(duì)于提高項(xiàng)目質(zhì)量、改進(jìn)開(kāi)發(fā)過(guò)程是很不利的。其次是由于缺乏形式上的約束和對(duì)變更代價(jià)的定量分析,變更會(huì)被非常隨意地提出、或被草率地執(zhí)行,也會(huì)大大影響項(xiàng)目的進(jìn)展和開(kāi)發(fā)質(zhì)量。
因此,沒(méi)有明確的需求變更管理流程,就會(huì)使需求變更變得泛濫。因?yàn)椴⒉皇撬械淖兏家薷模膊皇撬凶兏家⒖绦薷模枨笞兏芾淼哪康氖菫榱藳Q定什么類(lèi)型的變更需要修改和什么時(shí)候修改。比如界面風(fēng)格問(wèn)題,就可以先不修改,或者規(guī)劃一下修改的時(shí)間待到以后進(jìn)行優(yōu)化。
(3)沒(méi)有讓客戶知道需求變更的代價(jià)
對(duì)變更的影響沒(méi)有評(píng)估是需求變更泛濫的根本原因。變更都是有代價(jià)的,應(yīng)該要評(píng)估變更的代價(jià)和要讓客戶了解需求變更的后果。如果客戶不知道需求變更付出的代價(jià),對(duì)開(kāi)發(fā)人員的辛苦就會(huì)難以體會(huì)。
相比于需求開(kāi)發(fā)人員而言,客戶可能對(duì)需求變更認(rèn)識(shí)不足,認(rèn)為他們出錢(qián),軟件開(kāi)發(fā)團(tuán)隊(duì)就要為它服務(wù)。因此,客戶對(duì)需求變更往往會(huì)肆無(wú)忌彈,將需求變更視為兒戲,隨個(gè)人喜好隨意變更需求。所以,在和客戶接觸時(shí)應(yīng)該挑明態(tài)度,特別是要讓他們清楚需求隨意變更所帶來(lái)的代價(jià)和風(fēng)險(xiǎn)。如果客戶認(rèn)為代價(jià)太大,那么開(kāi)發(fā)人員就沒(méi)有必要及時(shí)修改,按原來(lái)的進(jìn)度走,但仍要記錄變更,待下一版本在修改。
如何有效控制非功能性需求的變更?
做任何變更之前,我們都要考慮后果。由于非功能性需求變更在開(kāi)發(fā)中所處的重要地位,一旦需求發(fā)生變化,影響面是很廣的。因此,有效控制非功能性需求頻繁變更是一件不容小視的事情。
(1)建立明確的非功能性需求基線
對(duì)于軟件開(kāi)發(fā)來(lái)說(shuō),變更無(wú)可避免,也無(wú)從逃避,只能積極應(yīng)對(duì)。因此,在開(kāi)發(fā)過(guò)程中,建立明確的非功能性需求基線是一件重要的事情。如果非功能性需求沒(méi)做好,基線范圍就含糊不清,就容易被客戶抓住空子,往往要付出許多無(wú)謂的變更。如果非功能性需求基線做得好,文檔清晰且又有客戶簽字,那么后期客戶提出的非功能性需求變更就會(huì)大大減少。因此,在建立需求基線的時(shí)候千萬(wàn)不能手軟,這并非要刻意針對(duì)客戶,而是不能讓客戶養(yǎng)成經(jīng)常變更的習(xí)慣,否則后患無(wú)窮。
(2)建立需求變更管理流程
需求變更對(duì)軟件開(kāi)發(fā)成敗有重要影響,既不能一概拒絕客戶的變更要求,也不能一味地遷就客戶,所以必須要做好需求變更的控制。有句通俗的話說(shuō)得非常好:需求變更管理的目的不是控制變更的發(fā)生,而是對(duì)變更進(jìn)行管理,確保變更有序進(jìn)行。需求變更管理流程包括變更申請(qǐng)環(huán)節(jié)、審批人員、審批事項(xiàng)、審批流程等。
目的有兩個(gè):一是將客戶下達(dá)變更的流程盡可能地規(guī)范化,減少?gòu)堊炀蛠?lái)的非必要、非緊急、非合理、非高層領(lǐng)導(dǎo)意圖的無(wú)效變更。二是留下書(shū)面依據(jù),為今后可能的成本核算準(zhǔn)備好變更賬。因此,凡未履行審批程序的變更,一律是無(wú)效變更不予受理。在實(shí)踐中,人們往往不愿意為小的需求變更去執(zhí)行正規(guī)的需求管理過(guò)程,認(rèn)為降低了開(kāi)發(fā)效率,浪費(fèi)了時(shí)間。但正是由于這種觀念才會(huì)使到需求變更逐漸變?yōu)椴豢煽兀罱K導(dǎo)致項(xiàng)目的失敗。
(3)確認(rèn)客戶是否接受變更的代價(jià)
需求變更作為一個(gè)計(jì)劃外的風(fēng)險(xiǎn)對(duì)項(xiàng)目肯定存在沖擊,只是大小的差別。而且客戶的需求是永遠(yuǎn)不會(huì)滿足的,可能一天一個(gè)樣,為了達(dá)到控制頻繁的需求變更。需要將變更后產(chǎn)生的成本進(jìn)行評(píng)估與量化,形成分析報(bào)告提交雙方領(lǐng)導(dǎo)。否則,一味的妥協(xié)只會(huì)讓項(xiàng)目進(jìn)一步惡化。因此,要讓客戶認(rèn)識(shí)到變更都是有代價(jià)的,不要讓客戶養(yǎng)成隨意變更的毛病。一般來(lái)說(shuō),如果客戶認(rèn)為該非功能性變更是必須的,而不是其上級(jí)領(lǐng)導(dǎo)拍腦袋提出的就會(huì)接受這些代價(jià)。通過(guò)與客戶的溝通和協(xié)商,開(kāi)發(fā)團(tuán)隊(duì)即使沒(méi)有回報(bào)也不會(huì)招致客戶的埋怨。
(4)加強(qiáng)合同約束力
雖然軟件開(kāi)發(fā)合同很難在簽訂之初就能夠精確定義每項(xiàng)需求,單靠合同是幫不上忙的,但也不能忽視合同的約束力。因?yàn)橛袝r(shí)銷(xiāo)售人員為使客戶能夠快速的簽訂合同,往往草率決定和片面同意客戶提出的需求。當(dāng)客戶提出新的需求時(shí),銷(xiāo)售人員往往一看"應(yīng)該"只是一個(gè)小小的修改,沒(méi)有太大的影響,可能會(huì)直接答應(yīng)能變更。所以,在與客戶簽訂開(kāi)發(fā)合同時(shí),可以增加一些相關(guān)條款,如限定客戶提出需求變更的時(shí)間,規(guī)定何種情況的變更可以接受、拒絕接受或部分接受,還可以規(guī)定發(fā)生需求變更時(shí)必須執(zhí)行變更控制流程等。
(5)加強(qiáng)感情溝通,注意溝通技巧
大多時(shí)候單靠合同的約束力是解決不了紛爭(zhēng)的。客戶著急了就是一句潛臺(tái)詞:做不做,不想做就滾蛋,想做的公司多著呢。例如,有時(shí)明明是不合理的要求,可是客戶也會(huì)狡辯憑什么不給他們做,這可是合同范圍內(nèi)的工作。所以,單看合同是沒(méi)用的。
那可怎么辦呢?通常的做法是通過(guò)感情聯(lián)絡(luò),爭(zhēng)取客戶的同情。我們常常對(duì)客戶說(shuō)的一句老生常談的話,就是提需求也要講究合情合理,這句話在變更管理中有著獨(dú)特的意義。用我們的行話說(shuō)是:做好需求變更管理控制只是做好了一半的工作,還有一半的工作就是去講道理,去用心、用感情勸客戶回頭。
月有陰晴圓缺,潮漲潮落。變化并不一定總是給我們帶來(lái)麻煩,有時(shí)也會(huì)帶來(lái)驚喜。在軟件開(kāi)發(fā)中,對(duì)待客戶提出的非功能性需求變更,我們需要用平常心去看待,不是一味拒絕,也不要一味答應(yīng)。
posted on 2010-11-08 00:44
cssseek 閱讀(1715)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
項(xiàng)目管理