令人煩惱的需求變更
在軟件開發中,大家都會遇到過這樣的問題:客戶的一個新想法,就推翻了之前與客戶經過再三討論而確認定下來的需求。如果是功能性需求變更還會讓人容易接受一些,畢竟功能性需求不實現的話,是會大大影響到軟件產品的質量。但是一些非功能性的變更會讓人很頭疼,許多是看起來無關痛癢的、雞毛蒜皮的變更,卻是極為令人無語和無奈,甚至是煩惱和厭惡的。
(1)什么是軟件需求?
在IEEE中,軟件需求的定義是:用戶解決問題或達到目標所需的條件或功能。一般包含業務需求、用戶需求、功能需求、行業隱含需求和一些非功能性需求。業務需求反映了客戶對系統、產品高層次的目標要求;功能需求定義了開發人員必須實現的軟件功能。所謂非功能性需求,是指為滿足用戶業務需求而必須具有除功能需求以外的特性。包括系統性能、可靠性、可維護性、易用性和對技術和對業務適應性等。其中最常見的是軟件界面、操作方便等一系列要求。
(2)非功能性需求變更的特點
讓我們從客戶角度和開發人員角度去看看非功能性需求的特點。首先,有些非功能性小需求從客戶角度看起來工作量不大,但是實際上開發人員要耗費比較長的時間去完成這些小功能。其次,許多非功能性需求,如界面美觀、操作方便等都是客戶頭腦一熱、或領導一拍腦袋就部署下去的需求,往往是原來在需求分析階段所沒有注意的內容。
其實,非功能性需求是常常被輕視,甚至被忽視的。原因是非功能性需求描述很困難,它很難像功能性需求那樣,可以通過結構化和量化的詞語來描述清楚。在描述這類需求時候,我們經常采用軟件性能要好、操作要方便、軟件界面要美觀大方等較模糊的描述詞語。例如,易用性就同時涉及到美工和UI界面、人機工程、交互式設計、心理學、用戶行為模式等內容。這類描述詞語都是脫離了軟件的執行環境,是對人和相關的場景的描述,因此很難體現到軟件架構設計和具體的實現中。
國內的很多軟件公司,對于這種情況趨之若鶩,認為是負擔,影響軟件公司的工作安排,工作量以及工作進度,直接導致了軟件公司的效益,幾乎是很多軟件公司的最大隱患,因此我們如何認識、對待這個普遍存在的問題就成了軟件公司以及員工需要解決的問題;
1)首先,要從心理上徹底根除對需求變更的恐懼,從認識上明確需求變更是軟件開發過程中不可缺少的部分,從方針上明確需求變更的存在性和必然性;
a)從軟件公司角度,認清自身存在的不足, 客觀面對需求的變更
b)從職員角度,提高本身的業務和技術能力
2)從技術角度上使需求變更的處理簡單化,明確化,增加可維護性;
a)使用更好的技術手段,設計更靈活以用來適應更多變的需求;
b)使用更完善的軟件工程的理念,讓軟件各個步驟細化,更易維護和修改;
c)使用完善的測試流程,最大的降低需求變更帶來的軟件風險;
3)對需求變更進行有效的管理,讓需求變更可以規范化管理,做到有效的處理需求的變更,用有限的資源獲得最大的效益;
a)軟件的初期,就要考慮最大限度的減少將來可能存在的需求變更
b)需求的控制,減少需求的來源,過濾不合理的需求
c)文檔化管理,有備可查,有據可依;
d)合適的公司體制和運作,找到一條適合自己公司發展的運作體制和管理模式;
可能大家覺得上面說的話有些空,那么我就從技術角度上再具體的談談。
就像剛才說過的,需求變更是必然存在的。從技術的角度來降低或避免需求變更給我們帶來的影響就顯得極為重要。
1、設計之初,充分理解需求,更好對需求進行整理和規劃,預測可能變更的需求。
需求難做,業務難做,非功能性的需求變更更是難做。所以當我們在收集了用戶需求后,不僅僅是簡單的分類,然后按部就班的開發,而是要深入挖掘需求,一些看似固定業務的需求,可能由于業務的變更而使得你的系統不能使用。我們要做的就是拆分需求,把一些可能會發生變化的需求拆開,改成工作流程可配置的。就像面向過程轉向面向對象的那樣,面向過程是死的,而面向對象重新組合后,就特別簡單。
就說說我們剛做的這個收銀系統吧,用戶要求結賬時,要打印小票,并自動打開錢箱。這就是最最原始的需求。但是我們最終把它做成了這樣:打印機是外部設備,可以增刪和配置;打印次數可配置;打印樣式可配置;打印時,要判斷打印機狀態,非正常狀態要給出各種提示(不一一列舉);錢箱可以自動打開,也可以手動打開。另外還設定了許多功能配置:如禁用/啟用全部打印機,禁用/啟用某個打印機,是否打印訂單小票,是否自動打開錢箱,是否顯示錯誤提示信息等等(如圖)。
我們把這個固定的需求,拆分成可配置的,這樣就把這個需求可能的變更已經分析的差不多了。不論它怎么變化,我們的應對都會變得從容。就在前2天部署的時候出現問題了,打印機是新買的,不只是什么原因,在打印多個換行之后,就會失敗,不能繼續打印。這個問題是我們所料不及的,因為我們測的我們這里的所有打印機,都完美打印,而新買的也是同品牌,同型號的打印機。最終分析出這個問題后,我們不用更改系統,只要修改一下小票樣式配置,就可以完美打印了。
小票樣式設定(圖):

硬件設置(圖):

單個打印機設置(圖):

功能設置(圖):

2、系統完成之后,客戶再提新需求后,要分析這個需求的深層次含義,分析客戶要的到底是什么。對于一些需求,如果適合于大部分客戶,而且改動很少,就可以完成,那么可以在下個升級版本中集成。而對于某些非功能性的需求,改動太大,或者基本的核心功能都需要更改的話,那么就不要先去急著實現,而是放置起來,等待系統需要進行大的升級或者重構時,再考慮添加。而且要防止客戶濫用提需求的權力,對于一些不合理的需求,還要去引導客戶,讓他們理解這個功能的不合理的地方,從而重新修改需求或者放棄。