Sawin軟體研發之窗:如何進行軟體需求分析
如何進行軟體需求分析51CMM 作者:曹偉1.概念需求的定義包括從用戶角度(系統的外部行為),以及從開發者角度(一些內部特性)來闡述需求。關鍵的問題是一定要編寫需求文檔。我曾經目睹過一個項目中途更換了所有的開發者,客戶被迫與新的需求分析者坐到一起。系統的分析人員說:「我們想與你談談你的需求。」客戶的第一反應便是:「我已經將我的要求都告訴你們前任了,現在我要的就是給我編一個系統」。而實際上,需求並未編寫成文檔,因此新的分析人員不得不從頭做起。所以如果只有一堆郵件、會談記錄或一些零碎的未整理的對話,你就確信你已明白用戶的需求,那完全是自欺欺人。需求的另外一種定義認為需求是「用戶所需要的並能觸發一個程序或系統開發工作的說明」。有些需求分析專家拓展了這個概念:「從系統外部能發現系統所具有的滿足於用戶的特點、功能及屬性等」。這些定義強調的是產品是什麼樣的,而並非產品是怎樣設計、構造的。而下面的定義則從用戶需要進一步轉移到了系統特性:需求是指明必須實現什麼的規格說明。它描述了系統的行為、特性或屬性,是在開發過程中對系統的約束。從上面這些不同形式的定義不難發現:並沒有一個清晰、毫無二義性的「需求」術語存在,真正的「需求」實際上在人們的腦海中,這個人們主要是指客戶,但一般情況下,用戶並不能描述自己的需要,只就需要系統分析人員根據用戶的自己語言的描述整理出相關的需要再進一步和客戶核對。系統分析員和客戶需要確保所有項目風險承擔者在描述需求的那些名詞的理解上務必達成共識。任何文檔形式的需求(例如如下將要描述的需求規格說明書)僅是一個模型,一種描述。2.需求分析的任務開發軟體系統最為困難的部分就是準確說明開發什麼。最為困難的概念性工作便是編寫出詳細技術需求,這包括所有面向用戶、面向機器和其它軟體系統的介面。同時這也是一旦做錯,將最終會給系統帶來極大損害的部分,並且以後再對它進行修改也極為困難。目前,國內產品的龐雜,一家企業可能有幾個系統並立運行,它們之間介面是系統開發人員最頭痛的問題。對於商業最終用戶應用程序,企業信息系統和軟體作為一個大系統的一部分的產品是顯而易見的。但是對於我們開發人員來說,並沒有編寫出客戶認可的需求文檔,我們如何知道項目於何時結束?而如果我們不知道什麼對客戶來說是重要的,那我們又如何能使客戶感到滿意呢?然而,即便並非出於商業目的的軟體需求也是必須的。例如庫、組件和工具這些供開發小組內部使用的軟體。當然你可能偶爾勿需文檔說明就能與其他人意見較為一致,但更常見的是出現重複返工這種不可避免的後果,而重新編製代碼的代價遠遠超過重寫一份需求文檔的代價,這些血的教訓正在國內的軟體開發者身上發生。近來,我遇到一個開發小組開發包括代碼編輯器在內的一套內部使用的計算機輔助軟體。不幸的是,當他們開發完這個工具後,發現這個工具不能列印出源代碼文件,使用者當然希望有這個功能。結果這個小組只好手工抄寫源代碼文檔以供代碼檢查。這說明那怕需求明確無誤並構思準確,如果我們沒有編寫文檔,軟體達不到期望目標也只能是咎由自取了。相反的情況,我曾見一個要集成到「錯誤跟蹤系統」中的簡單界面寫了一頁需求說明。而操作系統系統管理員在為處理腳本時發現簡單的一張需求清單竟是如此有用。他們依據需求對系統進行測試時,此系統不僅非常清晰地實現了所有必需功能,而且未發現任何錯誤。事實上,需求文檔在開發過程中一直起指導作用。3.需求分析過程可把整個軟體需求工程研究領域劃分為需求開發和需求管理兩部分更合適,如圖4-1所示:
圖4-1 需求工程域的層次分解示意圖需求開發可進一步分為:問題獲取、分析、編寫規格說明和驗證四個階段。這些子項包括軟體類產品中需求收集、評價、編寫文檔等所有活動。需求開發活動包括以下幾個方面:確定產品所期望的用戶類別。獲取每個用戶類的需求。了解實際用戶任務和目標以及這些任務所支持的業務需求。分析源於用戶的信息以區別用戶任務需求、功能需求、業務規則、質量屬性、建議解決方法和附加信息。將系統級的需求分為幾個子系統,並將需求中的一部份分配給軟體組件。了解相關質量屬性的重要性。商討實施優先順序的劃分。將所收集的用戶需求編寫成文檔和模型。評審需求規格說明,確保對用戶需求達到共同的理解與認識,並在整個開發小組接受說明之前將問題都弄清楚。需求管理需要「建立並維護在軟體工程中同客戶達成的合同」 。這種合同都包含在編寫的需求文檔與模型中。客戶的接受僅是需求成功的一半,開發人員也必須能夠接受他們,並真正把需求應用到產品中。通常的需求管理活動包括:定義需求基線(迅速制定需求文檔的主體)。評審提出的需求變更、評估每項變更的可能影響從而決定是否實施它。以一種可控制的方式將需求變更融入到項目中。使當前的項目計劃與需求一致。估計變更需求所產生影響並在此基礎上協商新的承諾,這種承諾具體體現在項目解決方案上。讓每項需求都能與其對應的設計、源代碼和測試用例聯繫起來以實現跟蹤。在整個項目過程中跟蹤需求狀態及其變更情況。以上幾點說明是我總結了成功實施項目後系統分析人員的經驗,同時也根據國內外的其他系統實施的相關成功經驗,進行了總結。4.需求的類型下面這些定義是需求工程領域中常見術語的定義。軟體需求包括三個不同的層次:業務需求、用戶需求和功能需求(也包括非功能需求)。1.業務需求(business requirement)反映了組織機構或客戶對系統、產品高層次的目標要求,它們在項目視圖與範圍文檔中予以說明。2.用戶需求(user requirement) 文檔描述了用戶使用產品必須要完成的任務,這在使用實例(use case)文檔或方案腳本說明中予以說明。3.功能需求(functional requirement)定義了開發人員必須實現的軟體功能,使得用戶能完成他們的任務,從而滿足了業務需求。在軟體需求規格說明書 (SRS)中說明的功能需求充分描述了軟體系統所應具有的外部行為。軟體需求規格說明在開發、測試、質量保證、項目管理以及相關項目功能中都起了重要的作用。對一個大型系統來說,軟體功能需求也許只是系統需求的一個子集,因為另外一些可能屬於子系統(或軟體部件)。作為功能需求的補充,軟體需求規格說明還應包括非功能需求,它描述了系統展現給用戶的行為和執行的操作等。它包括產品必須遵從的標準、規範和合約;外部界面的具體細節;性能要求;設計或實現的約束條件及質量屬性。所謂約束是指對開發人員在軟體產品設計和構造上的限制。質量屬性是通過多種角度對產品的特點進行描述,從而反映產品功能。多角度描述產品對用戶和開發人員都極為重要。下面以一個字處理程序為例來說明需求的不同種類。業務需求可能是:「用戶能有效地糾正文檔中的拼寫錯誤」,該產品的包裝盒封面上可能會標明這是個滿足業務需求的拼寫檢查器。而對應的用戶需求可能是「找出文檔中的拼寫錯誤並通過一個提供的替換項列表來供選擇替換拼錯的詞」。同時,該拼寫檢查器還有許多功能需求,如找到並高亮度提示錯詞的操作;顯示提供替換詞的對話框以及實現整個文檔範圍的替換。從以上定義可以發現,需求並未包括設計細節、實現細節、項目計劃信息或測試信息。需求與這些沒有關係,它關注的是充分說明你究竟想開發什麼。項目也有其它方面的需求,如開發環境需求或發布產品及移植到支撐環境的需求。儘管這些需求對項目成功也至關重要,但它們並非本書所要討論的。5.需求分析的原則不重視需求過程的項目隊伍將自食其果。需求工程中的缺陷將給項目成功帶來極大風險,這裡的「成功」是指推出的產品能以合理的價格、及時地在功能、質量上完全滿足用戶的期望。下面將討論一些需求風險。不適當的需求過程所引起的一些風險:1. 無足夠用戶參與客戶經常不明白為什麼收集需求和確保需求質量需花費那麼多功夫,開發人員可能也不重視用戶的參與。究其原因:一是因為開發人員感覺與用戶合作不如編寫代碼有意思;二是因為開發人員覺得已經明白用戶的需求了。在某些情況下,與實際使用產品的用戶直接接觸很困難,而客戶也不太明白自己的真正需求。但還是應讓具有代表性的用戶在項目早期直接參与到開發隊伍中,並一同經歷整個開發過程。系統人員在實踐過程中,也有些感覺,在實施一家公司的項目時,若無足夠的用戶參與,系統人員獲得的需求是片面的,不完整的,這樣系統在需求之初就埋下風險。2. 用戶需求的不斷增加在開發中若不斷地補充需求,項目就越變越龐大以致超過其計劃及預算範圍。計劃並不總是與項目需求規模與複雜性、風險、開發生產率及需求變更實際情況相一致,這使得問題更難解決。實際上,問題根源在於用戶需求的改變和開發者對新需求所作的修改。要想把需求變更範圍控制到最小,必須一開始就對項目視圖、範圍、目標、約束限制和成功標準給予明確說明,並將此說明作為評價需求變更和新特性的參照框架。說明中包括了對每種變更進行變更影響因素分析的變更控制過程,有助於所有風險承擔者明白業務決策的合理性,即為何進行某些變更,相應消耗的時間、資源或特性上的折中。產品開發中不斷延續的變更會使其整體結構日漸紊亂,補丁代碼也使得整個程序難以理解和維護。插入補丁代碼使模塊違背強內聚、松耦合的設計原則,特別是如果項目配置管理工作不完善的話,收回變更和刪除特性會帶來問題。如果你儘早地區別這些可能帶來變更的特性,你就能開發一個更為健壯的結構,並能更好地適應它。這樣設計階段需求變更不會直接導致補丁代碼,同時也有利於減少因變更導致質量的下降。3. 模稜兩可的需求模稜兩可是需求規格說明中最為可怕的問題。它的一層含義是指諸多讀者對需求說明產生了不同的理解;另一層含義是指單個讀者能用不止一個方式來解釋某個需求說明。模稜兩可的需求會使不同的風險承擔者產生不同的期望,它會使開發人員為錯誤問題而浪費時間,並且使測試者與開發者所期望的不一致。一位系統測試人員曾告訴我,她所在的測試組經常對需求理解有誤,以致不得不重寫許多測試用例並重做許多測試。處理模稜兩可需求的一種方法是組織好負責從不同角度審查需求的隊伍。僅僅簡單瀏覽一下需求文檔是不能解決模稜兩可問題的。如果不同的評審者從不同的角度對需求說明給予解釋,但每個評審人員都真正了解需求文檔,這樣二義性就不會直到項目後期才被發現,那時再發現的話會使得更正代價很大。4. 不必要的特性「畫蛇添足」是指開發人員力圖增加一些「用戶欣賞」但需求規格說明中並未涉及的新功能。經常發生的情況是用戶並不認為這些功能性很有用,以致在其上耗費的努力「白搭」了。開發人員應當為客戶構思方案並為他們提供一些具有創新意識的思路,具體提供哪些功能要在客戶所需與開發人員在允許時限內的技術可行性之間求得平衡,開發人員應努力使功能簡單易用,而不要未經客戶同意,擅自脫離客戶要求,自作主張。同樣,客戶有時也可能要求一些看上去很「酷」,但缺乏實用價值的功能,而實現這些功能只能徒耗時間和成本。為了將「畫蛇添足」的危害盡量減小,應確信:你明白為什麼要包括這些功能,以及這些功能的「來龍去脈」,這樣使得需求分析過程始終是注重那些能使用戶完成他們業務任務的核心功能。5. 過於精簡的規格說明有時,客戶並不明白需求分析有如此重要,於是只作一份簡略之至的規格說明,僅涉及了產品概念上的內容,然後讓開發人員在項目進展中去完善,結果很可能出現的是開發人員先建立產品的結構之後再完成需求說明。這種方法可能適合於尖端研究性的產品或需求本身就十分靈活的情況。但在大多數情況下,這會給開發人員帶來挫折(使他們在不正確的假設前提和極其有限的指導下工作),也會給客戶帶來煩惱(他們無法得到他們所設想的產品)。6. 忽略了用戶分類大多數產品是由不同的人使用其不同的特性,使用頻繁程度也有所差異,使用者受教育程度和經驗水平也不盡相同。如果你不能在項目早期就針對所有這些主要用戶進行分類的話,必然導致有的用戶對產品感到失望。例如,菜單驅動操作對高級用戶太低效了,但含義不清的命令和快捷鍵又會使不熟練的用戶感到困難。7. 不準確的計劃據統計,導致需求過程中軟體成本估計極不準確的原因主要有以下五點:頻繁的需求變更、遺漏的需求、與用戶交流不夠、質量低下的需求規格說明和不完善的需求分析。對不準確的要求所提問題的正確響應是「等我真正明白你的需求時,我就會來告訴你」。基於不充分信息和未經深思的對需求不成熟的估計很容易為一些因素左右。要作出估計時,最好還是給出一個範圍。未經準備的估計通常是作為一種猜測給出的,聽者卻認為是一種承諾。因此我們要儘力給出可達到的目標並堅持完成它。6.需求分析人員和用戶的合作關係優秀的軟體產品是建立在優秀的需求基礎之上的。而高質量的需求來源於客戶與開發人員之間有效的交流與合作。通常,開發人員與客戶或客戶代理人,如市場人員間的關係反而會成為一種對立關係。雙方的管理者都只想自己的利益而擱置用戶提供的需求從而產生摩擦,在這種情況下,不會給雙方帶來一點益處。只有當雙方參與者都明白要成功自己需要什麼,同時也應知道要成功合作方需要什麼時,才能建立起一種合作關係。由於項目壓力與日漸增,所有風險承擔者有著一個共同的目標這一點容易被遺忘。其實大家都想開發出一個既能實現商業價值,又能滿足用戶需要,還能使開發者感到滿足的優秀軟體產品。軟體客戶需求權利書列出了十條關於客戶在項目需求工程實施中與分析人員、開發人員交流時的合法要求。每一項權利都對應著軟體開發人員、分析人員的義務。而軟體客戶需求義務書也列出了十條關於客戶在需求過程中應承擔的義務。如果願意,可以將其作為開發人員的權利書。客戶有如下權利:1:要求分析人員使用符合客戶語言習慣的表達需求討論應集中於業務需要和任務,故要使用業務術語,你應將其教給分析人員,而你 不一定要懂得計算機的行業術語。2:要求分析人員了解客戶的業務及目標通過與用戶交流來獲取用戶需求、分析人員才能更好地了解你的業務任務和怎樣才能使產品更好地滿足你的需要。這將有助於開發人員設計出真正滿足你的需要並達到你期望的優秀軟體。為幫助開發人員和分析人員,可以考慮邀請他們觀察你或你的同事是怎樣工作的。如果新開發系統是用來替代已有的系統,那麼開發人員應使用一下目前的系統,這將有利於他們明白目前系統是怎樣工作的,其工作流程的情況,以及可供改進之處。3:要求分析人員編寫軟體需求規格說明分析人員要把從你和其他客戶那裡獲得的所有信息進行整理,以區分開業務需求及規範、功能需求、質量目標、解決方法和其它信息。通過這些分析就能得到一份軟體需求規格說明。而這份軟體需求規格說明便在開發人員和客戶之間針對要開發的產品內容達成了協議。軟體需求規格說明書可以用一種你認為易於翻閱和理解的方式組織編寫。要評審編寫出的規格說明以確保它們準確而完整地表達了你的需求。一份高質量的軟體需求規格說明能有助於開發人員開發出真正需要的產品。4:要求得到需求工作結果的解釋說明分析人員可能採用了多種圖表作為文字性軟體需求規格說明的補充。因為如工作流程圖那樣的圖表能很清楚地描述出系統行為的某些方面。所以需求說明中的各種圖表有著極高的價值。雖然它們不太難於理解,但是你很可能對此並不熟悉。因此可以要求分析人員解釋說明每張圖表的作用或其它的需求開發工作結果和符號的意義,及怎樣檢查圖表有無錯誤及不一致等。5:要求開發人員尊重你的意見如果用戶與開發人員之間不能相互理解,那關於需求的討論將會有障礙,共同合作能使大家「兼聽則明」。參與需求開發過程的客戶有權要求開發人員尊重他們並珍惜他們為項目成功所付出的時間。同樣,客戶也應對開發人員為項目成功這一共同目標所作出的努力表示尊重與感激。6:要求開發人員對需求及產品實施提供建議,拿出主意通常,客戶所說的「需求」已是一種實際可能的實施解決方案,分析人員將儘力從這些解決方法中了解真正的業務及其需求,同時還應找出已有系統不適合當前業務之處,以確保產品不會無效或低效。在徹底弄清業務領域內的事情後,分析人員有時就能提出相當好的改進方法。有經驗且富有創造力的分析人員還能提出增加一些用戶並未發現的很有價值的系統特性。7:描述產品易使用的特性你可以要求分析人員在實現功能需求的同時還要注重軟體的易用性。因為這些易用特性或質量屬性能使你更準確、高效地完成任務。例如,客戶有時要求產品要「用戶友好」或「健壯」或「高效率」,但這對於開發人員來說,太主觀了並無實用價值。正確的應是:分析人員通過詢問和調查了解客戶所要的友好、健壯、高效所包含的具體特性。8:調整需求,允許重用已有的軟體組件需求通常要有一定的靈活性。分析人員可能發現已有的某個軟體組件與你描述的需求很相符。在這種情況下,分析人員應提供一些修改需求的選擇以便開發人員能夠在新系統開發中重用一些已有的軟體。如果有可重用的機會出現,同時你又能調整你的需求說明,那就能降低成本和節省時間,而不必嚴格按原有的需求說明開發。所以說,如果想在產品中使用一些已有的商業常用組件,而它們並不完全適合你所需的特性,這時一定程度上的需求靈活性就顯得極為重要了。9:獲得滿足客戶功能和質量要求的系統每個人都希望項目獲得成功。但這不僅要求你要清晰地告知開發人員關於系統「做什麼」所需的所有信息,而且還要求開發人員能通過交流了解清楚取捨與限制。一定要明確說明你的假設和潛在的期望。否則,開發人員開發出的產品很可能無法讓你滿意。客戶有下列義務:1:給分析人員講解你的業務分析人員要依靠你給他們講解的業務概念及術語。但你不能指望分析人員會成為該領域的專家,而只能讓他們真正明白你的問題和目標。不要期望分析人員能把握你們業務的細微與潛在之處,他們很可能並不知道那些對於你和你的同事來說理所當然的「常識」。2:抽出時間清楚地說明並完善需求客戶很忙,經常在最忙的時候還得參與需求開發。但無論如何,你有義務抽出時間參與「頭腦風暴」會議的討論,接受採訪或其它獲取需求的活動。有時分析人員可能先以為明白了你的觀點,而過後發現還需要你的講解。這時,請耐心一些對待需求和需求的精化工作過程中的反覆,因為它是人們交流中的很自然的現象,何況這對軟體產品的成功極為重要。3:準確而詳細地說明需求編寫一份清晰、準確的需求文檔是很困難的。由於處理細節問題不但煩人而且又耗時,故很容易留下模糊不清的需求。但是,在開發過程中,必須得解決這種模糊性和不準確性。而你恰是為解決這些問題作出決定的最佳人選。不然的話,你就只好靠開發人員去正確猜測了。在需求規格說明中暫時加上待定(to be determined, TBD也可採用漢語拼音略寫「DQD:待確定」)的標誌是個不錯的辦法。用該標誌可指明了哪些需要進一步探討、分析或增加信息的地方。不過,有時也可能因為某個特殊需求難以解決或沒有人願意處理它而註上TBD標誌。盡量將每項需求的內容都闡述清楚,以便分析人員能準確的將其寫進軟體需求規格說明中。如果你一時不能準確表述,那就得允許獲取必要的準確信息這樣一個過程。通常使用所謂的原型技術。通過開發的原型,你可以同開發人員一起反覆修改,不斷完善需求定義。4:及時地作出決定正如一位建築師為你修建房屋,分析人員將要求你做出一些選擇和決定。這些決定包括來自多個用戶提出的處理方法或在質量特性衝突和信息準確度中選擇折衷方案等。有權做出決定的客戶必須積極地對待這一切,儘快做處理、做決定。因為開發人員通常只有等你做出了決定才能行動,而這種等待會延誤項目的進展。5:尊重開發人員的需求可行性及成本評估所有的軟體功能都有其成本價格,開發人員最適合預算這些成本(儘管許多開發人員並不擅長評估預測)。你所希望的某些產品特性可能在技術上行不通,或者實現它要付出極為高昂的代價。而某些需求試圖在操作環境中要求不可能達到的性能或試圖得到一些根本得不到的數據,開發人員會對此作出負面的評價意見,你應該尊重他們的意見。有時,你可以重新給出一個在技術上可行、實現上便宜的需求,例如,要求某個行為在「瞬間」發生是不可行的,但換種更具體的時間需求說法(「在50ms以內」,但若沒有準確的技術分析不能輕易下結論),這就可以實現了。6: 劃分需求優先順序別大多數項目沒有足夠的時間或資源來實現功能性的每個細節。決定哪些特性是必要的,哪些是重要的,哪些是好的,是需求開發的主要部分。只能由你來負責設定需求優先順序,因為開發者並不可能按你的觀點決定需求優先順序。開發者將為你確定優先順序提供有關每個需求的花費和風險的信息。當你設定優先順序時,你幫助開發者確保在適當的時間內用最小的開支取得最好的效果。在時間和資源限制下,關於所需特性能否完成或完成多少應該尊重開發人員的意見。儘管沒有人願意看到自己所希望的需求在項目中未被實現,但畢竟是要面對這種現實的。業務決策有時不得不依據優先順序來縮小項目範圍或延長工期,或增加資源,或在質量上尋找折衷。7:評審需求文檔和原型正如我們將在第1 4章討論的,無論是正式的還是非正式的方式,對需求文檔進行評審都會對軟體質量提高有所幫助。讓客戶參與評審才能真正鑒別需求文檔是否的確完整、正確說明了期望的必要特性。評審也給客戶代表提供一個機會,給需求分析人員帶來反饋信息以改進他們的工作。如果你認為編寫的需求文檔不夠準確,就有義務儘早告訴分析人員並為改進提供建議。通過閱讀需求規格說明,很難想像實際的軟體是什麼樣子的。更好的方法是先為產品開發一個原型。這樣你就能提供更有價值的反饋信息給開發人員,幫助他們更好地理解你的需求。必須認識到:原型並非是一個實際產品,但開發人員能將其轉變、擴充成功能齊全的系統。8:需求出現變更要馬上聯繫不斷的需求變更會給在預定計劃內完成高質量產品帶來嚴重的負面影響。變更是不可避免的,但在開發周期中變更越在晚期出現,其影響越大。變更不僅會導致代價極高的返工,而且工期也會被迫延誤,特別是在大體結構已完成後又需要增加新特性時。所以一旦你發現需要變更需求時,請一定立即通知分析人員。9:應遵照開發組織處理需求變更的過程為了將變更帶來的負面影響減少到最低限度,所有的參與者必須遵照項目的變更控制過程。這要求不放棄所有提出的變更,對每項要求的變更進行分析、綜合考慮,最後作出合適的決策以確定將某些變更引入項目中。10:尊重開發人員採用的需求工程過程軟體開發中最具挑戰性的莫過於收集需求並確定其正確性。分析人員採用的方法有其合理性。也許你認為需求過程不太划算,但請相信花在需求開發上的時間是「很有價值」的。如果你理解並支持分析人員為收集、編寫需求文檔和確保其質量所採用的技術,那麼整個過程將會更為順利。儘管去詢問分析人員為什麼他們要收集某些信息,或參與與需求有關的活動。系統分析人員在開發過程中可能會遇到以下問題,一些很忙的客戶可能不願意積极參与需求過程,而缺少客戶參與將很可能導致不理想的產品。故一定要確保需求開發中的主要參與者都了解並接受他們的義務。如果遇到分歧,通過協商以達成對各自義務的相互理解,這樣能減少今後的摩擦。7.需求文檔需求開發的最終成果是:客戶和開發小組對將要開發的產品達成一致協議。協議綜合了業務需求、用戶需求和軟體功能需求。就像我們早先所看到的,項目視圖和範圍文檔包含了業務需求,而使用實例文檔則包含了用戶需求。你必須編寫從使用實例派生出的功能需求文檔,還要編寫產品的非功能需求文檔,包括質量屬性和外部介面需求。只有以結構化和可讀性方式編寫這些文檔,並由項目的風險承擔者評審通過後,各方面人員才能確信他們所贊同的需求是可靠的。你可以使用以下三種方法編寫軟體需求規格說明:用好的結構化和自然語言編寫文本型文檔。建立圖形化模型,這些模型可以描繪轉換過程、系統狀態和它們之間的變化、數據關係、邏輯流或對象類和它們的關係。編寫形式化規格說明,這可以通過使用數學上精確的形式化邏輯語言來定義需求。由於形式化規格說明具有很強的嚴密性和精確度,因此,所使用的形式化語言只有極少數軟體開發人員才熟悉,更不用說客戶了。雖然結構化的自然語言具有許多缺點,但在大多數軟體工程中,它仍是編寫需求文檔最現實的方法。包含了功能和非功能需求的基於文本的軟體需求規格說明已經為大多數項目所接受。圖形化分析模型通過提供另一種需求視圖,增強了軟體需求規格說明。軟體需求規格說明不僅是系統測試和用戶文檔的基礎,也是所有子系列項目規劃、設計和編碼的基礎。它應該儘可能完整地描述系統預期的外部行為和用戶可視化行為。除了設計和實現上的限制,軟體需求規格說明不應該包括設計、構造、測試或工程管理的細節。許多讀者使用軟體需求規格說明來達到不同的目的:客戶和營銷部門依賴它來了解他們所能提供的產品。項目經理根據包含在軟體需求規格說明中描述的產品來制定規劃並預測進度安排、工作量和資源。軟體開發小組依賴它來理解他們將要開發的產品。測試小組使用軟體需求規格說明中對產品行為的描述制定測試計劃、測試用例和測試過程。軟體維護和支持人員根據需求規格說明了解產品的某部分是做什麼的。產品發布組在需求規格說明和用戶界面設計的基礎上編寫客戶文檔,如用戶手冊和幫助屏幕等。培訓人員根據需求規格說明和用戶文檔編寫培訓材料。軟體需求規格說明作為產品需求的最終成果必須具有綜合性:必須包括所有的需求。開發者和客戶不能作任何假設。如果任何所期望的功能或非功能需求未寫入軟體需求規格說明,那麼它將不能作為協議的一部分並且不能在產品中出現。我見過有一個項目突然接到測試人員發出的錯誤災難的報告。結果是他們測試的是老版本的軟體需求規格說明,而他們覺得錯誤的地方正是產品所獨有的特性。他們的測試工作是徒勞的,因為他們一直在老版本的軟體需求規格說明中尋找錯誤的系統行為。在編寫軟體需求規格說明,希望讀者牢記以下的建議:對節、小節和單個需求的號碼編排必須一致。在右邊部分留下文本注釋區。允許不加限制地使用空格。正確使用各種可視化強調標誌(例如,黑體、下劃線、斜體和其它不同字體)。創建目錄表和索引表有助於讀者尋找所需的信息。對所有圖和表指定號碼和標識號,並且可按號碼進行查閱。使用字處理程序中交叉引用的功能來查閱文檔中其它項或位置,而不是通過頁碼或節號。為了滿足軟體需求規格說明的可跟蹤性和可修改性的質量標準,必須唯一確定每個軟體需求。這可以使你在變更請求、修改歷史記錄、交叉引用或需求的可跟蹤矩陣中查閱特定的需求。由於要達到這一目的,用單一的項目列表是不夠的,因此,我將描述幾個不同的需求標識方法,並闡明它們的優點與缺點。可以選擇最適合你的方法。(1) 序列號最簡單的方法是賦予每個需求一個唯一的序列號,例如SRS-13。當一個新的需求加入到商業需求管理工具的資料庫之後,這些管理工具就會為其分配一個序列號(許多這樣的工具也支持層次化編號)。序列號的前綴代表了需求類型,例如SRS代表「軟體需求說明」。由於序列號不能重用,所以把需求從資料庫中刪除時,並不釋放其所佔據的序列號,而新的需求只能得到下一個可用的序列號。這種簡單的編號方法並不能提供任何相關需求在邏輯上或層次上的區別,而且需求的標識不能提供任何有關每個需求內容的信息。(2) 層次化編碼這也許是最常用的方法。如果功能需求出現在軟體需求規格說明中第3 . 2部分,那麼它們將具有諸如3.2.4.3這樣的標識號。標識號中的數字越多則表示該需求越詳細,屬於較低層次上的需求。即使在一個中型的軟體需求規格說明中,這些標識號也會擴展到許多位數字,並且這些標識也不提供任何有關每個需求目的的信息。如果你要插入一個新的需求,那麼該需求所在部分其後所有需求的序號將要增加。刪除或移去一個需求,那麼該需求所在部分其後所有需求的序號將要減少。但其他地方的引用將混亂,對於這種簡單的層次化編號的一種改進方法是對需求中主要的部分進行層次化編號,然後對於每個部分中的單一功能需求用一個簡短文字代碼加上一個序列號來識別。例如,軟體需求規格說明可能包含「第3.2.5部分—編輯功能」,並將此部分編寫成子模塊文檔,然後配置管理。有時,你覺得缺少特定需求的某些信息。在解決這個不確定性之前,可能必須與客戶商議、檢查與另一個系統的介面或者定義另一個需求。使用「待確定」(to be determined, TBD或採用漢語拼音略寫DQD)符號作為標準指示器來強調軟體需求規格說明中這些需求的缺陷。通過這種方法,你可以在軟體需求規格說明中查找所要澄清需求的部分。記錄誰將解決哪個問題、怎樣解決及什麼時候解決。把每個TBD編號並創建一個TBD列表,這有助於方便地跟蹤每個項目。在繼續進行構造需求集合之前,必須解決所有的TBD問題,因為任何遺留下來的不確定問題將會增加出錯的風險和需求返工。當開發人員遇到一個TBD問題或其它模糊之處時,他可能不會返回到原始需求來解決問題。多半開發者對它進行猜測,但並不總是正確的。如果有TBD問題尚未解決,而你又要繼續進行開發工作,那麼儘可能推遲實現這些需求,或者解決這些需求的開放式問題,把產品的這部分設計得易於更改。編寫優秀的需求文檔沒有現成固定的方法,最好是根據經驗進行。從過去所遇到的問題中可使你受益匪淺。許多需求文檔可以通過使用有效的技術編寫風格和使用用戶術語而不是計算機專業術語的方式得以改進。你在編寫優秀的需求文檔時,希望讀者還需牢記以下幾點建議:保持語句和段落的簡短。採用主動語態的表達方式。編寫具有正確的語法、拼寫和標點的完整句子。使用的術語與辭彙表中所定義的應該一致。需求陳述應該具有一致的樣式,例如「系統必須..」或者「用戶必須..」,並緊跟一個行為動作和可觀察的結果。例如,「倉庫管理子系統必須顯示一張所請求的倉庫中有存貨的庫存清單。」為了減少不確定性,必須避免模糊的、主觀的術語,例如,用戶友好、簡單、有效、、最新技術、優越的、可接受的等。當用客說「用戶友好」或者「快」時,你應該明確它們的真正含義並且在需求中闡明用戶的意圖。避免使用比較性的辭彙,定量地說明所需要提高的程度或者說清一些參數可接受的最大值和最小值。當客戶說明系統應該「處理」、「支持」或「管理」某些事情時,你應該能理解客戶的意圖。由於需求的編寫是層次化的,因此,可以把頂層不明確的需求向低層詳細分解,直到消除不明確性為止。文檔的編寫人員不應該把多個需求集中在一個冗長的敘述段落中。在需求中諸如「和」,「或」之類的連詞就表明了該部分集中了多個需求。務必記住,不要在需求說明中使用「和/或」,「等等」之類的連詞。8.需求分析的過程需求獲取是在問題及其最終解決方案之間架設橋樑的第一步。獲取需求的一個必不可少的結果是對項目中描述的客戶需求的普遍理解。一旦理解了需求,分析者、開發者和客戶就能探索出描述這些需求的多種解決方案。參與需求獲取者只有在他們理解了問題之後才能開始設計系統,否則,對需求定義的任何改進,設計上都必須大量的返工。把需求獲取集中在用戶任務上—而不是集中在用戶介面上—有助於防止開發組由於草率處理設計問題而造成的失誤。需求獲取、分析、編寫需求規格說明和驗證並不遵循線性的順序,這些活動是相互隔開、增量和反覆的。當你和客戶合作時,你就將會問一些問題,並且取得他們所提供的信息(需求獲取)。同時,你將處理這些信息以理解它們,並把它們分成不同的類別,還要把客戶需求同可能的軟體需求相聯繫。然後,你可以使客戶信息結構化,並編寫成文檔和示意圖。下一步,就可以讓客戶代表評審文檔並糾正存在的錯誤。這四個過程貫穿著需求開發的整個階段。由於軟體開發項目和組織文化的不同,對於需求開發沒有一個簡單的、公式化的途徑。下面列出了1 4個步驟,你可以利用它們指導你的需求開發活動。對於需求的任何子集,一旦你完成了第十三步,那麼你就可以很有信心地繼續進行系統的每一部分的設計、構造,因為你將開發出一個好的產品:1. 定義項目的視圖和範圍。2. 確定用戶類。3. 在每個用戶類中確定適當的代表。4. 確定需求決策者和他們的決策過程。5. 選擇你所用的需求獲取技術。6. 運用需求獲取技術對作為系統一部分的使用實例進行開發並設置優先順序。7. 從用戶那裡收集質量屬性的信息和其它非功能需求。8. 詳細擬訂使用實例使其融合到必要的功能需求中。9. 評審使用實例的描述和功能需求。10. 如果有必要,就要開發分析模型用以澄清需求獲取的參與者對需求的理解。11. 開發並評估用戶界面原型以助想像還未理解的需求。12. 從使用實例中開發出概念測試用例。13. 用測試用例來論證使用實例、功能需求、分析模型和原型。14. 在繼續進行設計和構造系統每一部分之前,重複6~1 3步。需求獲取可能是軟體開發中最困難、最關鍵、最易出錯及最需要交流的方面。需求獲取只有通過有效的客戶—開發者的合作才能成功。分析者必須建立一個對問題進行徹底探討的環境,而這些問題與產品有關。為了方便清晰地進行交流,就要列出重要的小組,而不是假想所有的參與者都持有相同的看法。對需求問題的全面考察需要一種技術,利用這種技術不但考慮了問題的功能需求方面,還可討論項目的非功能需求。確定用戶已經理解:對於某些功能的討論並不意味著即將在產品中實現它。對於想到的需求必須集中處理並設定優先順序,以避免一個不能帶來任何益處的無限大的項目。需求獲取是一個需要高度合作的活動,而並不是客戶所說的需求的簡單拷貝。作為一個分析者,你必須透過客戶所提出的表面需求理解他們的真正需求。詢問一個可擴充的問題有助於你更好地理解用戶目前的業務過程並且知道新系統如何幫助或改進他們的工作。需求獲取利用了所有可用的信息來源,這些信息描述了問題域或在軟體解決方案中合理的特性。一個研究表明:比起不成功的項目,一個成功的項目在開發者和客戶之間採用了更多的交流方式。與單個客戶或潛在的用戶組一起座談,對於業務軟體包或信息管理系統(MIS)的應用來說是一種傳統的需求來源。在每一次座談討論之後,記下所討論的條目,並請參與討論的用戶評論並更正。及早並經常進行座談討論是需求獲取成功的一個關鍵途徑,因為只有提供需求的人才能確定是否真正獲取需求。進行深入收集和分析以消除任何衝突或不一致性。盡量理解用戶用於表述他們需求的思維過程。充分研究用戶執行任務時作出決策的過程,並提取出潛在的邏輯關係。流程圖和決策樹是描述這些邏輯決策途徑的好方法。當進行需求獲取時,應避免受不成熟的細節的影響。在對切合的客戶任務取得共識之前,用戶能很容易地在一個報表或對話框中列出每一項的精確設計。如果這些細節都作為需求記錄下來,他們會給隨後的設計過程帶來不必要的限制。你可能要周期性地檢查需求獲取,以確保用戶參與者將注意力集中在與今天所討論的話題適合的抽象層上。向他們保證在開發過程中,將會詳盡闡述他們的需求。在一個逐次詳細描述過程中,重複地詳述需求,以確定用戶目標和任務,並作為使用實例。然後,把任務描述成功能需求,這些功能需求可以使用戶完成其任務,也可以把它們描述成非功能需求,這些非功能需求描述了系統的限制和用戶對質量的期望。雖然最初的屏幕構思有助於描述你對需求的理解,但是你必須細化用戶界面設計。
作者小傳:曹偉,南京易點網路軟體公司技術總監。從ERP的系統開發,對整體系統有較強的認識慾望,現正在實施企業級軟體系統構架,實施一個國際化企業電子化的解決方案。
推薦閱讀:
※對珠寶首飾的消費心理,是有怎樣的需求?
※「紅顏」究竟滿足了男人哪些心理需求?
※最舒適的榻榻米設計,滿足你一切需求!
※需求和需要最大的區別是什麼?
※雷尼爾效應——了解員工的真正需求