l

2013年7月9日 星期二

[還少一本書] Domain-Driven Design

July 08 21:12~22:54

螢幕快照 2013-07-08 下午10.18.31

Domain-Driven Design: Tackling Complexity in the Heart of Software》,作者Eric Evans。這是一本讓Teddy讀了之後有「相見恨晚」感覺的書。本書2004年出版,這個時間Teddy正在學校念書,當時買了不少書,但卻遺漏了這本好書。9年過去,前幾日讀了本書,雖然只讀完第一章,但卻忍不住要趕快推薦給鄉民們。

話說一個多禮拜前,Teddy偶然在網路上看了一個名為《Designing with Forces" – How to apply Christopher Alexander in everyday work》的演講影片很棒很棒很棒很棒很棒這個演講本身非常棒,順便推薦鄉民們抽空聽一下。原本這個演講的主題是介紹Alexander的《Notes on the Synthesis of Form》這本書對設計者的影響 ,不知道為什麼在演講快結束前講者居然一併推薦了《Domain-Driven Design》這本書。由於Teddy非常喜歡該演講的內容,講者所推薦的書想必也很有幫助,於是上禮拜就到天瓏書局買了這本書回來看。

這本書的書名「Domain-Driven Design」,Teddy之前一直把它想成是「Model-Driven Design(MDA)」這一類的書。因為之前曾經買過一本MDA的書,覺得作法太過正規化不太容易學習,所以後來這方面的書就沒有動機去翻閱。買了《Domain-Driven Design》之後Teddy才發現原來這也是一本pattern的書籍,只是書名沒有pattern這個字而已(Teddy內心獨白:所以說學會Alexander的pattern方法對於提升設計能力是非常有幫助的啊)。

講了這麼多廢話,這本書倒底在說什麼?開發軟體的人,或是學過OOAD(物件導向分析與設計)的人應該都知道,軟體分析與設計工作,其中很重要的一環就是要設計domain model。簡單的說這就是一本告訴鄉民們要如何做好domain model設計的書。看到這邊鄉民們可能會問:學了OOAD不就知道如何設計domain model了嗎,為什麼還要讀這本書?以Teddy的經驗,OOAD只會告訴鄉民們用物件導向技術來從事分析與設計的方法及技巧,在這個過程中當然會提到建立domain model的方法(請參考《傻的願意相信》),但只能算是入門的基本技巧。《Domain-Driven Design》這本書則是詳細說明為什麼軟體設計需要建立domain model,以及用了書中依該有超過2/3的篇幅以pattern的形式介紹建立domain model的pattern,當然其中也包含了範例說明。

這本書除了採用Teddy喜歡的pattern格式來撰寫以外,還有一個很重大的好處,就是書中所建議開發軟體做法跟敏捷開發方法十分「速配」。敏捷開發方法強調「逐步成長」的精神,本書建議讀者建構domain model的方法,完全符合這個精神。書中第一章就舉了一個很棒的例子,作者曾經參與開發PCB(印刷電路板)軟體的案子,一開始作者完全不懂PCB的領域知識。作者藉由以下幾個步驟,來釐清PCB這個領域的知識,並建立起軟體的domain model:

  • 找領域知識專家一起開會。
  • 選擇一個使用者(領域知識專家)覺得重要的scenario,準備透過雙方溝通這個scenario的過程,來逐步建立起domain model。
  • 用object interaction diagram(UML diagram的一種)來描述所挑選的scenario 。

螢幕快照 2013-07-08 下午10.23.48

書中第9頁範例,用object interaction diagram描述PCB軟體的probe simulation scenario。

 

  • 經過反覆修正與去蕪存菁的過程,最後建立起系統一部分的domain model。

螢幕快照 2013-07-08 下午10.42.16

書中第11頁範例,從object interaction diagram所建立的domain model。

***

從書中這個範例便可聞到「軟體架構也可逐步成長」的味道。從Scrum的角度來看,每一個sprint開發若干的story,每一個story可以想像成上面這個例子中的scenario,透過story的討論與實作,建立起一小部分的domain model。整個系統的domain model,或是軟體架構,便由這樣的過程中(一 次完成一個story)逐步成長起來。當然這樣的過程還是免不了會產生「一次只看一點,最後整個系統設計或架構長壞掉」的風險,而Teddy在《軟體架構也可逐步成長》系列文章中所介紹的方法就是要避免這樣的問題。

題外話:Teddy在部落格中舉了這麼多例子,鄉民們多多少少應該開始有點相信「軟體架構也可逐步成長」這件事了吧挑眉質疑

***

本書約530,對於想要學習如何建立domain model的鄉民們,是值得一看的好書。

***

友藏內心獨白:學好敏捷開發,不是光讀書名有Agile、Lean、Scrum或Kanban的書就夠了啊。

2 則留言:

  1. 比較好奇的是書中有提到這個domain model是經過幾個iteration之後才變成那樣的嗎?

    回覆刪除
    回覆
    1. 我只看完第一章而已,沒看到書中有無提到你問的問題。不過書中有提到建立好一個domain model最好馬上寫程式驗證這個model(可以是沒有 GUI 的 prototype),然後還要撰寫自動化測試,當model演進時要refactor這個model。基本上就是現在大家熟知的敏捷開發作法。

      刪除