[Agile] 完整前期設計 vs. 漸進式設計

傳統開發團隊在轉換到 Agile 時,第一個遇到的問題應該會是如何切換成「Iterative and Incremental Development」。也就是說,通常一時間會難以接受沒有細部設計就開始實作的方式,不過我待的團隊很幸運,剛好有機會嘗試這兩種開發方式,這邊來談談施行經驗與觀察吧。

這裡的結論可能不是很客觀,我們團隊嘗試這兩種方法的時間點不同,所以成員的能力也有差異,另外,這也只是我憑著記憶整理出來的結果,不過相信結論不會悖離事實太多。

因為這邊談到的狀況,不全然是基於 Scrum 框架下的運作,所以這邊定義一下角色,針對寫程式的人,我們叫做 Programmer,而 (Architecture) Designer 則是軟體架構的主要設計者。

環境: 

  • Programmer 的能力偏向 Junior Engineer,沒有 Design 能力,看得懂 UML 表達方法。
  • 時程壓力不大
  • 專案的需求變動度低

開發方法:

  • 完整前期設計: 定義出 Designer 及 Programmer,從需求分析到 UML 圖設計都先做完後,再進行實作,後續有問題時,再由 Designer 進行修改。
  • 漸進式設計: 定義出 Designer 及 Programmer,由 Designer 將基礎架構訂出後,就開始實作,並由 Designer 擔任設計顧問,Programmer 主導區塊的設計細節。
觀察的結果大致如下,

前期準備時間 單一開發週期產生之成果 成員自我管理
完整前期設計(方法1)
漸進式設計 (方法2)

在方法1的執行過程中,團隊初期會比較專注在架構的設計,而不是產出可用的軟體單元,但偏偏又無法在初期就做出沒有問題的架構設計,所以日後還是推翻先前的分析與設計。方法1很難在短時間裡,從實作面得到需求和架構意見,日後還是要花時間大幅度修正架構。

在方法2中,因為直接讓 Programmer 投入細部設計並直接實作,所以可以從早期就取得許多回饋,並能與 Designer 早點將問題引入架構設計的討論中,架構因此能夠逐步穩定,並且讓 Programmer 及 Designer 對架構和需求理解更有信心。

在成員的成長方面,方法2對於 Programmer 的學習有很大幫助,Programmer 可以參與架構的細部設計,一方面可以讓成員有學習設計的機會,並且直接了解架構細節,另一方面,能增加成員自我管理的可能性。而方法1則造成 Programmer 按圖施工的可能性大增,而忽略達成需求的目標,此外,也無法從 Programmer 身上取得較多的回饋,增加架構崩壞的可能性。

不過,雖然早點開始實作,可以在一定的時間內取得部份成果,但是,對於主導的 Designer 卻是很大的負擔。這是因為成員不懂軟體設計相關議題,所以要確保實作品質、協助 Programmer 理解需求、串連不同的單元,跟 Programmer 就會有極大量的溝通。這樣的好處是在過程中,比較有機會直接讓 Programmer 了解什麼是有效的設計,也能降低實作與需求之間的落差,而且 Programmer 會比較懂得反應問題點,並討論解決方法。但問題就是會耗費大量時間,卻未必可以在週期內出現有效的產出,而且Programmer 和 Designer 也可能彈性疲乏。

從實行結果來看,方法1相當可惜,因為前期準備時間過長,後期溝通成本又居高不下(因為 Programmer 還無法理解設計,也無法提出細部設計的意見),所以最後還來不及產出可用的成品,就因為其他專案的加入而中止了。

但方法2也不是沒有缺點,因為總是會有些看得到的產出,但是內容物可能很有問題,可能是沒寫測試、可能有不容易察覺的 bug、可能實作方式有些架構上的問題,這些技術債會留下,但可展示的產出物卻會讓客戶有「什麼都做好了」的錯覺。這時候 Definition of Done (DoD) 及 Refactor 就會顯得非常重要了。
綜合以上的狀況,我會採取方法2的策略,藉此協助 Programmer 提昇技術能力,並洗腦教育 Programmer 能夠在每個週期內產出可運作的軟體,幫助自己確認需求內容。
將架構設計的思考導入 Programmer 後,就能漸漸地增加 Programmer 在設計上的責任,然後再進一步達成 Programmer 身兼 Design、Implement、Testing 的目標。
—–
以上純屬個人經驗與觀察,請審慎採用。XD

發佈留言