l

2011年12月27日 星期二

Scrum 是什麼(1):雙重回饋機制

December 27 09:35~11:11

昨天中午 Teddy 跟一位多年未見的好友一起吃飯,沒想到多年不見,這位朋友已是三個孩子的媽了,好友增產報國的決心,令 Teddy 肅然起敬。聊著聊著,突然談到 Scrum。正當 Teddy 想要跟這位好友解釋什麼是 Scrum 的時候,Teddy 腦海中冒出的淨是『sprint』,『story』,『daily scrum』,『retrospective meeting』這些東東,此時 Teddy 突然發現居然無法用簡單的一句話來說明 Scrum 是什麼玩意兒,這幾年白混了...Orz。

此時 Teddy 才想起來,在部落格中寫了那麼多關於 Scrum 與 agile practices 的文章,但是從來沒有一篇的主題是專門介紹什麼是 Scrum 的,乾脆今天就來講這個題目好了。

以下為幾種常見對於 Scrum 的說明:

  • 首先看看 Wikipedia上面的英文中文解釋:Scrum is an iterative, incremental framework for project management often seen in agile software development, a type of software engineering.(Scrum是一種迭代式增量軟體開發過程,通常用於敏捷軟體開發。)這可能是絕大多數鄉民對於 Scrum 的印象,一種敏捷專案管理框架。請把重點放在專案管理這四個字上面,所以想到 Scrum 就想到專案管理。
  • 接著看看 Ken Schwaber 與 Mike Beedle 在 Agile Software Development with Scrum, p 2, 的說法:Scrum is a management and control process that cuts through complexity to focus on building software that meets business needs. 相較於專案管理這四個字,Scrum 是一種『management and control process (管理與控制流程)』感覺起來比較抽象一點。

把 Schwaber 與 Beedle 所寫得書讀到最後,會發現作者想要表達的『management and control process』的精神。不過,廣義的來講,專案管理也包含了『management and control process』。為了簡單起見,就先把 Scrum 當成是一種『敏捷專案管理方法』或是『敏捷專案管理框架』吧...雖然 Teddy 潛意識中不太喜歡把 Scrum 說成專案管理的方法。

***
 
接下來是重點,如果把 Scrum 看成是一種敏捷專案管理方法,那麼這個方法的內含是什麼?和傳統的專案管理方法有何不同?在介紹 Scrum 內含之前,先看一下 Scrum 與傳統一般專案管理最大的差異之一,在於 Scrum 有如下圖所示的『雙重回饋機制』。在軟體開發中,下圖左邊的『輸入』是『軟體需求』,中間『流程』那一塊表示軟體開發活動,最後的『輸出』表示軟體本身(也可以包含設計與使用文件等)。從輸入經過開發流程到產品輸出,在 Scrum 的術語中這一段時間稱之為『sprint(短跑或衝刺)』,另一個與 sprint 相同意思但卻更一般化的說法叫做『iteration』。廣義的來說,敏捷方法(agile methods)將一個軟體專案的開發時程(假設 6 個月)切割成若干個『時間長度固定(time-boxing),例如兩個禮拜的開發活動,這種時間長度固定的週期就稱之為一個 sprint 或是一個 iteration。如果一個專案是 6 個月後要釋出產品,開發團隊採用為期兩週的 sprint,那麼這個專案就一共有 12 個 sprints(先不要管每一個 sprint 要做什麼,以及如何將需求分配到每個sprint 這些問題)。

 
image
所以,採用 Scrum 的團隊就是要在每一個 sprint 結束之前(每兩週)完成上圖從輸入端丟入軟體需求,然後經過開發流程,最後產生產品。圖中從輸出那端拉了『兩條回饋線』,一條透過『demo meeting(sprint demo or sprint review meeting)』回饋到『輸入的需求端』,另一條透過『retrospective meeting,回顧或是反省會議』回饋到『開發流程』。
 
這兩條回饋線的含意是:
  • Review meeting: 每個 sprint 結束時,開發團隊要展示本此所完成的功能給客戶(或是客戶代表)看,讓客戶確定此次所開發的功能是否符合客戶期待。如果不符合則可以在之後的 sprint 加以修正(此為回饋機制的意義,有錯則改之)。由於每個 sprint 週期很短(一般 Scrum 團隊採用 2 週至 4 週的 sprint),所以可以避免傳統開發專案在專案晚期客戶才發現問題但卻沒時間加以修正的困境。
  • Retrospective meeting: 軟體開發除了需求可能不符合客戶所需,軟體開發流程本身如果沒有做好管理,也很容易開發出『低品質』的軟體。例如,bugs 太多,程式無法擴充,沒有自動化測試等等。所以,在每個 sprint 結束時,除了review meeting 以外,Scrum 還有一個稱之為 retrospective meeting 的活動,用來檢討與軟體開發流程有關的議題。在這個活動中,團隊成員們探討(1)那些開發作法是好的,應該要繼續維持下去。例如,有導入持續整合,或是有持續做 pair programming;(2) 有那些與開發流程有關的地方沒有做好需要改善的。例如,自動化單元測試做的不夠多,或是測試硬體設備不夠;(3)擬定改善計畫(action plan)。
在了解 Scrum 的內含之前,希望鄉民們先了解與細細品味一下 Scrum  雙重回饋機制』的重要性。其實這個雙重回饋機制』是一種很簡單的作法,但是對於改善軟體開發(需求與流程)卻是相當有用(PS:還有 time-boxing 的觀念也是很重要滴)

今天先講到這裡,Scrum 的內含下次再說明。

下一集:〈Scrum 是什麼(2):Scrum 的內涵

***

友藏內心獨白:啊,這一篇寫太久了,還有重要事情要辦說。

3 則留言:

  1. 可是我一直認為Scrum是專案管理而不是開發流程耶XD

    回覆刪除
  2. To Sprint:

    也許沒錯,但是 Teddy 對『專案管理』這四個字特別感冒,所以內心一直不願意接受 Scrum 是一種敏捷專案管理方法...但是用專案管理角度來解釋 Scrum 可能絕大多數鄉民比較容易接受。所以,Teddy 在還沒找到更好的說法之前,也只能接受 Scrum 是一種專案管理...Orz..

    回覆刪除
  3. 該怎麼說,我認為Scrum比較符合現代的專案管理,台灣卻還在停留在過去式的專案管理,也就是為什麼有要打卡的責任制這些變相的東西出現。我覺得專案管理其實沒有很複雜,預估(story point)、實作(sprint)、監控(daily scrum)和修正(retrospective meeting),這些都在Scrum裡。

    回覆刪除