一、需求矛盾
根據CHAO的權威統計,雖然自"軟件危機"提出以來,軟件工程方法得到了長足的發展與進步,但在去年的軟件項目成功率仍然不足30%,絕大多數的軟件項目仍然超進度、超成本。而在這些不成功的項目中,由于需求不清晰、需求不完整等方面的因素,占到了60%左右。
下面的這幅漫畫雖然不乏夸張,但卻是能夠激起我們的深思:

根據筆者多年來從事軟件需求捕獲、分析工作的實踐經驗,認為造成這一現象的根本原因在于客戶與開發人員之間的溝通存在障礙,雙方都以自己的角度、自己的專業術語進行溝通,這使得大家并不能夠很好地就軟件需求達成共識。
由于幫助客戶更好地利用信息化工具提高工作效率,是我們軟件開發團隊的責任,因此我們沒有權利讓用戶理解我們所用的語言,而是反過來,我們有義務去理解用戶的語言,站在用戶的角度看問題。
而事實上,許多開發團隊經常抱怨"我們的客戶連需求都說不清楚"、"我們的客戶對計算機了解太少了"。多年以來,大家都習慣從自己的角度來定義、分析問題,這也就造成了軟件行業成為了一個最缺乏信任的行業,我們需要改一下習慣了。
二、現代需求實踐
針對這些現象,許多先賢們開始了實踐,并且總結出了一系列優秀的需求實踐:
1)Use case:用例分析技術
鼎鼎大名的RUP是這樣總結自己的:用例驅動,以體系結構為中心,迭代、增量的開發過程。Use case也伴隨著RUP、UML一起名揚天下。
用例用來描繪一個系統外在可見的需求情況,是代表系統中各個項目相關人員(風險承擔人,Stakeholder)之間就系統的行為所達成的契約。
2)User Story:用戶故事、用戶素材
用戶故事是Kent Beck在極限編程(XP)方法論中推薦的最佳實踐之一。它由客戶參與編寫,說明他們需要系統為他們做什么,一般用客戶的術語寫就,三句話左右。
3)Feature:特征
這是特征驅動開發(FDD)方法論的核心實踐之一。一個特征就是一個小的,具有客戶價值的功能,通常表示為<action><result><object>。
從上面的定義來看,這三種現代軟件工程需求實踐無一例外地遵從兩個原則:一是站在用戶的角度看待系統、定義系統;二是用用戶看得懂的語言表達。而在筆者的實踐中,鑒于以下兩點考慮還是先在團隊中應用了"用例分析技術":
1)用戶故事略顯粗糙,掌握起來需要經驗,沒有詳細的規則用于按部就班,一開始采用容易迷失方向;而用例相對來說更加形式化,易于上手;
2)特征看上去很有吸引力,但畢竟相關的理論還未完整,引入團隊實踐有些困難。
三、用例分析技術簡介
用例分析技術是Rational三友之一Ivar Jacobson先生于1967年在愛立信公司開發AXE交換機時開始研究,并于1986年總結、發布的一項源于實踐的需求分析技術。Ivar先生在加盟Rational之后,與三友合作提出了UML、完善了RUP,用例分析技術也因此被人廣泛了解和關注。
用例分析技術為軟件需求規格化提供了一個基本的元素,而且該元素是可驗證、可度量的。用例可以作為項目計劃、進度控制、測試等環節的基礎。而且用例還可以使開發團隊與客戶之間的交流更加順暢。
許多人是在學習UML的時候接觸到Use case,所以許多人都誤解其為一種圖表,把用例圖當作用例分析的全部,其實這是錯誤的,用例描述才是用例分析技術的核心。下面是一個簡單的例子:

3.1 參與者,Actor
參與者,定義了用戶在系統交互過程中扮演的角色,其可以是一個人,也可以是另一個相關的系統。
3.2 用例,Use case
用例實例(場景)是在系統中執行的一系列動作,這些動作將生成特定參與者可見的價值結果,一個用例定義一組用例實例(場景)。
一個用例應為參與者提供(實現)一個價值。

3.3 事件流
就像類對應于對象一樣,一個用例的實例就是使用場景,用例就是對使用場景進行抽象的總結:
1)前置條件:指在用例啟動時,參與者(Actor)與系統應置于什么狀態,這個狀態應該是系統能夠檢測到的、可觀測的;
2)后置條件:用例結束時,系統應置于什么狀態,這個狀態也應該是系統能夠檢測得到的、可觀測的;
3)基本事件流:基本事件流是對用例中常規、預期路徑的描述,也被稱為Happy day場景,這時大部分時間所遇到的場景;它將體現系統的核心價值;
4)擴展事件流:主要是對一些異常情況、選擇分支進行描述。
建議大家在編寫事件流時,注意以下幾點:
1)使用簡單的語法:主語明確,語義易于理解;
2)明確寫出"誰控制球":也就是在事件流描述中,讓讀者直觀地了解是參與者在控制還是系統在控制;
3)從俯視的角度來編寫:指出參與者的動作,以及系統的響應,也就是第三者的角度;
4)顯示過程向前推移:也就是第一步都有前進的感(例如,用戶按下tab鍵做為一個事件就是不合適的);
5)顯示參與者的意圖而非動作(光有動作,讓人不容易直接從事件流中理解用例);
6)包括"合理的活動集"(帶數據的請求、系統確認、更改內部、返回結果);
7)用"確認"而非"檢查是否":(如系統確認用戶密碼正確,而非系統檢查用戶密碼是否正確);
8)可選擇地提及時間限制;
9)采用"用戶讓系統A與系統B交互"的習慣用語;
10)采用"循環執行步驟x到y,直到條件滿足"的習慣用語。
四、Alistair Cockburn眼中的用例分析技術
在使用用例分析技術時,很多人都覺得如何確定用例的粒度是一個難點,而且感覺到用例沒有什么規則遵從,甚至有無所適從的感覺。正如Cockburn先生提出的學習用例分析技術的"守、破、離"的三個階段:
1)守:練習基本功夫,遵循規則,照章行事;
2)破:能突破傳統,因地制宜地靈活應用; 3)離:超脫任何招式與規則,達到無招勝有招的境界。
但用例分析技術卻讓第一階段的初學者感到無法很快地掌握。而其所著"編寫有效用例"則想為用例分析技術補充規則,讓大家能夠更好地掌握。
Cockburn先生在Ivar Jacobson的基礎上,做了一些補充:
1)用例是契約,是系統與涉眾之間達成的契約。也就是將用例朝著形式化的方向發展;
2) 將用例分成三級:
◆ 概要級:包括多個用戶目標(顯示用戶目標運行的語境,顯示相關目標的生命周期、為低層用例提供一個目錄表);
◆ 用戶目標級
◆ 子功能級
不過,對于Cockburn先生的貢獻,用例始祖Ivar大師并未做出任何反應。本人在實踐中認為,Cockburn先生的思路與理念對于初學用例分析技術的人來說,十分有價值,使得用例分析技術更具操作性,當其同時也有點畫地為牢的感覺,也許Cockburn先生也意識到這點,因此第三階段就是"離",沒有規則,按需靈活使用。
五、如何在開發過程中應用用例分析技術
用例分析技術在需求過程中的地位如下圖所示:

對于用例分析技術理解上的兩個最大的誤區是:
1)用例分析技術包括了整個需求過程:它只是一個需求分析技術,是在傳統的需求捕獲技術的基礎上使用的,并無法替代這些技術;
2)用例分析技術是分解技術:其實用例分析技術是一種合成技術,將在需求捕獲中收集而來的零散的特性合成為用例:

5.1 用例分析前的工作
在用例分析之前,應該完成以下工作:
1)確定涉眾(Stakeholder)和用戶類型(命名、簡要描述、涉眾代表、特征、能力);
2)確定涉眾代表(命名、簡要描述、責任、參與);
3)在項目中加入涉眾代表(訪談、問卷、顧問、評審、角色扮演);
4)創建共同的構想(問題定義、系統范圍、用戶目標、非功能需求à前景文檔);
5)采用傳統的需求捕獲技術捕獲需求;
6)組建用例分析隊伍(少量、有問題域知識)。
5.2 用例分析過程中的注意事項
用例分析的過程如下圖所示:

在使用中要注意:
1)用例源于涉眾,請不要自己杜撰出用例;
2)用例的事件流的編寫過程中,應充分加入團隊的參與;
3)雖然用例源于涉眾,但不要企圖向他們直接問"你還有什么用例?這樣的問題