《用戶故事與敏捷方法》讀書筆記

User Stories Applied

第一部分 起步

第一章 概覽

什么是用戶故事

用戶故事描述了對用戶、系統(tǒng)或軟件購買者有價值的功能。

  • 一份書面的故事描述,用來做計劃和作為提示。 (Card)
  • 有關(guān)故事的對話,用于具體化故事細節(jié)。(Conversation)
  • 測試,用戶表達和編檔故事細節(jié)且可用于確定故事何時完成。(Confirmation)

規(guī)劃發(fā)布和迭代

假設(shè)開發(fā)團隊每輪迭代的速率是13個故事點:

故事 故事點數(shù)
故事A 3
故事B 5
故事C 5
故事D 3
故事E 1
故事F 8
故事G 5
故事H 5
故事I 5
故事J 2

用戶故事的發(fā)布計劃:

迭代 故事 故事點數(shù)
迭代1 A、B、C 13
迭代1 D、E、F 12
迭代1 G、H、J 12
迭代1 I 5

分割故事,做更好的發(fā)布計劃:把故事I分成故事Y(3個點)和故事Z(2個點)

迭代 故事 故事點數(shù)
迭代1 A、B、C 13
迭代1 D、E、F 12
迭代1 G、H、Y 13
迭代1 J、Z 4

什么是驗收測試?

假設(shè)寫下故事“用戶可以用信用卡為購物車中的物品付款”。然后再故事卡背面寫下測試描述:

  • 用Visa信用卡、萬事達信用卡測試(通過)。
  • 用大來卡測試(失?。?/li>
  • 用Visa借記卡測試(通過)
  • 用有效、無效和反面丟失卡ID號的信用卡測試
  • 用過期卡測試。
  • 用不同購買金額測試(包括超出信用卡額度)

為什么要變?

Change is a law, and no amount of pretending will alter the reality.

  • 用戶故事強調(diào)對話交流而不是書面溝通。
  • 用戶故事可以同時被你和開發(fā)人員理解。
  • 用戶故事的大小適合于做計劃。
  • 用戶故事適用于迭代開發(fā)。
  • 用戶故事鼓勵推遲考慮細節(jié),直到你非常清楚地了解自己的真正需求。

小結(jié)

  • 故事卡包含對用戶或者客戶有價值的功能的簡短描述。
  • 故事卡是故事的可見部分,但客戶團隊和開發(fā)人員關(guān)于故事的對話更重要。
  • 客戶團隊包括那些確保軟件符合潛在用戶需求的人,可以包括測試人員、產(chǎn)品經(jīng)理、實際用戶和交互設(shè)計師。
  • 故事卡由客戶團隊編寫,因為他們最了解如何表達需要實現(xiàn)的需求,也因為他們會在后期于開發(fā)人員共同確定故事細節(jié)并安排故事的優(yōu)先級。
  • 按照故事對客戶的價值來安排故事的優(yōu)先級。
  • 將各個故事放入迭代,進行發(fā)布與迭代規(guī)劃。
  • 速率是開發(fā)人員可以在一輪迭代中完成的工作量。
  • 放入一輪迭代的故事估計總和不能超過事先開發(fā)人員預(yù)計的速率。
  • 如果故事太大以至于無法在一輪迭代中完成,可以考慮把它分成兩個或更多的小故事。
  • 驗收測試用于驗證實現(xiàn)的故事是否開發(fā)成符合客戶團隊的設(shè)想。
  • 用戶故事是很有意義的,因為它們強調(diào)口頭交流,你和開發(fā)人員都可以理解,可以用于進行迭代計劃,在迭代開發(fā)中能很好地工作,而且因為它們鼓勵推遲細節(jié)。

第 2 章 編寫故事

優(yōu)秀的故事的特點:(INVEST)

  • 獨立性(Independent)
  • 可討論的(Negotiable)
  • 對用戶或客戶有價值的(Valuable to Purchasers or Users)
  • 可估計的(Estimatable)
  • 小的(Small)
  • 可測試的(Testable)

小結(jié)

  • 理想情況下,故事之間是獨立的。故事之間的交付順序應(yīng)該是無關(guān)的,可以任意拿一個故事來實現(xiàn)。
  • 故事細節(jié)由用戶和開發(fā)人員討論得出。
  • 故事應(yīng)該很清晰地體現(xiàn)對用戶或客戶的價值。最好的做法是讓客戶編寫故事。
  • 故事可以注釋一些細節(jié),但是過多的細節(jié)會使故事難以理解。
  • 給故事加上注釋的最好方法是給它編寫測試用例。
  • 如果故事太大,復(fù)合故事和復(fù)雜故事可以分成幾個小的故事。
  • 如果故事太小,幾個小故事可以合并成一個較大的故事。
  • 故事應(yīng)該是可以測試的。

開發(fā)人員職責

  • 幫助客戶編寫故事,故事要能提醒你們同客戶交談,不是記錄詳細的需求定義,故事應(yīng)該對用戶或者客戶有價值,它們是獨立的、可測的、大小合適的。
  • 使用對用戶或客戶有價值的術(shù)語來描述實現(xiàn)故事所用的技術(shù)或者基礎(chǔ)架構(gòu)信息。

客戶團隊職責

  • 負責編寫故事。

第 3 章 用戶角色建模

  • 通過頭腦風暴,列出初始的用戶角色集合
  • 整理最初的角色集合
  • 整合角色
  • 提煉角色

小結(jié)

  • 大部分項目小組只考慮單一的用戶類型。導致軟件忽略原本需要的一些用戶類型。
  • 為了避免從單一用戶的角度編寫所有故事,要識別與軟件交互的不同用戶角色。
  • 通過對每個用戶角色定義相關(guān)特征,可以更清楚地看到不同角色間的不同點。
  • 對于有些用戶角色而已,用代表人物來描述會很有幫助。虛構(gòu)人物是假想出來的用戶角色代表。他們有名字,有照片,還有足夠的相關(guān)細節(jié),因為對項目成員來說,很真實。
  • 對于有些應(yīng)用程序,極端人物可能有助于搜集原本被遺漏的故事。

開發(fā)人員職責

  • 負責參與確認用戶角色和虛擬人物的過程。
  • 負責理解每個用戶角色或虛擬人物,以及它們之間的異同。
  • 開發(fā)軟件時,負責考慮不同的用戶角色對于軟件如何運行的不同偏好。
  • 負責確保在識別和描述用戶角色時,它們只是這個過程中的工具,不應(yīng)超越作為工具之外的任何用途。

客戶職責

  • 負責尋找用戶(多多益善),并識別恰當?shù)挠脩艚巧?/li>
  • 確保軟件沒有關(guān)注不恰當?shù)挠脩簟?/li>
  • 確保每個故事都能和至少一個用戶角色或虛構(gòu)人物聯(lián)系起來。
  • 開發(fā)軟件時,負責考慮不同的用戶角色對于軟件如何運行的不同偏好。
  • 負責確保在識別和描述用戶角色時,它們只是這個過程中的工具,不應(yīng)超越作為工具之外的任何用途。

第 4 章 搜集故事

創(chuàng)建故事最有用的一些方法:

  • 用戶訪談
  • 問卷調(diào)查
  • 觀察
  • 故事編寫工作坊
簡單原型.png

通過畫上面這個原型,得到以下故事:

  • 求職者可以發(fā)布他的簡歷。
  • 雇主可以發(fā)布工作。
  • 雇主可以查看提交的簡歷。
  • 求職者可以搜索工作
  • 求職者可以看到符合搜索條件的工作。
  • 求職者可以看到指定工作的詳細信息。

畫原型的過程中,問一些有助于找到遺漏故事的問題:

  • 用戶接下來最有可能做什么?
  • 用戶會在這里犯什么錯誤?
  • 用戶會有什么困惑?
  • 用戶需要什么額外的信息?

小結(jié)

  • 能夠引出及捕捉需求這一想法是錯誤的。
  • 拖網(wǎng)捕魚的比喻非常有用。
  • 即使敏捷流程支持需求的后期涌現(xiàn),依然需要對預(yù)期的發(fā)布進行展望并開始寫下容易發(fā)現(xiàn)的故事。
  • 可以通過用戶訪談、觀察用戶、問卷調(diào)查和舉辦故事編寫工作坊來發(fā)現(xiàn)用戶故事。
  • 使用多種方法比過度使用一種方法更能獲得好的效果。
  • 通過開放式、與背景無關(guān)的提問更容易獲得有用的答案。

開發(fā)人員職責

  • 負責理解并使用多種技巧來捕撈用戶故事。
  • 負責知道怎么使用開放式和背景無關(guān)的提問。

客戶職責

  • 負責理解并使用多種技巧來捕撈用戶故事。
  • 負責盡早寫更多的用戶故事。
  • 作為軟件用戶的主要代表,負責和他們多溝通。
  • 了解怎么使用開放式和背景無關(guān)的提問。
  • 如果需要關(guān)于編寫故事的幫助,負責安排并舉辦一次或多次故事編寫工作坊。
  • 負責確保在捕撈故事過程中考慮所有用戶角色。

第 5 章 與用戶代理合作

小結(jié)

  • 除非用戶的經(jīng)理也是用戶,否則他就不是合適的用戶代理。
  • 開發(fā)經(jīng)理會試圖擔任用戶代理,因為他們已經(jīng)參與到項目每天的細節(jié)中。然而,開發(fā)經(jīng)理大多不是正在開發(fā)的軟件的用戶,所以他們不是理想的用戶代理。
  • 在產(chǎn)品公司里,客戶經(jīng)常來自市場團隊。
  • 與很多不同的客戶聯(lián)系的銷售人員可以是很好的開發(fā)項目客戶。
  • 領(lǐng)域?qū)<铱梢猿蔀閮?yōu)秀的用戶代理。
  • 客戶,那些做出購買決定的人,如果他們能與用戶密切地交流,那么他們能成為非常好的用戶代理。
  • 為了成為好的用戶代理,培訓師和技術(shù)支持人員必須避免僅僅關(guān)注產(chǎn)品中那些他們每天關(guān)心的方面。

開發(fā)人員職責

  • 負責幫助組織機構(gòu)為項目物色合適的客戶。
  • 負責了解不同類型的用戶代理怎么考慮你們正在開發(fā)的系統(tǒng),他們的背景如何影響交付。

客戶團隊職責

  • 如果你不是軟件的用戶,則要負責了解自己屬于哪類用戶代理。
  • 負責理解自己會將哪些偏見帶到項目中,如何克服這個問題,無論是依靠別人還是其他方法。

第 6 章 用戶故事驗收測試

測試是一個兩步流程:

  • 將測試要點記錄在故事卡的背面,任何時候發(fā)現(xiàn)新的測試,都可以記錄到故事卡的背面;
  • 將測試要點變成全面的測試,這些測試可以用來演示故事已正確、完整地實現(xiàn)。

一般在這些時候?qū)憸y試:

  • 開發(fā)人員和客戶討論故事且需要記錄明確的細節(jié)時。
  • 在迭代開始時,在寫代碼前作為一項專門的任務(wù)。
  • 在開發(fā)中或之后的任何時候發(fā)現(xiàn)新的測試時。

客戶和開發(fā)人員討論故事的時候,比較好的做法是問一些類似的問題:

  • 關(guān)于這個故事,程序員還需要知道什么?
  • 對怎么實現(xiàn)這個故事,我的想法是什么?
  • 有沒有一些特殊情況會使這個故事有不一樣的行為?
  • 這個故事在什么情況會出錯?

測試類型

  • 用戶交互測試,確保所有用戶交互組件如期工作。
  • 可用性測試,確保程序好用。
  • 性能測試,測量應(yīng)用程序在各種負荷下的工作狀況。
  • 壓力測試,使應(yīng)用程序在用戶和事務(wù)的極限情況或其他任何讓應(yīng)用程序處在壓力下的情況運行。

小結(jié)

  • 驗收測試可以用來記錄客戶和開發(fā)人員討論的很多細節(jié)。
  • 驗收測試記錄了有關(guān)故事的一些假設(shè),這些假設(shè)可能還沒有和開發(fā)人員討論過。
  • 驗收測試提供了檢查故事是否被完整實現(xiàn)的基本標準。
  • 驗收測試應(yīng)由客戶來寫而不是開發(fā)人員。
  • 驗收測試應(yīng)在程序員寫代碼之前寫好。
  • 如果新的測試對闡明故事的細節(jié)或意圖沒有任何幫助,就不用再寫。
  • FIT 和 FitNesse 是寫驗收測試的優(yōu)秀工具,它們用的是我們熟悉的表格或電子表格格式。

開發(fā)人員職責

  • 若團隊覺得有需要,則負責實現(xiàn)自動化驗收測試。
  • 開始開發(fā)一個新的故事時,負責考慮更多的驗收測試。
  • 負責為代碼作單元測試,使驗收測試就不必顧及故事的每個細節(jié)。

客戶職責

  • 負責編寫驗收測試
  • 負責執(zhí)行驗收測試

第 7 章 優(yōu)秀用戶故事準則

  • 從目標故事開始

  • 切蛋糕

  • 編寫封閉的故事

  • 卡片約束

  • 根據(jù)實現(xiàn)時間來確定故事規(guī)模

  • 不要過早涉及用戶界面

  • 有些需求并不是故事

  • 在故事里包括用戶角色

  • 只為一個用戶編寫

  • 以主動語態(tài)編寫

  • 由客戶編寫

  • 向故事卡編號說“不”

  • 不要忘記意圖

小結(jié)

  • 為了確定故事,從每個用戶角色使用系統(tǒng)的目標開始考慮。
  • 分割故事時,試著將它分割成貫穿應(yīng)用程序所有層面的故事。
  • 試著讓故事的大小能夠在使用后讓用戶有成就感。
  • 如果有項目領(lǐng)域和環(huán)境的需要,可以用其他需求搜集或文檔技術(shù)來補充故事。
  • 創(chuàng)建約束卡,將它們貼在公共的墻上,或者編寫測試來確保系統(tǒng)沒有違反約束。
  • 為團隊即將實現(xiàn)的功能編寫小的故事,針對未來實現(xiàn)的功能編寫寬泛的、高層次的故事。
  • 不要讓故事過早涉及用戶界面。
  • 實際編寫故事時,要包括用戶角色。
  • 用主動語態(tài)編寫故事。
  • 為單個用戶編寫故事。
  • 讓客戶,而不是開發(fā)人員,編寫故事。
  • 用戶故事要簡短。
  • 不要給故事卡編號。

第 2 部分 估算和計劃

第 8 章 估算用戶故事

估算故事的最好方法具有如下特點:

  • 無論什么時候獲得有關(guān)故事的新信息,都允許我們改變之前的想法。
  • 適用于史詩故事和小故事
  • 不需要花很多時間
  • 提供進度和剩余工作的有用信息
  • 不太精確的估算也不會有太大問題
  • 可以用來制定發(fā)布計劃

故事點

理想工作日:一天中沒有任何干擾,沒有會議,沒有電子郵件,沒有電話等等

以團隊估算

  • 還不確定團隊中誰負責完成這個故事;
  • 團隊決定的估算可能比個人估算更有用。

所有事情都要花4小時

Mad About You中, 主角是住在紐約的一對新婚夫婦。有一集中,妻子纏著丈夫去買沙發(fā)。她堅持認為只需要花一個小時。丈夫告訴她“這個世界上所有的事情都要花4個小時。你會去那,做各種事情,吃東西,談?wù)撃闫鋵崙?yīng)該在哪里進餐更好,然后回家。這至少是4個小時。”
程序員估算一個故事時,應(yīng)該考慮完成這個故事需做的所有事。他們要全盤考慮測試代碼,和客戶討論,可能幫助客戶計劃或自動化驗收測試等諸多因素。如果不將這些考慮在內(nèi),無異于期望只花一個小時買個沙發(fā)。

可以用紙牌的方式,讓大家估算時間。估算值很可能相差很大。這其實是一件好事。如果估值不同,估算值高的和低的再解釋一下估算依據(jù)。值得注意的是,這時不要互相攻擊對方,而是耐心聽取他們的想法。

討論完之后,開發(fā)人員再次將估算值寫在卡片上。當大家都寫好修改的估算值,將卡再次展示給所有人看。如果估算值還是相差很大,重復(fù)讓估高和估低的人解釋他們的想法。

三角測量

image.png

使用故事點

如果用結(jié)對編程呢?

如,有個兩個開發(fā)人員的團隊按理想日來估算故事點。他們沒有用結(jié)對編程。他們計劃一個一星期的迭代,一共兩個故事,每個估算3個故事點,完成這輪迭代,他們完成了這兩個故事并算出其團隊速率為6。如果他們用結(jié)對編程并且以理想結(jié)對日來估算。他們研究故事后決定每個故事需要兩個理想結(jié)對日。這個迭代結(jié)束后,他們完成了這兩個故事,并算出其團隊速率為4。數(shù)字不一樣,但這兩種情況速率是一樣的。一個迭代都是完成這兩個故事。

一些提醒

  • 你的團隊的故事點和我的團隊的故事點是不一樣的。你的團隊估算的故事有3個故事點,可能我的團隊估算有5個故事點。
  • 一個故事(可能是一個史詩故事)分解成一些小故事后,這些小故事估算的總和不需要與開始那個故事或史詩故事估算相等。
  • 類似地,一個故事分解成一些任務(wù)。這些任務(wù)估算的總和不需要與故事的估算相等。

小結(jié)

  • 用故事點估算故事,故事點是故事復(fù)雜度、工作量或工期的相對估算。
  • 應(yīng)由團隊估算故事,估算屬于團隊而不是個人。
  • 通過和其他估算進行比較來進行三角測量。
  • 團隊是否使用結(jié)對編程對故事點估算沒有影響。結(jié)對編程影響的是團隊的速率,不是他們的估算。

開發(fā)人員職責

  • 負責用一個方式定義故事點,并且對團隊可用和相關(guān)的。努力保證這個定義的一致性。
  • 負責給出誠實的估算,不屈服于誘惑或壓力而給出低的估算。
  • 負責以團隊估算
  • 負責估算應(yīng)與其他估算一致。即所有2點的故事都應(yīng)差不多。

客戶職責

  • 負責參加估算會議,但是你的任務(wù)是回答問題并澄清故事細節(jié)。你不必參與故事估算。

第 9 章 發(fā)布計劃

DSDM(Business Focused Development) 包括一個排列優(yōu)先級的方法,稱為莫斯科(MoSCow)規(guī)則:

  • 必須有(Must have)
  • 應(yīng)該有(Should have)
  • 可以有(Could have)
  • 這次不會有(Won't have this time)

可以通過多個維度為故事排列優(yōu)先級:

  • 故事不能如期完成的風險(如需要有預(yù)期的性能特點或全新算法時)
  • 推遲實現(xiàn)一個故事時對其他故事的影響。
  • 故事對于廣泛用戶或客戶的重要性
  • 故事對于少部分重要用戶或客戶的重要性
  • 故事與其他故事的內(nèi)聚性

獲得初始速率的三種方式:

  • 使用歷史值
  • 執(zhí)行一輪初始迭代,使用那輪迭代的速率
  • 猜測

一個由6人組成的團隊,使用為期2周的迭代長度(10個工作日),每輪迭代會有60個開發(fā)日。取決于他們預(yù)計的工作日與理想日之間的差異,他們可能想把速率估算為每輪迭代只能完成20~30個故事點。

小結(jié)

  • 在計劃發(fā)布時,有必要知道客戶預(yù)期的大致發(fā)布日期和故事的相對優(yōu)先級
  • 故事應(yīng)該以明確的順序排列。
  • 故事的優(yōu)先級有客戶確定,但也要考慮開發(fā)人員的想法
  • 使用速率將以理想日為單位的估算轉(zhuǎn)換成日歷日
  • 估算團隊的初始速率是很有必要的

開發(fā)人員職責

  • 負責提供信息給客戶,以幫助她排列故事優(yōu)先級
  • 負責在基礎(chǔ)性需求或者架構(gòu)性需求與其他客戶需求之間取得權(quán)衡,避免不切實際地提高基礎(chǔ)性需求或架構(gòu)性需求的優(yōu)先級
  • 建立發(fā)布計劃時,負責在實際估算的基礎(chǔ)上,適當包括一定長短的時間用以項目緩沖。

客戶職責

  • 負責以自己對故事價值的估計來確切排列用戶故事的優(yōu)先級。
  • 負責誠實地表達發(fā)布期限。
  • 負責理解理想日和日歷日的不同
  • 在想對故事的不同組件排列不同的優(yōu)先級時,負責分割故事。
  • 負責了解為何不應(yīng)該譴責或批評一位個人速率為0.6的程序員,只因為她的速率小于1.0

第 10 章 迭代計劃

迭代計劃會議內(nèi)容:

  • 討論故事
  • 從故事中分解出任務(wù)
  • 開發(fā)人員承擔每個任務(wù)的職責
  • 討論過所有故事,并且接受所有任務(wù)后,開發(fā)人員單獨估計他們承擔的任務(wù),以確保他們不會做出過于樂觀的承諾。

小結(jié)

  • 迭代計劃是發(fā)布計劃的進一步計劃,但只在迭代即將開始時才開始做迭代計劃。
  • 迭代計劃中,團隊討論每個故事,然后從故事中分解出任務(wù)。
  • 任務(wù)的大小沒有強制的范圍。相反,從故事中分解出任務(wù)用來幫助估算或鼓勵多個開發(fā)人員合作完成一個故事。
  • 每個任務(wù)都有開發(fā)人員承擔。
  • 開發(fā)人員通過估算他們承擔的任務(wù),評估他們是否承諾過度。

開發(fā)人員職責

  • 負責參加迭代計劃會議
  • 負責幫助把所有故事劃分為任務(wù),而不只是自己想做的故事
  • 負責為認領(lǐng)的任務(wù)承擔責任。
  • 負責確保承擔適當工作量的任務(wù)
  • 在整輪迭代中,負責監(jiān)控自己剩余的工作,同時也要監(jiān)控隊友剩余的工作。如果很快就能完成自己的工作,就有責任幫助隊友承擔部分工作。

客戶職責

  • 負責對迭代中包含的故事排列優(yōu)先級
  • 負責指導開發(fā)人員交付他們能提供的最大商業(yè)價值,意味著,從發(fā)布計劃設(shè)定后,諾有更高價值的故事,要負責調(diào)整優(yōu)先級以交付最大的商業(yè)價值。
  • 負責參加迭代計劃會議。

第 11 章 測量并監(jiān)控速率

尚未全部完成的故事不能包括在計算中,因為:

  • 沒法計算故事已完成的百分比;
  • 不能使用帶小數(shù)的值為速率引入錯誤的精度;
  • 沒完成的故事通常不能給用戶或客戶帶來任何價值。

用集中全部力量完成一個故事的方法會提高團隊的意識:大家一起先完成一些故事比所有故事都只完成一部分更有價值。

為每輪迭代畫出計劃速率和實際速率:

image.png
image.png

Burndown Chart

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容