隨筆 - 175  文章 - 202  trackbacks - 0
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          第一個(gè)Blog,記錄哈哈的生活

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Java links

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          (本文發(fā)表于程序員雜志2006年第4期)

          在很多人的印象中,敏捷軟件開發(fā)是種類似黑客行為的過程,是程序員最愛的勾當(dāng)。不寫文檔,不作需求分析,沒有項(xiàng)目經(jīng)理,做什么東西完全是程序員自己的行為。所以他們認(rèn)為這樣的過程無法滿足真正大型項(xiàng)目和復(fù)雜項(xiàng)目的需要,因此在經(jīng)過考慮后,放棄了敏捷方法。

          真的是這樣嗎?敏捷過程到底是如何做需求分析?用戶故事和用例有什么區(qū)別?敏捷過程如何去管理需求的?這些是一些想要實(shí)踐敏捷的人一直在困惑的事情。

          我們常常看到書中講,程序員拿到一個(gè)用戶故事后,怎么計(jì)劃,怎么分解,怎么寫單元測(cè)試,怎么小步前進(jìn),怎么持續(xù)集成。這是典型的程序員視角。事實(shí)上,敏捷方法分為三部分,敏捷項(xiàng)目管理,敏捷需求分析,敏捷軟件開發(fā)。上述書中提到的完全是敏捷開發(fā)中的實(shí)踐,很多人了解到的敏捷,只是敏捷的三分之一。

          在敏捷的團(tuán)隊(duì)中,作一個(gè)敏捷程序員確實(shí)是非常舒服的事情。從程序員的角度來看,只需要選擇一張他感興趣的故事卡片,了解清楚該卡片的需求,開始從功能測(cè)試寫代碼,等通過了所有測(cè)試就完工。基本上不需要考慮太多的事情,非常輕松愉快。但程序員向誰去問清楚需求?故事卡片是怎樣寫出來的呢?讓我們來關(guān)注開發(fā)前發(fā)生的事情。

          了解敏捷過程的人都知道,Kent Beck在XP過程中提到了現(xiàn)場(chǎng)客戶,如果一個(gè)敏捷團(tuán)隊(duì)能夠有現(xiàn)場(chǎng)客戶,這當(dāng)然是最棒的事情。但多數(shù)情況下,客戶都是很忙碌的,很難全力投入到軟件開發(fā)過程中。這時(shí)候,我們就需要商務(wù)分析師這個(gè)角色,來充當(dāng)客戶的角色。

          我在ThoughtWorks的團(tuán)隊(duì)中擔(dān)任的就是商務(wù)分析師這個(gè)角色。商務(wù)分析師最重要的職責(zé)就是與客戶交談,了解和分析需求,將其制作成用戶故事并將需求轉(zhuǎn)述給程序員。同時(shí),商務(wù)分析師也要代替客戶負(fù)責(zé)功能驗(yàn)收測(cè)試。

          敏捷思想的核心是人與交流。需求問題實(shí)際上是一個(gè)交流問題。商務(wù)分析師要和客戶交流,搞清楚客戶到底需要什么,到底為什么需要這些東西。商業(yè)價(jià)值是商務(wù)分析師關(guān)注的最終目標(biāo)。有了目標(biāo)的指向,就可以不迷失方向。和客戶進(jìn)行交流,最終目的就是挖掘出客戶的商業(yè)目標(biāo)。可能大家會(huì)經(jīng)常有這樣的經(jīng)驗(yàn),客戶說,我要這個(gè)功能,我想要怎么怎么樣。這時(shí)候要特別注意,他說的這些東西并不是真正的需求。商務(wù)分析師需要詳細(xì)的問客戶為什么,挖掘出他真正的目標(biāo)。

          在這個(gè)目標(biāo)下,商務(wù)分析師開始進(jìn)行需求的分析:我們到底是否真的需要這個(gè)需求?有沒有更好的解決方案?有沒有簡(jiǎn)單并且低廉的方式?換一種形式是不是也能達(dá)到這樣的需求?這個(gè)需求有多少地方涉及到以前的軟件變更?

          搞清楚這些事情后,就可以寫出用戶故事。用戶故事的書寫遵循一定的原則,一般包括三部分:"作為(系統(tǒng)的一個(gè)涉眾),我想要(做一件事),從而(達(dá)到一個(gè)商業(yè)價(jià)值)"。在書寫的時(shí)候格式比較隨意,可以在故事卡背面寫上注釋或疑問,甚至畫上界面原形圖。

          舉一個(gè)最常見的用戶故事例子,"作為一個(gè)普通用戶,我希望能夠用用戶名和密碼登錄,以便我能享受到個(gè)性化的服務(wù)"。其中,用戶是系統(tǒng)涉眾,登錄是他想要做的事情,而他的目標(biāo)是獲得個(gè)性化的服務(wù)。

          從這個(gè)例子我們可以想象到,這個(gè)頁面可能存在兩個(gè)文本框,用于輸入用戶名和密碼,有一個(gè)按鈕來登錄,并且不登錄就不能看到個(gè)人資料,另外,如果用戶輸入錯(cuò)誤需要提示"登錄失敗請(qǐng)重試"。這就是可見性,也可以稱為可測(cè)試性。我們可以根據(jù)這樣的可見性寫出功能測(cè)試,從而驅(qū)動(dòng)這個(gè)用戶故事的開發(fā),這被稱為 Acceptance Driven Development。

          用戶故事的作用有兩個(gè),一個(gè)是作為進(jìn)度跟蹤的依據(jù),一個(gè)是作為與人交談的備忘錄。用戶故事卡片并不是很精確的需求,因此不需要把事情描述的非常清楚。將需求的詳細(xì)分析推遲到實(shí)現(xiàn)前夕來完成,這是敏捷需求分析的精華所在。任何提前做好的東西都會(huì)導(dǎo)致浪費(fèi),敏捷過程提倡足夠就好,避免浪費(fèi)。

          不少人對(duì)用戶故事和用例的區(qū)別感到疑惑。用戶故事的作用是備忘功能,而不是文檔。而用例需要詳細(xì)的描述其操作步驟,以及每個(gè)異常路徑,因而起到了文檔的作用。用戶故事是可見的商業(yè)價(jià)值,而不是功能描述。每個(gè)用戶故事的粒度和工作量都相差不多,這和用例有很大的區(qū)別。用戶故事是小粒度的,可測(cè)試的,可見的,并且是有價(jià)值的。

          ThoughtWorks有個(gè)項(xiàng)目組作的是一個(gè)網(wǎng)游物品交易平臺(tái)。該平臺(tái)是典型的互聯(lián)網(wǎng)項(xiàng)目,在開工的時(shí)候客戶對(duì)功能需求還不明確,但需要快速推出搶占市場(chǎng),正是最適合敏捷過程的項(xiàng)目。

          在項(xiàng)目伊始,商務(wù)分析師和客戶做了深入的談話,了解他的商業(yè)構(gòu)想,他的盈利模式,搞清楚宏觀的結(jié)構(gòu),然后思考并整理獲得的結(jié)果,花1-2天時(shí)間將客戶需求大略整理為幾十個(gè)用戶故事。這些用戶故事并不完善,不足以做好整個(gè)系統(tǒng)。但對(duì)于我們開始項(xiàng)目的前一陣,已經(jīng)足夠了。我們可以從這里開始項(xiàng)目。

          敏捷方法希望快速交付可用的軟件。實(shí)現(xiàn)軟件的快速交付是通過迭代來完成。在迭代開始前,由一組有經(jīng)驗(yàn)的開發(fā)人員大致評(píng)估一下用戶故事,標(biāo)記出不同的難度和風(fēng)險(xiǎn),并提出問題供商務(wù)分析師來獲得更詳細(xì)的信息,商務(wù)分析師會(huì)和相關(guān)涉眾去討論。然后商務(wù)分析師將推薦優(yōu)先級(jí)最高的一組用戶故事給客戶來挑選,客戶可以選擇這些用戶故事,或者指出從他的視角看到的優(yōu)先級(jí)更高的用戶故事。這些將成為下一個(gè)迭代的內(nèi)容。
          客戶看到每個(gè)迭代交付的可運(yùn)行的軟件后或者得到用戶反饋后,常常會(huì)有新的想法冒出來。有些想法是好的,有些想法就屬于看到別家網(wǎng)站有這個(gè)功能,不假思索的提出的功能。這些不同的需求都需要經(jīng)過認(rèn)真的分析,找出哪些是值得我們立即考慮的,哪些是不用急迫的去實(shí)現(xiàn)的。

          有一次和客戶談話時(shí),他說到希望增加拍賣功能。那么,我們?yōu)槭裁葱枰馁u呢?客戶說希望讓用戶拍賣物品以獲得最高價(jià)格。經(jīng)過考慮,我們發(fā)現(xiàn),網(wǎng)游物品的實(shí)時(shí)性和唯一性決定了系統(tǒng)不適合使用拍賣機(jī)制。拍賣的時(shí)效性無法滿足實(shí)時(shí)交易的要求,因此,用戶最終放棄了這個(gè)特性。

          另一次,客服人員提出增加一個(gè)查詢用戶交易的功能,而此時(shí)我們有其他更加重要的功能需要先去考慮,查詢用戶交易功能可以由技術(shù)人員臨時(shí)通過數(shù)據(jù)庫直接代為查詢,因?yàn)轫?xiàng)目運(yùn)營初期交易不是很多,暫時(shí)還不需要專門的后臺(tái)功能來支持客服的工作。所以把這個(gè)需求卡片一直貼在墻壁上,始終沒有排到最高的優(yōu)先級(jí)。

          客戶一開始也不是很能夠接受敏捷需求中強(qiáng)調(diào)商業(yè)價(jià)值和優(yōu)先級(jí)的做法。但經(jīng)過幾個(gè)月的磨合,客戶也逐漸適應(yīng)了許多敏捷思想,甚至我在和客戶討論時(shí),偶然提起了后期的某種可能的情況,他們還能夠幫我糾正應(yīng)當(dāng)考慮目前的情況,為近期的情況作計(jì)劃。

          用戶故事的跟蹤和管理是由項(xiàng)目經(jīng)理來進(jìn)行。每個(gè)迭代跟蹤卡片的進(jìn)展,是否已經(jīng)開始實(shí)現(xiàn)?是否已經(jīng)完成代碼開發(fā)?是否已經(jīng)開始功能測(cè)試?不同的卡片在迭代前都會(huì)評(píng)估為不同的大小。我們一般分為大中小三級(jí)。等實(shí)踐過幾個(gè)迭代后,團(tuán)隊(duì)的開發(fā)速度基本保持恒定,我們就可以很容易的知道每個(gè)迭代能做多少個(gè)用戶故事,這樣就可以安排下一迭代的開發(fā)。

          每個(gè)迭代內(nèi)分析好恰好足夠下一個(gè)迭代開發(fā)的需求,就是商務(wù)分析師每個(gè)迭代的主要工作內(nèi)容。商務(wù)分析師的需求分析工作在上一個(gè)迭代完成,包括需求的了解,分析,評(píng)估和排列優(yōu)先級(jí)。

          在每個(gè)迭代開始的時(shí)候,由商務(wù)分析師主持召開迭代計(jì)劃會(huì)議,在會(huì)議上向所有的程序員解釋這個(gè)迭代要完成的用戶故事,然后由程序員自由提問,知道他們能夠獲得足夠開始實(shí)現(xiàn)該功能的信息。

          在程序員完成一個(gè)用戶故事后,商務(wù)分析師還要來代表客戶做功能驗(yàn)收測(cè)試,查看是否完成了預(yù)計(jì)的功能,是否有程序員還沒有想到的異常情況。如果存在問題需要退回給程序員繼續(xù)完成。這在一定程度上保證了系統(tǒng)完成的需求不偏離客戶的要求。當(dāng)然,更多的測(cè)試還需要QA來完成。

          我們的實(shí)踐充分表明了,敏捷過程并不是沒有需求分析,而是把需求分析過程分散到整個(gè)開發(fā)的過程中,讓開發(fā)和需求分析并行進(jìn)行。這就是ThoughtWorks敏捷方法實(shí)施成功的秘訣之一。而商務(wù)分析師在這個(gè)過程中,起到了紐帶和橋梁的作用,是一個(gè)團(tuán)隊(duì)不可缺少的角色。

          原文:http://www.javaeye.com/topic/34957

          posted on 2007-01-04 07:58 哈哈的日子 閱讀(280) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 阿克陶县| 潞西市| 衡南县| 邵阳县| 磴口县| 南丹县| 海盐县| 开原市| 广元市| 万山特区| 荥经县| 惠安县| 康定县| 谢通门县| 滦平县| 浦江县| 塔城市| 平陆县| 自治县| 聂荣县| 贵阳市| 汉源县| 繁昌县| 盐城市| 兴化市| 鸡泽县| 上虞市| 前郭尔| 娱乐| 盈江县| 石渠县| 和林格尔县| 綦江县| 莲花县| 麻江县| 彭泽县| 雷波县| 玛曲县| 林州市| 石泉县| 锦州市|