
版權
領域驅動設計:軟體核心複雜性應對之道(修訂版)
• 著 [美] eric evans
譯 趙 俐 盛海豔 劉 霞 等
責任編輯 楊海玲
• 人民郵電出版社出版發行 北京市豐台區成壽寺路11号
郵編 100164 電子郵件 [email protected]
• 讀者服務熱線:(010)81055410
反盜版熱線:(010)81055315
作者簡介
eric evans “領域驅動設計之父”,世界著名軟體模組化專家。他建立了domain language公司,緻力于幫助公司機建構立與業務緊密相關的軟體。他在世界各地宣講領域驅動設計(domain-driven design,ddd)的思想,開設課程,參加會議,接受專訪,擁有大批的追随者。從20世紀80年代開始,他就以設計師和程式員的雙重身份參與過許多大型面向對象系統的設計和開發,涉及各種複雜的業務和技術領域。同時,他還教育訓練和指導過許多開發團隊開展極限程式設計實踐。
本書賣點
“領域驅動設計之父”經典著作
衆多世界級軟體大師鼎力推薦
凝聚領域模組化專家數十年的實戰經驗
深度剖析建構高品質複雜系統的核心技術
領域模型使開發人員可以表達豐富的軟體功能需求,由此實作的軟體可以滿足使用者真正的需要,是以被公認為是軟體設計的關鍵所在,其重要性顯而易見。但講述如何将領域模型用于軟體開發過程的優秀的實用資料卻不多見。本書正是這一領域最著名的作品,受到衆多業界大師的贊美和推介,廣受讀者好評。
要通過建立領域模型來加速複雜的軟體開發,就需要利用大量最佳實踐和标準模式在開發團隊中形成統一的交流語言;不但要重構代碼,而且要重構代碼底層的模型;同時采取反複疊代的靈活開發方法,深入了解領域特點,促進領域專家與程式員的良好溝通。針對這些内容,本書結合真實項目,系統地介紹了領域驅動開發的目标、意義和方法,充分讨論了複雜系統的模組化與設計問題。
本書将指導面向對象開發人員、系統分析人員和設計人員合理地組織工作,各有側重、彼此協作,有條不紊地進行複雜系統的開發,幫助他們建立豐富而實用的領域模型,并由此建立長期适用的優質軟體。
内容提要
本書是領域驅動設計方面的經典之作,修訂版更是對之前出版的中文版進行了全面的修訂和完善。
全書圍繞着設計和開發實踐,結合若幹真實的項目案例,向讀者闡述如何在真實的軟體開發中應用領域驅動設計。書中給出了領域驅動設計的系統化方法,并将人們普遍接受的一些最佳實踐綜合到一起,融入了作者的見解和經驗,展現了一些可擴充的設計最佳實踐、已驗證過的技術以及便于應對複雜領域的軟體項目開發的基本原則。
本書适合各層次的面向對象軟體開發人員、系統分析員閱讀。
版權聲明
authorized translation from the english language edition, entitled domain-driven design: tackling complexity in the heart of software, 9780321125217 by eric evans, published by pearson education, inc., publishing as addison-wesley, copyright © 2004 by eric evans.
all rights reserved. no part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from pearson education, inc.
chinese simplified language edition published by pearson education asia ltd. and posts & telecom press copyright © 2016.
本書中文簡體字版由 pearson education asia ltd. 授權人民郵電出版社獨家出版。未經出版者書面許可,不得以任何方式複制或抄襲本書内容。
本書封面貼有 pearson education(培生教育出版集團)雷射防僞标簽,無标簽者不得銷售。
版權所有,侵權必究。
譯者序
我最早聽說eric evans的《領域驅動設計》是在2007年,那時我所在的項目組出于知識儲備的考慮購進了一批軟體設計書和相關資料。其中一篇英文的短篇技術文檔與我們當時的項目非常相關,于是我們就仔細研讀了一番。這篇僅有幾萬字的文檔多次提到了eric evans的《領域驅動設計》,并引用了他的很多精辟觀點。由于當時領域驅動設計遠遠沒有現在這樣普及,是以這些觀點使我耳目一新,也給我留下了深刻的印象。随後我又經常在一些文獻中看到eric evans的名字,更多地了解了他的領域驅動設計思想,沒想到時隔幾年後竟然有機會把這位大師的作品翻譯出來奉獻給各位讀者,也算是機緣巧合了。
相信大家對這本書都不陌生,它已經成為軟體設計書中的經典。在網上搜尋一下,讀者對它好評如潮,我再多說一句贊美的話都是多餘的。而我能想到的也唯有“經典”二字,它堪稱經典中的經典。
我們對“領域”這個概念都很熟悉,但有多少人真正重視過它呢?軟體開發人員幾乎總是專注于技術,把技術作為自己能力的展示和成功的度量。而直到eric evans出版了他的這部巨著之後,人們才真正開始關注領域,關注核心領域,關注領域驅動的設計,關注模型驅動的開發。相信在讀完本書後,你會對軟體設計有全新的認識。
我曾經和一些好友探讨過以下一些問題。項目怎樣開發才能確定成功?什麼樣的軟體才能為使用者提供真正的價值?什麼樣的團隊才算是優秀的團隊?現在,在仔細研讀完本書後,這些問題都找到了答案。
本書廣泛适用于各種領域的軟體開發項目。在每個項目的生命周期中,都會有一些重大關頭或轉折點。如何制定決策,如何把握項目的方向,如何處理和面對各種機會和挑戰,将對項目産生決定性的影響。讓我們一起跟随大師的腳步,分享他通過大量項目獲得的真知灼見和開發心得吧。
最後,衷心感謝人民郵電出版社各位編輯在翻譯工作中給予的幫助和寶貴意見,感謝熱心讀者魏海楓,他在百忙之中抽出時間對本書譯稿做了修訂工作,發現并修正了很多問題。由于譯者水準有限,在翻譯過程中難免還會留有一些錯誤,懇請讀者批評指正。
序
有很多因素會使軟體開發複雜化,但最根本的原因是問題領域本身錯綜複雜。如果你要為一家人員複雜的企業提高自動化程度,那麼你開發的軟體将無法回避這種複雜性,你所能做的隻有控制這種複雜性。
控制複雜性的關鍵是有一個好的領域模型,這個模型不應該僅僅停留在領域的表面,而是要透過表象抓住領域的實質結構,進而為軟體開發人員提供他們所需的支援。好的領域模型價值連城,但要想開發出好的模型也并非易事。精通此道的人并不多,而且這方面的知識也很難傳授。
eric evans就是為數不多的能夠建立出優秀領域模型的人。我是在與他合作時發現他的這種才能的——發現一個客戶竟然比我技術更精湛,這種感覺有些奇妙。我們的合作雖然短暫,但卻充滿樂趣。從那之後我們一直保持聯系,我也有幸見證了本書整個“孕育”過程。
本書絕對值得期待。
本書終于實作了一個宏偉抱負,即描述并建立了領域模組化藝術的詞彙庫。它提供了一個參考架構,人們可以用它來解釋相關活動,并用它來傳授這門難學的技藝。本書在寫作過程中,也帶給我很多新想法,如果哪位概念模組化方面的老手沒有從閱讀本書中獲得大量的新思想,那我反而該驚詫莫名了。
eric還對我們多年以來學過的知識進行了歸納總結。首先,在領域模組化過程中不應将概念與實作割裂開來。高效的領域模組化人員不僅應該能夠在白闆上與會計師進行讨論,而且還應該能與程式員一道編寫java代碼。之是以要具備這些能力,一部分原因是如果不考慮實作問題就無法建構出有用的概念模型。但概念與實作密不可分的最主要原因在于,領域模型的最大價值是它提供了一種通用語言,這種語言是将領域專家和技術人員聯系在一起的紐帶。
我們将從本書中學到的另一個經驗是領域模型并不是按照“先模組化,後實作”這個次序來工作的。像很多人一樣,我也反對“先設計,再建構”這種固定的思維模式。eric的經驗告訴我們,真正強大的領域模型是随着時間演進的,即使是最有經驗的模組化人員也往往發現他們是在系統的初始版本完成之後才有了最好的想法。
我衷心希望本書成為一本有影響力的著作,并希望本書能夠将如何利用領域模型這一寶貴工具的知識傳授給更多的人,進而為這個高深莫測的領域梳理出一個結構,并使它更有内聚力。領域模型對軟體開發的控制有着巨大影響,不管軟體開發是用什麼語言或環境實作的。
最後,也是很重要的一點,我最敬佩eric的一點是他敢于在本書中談論自己的一些失敗經曆。很多作者都喜歡擺出一副無所不能的架勢,有時着實讓人不屑。但eric清楚地表明他像我們大多數人一樣,既品嘗過成功的美酒,也體驗過失敗的沮喪。重要的是他能夠從成功和失敗中學習,而對我們來說更重要的是他能夠将所有經驗傳授給我們。
martin fowler
2003年4月
前言
至少20年前,一些頂尖的軟體設計人員就已經認識到領域模組化和設計的重要性,但令人驚訝的是,這麼長時間以來幾乎沒有人寫出點兒什麼,告訴大家應該做哪些工作或如何去做。盡管這些工作還沒有被清楚地表述出來,但一種新的思潮已經形成,它像一股暗流一樣在對象社群中湧動,我把這種思潮稱為領域驅動設計(domain-driven design)。
過去10年中,我在幾個業務和技術領域開發了一些複雜的系統。我在設計和開發過程中嘗試了一些最佳實踐,它們都是面向對象開發高手用過的領先技術。有些項目非常成功,但有幾個項目卻失敗了。成功的項目有一個共同的特征,那就是都有一個豐富的領域模型,這個模型在疊代設計的過程中不斷演變,而且成為項目不可分割的一部分。
本書為作出設計決策提供了一個架構,并且為讨論領域設計提供了一個技術詞彙庫。本書将人們普遍接受的一些最佳實踐綜合到一起,并融入了我自己的見解和經驗。面對複雜領域的軟體開發團隊可以利用這個架構來系統性地應用領域驅動設計。
三個項目的對比
談到領域設計實踐對開發結果的巨大影響時,我的記憶中立即就會跳出三個項目,它們就是鮮活的例子。雖然這三個項目都傳遞了有用的軟體,但隻有一個項目實作了宏偉的目标——傳遞了能夠滿足組織後續需求、可以不斷演進的複雜軟體。
我要說的第一個項目完成得很迅速,它提供了一個簡單實用的web交易系統。開發人員主要憑直覺開發,但這并沒有妨礙他們,因為簡單軟體的編寫并不需要過多地注意設計。由于最初的這次成功,人們對未來開發的期望值變得極高。我就是在這個時候被邀請開發它的第二個版本的。當我仔細研究這個項目時,發現他們沒有使用領域模型,甚至在項目中沒有一種公共語言,而且項目完全沒有一種結構化的設計。項目上司者對我的評價并不贊同,于是我拒絕了這項工作。一年後,這個項目團隊陷入困境,無法傳遞第二個版本。盡管他們在技術的使用方面也值得商榷,但真正挫敗他們的是業務邏輯。他們的第一個版本過早地變得僵化,成為一個維護代價十分高昂的遺留系統。
要想克服這種複雜性,需要非常嚴格地使用領域邏輯設計方法。在我職業生涯的早期,我幸運地完成了一個非常重視領域設計的項目,這就是我要說的第二個項目。這個項目的領域複雜性與上面提到的那個項目相仿,它最初也小獲成功,為貿易機構提供了一個簡單的應用程式。但在最初傳遞之後緊跟着又進行了連續的加速開發。每次疊代都為上一個版本在功能的內建和完善上增加了非常好的新選項。開發團隊能夠按照貿易商的要求提供靈活性和擴充性。這種良性發展直接歸功于深刻的領域模型,它得到了反複精化,并在代碼中得以展現。當團隊對該領域有了新的了解後,領域模型也随之深化。開發人員之間、開發人員與領域專家之間的溝通品質都得到改善,而且設計不但沒有加重維護負擔,反而變得易于修改和擴充。
遺憾的是,僅靠重視模型并不會使項目達到這樣的良性循環。我要說的第三個項目就是這種情況,它開始制訂的目标很高,打算基于一個領域模型建立一個全球企業系統,但在經過了幾年的屢戰屢敗之後,不得不降格以求,最終“泯然衆人矣”。團隊擁有很好的工具,對業務也有較好的了解,也非常認真地進行了模組化。但團隊卻錯誤地将開發人員的角色獨立出來,導緻模組化與實作脫節,是以設計無法反映不斷深化的分析。總之,詳細的業務對象設計不能保證它們能夠嚴絲合縫地被整合到複雜的應用程式中。反複的疊代并沒有使代碼得以改進,因為開發人員的技術水準參差不齊,他們沒有認識到他們使用了非正式的風格和技術體系來建立基于模型的對象(這些對象也充當了實用的、可運作的軟體)。幾個月過去了,開發工作由于巨大的複雜性而陷入困境,而團隊對項目也失去了一緻的認識。經過幾年的努力,項目确實建立了一個适當的、有用的軟體,但團隊已經放棄了當初的宏偉抱負,也不再重視模型。
複雜性的挑戰
很多因素可能會導緻項目偏離軌道,如官僚主義、目标不清、資源缺乏等。但真正決定軟體複雜性的是設計方法。當複雜性失去控制時,開發人員就無法很好地了解軟體,是以無法輕易、安全地更改和擴充它。而好的設計則可以為開發複雜特性創造更多機會。
一些設計因素是技術上的。軟體的網絡、資料庫和其他技術方面的設計耗費了人們大量的精力。很多書籍都介紹過如何解決這些問題。大批開發人員很注意培養自己的技能,并緊跟每一次技術進步。
然而很多應用程式最主要的複雜性并不在技術上,而是來自領域本身、使用者的活動或業務。當這種領域複雜性在設計中沒有得到解決時,基礎技術的構思再好也無濟于事。成功的設計必須系統地考慮軟體的這個核心方面。
本書有兩個前提:
(1)在大多數軟體項目中,主要的焦點應該是領域和領域邏輯;
(2)複雜的領域設計應該基于模型。
領域驅動設計是一種思維方式,也是一組優先任務,它旨在加速那些必須處理複雜領域的軟體項目的開發。為了實作這個目标,本書給出了一整套完整的設計實踐、技術和原則。
設計過程與開發過程
設計書就是講設計,過程書隻是講過程。它們之間很少互相參考。設計和過程本身就是兩個足夠複雜的主題。本書是一本設計書,但我相信設計與過程這二者是密不可分的。設計思想必須被成功實作,否則它們就隻是紙上談兵。
當人們學習設計技術時,各種可能性令他們興奮不已,然而真實項目的錯綜複雜又會為他們潑上一盆冷水。他們無法用所使用的技術來貫徹新的設計思想,或者不知道何時應該為了節省時間而放棄某個設計方面,何時又應該堅持不懈直至找到一個幹淨利落的解決方案。開發人員可以抽象地讨論設計原則的應用,而且他們也确實在進行着這樣的讨論,但更自然的做法應該是讨論如何完成實際工作。是以,雖然本書是一本有關設計的書,但我會在必要的時候穿越這條人為設定的邊界,進入過程的領域。這有助于将設計原則放到一個适當的語境下進行讨論。
雖然本書并不局限于某一種特定的方法,但主要還是面向“靈活開發過程”這一新體系。特别地,本書假定項目必須遵循兩個開發實踐,要想應用書中所講的方法,必須先了解這兩個實踐。
(1)疊代開發。人們倡導和實踐疊代開發已經有幾十年時間了,而且它是靈活開發方法的基礎。在靈活開發和極限程式設計(xp)的文獻中有很多關于疊代開發的精彩讨論,其中包括surviving object-oriented projects [cockburn 1998] ①和extreme programming explained [beck 1999]。
(2)開發人員與領域專家具有密切的關系。領域驅動設計的實質就是消化吸收大量知識,最後産生一個反映深層次領域知識并聚焦于關鍵概念的模型。這是領域專家與開發人員的協作過程,領域專家精通領域知識,而開發人員知道如何建構軟體。由于開發過程是疊代式的,是以這種協作必須貫穿整個項目的生命周期。
極限程式設計的概念是由kent beck、ward cunningham和其他人共同提出的[beck 2000],它是靈活過程最重要的部分,也是我使用得最多的一種程式設計方法。為了使讨論更加具體,整本書都将使用xp作為基礎讨論設計和過程的互動。本書論述的原則很容易應用于其他靈活過程。
近年來,反對“精細開發方法學”(elaborate development methodology)的呼聲漸起,人們認為無用的靜态文檔以及死闆的預先規劃和設計加重了項目的負擔。相反,靈活過程(如xp)強調的是應對變更和不确定性的能力。
極限程式設計承認設計決策的重要性,但強烈反對預先設計。相反,它将相當大的精力投入到促進溝通和提高項目快速變更能力的工作中。具有這種反應能力之後,開發人員就可以在項目的任何階段隻利用“最簡單而管用的方案”,然後不斷進行重構,一步一步做出小的設計改進,最終得到滿足客戶真正需要的設計。
這種極端的簡約主義是解救那些過度追求設計的執迷者的良方。那些幾乎沒有價值的繁瑣文檔隻會為項目帶來麻煩。項目受到“分析癱瘓症”的困擾,團隊成員十分擔心會出現不完美的設計,這導緻他們根本沒法取得進展。這種狀況必須得到改變。
遺憾的是,這些有關過程的思想可能會被誤解。每個人對“最簡單”都有不同的定義。持續重構其實是一系列小規模的重新設計,沒有嚴格設計原則的開發人員将會建立出難以了解或修改的代碼,這恰好與靈活的精神相悖。而且,雖然對意外需求的擔心常常導緻過度設計,但試圖避免過度設計又可能走向另一個極端——不敢做任何深入的設計思考。
實際上,xp最适合那些對設計的感覺很敏銳的開發人員。xp過程假定人們可以通過重構來改進設計,而且可以經常、快速地完成重構。但重構本身的難易程度取決于先前的設計選擇。xp過程試圖改善團隊溝通,但模型和設計的選擇有可能使溝通更明确,也有可能會使溝通不暢。
本書将設計和開發實踐結合起來讨論,并闡述領域驅動設計與靈活開發過程是如何互相增強的。在靈活開發過程中使用成熟的領域模組化方法可以加速開發。過程與領域開發之間的互相關系使得這種方法比任何“純粹”真空式的設計更加實用。
本書的結構
本書分為4個部分。
第一部分 “運用領域模型”提出領域驅動開發的基本目标,這些目标是後面幾部分中所讨論的實踐的驅動因素。由于軟體開發方法有很多,是以第一部分還定義了一些術語,并給出了用領域模型來驅動溝通和設計的總體含義。
第二部分 “模型驅動設計的構造塊”将面向對象領域模組化中的一些核心的最佳實踐提煉為一組基本的構造塊。這一部分主要是消除模型與實際運作的軟體之間的鴻溝。團隊一緻使用這些标準模式就可以使設計井然有序,并且使團隊成員更容易了解彼此的工作。使用标準模式還可以為公共語言貢獻術語,使得所有團隊成員可以使用這些術語來讨論模型和設計決策。
但這一部分的主旨是讨論一些能夠保持模型和實作之間互相協調并提高效率的設計決策。要想達到這種協調,需要密切注意個别元素的一些細節。這種小規模的仔細設計為開發人員提供了一個穩固的基礎,在此基礎上就可以應用第三部分和第四部分讨論的模組化方法了。
第三部分 “通過重構來加深了解”讨論如何将構造塊裝配為實用的模型,進而實作其價值。這一部分沒有直接讨論深奧的設計原則,而是着重強調一個發現過程。有價值的模型不是立即就會出現的,它們需要對領域的深入了解。這種了解是一步一步得到的,首先需要深入研究模型,然後基于最初的(可能是不成熟的)模型實作一個初始設計,再反複改進這個設計。每次團隊對領域有了新的了解之後,都需要對模型進行改進,使模型反映出更豐富的知識,而且必須對代碼進行重構,以便反映出更深刻的模型,并使應用程式可以充分利用模型的潛力。這種一層一層“剝洋蔥”的方法有時會創造一種突破的機會,使我們得到更深刻的模型,同時快速進行一些更深入的設計修改。
探索本身是永無止境的,但這并不意味着它是随機的。第三部分深入闡述一些指引我們保持正确方向的模組化原則,并提供了一些指導我們進行探索的方法。
第四部分 “戰略設計”讨論在複雜系統、大型組織以及與外部系統和遺留系統的互動中出現的複雜情況。這一部分探讨了作為一個整體應用于系統的3條原則:上下文、提煉和大型結構。戰略設計決策通常由團隊制定,或者由多個團隊共同制定。戰略設計可以保證在大型系統或應用程式(它們應用于不斷延伸的企業級網絡)上以較大規模去實作第一部分提出的目标。
本書通篇讨論使用的例子并不是一些過于簡單的“玩具式”問題,而是全部選自實際項目。
本書的大部分内容實際上是作為一系列的“模式”編寫的。但讀者無需顧忌這一方法也應該能夠了解本書,對模式的風格和格式感興趣的讀者可以參考附錄。
本書面向的讀者
本書主要是為面向對象軟體開發人員編寫的。軟體項目團隊的大部分成員都能夠從本書的某些部分獲益。本書最适合那些正在項目上嘗試這些實踐的人員,以及那些已經在這樣的項目上積累了豐富經驗的人員。
要想從本書受益,掌握一些面向對象模組化知識是非常必要的,如uml圖和java代碼,是以一定要具備基本讀懂這些語言的能力,但不必精通細節。了解極限程式設計的知識有助于從這個角度來了解開發過程的讨論,但不具備這一背景知識也能讀懂這些内容。
一些中級軟體開發人員可能已經了解面向對象設計的一些知識,也許讀過一兩本軟體設計的書,那麼本書将填補這些讀者的知識空缺,向他們展示如何在實際的軟體項目上應用對象模組化技術。本書将幫助這些開發人員學會用進階模組化和設計技巧來解決實際問題。
進階軟體開發人員或專家可能會對書中用于處理領域的綜合架構感興趣。這種系統性的設計方法将幫助技術負責人指導他們的團隊保持正确的方向。此外,本書從頭至尾所使用的明确術語将有助于進階開發人員與他們的同行溝通。
本書采用記叙體,讀者可以從頭至尾閱讀,也可以從任意一章的開頭開始閱讀。具有不同背景知識的讀者可能會有不同的閱讀方式,但我推薦所有讀者從第一部分的引言和第1章開始閱讀。除此之外,本書的核心是第2、3、9和14章。已經掌握一定知識的讀者可以采取跳躍式閱讀的方式,通過閱讀标題和粗體字内容即可掌握要點。一些進階讀者則可以跳過前兩部分,重點閱讀第三部分和第四部分。
除了這些主要讀者以外,分析員和相關的技術項目經理也可以從閱讀本書中獲益。分析員在掌握了領域與設計之間的聯系之後,能夠在靈活項目中作出更卓越的貢獻,也可以利用一些戰略設計原則來更有重點地組織工作。
項目經理感興趣的重點是提高團隊的工作效率,并緻力于設計出對業務專家和使用者有用的軟體。由于戰略設計決策與團隊組織和工作風格緊密相關,是以這些設計決策必然需要項目上司者的參與,而且對項目的路線有着重要的影響。
領域驅動團隊
盡管開發人員個人能夠從了解領域驅動設計中學到有價值的設計技術和觀點,但最大的好處卻來自團隊共同應用領域驅動設計方法,并且将領域模型作為項目溝通的核心。這樣,團隊成員就有了一種公共語言,可以用來進行更充分的溝通,并確定圍繞軟體來進行溝通。他們将建立出一個與模型步調一緻的清晰的實作,進而為應用程式的開發提供幫助。所有人都了解不同團隊的設計工作之間的互相聯系,而且他們會一緻将注意力集中在那些對組織最有價值、最與衆不同的特性的開發上。
領域驅動設計是一項艱巨的技術挑戰,但它也會帶來豐厚的回報,當大多數軟體項目開始僵化而成為遺留系統時,它卻為你敞開了機會的大門。
①這種表述指這是本書參考文獻中提到的圖書。——編者注
緻謝
本書的創作曆時4年多,其間經曆了諸多工作形式的變化,在這個過程中很多人為我提供了幫助和支援。
感謝那些閱讀本書書稿并提出意見的人。沒有這些人的回報意見,本書将不可能出版。其中有幾個團隊和一些人員對本書的評閱給予了特别的關注。由russ rufer和tracy bialek上司的矽谷模式小組(silicon valley patterns group)花費了幾周時間詳細審閱了本書完整的第一稿。由ralph johnson上司的伊利諾伊大學的閱讀小組也花費了幾周時間審閱了本書的第二稿。這些小組長期、精彩的讨論對本書産生了深遠的影響。kyle brown和martin fowler提供了細緻入微的回報意見和寶貴的建議,也給了我無價的精神支援(在我們坐在一起釣魚的時候)。ward cunningham的意見幫助我彌補了一些重大的缺陷。alistair cockburn在早期給了我很多鼓勵,并和hilary evans一起幫助我完成了整個出版過程。david siegel和eugene wallingford幫助我避免了很多技術上的錯誤。vibhumohindra和vladimir gitlevich不厭其煩地檢查了所有代碼示例。
rob mee看了我對一些素材所做的早期研究,并在我嘗試表達這種設計風格的時候與我進行了頭腦風暴活動,幫我産生了很多新的想法。他後來又與我一起仔細探讨了後面的書稿。
本書在寫作過程中經曆了一次重大轉折,這完全歸功于joshkerievsky。他勸說我在寫作本書時借鑒“亞曆山大”模式① ,後來本書正是按這種方式組織的。在1999年plop會議臨近時的忙碌時刻,josh還幫我收集第二部分的材料,首次将它們組織為更嚴密的形式。這些材料成了一粒種子,本書大部分後續内容都是圍繞這些内容創作的。
還要感謝awad faddoul,我有數百個小時坐在他的咖啡廳中寫作。咖啡廳甯靜優雅,窗外的湖面上總有片片風帆,我正是這樣才堅持寫下去。
此外還要感謝martine jousset、richard paselk和ross venables,他們拍攝了一些非常精美的照片,用來示範一些關鍵概念(參見本書後面的圖檔說明)。
在構思本書之前,我必須先要形成我自己對軟體開發的看法和了解。這個過程得到了一些傑出人員的無私幫助,他們是我的良師益友。david siegel、eric gold和iseult white各自從不同方面幫助我形成了對軟體設計的思考方式。同時,bruce gordon、richardfreyberg和judith segal博士也從不同角度幫助我找到了項目的成功之路。
我自己的觀念就是從那時的思想體系中自然而然發展形成的。有些内容我在正文中清楚地列了出來,并且在可能的地方标明了出處。還有些可能是十分基礎的知識,我甚至自己都沒有意識到它們對我産生了影響。
我的碩士論文導師bala subramanium博士是我在數學模組化方面的引路人,當時我們用數學模組化來進行化學反應動力學方面的研究。雖說模組化本身沒什麼稀奇,但那時的工作是引導我創作本書的一部分原因。
在更早之前,我的母親carol和父親gary對我思維模式的形成産生了很大影響。還有幾位特别值得一提的教師激發了我的興趣,幫助我打下堅實的基礎,在此感謝dale currier(我的高中數學老師)、mary brown(我的高中英文寫作老師)和josephine mcglamery(我上6年級時的自然科學老師)。
最後,感謝我的朋友和家人,以及fernando de leon,感謝他們一直以來給我的鼓勵。
①克裡斯托弗•亞曆山大(christopher alexander),1936年10月4日出生于奧地利的維也納,是一名建築師,以其設計理論和豐富的建築設計作品而聞名于世。亞曆山大認為,建築的使用者比建築師更清楚他們需要什麼,他創造并以實踐驗證了“模式語言”,建築模式語言賦予所有人設計并建造建築的能力。亞曆山大的代表作是《建築模式語言》,該書對計算機科學領域中的“設計模式”運動産生了巨大的影響。亞曆山大創立的增量、有機和連貫的設計理念也影響了“極限程式設計”運動。——編者注
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。
目錄
第一部分 運用領域模型
<a href="https://yq.aliyun.com/articles/92319">第1章 消化知識</a>
<a href="https://yq.aliyun.com/articles/92319">1.1節有效模組化的要素</a>
<a href="https://yq.aliyun.com/articles/92320">1.2節知識消化</a>
<a href="https://yq.aliyun.com/articles/92322">1.3節持續學習</a>
<a href="https://yq.aliyun.com/articles/92331">1.4節知識豐富的設計</a>
<a href="https://yq.aliyun.com/articles/92332">1.5節深層模型</a>
<a href="https://yq.aliyun.com/articles/92341">第2章 交流與語言的使用</a>
<a href="https://yq.aliyun.com/articles/92341">2.1節模式:ubiquitous language</a>
<a href="https://yq.aliyun.com/articles/92350">2.2節“大聲地”模組化</a>
<a href="https://yq.aliyun.com/articles/92355">2.3節一個團隊,一種語言</a>
<a href="https://yq.aliyun.com/articles/92361">2.4節文檔和圖</a>
<a href="https://yq.aliyun.com/articles/92368">2.5節解釋性模型</a>
第3章 綁定模型和實作
第二部分 模型驅動設計的構造塊
第4章 分離領域
第5章 軟體中所表示的模型
第6章 領域對象的生命周期
第7章 使用語言:一個擴充的示例
第三部分 通過重構來加深了解
第8章 突破
第9章 将隐式概念轉變為顯式概念
第10章 柔性設計
第11章 應用分析模式
第12章 将設計模式應用于模型
第13章 通過重構得到更深層的了解
第四部分 戰略設計
第14章 保持模型的完整性
第15章 精煉
第16章 大型結構
第17章 領域驅動設計的綜合運用
結束語
附錄
術語表
參考文獻
圖檔說明
歡迎來到異步社群!