其實你已經知道怎么做了
也許你現在覺得創建用戶故事地圖是一件很難的事,整個過程中充滿了復雜和神奇。但其實就在此時此刻,你已經具備了創建一個用戶故事地圖的能力和知識,所以我保證這個過程一點兒也不困難。讓我們從一個日常生活中常見的例子開始。為了再進一步簡化,就從你的生活開始。隨著這個例子的展開,也許我會給你已經知道了的事情重新起一些名字。
找一疊即時貼和一支筆,我說什么你就做什么。
別擔心,去準備一下吧,我等你。
準備好了嗎?
1. 寫下關于你的故事,一次一個
閉上你的眼睛,回想一下今天早上你醒來的那一刻。你至少“醒來”了對吧?那么第一件你回想起來的事情是什么呢?現在睜開你的眼睛,把它寫下來,寫在一張即時貼上。我也會跟你一起想、一起寫的。我第一張即時貼上寫著“點擊鬧鐘的'小睡一會兒'”。讓我不爽的是,這件事幾乎每天早上都會發生,如果是一些很糟糕的早晨,我會敲上鬧鐘兩次或者三次。
現在,撕下這張即時貼把它貼到你面前的桌子上,然后回想今天早上你做過的下一件事情,把它寫下來、撕下來,貼到第一張邊上。然后繼續。
我的第二張和第三張即時貼上寫著“關上鬧鐘”、“昏昏沉沉跌跌撞撞地走進浴室”。
一直寫到你終于準備好出門上班了,如果你今天不上班,那就寫到你已經準備好正式開始這美好的一天吧。我通常會以“進入我的愛車”作為最后一張即時貼。
我覺得你能在三到四分鐘之內就能寫完所有的即時貼。
“任務”就是我們做的事
看一下你寫下的所有即時貼,注意一下它們是不是都是動詞短語?至少絕大多數是吧。這些動詞短語就是任務,例如“沖澡”、“刷牙”。
所謂任務就是我們為了某個特定的目的而按順序做的一系列事情。
在軟件里,人們按照某個特定的目的而按順序做的一系列事情我們就就叫它們“用戶任務”。這是一個對于用戶故事地圖來講非常重要的概念,甚至比寫下并講出一個好的故事還要重要。
用戶故事地圖中的即時貼上記錄著人們如何使用你的軟件,你也許會注意到它們幾乎都是動詞短語。
現在休息幾分鐘,想想剛才的過程有多么的容易。
我讓你寫下你所做的事情,之后所有的任務就從你的腦海中一個個地蹦出來了。這個概念是如此的重要,卻又如此自然而然,這讓我覺得這個過程非常酷。
先別著急沉醉在“任務”這個詞里。如果你是一個項目經理,你會注意到項目計劃中充滿了各種“任務”。如果你是一個程序員,在敏捷開發中正在使用用戶故事,你會發現在做計劃的時候會寫上一堆開發和測試的“任務”。如果你既不是一個項目經理,又不是一個程序員,那么在使用“任務”這個詞的時候要加倍小心。因為項目經理和程序員會認為你說的“任務”跟他們的使用方法不太一樣,他們也許會告訴你,你對這個詞的使用方法似乎不太對。
用戶任務是構建用戶故事地圖的基本元素
現在,數數你寫下的這些任務,大多數人都會寫下大概15~25張即時貼。如果你寫下的比這個數要多,那你簡直太棒了。如果你寫下的比這個數要少呢?哥們兒,你一定是過著一種非常簡約的生活吧,我無比渴望每天早上自己也能像你這么快就能出家門。但你最好回頭看看你的列表,看看是不是把一些事情給跳過去了。
我的任務和你的任務是不同的
我相信,“人與人是不同的”這個觀點對于每個人來講都不是什么新鮮事。你會在人們選擇做什么事情的時候發現這種不同。
舉個例子來說,總有一些人有動力和自律,幾乎每天早上都會去晨練。如果你寫下了幾張關于晨練的任務,那你就太棒了!我一直還在為這個目標而努力。
還有些人會因為家庭而有一些額外的任務。如果你有孩子了,我保證你會比那些沒有孩子的人多寫下很多任務。如果你養了一條狗,那也許在你的桌子上會多出來幾個關于照顧狗的任務。
當你在考慮人們如何使用你做出來的軟件的時候,牢記這一點:人與人是不同的。他們在使用軟件的時候也許會有不同的目的。他們也許在不同的場景下使用你的軟件,而這個場景會迫使他們做出一些你想不到的事。
我只是更關注細節
在這個練習里,有些人寫下了比其他人更多的細節。他們也許會把“做早飯”分成“把面包放入烤面包機”、“倒一杯果汁”。如果是我老婆的話,也許她會寫下一個讓我深惡痛絕的任務——“在果汁里加入紫甘藍”。
任務就像是大石頭,你可以用錘子把大石頭敲碎成一堆小石頭,而這些小石頭仍然是石頭。到現在為止我也搞不清一塊大石頭究竟要大到什么份兒上就會被稱作“巨石”,一塊小石頭要小到什么份兒上就會被稱作“鵝卵石”。不過提到把大任務和小任務區分開,還是有一個很有效的方法的。
我的朋友Alistair Cockburn在他的著作《編寫有效用例》中介紹了一個關于“目的等級”的概念。別慌,咱們不是要開始寫用例了。只是我們在談論人類行為的時候這個概念非常有用。
Alistair使用了“海平面”的比喻來形容這個概念。海平面位于正中間,其它的所有東西都位于海平面的上面或下面。一個海平面級別的任務意味著我們希望完整而單獨地完成它。你有沒有寫下“沖澡”這個任務?這就是個海平面任務,因為你不會在進行到一半的時候去想:“嗯,洗澡這件事先拖一拖吧,我先去搞杯咖啡喝,等會兒再繼續沖澡。”Alistair管這類任務叫做“功能級別任務”,并用海波浪來標示它。不過我們還是管這類任務就叫任務吧。
像“沖澡”這個任務可以被拆分成很多個更小的子任務,比如“調整水溫”和“洗頭發”,如果是我的老婆的話,可能還要加上“用絲瓜絡清理死皮”之類的。始終要注意,人與人是不同的,你會看到人們執行這些任務的時候選擇的行為是不同的。因為這些任務在海平面之下,所以Alistair用小魚的圖標來標識這些任務。
最后,我們可以將一批任務上升到“摘要任務”級別,“洗澡”、“剃須”、“刷牙”以及所有其它在你起床之后要做的類似的任務,都可以被歸整到一個“摘要任務”中,我沒想好管它叫什么,“個人清潔“?或者叫”清晨洗禮“?不過好像“洗禮”是個挺傻的詞兒,算了,別用它了。
使用目的等級的概念,可以幫助你把一些小任務集合起來,或者是把一些大的任務分解開。
2. 組織你的故事
如果你還沒有把你的任務組織起來,那請將你的任務們按照先后執行的順序,從左到右排列起來。
用你的手指指著第一張即時貼,試著講一個故事,就從“首先,我做這件事”開始。然后把手指挪向下一張即時貼,說“然后,我做這件事“。之后從左向右繼續講你的故事。你會看到每張即時貼都是一個步驟,而連接這些步驟的則是一個小巧的連詞:然后。
我管這種從左向右的順序叫做”故事講述順序“,或者是個更華麗的名字:”敘述流“。我們管這整件事叫做一個”地圖“,而敘述流就是這個地圖的橫坐標。
由于我的敘述流已經變得很長了,所以我開始把一些同時發生的事情堆疊起來。隨著我把整個流程展開,我發現我遺漏了一些細節。這讓我去仔細思考被遺漏的事情究竟是不是真的重要。
把遺漏的細節補充進去
挪動即時貼的方式最爽的地方在于能夠讓我們看到一整個大的故事。看著這些已經被組織在敘述流中的故事,我們會更容易發現被遺漏的部分。
現在回過頭去看看你的那張正在變大的地圖,看看有哪些步驟是你遺漏了的。
我只增加了幾張即時貼,因為有太多在“海平面”之下的細節了,所以我不打算把它們寫出來了。如果我這么做了,我的桌子上也許會有上百張即時貼。
3. 探索其它的故事
直到現在為止,都太明顯了,對吧?學習這些東西感覺都對不起你浪費的那些紙!
但是,好玩的事兒才剛剛開始呢。
花上一分鐘想想你昨天早上都做什么了。如果昨天早上和今天早上你做過的事有什么不一樣的,把它們寫下來并加入到你的故事地圖中。
想象一下一個糟糕的早上,如果沒有沒有熱水了會怎樣?你會怎么做?如果麥片或者牛奶或者其它的什么你經常作為早餐的什么東西沒有了呢?如果你閨女因為沒做作業而一大清早情緒崩潰了怎么辦(這種事情在我家每隔一段時間就會發生一次)?
把你處理這些事情時候的任務寫下來并加入到你的故事地圖中。
現在想象一個你理想中的早晨。哪些事情能夠讓你的早晨變得非常完美呢?如果早上我去晨練了,并且伴隨著閱讀享受了一頓悠閑的早飯的話,對我來講就算是一個完美的早晨了。不過如果那樣的話,我希望我能夠早起一會兒并終止每天早上和鬧鐘的作戰。
同時注意一下你最好把一些任務放到同一列當中,不僅為了節省空間,同時還意味著他們和其它的任務有相像的地方。例如,你可能會把“做一頓豐盛的早餐”和“快速做一頓早飯”放到同一列中。
我的朋友David Hussman管這件事叫做“怎么辦”的游戲。不幸的是,我們也許可以玩這個游戲很長的時間,但 那會讓我們的地圖變得無比巨大。我加了一些我希望能夠在早上做的事,例如晨練、伴隨著放松的閱讀吃一頓早餐。我還加了一些經常在早上發生的其它事。
把細節、其它的選項、變化和異常加入到你的地圖中
保持敘述流
有沒有注意到當你開始加入這些新的任務的時候,你會重新調整你的敘述流。至少我會的。例如,我需要把“晨練”插入到“起床”和“沖澡”之間。同時我需要加入“穿上運動服”,而這個任務和我洗完澡之后的“穿衣”還是不同的。
如果你很輕松自然地把事情都排列好,你會對呈現出來的敘述流感到很滿意。
如果現在你講出你的故事的話,你會發現你可以用很多種方式講出這個故事。你可以講關于典型的早上的故事、關于一個豪華早上的故事、關于發生了一件或兩件緊急事件的早上。所有的這些故事都可以采用同樣的方式——用手指從左向右一張一張地指著不同的即時貼。試試使用一些連詞來把你的任務連接起來,你也許會說:“通常我做這件事,但有時候我做這個。”或者“我做這件事,或者這件,然后是這件事。”當然我希望你用具體要做的事來代替“這件事”這個詞,因為從我這里看不到你指的是哪張即時貼。
我小的時候,有一個兒童圖書系列,叫做《選擇你自己的大冒險》,也許你也記得它們。它會在你閱讀完一個章節的時候給你好幾個選項,你的選擇會決定英雄接下來要做的事。在每個選項后面都是一個頁碼。如果你選擇了一個選項,就可以把書翻到指定的頁碼繼續讀。實話實話,我從來都不是這類書的粉絲。不管我做出什么樣的選擇,故事最終好像都會結束在同一個地方,而且對于一個真正的大冒險的話,似乎選項從來都不夠。故事地圖有點像這種書,或許更好一點兒。地圖中的道路數量幾乎是無限的,如果你想想一個使用你的軟件來達成他們自己目標的人,這種情況確實更真實一點兒。
如果你想讓整件事情變得更加有挑戰性一點兒的話,那就和你的同事們一起來做這個練習。你會更多地了解這些每天和你一起工作的人,并且你會發現找到每個人都同意的敘述流是一件有趣的事兒。在這里,“有趣”的意思是“爭論”。總有一些人在吃完早飯去洗澡,而另外一些人正好相反,同樣,關于刷牙也是個經常發生的爭論,你是在吃早飯前刷牙還是在吃早飯后刷牙呢?或者早飯前后各刷一次?
放輕松。
如果你們有分歧,那證明這件事其實不是什么大不了的事兒。例如,早飯前洗澡或者早飯后洗澡只是個人喜好問題。如果找到那些你和你的同事們共通的事情,你會發現在真正重要的事上不會有什么分歧,例如把“穿衣服”這個任務放在“沖澡”這個任務之后,這件事就不是什么個人喜好問題了,畢竟沖澡之前穿衣服只會讓你濕漉漉地出現在你的同事面前。
4. 提煉你的故事地圖,找到一條主線
到現在為止,你的故事地圖應該看上去很寬了,如果你探索了一些其它選項,應該看上去也有了一定高度。應該差不多有了30個左右的任務吧,有點兒像一只詭異的動物的脊椎骨和肋骨。
回頭從左向右看一下你的故事地圖,你會發現有一堆故事好像應該原本待在一起。例如,那些你在浴室中完成的事情,或者那些在廚房為了做早飯而做的事,或者那些你離開家門之前的瑣事——看看天氣、抄起外套、把電腦和一天用的東西裝進包里之類的。你發現了嗎?這樣一堆一堆的任務好像原本就應該待在一起,幫你完成一個更大的目標。
在每堆相似的任務上面,貼上一個不同顏色的即時貼,并寫上一個動詞短語,把下面那些待在一堆的任務提煉出來。
如果你沒有其它顏色的即時貼了,讓我教你個小把戲——其實每張即時貼都有兩種不同的形狀!只需要把一張即時貼旋轉45°……唰!一張鉆石形狀的即時貼就閃亮登場了!當你希望擁有不同形狀的即時貼的時候,就可以用這個法子。
這些更高一層的任務被稱作”活動“。活動把一堆由相同的人在相同的時間內所做的任務組織起來,去達成一個特定的目標。當你閱讀在故事地圖上面的活動的時候,它們也構成了一個敘述流。這一行即時貼就是整張故事地圖的骨干。如果你有一張由非常多數量的即時貼構成的故事地圖,而你又非常想把它共享給別人的話,一個好的方式就是講一個高層次的故事。只需要閱讀一下故事地圖的主干,使用”然后,他們……“這個連接詞把每個活動連接起來。
活動可以為了一個共同的目標把任務聚合起來。
這里是我把活動加入到故事地圖中之后的樣子,活動給了整張故事地圖一個骨干。它讓閱讀故事地圖和尋找某個任務變得更加容易,至少對我來講是這樣的。而且骨干還能讓我更容易地在宏觀上看到早上發生的所有事情。
活動和更高級別的任務組成了故事地圖的骨干
活動和任務不一定采取同樣的表述手段。舉個例子,你管早上離開屋子之前做的事情叫什么呢?就是類似拿起背包,找到一份購物清單,查看天氣,拿起雨傘(如果需要的話)這種事情。我可能會管它叫”歸攏我的雜物“,而你可能會給它起個別的名字。
當你在為你的客戶、你的產品創建故事地圖以及找到骨干的時候,最好能夠給他們起一個你的客戶習慣的名字。
5. 為了達成某個特性的目標,把你的任務們分片
接下來會是真正很酷的部分了,在這個小節里你會開始用故事地圖幫助你暢想那些沒有發生的事情。
如果看看你創造出來的故事地圖,你可能會看到”點擊鬧鐘的‘小睡一會兒’“或者”關上鬧鐘“在你地圖的最左端。想象一下昨晚你忘記設置鬧鐘了,所以今天早上你沒有執行這些”任務“。你猛地睜開眼,看了一眼鬧鐘,發現幾分鐘之后你就應該出現在某地,你要遲到了!——別緊張,我們只是假設。
在一張即時貼上寫下”幾分鐘之內出門“,把它放在故事地圖的最左端,靠上的位置。現在設想一條線,從左向右貫穿整張故事地圖,就像一條腰帶一樣。現在,把所有不是必須的任務移到這條線的下方。不需要把活動挪下來,即使在線的上方沒有任何這個活動下屬的任務了。就讓那個活動下面沒有任何任務,這表示如果你想在幾分鐘之內出門,你不需要去達成這個活動的目標。
現在在最上面的切片里應該只剩下了少數的幾個任務。現在回頭沿著整個敘述流查看一下,如果在你馬上要遲到的時候,還有什么事需要做,而不在故事地圖之中的。例如,平時你也許會”沖澡“,但在如此緊急的時刻,”胡亂洗一把臉“或者”用毛巾擦一下身上有異味的部位“這種任務會取代”沖澡“。每當我在一群程序員中做這個練習的時候,我經常看到”多涂一些除味劑“這個任務。我沒有偏見,我只是在陳述。
這里是我的地圖,分出來的這一條就是我如果想在幾分鐘之內出門,要做的所有任務。
你可以用這個方法考慮不同的目標,把這些不同的目標貼在最左端。比如”享受一個有史以來最豪華的清晨“,或者”為期兩周的度假“。你會發現敘述流會保持穩定,但你需要添加或刪除某些任務來達成不同的目標。
采用分片的方式,在特定的目標下識別出對應的任務和細節
就這些了!你已經學到了所有重要的概念
太容易了,對吧?隨著你創建這個故事地圖,你學到了:
- 任務是描述人們做的事用的,它是動詞短語。
- 任務具有不同的目標等級。
- 任務在故事地圖中從左向右被組織成為敘述流。
- 故事地圖的縱深包含了變化的、可互相替換的任務。
- 任務被處于故事地圖頂端的活動組織在一起。
- 活動構成了故事地圖的骨干。
- 你可以把故事地圖分片,用來識別為了達成某個特定目標而必須的任務。