在過去十多年間的全球軟件(包括互聯(lián)網(wǎng)等)開發(fā)界,最令人矚目、堪稱現(xiàn)象級的一場持續(xù)風(fēng)潮大概就屬“敏捷開發(fā)熱”了,其中又以Scrum、XP(極限編程,也譯為極端編程)以及Lean(精益)、Kanban(看板)等為代表的敏捷方法與流派最為熱門。時至今日,可能很多人仍對當(dāng)年異;鸨腟crum 認(rèn)證熱、人們爭先恐后地追求Scrum Master證書的場景記憶猶新。這場熱熱鬧鬧的敏捷運(yùn)動帶來了各方面有好、有差的許多效應(yīng)。例如,源自XP的用戶故事(User Story)就順著這股浪潮,成為了一項(xiàng)知名度最高、Scrum+XP開發(fā)的缺省配置,可謂“No.1”的敏捷需求技術(shù),同時在坊間也很少或很難聽到針對它的任何批評意見。
用戶故事的優(yōu)勢顯然被高估了,其實(shí)際價值遠(yuǎn)沒有各種營銷、推廣所宣傳的那么大。然而,遠(yuǎn)比用戶故事更為強(qiáng)大和實(shí)用、傳入中國已近二十年的另一項(xiàng)敏捷需求技術(shù)———用例(Use Case,也譯作“用況”“用案”等)卻被普遍忽視了,這不禁令人感到些許遺憾。
于是,就有了本書。
什么是用例?
簡單地說,一個“用例”就是對用戶使用某個系統(tǒng)功能的具體執(zhí)行、交互流程的描述,即一個比較完整的“使用故事(Use Story)”。不要以為用例是多么高深、難懂的東西。其實(shí),不管是軟件還是硬件,地球上的任何產(chǎn)品、系統(tǒng)(或有使用價值的東西)都有用例,至少一個吧。在產(chǎn)品設(shè)計(jì)與需求分析的過程中,用例的分析與建模常常從畫系統(tǒng)的UML(Unified Modeling Language,統(tǒng)一建模語言)用例圖(Use Case Diagram)開始。以下是一個日常生活中的例子,一個最簡單的微波爐系統(tǒng)的用例圖可描繪如下:
圖中的UML橢圓符號“加熱食物”所標(biāo)記的就是一個用例。而一個用例的名稱反映了用戶針對某個特定系統(tǒng)或產(chǎn)品的一個功能目標(biāo),或者系統(tǒng)可為該用戶提供的一項(xiàng)有價值的服務(wù)。例如,用例“加熱食物”,它代表了微波爐的一項(xiàng)基本功能與服務(wù)———用戶可以利用微波爐來加熱食物。這既是一個用戶的目標(biāo)(User Goal),也體現(xiàn)了微波爐作為產(chǎn)品的一項(xiàng)使用價值。
用例圖主要用來提取和表示多個用例及其關(guān)系,那么一個用例的具體內(nèi)容又是什么呢?例如,用戶應(yīng)該怎么通過微波爐來加熱食物? 正確的使用流程和操作方法是怎樣的? 具體有哪些步驟呢? 用比較規(guī)范的用例交互腳本來描述“加熱食物”,其文本大致是這樣的:
1. 用戶打開微波爐的電源;
2. 用戶打開爐門,把食物放入微波爐,關(guān)好爐門;
3. 用戶設(shè)置火力;
4. 用戶設(shè)置加熱時長;
5. 用戶啟動微波爐;
6. 微波爐運(yùn)轉(zhuǎn)加熱食物,直到超過用戶已設(shè)置好的運(yùn)行時間;
7. 用戶在聽到微波爐的提示音、停止運(yùn)轉(zhuǎn)后,打開爐門,取出食物,然后關(guān)上爐門;
8. 用戶關(guān)閉微波爐的電源。
您看,這就是用例(的基本流)———一個用戶如何用微波爐“加熱食物”的使用故事。在微波爐的用戶手冊上常常也能看到類似的介紹,形式與內(nèi)容非常簡單,幾乎人人都能讀懂。用例技術(shù)是由來自瑞典的UML創(chuàng)始人、被稱為“UML 三友”之一的Ivar Jacobson在20世紀(jì)80年代中期發(fā)明的。20世紀(jì)70—80年代Jacobson曾長期為愛立信公司工作(參與開發(fā)程控交換機(jī)),他于1992年出版的名著《面向?qū)ο筌浖こ獭?OOSE)可謂是用例技術(shù)的奠基之作。1995年以后,用例與UML技術(shù)一起被整合進(jìn)了Rational公司的“統(tǒng)一軟件開發(fā)過程”框架指南RUP(Rational Unified Process)之中。
我第一次接觸用例、UML是在1998年。那時由于要帶領(lǐng)研發(fā)團(tuán)隊(duì),我正式開始學(xué)習(xí)了包括UML建模在內(nèi)的軟件架構(gòu)方法與技術(shù),并在RUP的相關(guān)文檔中看到了用例。說實(shí)話,當(dāng)時我并不太理解一個個的軟件需求為什么要寫成用例那樣,用文本模板來寫,還包括若干步驟和字段,感覺有點(diǎn)麻煩。
直到2000年以后,當(dāng)我認(rèn)真讀完了繼Jacobson之后另一位用例大師AlistairCockburn的名著《編寫有效用例》之后,才逐漸深刻地體會到,除了描畫各種UML統(tǒng)一用例方法: UML與敏捷需求實(shí)踐圖形之外,文本用例與模板對于復(fù)雜軟件和系統(tǒng)需求分析的巨大價值。
如今自用例誕生,近三十年過去了,業(yè)界有哪些著名國際企業(yè)一直或仍在使用用例技術(shù)呢? 大家熟知的主要包括愛立信、IBM(于2003年收購了Rational)、Oracle、Amazon等公司,涉及通信、IT、互聯(lián)網(wǎng)等行業(yè)。除了這些行業(yè)以外,過去這些年我自己也曾經(jīng)為國內(nèi)的其他一些行業(yè)(如證券、保險、外貿(mào)、稅務(wù)等)中的知名企業(yè)或機(jī)構(gòu)講解過用例技術(shù)。雖然總數(shù)不算多,但用例技術(shù)在許多軟件工程比較成熟的研發(fā)組織中應(yīng)用也并不少見。尤其值得一提的是,兩大IT巨頭這些年主推的企業(yè)級開發(fā)過程與方法———IBM的RUP與Oracle的OUM(Oracle統(tǒng)一方法)其實(shí)都源自于“UML三友”所引領(lǐng)研發(fā)的UP(統(tǒng)一過程),而用例驅(qū)動開發(fā)與可視化(包括UML)建模正是UP方法(家族)的兩個基本特征。
這些年在日常軟件開發(fā)過程中,坊間常用到的需求技術(shù)除了用例以外,主要還有特性(Feature)、用戶故事等。那么,用例區(qū)別于其他需求技術(shù),有哪些獨(dú)特的優(yōu)點(diǎn)和價值呢?
用例在本質(zhì)上,是一種主要用自然語言編寫而成的規(guī)范、結(jié)構(gòu)化(模板化)的“需求程序(Requirement Program)”,一個比較完整的用例通常包含了名稱、前態(tài)、后態(tài)、基本流、擴(kuò)展流等若干項(xiàng)內(nèi)容,主要被用來描述產(chǎn)品(系統(tǒng)或軟件)的功能需求及其交互流。因此,用例文本通常也可以稱為功能的“用例腳本”或“交互腳本”。在工作與生活中我們常?梢钥吹皆S多案例,比如一件產(chǎn)品在使用、功能、交互等方面,其設(shè)計(jì)細(xì)節(jié),往往會直接影響到它的易用性與用戶體驗(yàn)。如果是一個復(fù)雜、上規(guī)模的軟件密集型的大中型產(chǎn)品或系統(tǒng),則常常包含了大量的需求或交互細(xì)節(jié),要想及時、準(zhǔn)確地發(fā)現(xiàn)和處理這些細(xì)節(jié)常常既費(fèi)時又費(fèi)力!凹(xì)節(jié)決定成敗,細(xì)節(jié)是魔鬼”,眾所周知的這些諺語說明了簡單的事實(shí)和道理。
研究UML與用例技術(shù)多年,我的體會是:與特性、用戶故事等其他需求技術(shù)相比,用例方法與技術(shù)的最大價值就在于通過其設(shè)計(jì)科學(xué)、系統(tǒng)、合理、規(guī)范的文本模板與相應(yīng)的分析過程和技巧,可以幫助產(chǎn)品的設(shè)計(jì)師(或需求分析師等)能夠有條不紊地把各種復(fù)雜、潛藏、難以發(fā)現(xiàn)和理解的需求及交互細(xì)節(jié)逐步挖掘出來,并梳理、表達(dá)清楚,從而盡最大可能不遺漏(甚至可以提前預(yù)見到)那些關(guān)鍵的、對開發(fā)成敗具有重要影響的需求。
不僅如此,用規(guī)范、格式化的用例腳本結(jié)合更加形象、直觀的UML圖形聯(lián)合建模,可以更加積極、有效地應(yīng)對常見的需求難題(比如管理好各種需求細(xì)節(jié),妥善應(yīng)對需求變化等),這也是“用例+UML”方法相較于其他需求方法所具有的一項(xiàng)明顯簡單一句話,用例與UML建模的主要價值可以概括為:基于其他需求方法所欠缺的———流程化與結(jié)構(gòu)化(需求程序)的書面描述方式(包括文本與圖形建模等),可以更加精準(zhǔn)、有效地發(fā)掘、記載和管理好復(fù)雜的需求與交互細(xì)節(jié),做到化繁為簡、抓住本質(zhì)。
相信讀完本書并經(jīng)過一段時間的實(shí)踐之后,您大概也會有類似的體會?梢哉f,用例(與UML)建模是自1990年代以來現(xiàn)代軟件工程中最重要的需求技術(shù)(之一),在驅(qū)動并保障各類復(fù)雜產(chǎn)品、系統(tǒng)與軟件的成功開發(fā)中發(fā)揮了獨(dú)特的價值和重要的作用,用例分析作為當(dāng)代軟件與系統(tǒng)需求分析的一項(xiàng)重點(diǎn)(或核心)技術(shù)是當(dāng)之無愧的。
敏捷方法傳入中國也快二十年了,然而對于敏捷需求技術(shù),坊間一直廣泛流傳著許多似是而非的觀點(diǎn)或誤解,例如:用戶故事是敏捷的,用例是不敏捷的;用戶故事比用例更好、更先進(jìn);Scrum 必須用用戶故事,不能用用例。莫非自敏捷運(yùn)動興起以來,用例就真的已經(jīng)過時、落后了,應(yīng)該被用戶故事所淘汰了嗎?
非也。
前面提到的以實(shí)用用例技術(shù)而聞名的Alistair Cockburn,不但是當(dāng)年組建敏捷聯(lián)盟與簽署《敏捷宣言》的主創(chuàng)成員之一,而且同時也是敏捷方法水晶(Crystal)流派的創(chuàng)始人,他對于肯定用例在敏捷開發(fā)中的重要價值以及優(yōu)先采用用例的主張與態(tài)度可以說是非常堅(jiān)定和一貫的。而另一位知名的敏捷與極限編程專家Martin Fowler對“用例與用戶故事之爭”也持有相對中立的立場。他曾經(jīng)提到,在敏捷開發(fā)實(shí)踐中用例與用戶故事兩者既可以結(jié)合一起使用,也可以分開單獨(dú)使用(要么只用用例,要么只用用戶故事),不同的團(tuán)隊(duì)可根據(jù)自己的實(shí)際情況進(jìn)行選擇。
事實(shí)上,用戶故事只是一項(xiàng)源于XP的專用技術(shù),而Scrum 作為一個更加開放、簡約的敏捷、迭代開發(fā)框架,其本身幾乎不含任何技術(shù)實(shí)踐,因而對于采用哪種需求技術(shù)也是持中立的態(tài)度。成功的Scrum 團(tuán)隊(duì)既可以采用用戶故事,也可以采用用例(故事),而具體采用哪種技術(shù)應(yīng)該由每個團(tuán)隊(duì)在實(shí)踐中因地制宜、按需(價值最大化、風(fēng)險最小化)來配置。
此外,在用例編寫與建模的過程中,我們可以根據(jù)敏捷開發(fā)的實(shí)際需要,采用各種不同的、從簡單到復(fù)雜的描述形態(tài),例如從用例名稱、用例圖,到用例簡述,以及UML的活動圖、交互圖,乃至更加全面、詳盡的用例腳本等?梢,用用例來描述需求,既可以比用戶故事更簡單、方便,也可以比用戶故事更復(fù)雜和完善(比如達(dá)到測試級的精準(zhǔn)度)。
所以,用例分析是一項(xiàng)靈活、實(shí)用、適用面非常廣的敏捷需求技術(shù),它對于當(dāng)代軟件工程與下一代敏捷開發(fā)(如Agile 2)的價值與潛力還遠(yuǎn)未被業(yè)界所真正、廣泛地認(rèn)識到。
經(jīng)過多年的發(fā)展與演化,目前用例方法與技術(shù)尚存在著幾個競合流派(如Jacobson和Cockburn等),雖然它們大同小異且都出自同一個源頭,但是在一些具體的技術(shù)細(xì)節(jié)(包括術(shù)語解釋和用法等方面)上仍存在著不少差異;而且,盡管利用UML等標(biāo)準(zhǔn)圖形符號來描述用例這部分早已經(jīng)標(biāo)準(zhǔn)化了,但是用例文本模板至今還沒有出現(xiàn)一個像UML那樣被業(yè)界廣泛認(rèn)同的國際標(biāo)準(zhǔn)與正式規(guī)范。
以上這些情況導(dǎo)致坊間長期一直存在著形態(tài)各異的多種用例模板或格式,給專業(yè)人士閱讀、理解和交流、分享用例腳本與系統(tǒng)需求及其相關(guān)知識帶來了不少困擾。因此,在日常需求工作中,如何仔細(xì)甄別各個流派方法的異同,有效地作出技術(shù)決策與取舍以獲得運(yùn)用用例技術(shù)的最佳收益,成為產(chǎn)品設(shè)計(jì)、需求分析相關(guān)領(lǐng)域的實(shí)踐者們必須面對的一個現(xiàn)實(shí)問題。
本書根據(jù)筆者自2000年以來在用例與UML建模、需求分析與敏捷開發(fā)方法的培訓(xùn)教學(xué)、咨詢等方面的研究與實(shí)踐經(jīng)驗(yàn),提出并重點(diǎn)介紹了整合用例、用戶故事與特性等當(dāng)代主流需求技術(shù)的統(tǒng)一用例方法(UUCM,a Unified Use Case Method),以揚(yáng)長避短、兼收并蓄,消除或減少各流派方法之間的不一致性和分歧,更好地促進(jìn)“用例+UML”等分析與建模技術(shù)在下一代敏捷開發(fā)中的應(yīng)用。
本書共分為7章。
第1章“產(chǎn)品與需求工程”作為全書的開篇,回顧了與產(chǎn)品需求分析相關(guān)的一些基本概念和知識,并簡要介紹了用例分析在產(chǎn)品、系統(tǒng)或軟件開發(fā)與需求工程中的關(guān)鍵位置和重要價值。
第2章“敏捷需求方法”是對全書主要內(nèi)容的綜述。首先回顧了敏捷開發(fā)的起源,介紹了敏捷體系結(jié)構(gòu),以及以用戶故事為代表的敏捷需求實(shí)踐的現(xiàn)狀;然后,介紹了以用例為代表的成熟功能需求分析方法對于敏捷產(chǎn)品設(shè)計(jì)與交互設(shè)計(jì)的重要價值;最后,簡要介紹了在16字“太極建?谠E”(由外而內(nèi),層次分明;動靜結(jié)合,逐步求精)的指導(dǎo)下,基于用例與UML建模的統(tǒng)一用例方法的基本工作流程和步驟。
第3~6章是本書的重點(diǎn)。建議對用例、UML不太熟悉的讀者先閱讀第3~4章“用例基礎(chǔ)”與“UML 基礎(chǔ)”,以便對需求分析時常用到的用例與UML的一些基本概念、元素和技巧等內(nèi)容有一個大致的了解。
第5章“業(yè)務(wù)分析”,介紹了通過基于用例與UML建模的業(yè)務(wù)分析方法建立產(chǎn)品的業(yè)務(wù)模型(主要包含“一動一靜”業(yè)務(wù)流程與業(yè)務(wù)對象兩個子模型)的基本流程、步驟和技巧,重點(diǎn)是如何利用業(yè)務(wù)用例圖提取業(yè)務(wù)流程,以及如何通過繪制UML活動圖和序列圖來詳細(xì)分析業(yè)務(wù)流程。該章最后還簡要介紹了用UML類圖建立業(yè)務(wù)對象模型的基本方法。
第6章“系統(tǒng)需求分析”,詳細(xì)介紹了通過基于用例與UML建模的系統(tǒng)需求分析方法建立系統(tǒng)需求模型(主要包含“一動一靜”用例模型與非功能需求集兩個部分)的基本流程、步驟和技巧,重點(diǎn)是介紹如何通過編寫格式規(guī)范、清晰易讀的用例(交互)腳本來盡量精準(zhǔn)地描述復(fù)雜的系統(tǒng)功能需求及其細(xì)節(jié)。當(dāng)然,對于一些簡單的系統(tǒng)功能,也可以不必編寫詳細(xì)的用例腳本,而是通過畫UML圖(如用例圖、活動圖、序列圖)或者編寫特性清單等更加輕量的方式來表示。
......
第1章 產(chǎn)品與需求工程1
1.1 產(chǎn)品、系統(tǒng)與軟件1
1.2 需 求4
1.2.1 需求的種類 4
1.2.2 常用需求表示法 9
1.3 需求工程12
1.3.1 需求的重要性12
1.3.2 主要的內(nèi)部需求干系13
1.3.3 需求過程18
1.3.4 需求質(zhì)量22
1.4 小 結(jié)26
第2章 敏捷需求方法 27
2.1 敏捷開發(fā)述評28
2.1.1 敏捷體系28
2.1.2 敏捷需求實(shí)踐34
2.2 敏捷的產(chǎn)品設(shè)計(jì)36
2.2.1 產(chǎn)品需求文檔37
2.2.2 產(chǎn)品模型39
2.2.3 交互設(shè)計(jì)41
2.3 統(tǒng)一的敏捷需求流程45
2.3.1 太極建模口訣45
2.3.2 業(yè)務(wù)分析流程50
2.3.3 系統(tǒng)需求分析流程56
2.4 小 結(jié)63
第3章 用例基礎(chǔ) 64
3.1 用例簡介64
3.2 什么是用例66
3.3 用例文本范例67
3.4 用例名稱70
3.5 用例簡述71
3.6 范圍與類型71
3.7 用角與干系者72
3.7.1 主用角73
3.7.2 輔用角73
3.7.3 其他干系者74
3.7.4 Actor的譯法 74
3.8 層 級77
3.8.1 概要目標(biāo)層79
3.8.2 用戶目標(biāo)層 79
3.8.3 子功能層81
3.8.4 Why/How關(guān)系83
3.8.5 粒度是否存在84
3.9 交互流86
3.9.1 前 態(tài)86
3.9.2 后 態(tài)87
3.9.3 觸發(fā)事件89
3.9.4 基本流89
3.9.5 基本寫作技巧90
3.9.6 輔助構(gòu)造97
3.9.7 擴(kuò)展流99
3.9.8 流控制保留詞 102
3.10 用例編寫的常見錯誤103
3.11 小 結(jié)103
第4章 UML基礎(chǔ) 105
4.1 UML簡介 105
4.1.1 簡 史105
4.1.2 用 途 106
4.1.3 基本內(nèi)容 107
4.1.4 UML工具 109
4.2 動態(tài)圖 110
4.2.1 用例圖 111
4.2.2 活動圖 122
4.2.3 序列圖 128
2
統(tǒng)一用例方法: UML與敏捷需求實(shí)踐
4.3 靜態(tài)圖 136
4.3.1 對象圖 137
4.3.2 類 圖138
4.3.3 包 圖 144
4.4 擴(kuò)展機(jī)制 145
4.4.1 關(guān)鍵詞 145
4.4.2 版 型 145
4.4.3 約 束 146
4.4.4 擴(kuò) 集147
4.5 小 結(jié) 147
第5章 業(yè)務(wù)分析149
5.1 分析流程概述150
5.1.1 主要任務(wù) 150
5.1.2 主要角色 152
5.1.3 主要工件 153
5.2 確定業(yè)務(wù)邊界154
5.3 業(yè)務(wù)用角分析155
5.3.1 抽象的角色 155
5.3.2 提取業(yè)務(wù)用角 156
5.3.3 業(yè)務(wù)用角的屬性 158
5.3.4 業(yè)務(wù)用角圖 158
5.4 提取業(yè)務(wù)流程 158
5.4.1 分析業(yè)務(wù)用角目標(biāo) 159
5.4.2 重點(diǎn)業(yè)務(wù)用例圖 160
5.4.3 與系統(tǒng)用例的區(qū)別與聯(lián)系 160
5.4.4 業(yè)務(wù)用角用例圖 162
5.4.5 特殊的業(yè)務(wù)用例 162
5.4.6 核心業(yè)務(wù)用例包 164
5.5 業(yè)務(wù)流程分析165
5.5.1 業(yè)務(wù)用例實(shí)現(xiàn) 165
5.5.2 UML建模 166
5.6 業(yè)務(wù)對象分析 185
5.6.1 領(lǐng)域分析與建模 186
5.6.2 基本步驟 187
5.6.3 主動對象建模191
5.7 業(yè)務(wù)模型分析 192
5.7.1 模型的結(jié)構(gòu)與組織 193
5.7.2 業(yè)務(wù)模型評審 196
5.8 小 結(jié) 197
第6章 系統(tǒng)需求分析199
6.1 分析流程概述 199
6.1.1 主要任務(wù) 200
6.1.2 主要角色201
6.1.3 主要工件 202
6.2 確定系統(tǒng)邊界 205
6.2.1 術(shù)語澄清 206
6.2.2 BoS與BoB的聯(lián)系與區(qū)別 206
6.2.3 一個常見的誤解207
6.3 用角分析 208
6.3.1 主輔用角 209
6.3.2 提取用角 209
6.3.3 用角屬性 210
6.3.4 用角圖 210
6.4 提取用例 211
6.4.1 直接分析用角目標(biāo) 211
6.4.2 從業(yè)務(wù)模型中提取用例 214
6.4.3 由系統(tǒng)發(fā)起的用例 220
6.4.4 組織用例包 220
6.4.5 提取用例不同于傳統(tǒng)功能分解 224
6.4.6 特性列表225
6.5 用例分析227
6.5.1 設(shè)置基本屬性 228
6.5.2 畫動態(tài)圖 229
6.5.3 編寫交互腳本 235
6.5.4 補(bǔ)充包含與擴(kuò)展用例 261
6.5.5 用例評審 267
6.6 用例模型分析 268
6.6.1 模型的組織 269
6.6.2 何時算完成 271
6.7 NFR分析272
6.7.1 主要內(nèi)容 272
6.7.2 補(bǔ)充需求規(guī)約273
6.7.3 數(shù)據(jù)需求與領(lǐng)域分析 274
6.8 系統(tǒng)需求模型評審 276
6.9 小 結(jié) 277
第7章 兩個故事278
7.1 用戶故事簡介 278
7.2 兩個故事比較 280
7.2.1 生命期 280
7.2.2 完全性 281
7.2.3 粒 度 282
7.2.4 用 途284
7.2.5 與用例簡述比較 285
7.2.6 偏等價性287
7.3 用戶故事的優(yōu)點(diǎn) 289
7.3.1 優(yōu)點(diǎn)一: 對話優(yōu)先 289
7.3.2 優(yōu)點(diǎn)二: 適宜做計(jì)劃 292
7.3.3 優(yōu)點(diǎn)三: 推遲確定細(xì)節(jié) 294
7.3.4 其他優(yōu)點(diǎn) 295
7.4 用戶故事的缺點(diǎn)296
7.4.1 缺點(diǎn)一: 不完整 296
7.4.2 缺點(diǎn)二: 不正規(guī)297
7.4.3 缺點(diǎn)三: 不鼓勵建模 297
7.4.4 缺點(diǎn)四: 不可追溯 298
7.5 小 結(jié)298
結(jié) 束 語300
參考文獻(xiàn)302