副標題:企業層級的應用系統,是要能兼顧彈性、穩定與效能,而這需要具整體的架構設計觀與前人所提供解決方案的設計模式。

Patterns Of Enterprise Application Architecture Patterns Of Enterprise Application Architecture
———————————–
作者/Martin Fowler /著
出版社/Addison-Wesley Professional
ISBN/0321127420
Amazon 評鑑:四顆半星

內容簡介
The practice of enterprise application development has benefited from the emergence of many new enabling technologies. Multi-tiered object-oriented platforms, such as Java and .NET, have become commonplace. These new tools and technologies are capable of building powerful applications, but they are not easily implemented. Common failures in enterprise applications often occur because their developers do not understand the architectural lessons that experienced object developers have learned.

Patterns of Enterprise Application Architecture is written in direct response to the stiff challenges that face enterprise application developers. The author, noted object-oriented designer Martin Fowler, noticed that despite changes in technology–from Smalltalk to CORBA to Java to .NET–the same basic design ideas can be adapted and applied to solve common problems. With the help of an expert group of contributors, Martin distills over forty recurring solutions into patterns. The result is an indispensable handbook of solutions that are applicable to any enterprise application platform.

This book is actually two books in one. The first section is a short tutorial on developing enterprise applications, which you can read from start to finish to understand the scope of the book’s lessons. The next section, the bulk of the book, is a detailed reference to the patterns themselves. Each pattern provides usage and implementation information, as well as detailed code examples in Java or C#. The entire book is also richly illustrated with UML diagrams to further explain the concepts.

Armed with this book, you will have the knowledge necessary to make important architectural decisions about building an enterprise application and the proven patterns for use when building them.

The topics covered include:

  • Dividing an enterprise application into layers
  • The major approaches to organizing business logic
  • An in-depth treatment of mapping between objects and relational databases
  • Using Model-View-Controller to organize a Web presentation
  • Handling concurrency for data that spans multiple transactions
  • Designing distributed object interfaces

前言

每次研讀 Martin Fowler 的著作,直覺馬上就浮現出一個成語:天縱英才! 從極高度抽象的「分析模式(analysis pattern)」,對程式碼實作階段時的結構重整的 「重構(refactoring)」,以及本次書評所介紹的,關於企業層級系統平台設計議題的 「企業應用架構模式 (patterns of enterprise application architecture, 簡稱 PEAA)。 我是從來沒有看過有人可以如此像他這般,務虛與務實的不同層次都能是軟體業界的第一把交椅,著作的每一本書都是鉅作,然後又能在抽象分析、平台設計、程式碼實作等各層次整理出所謂的 “模式(pattern)”,供我輩軟體人員學習並再利用於現實的軟體開發工作。 前述的這三本書每一本都蠻厚的,但是 Fowler 也能寫出薄薄的那麼一本 「UML 精華(uml distilled)」,真正道盡 UML 的本質精髓,而熱銷全球數十萬本以上。 在我的心目中,Martin Fowler 有如神人一般,可以說是引領我在軟體業界持續奮進與學習的精神導師。

不僅如此,他寫的書,總是能以很淺顯易懂的白話來解釋看起來很深奧的道理。寫到這突然讓我想起,也算是有感而發,想當初我在啟蒙軟體領域的學習時,當然也會先從國內一些所謂的名家作者的著作來研讀。 可明明就是中文字,但閱讀起來就是很吃力,本想說是不是我真的有比較笨,領悟力差。 而後先從接觸 Fowler 的中文翻譯著作(感謝高水平的翻譯),耶! 我看得懂啊,甚至一看再看也不覺得煩,還能讀得津津有味,每一次的重讀又有不同的體會。後來再轉而看他的原文著作,雖然多少有些英文字彙的障礙,但是真的,絕對是比國內那些寫軟工書籍的作者,輕鬆易讀太多了,可以說閱讀 Fowler 的論著,就是一種享受。後來我才逐漸體悟到,太多所謂的軟工技術人,就是常賣弄太多 IT 的專業術語,而把單純的觀念表達的很複雜;還有一點,就是不容易從文字感受到這些 IT技術人 的想法,好像內容就是東拼西湊般,沒有真正自己主觀的想法。 的確,言之有物的好書能帶軟體人員上天堂;太多艱深術語、沒有自己體悟的書籍真的會讓你下地獄。

本次書評的主角,PEAA,所涉及相關軟體設計的議題可是相當廣泛,焦點是全擺在平台面系統設計的諸多議題,包括 分層結構、O-R(Object-Relation) Mapping、WebUI 的狀態控管、多人同時上線時的交易機制處理、分散式的設計策略等。 500 多頁,書本是蠻厚的,不過內容其實不會難懂 (前面說過,作者的風格就是總能以很淺顯的白話表達某一個所討論的主題)。 因為本書真的比較厚一些,我也不可能如同書摘般來記錄每一章的重點,在這裡我是想分享一下我是如何來閱讀本書的。

從書名思考本書的核心關鍵內容,找出自己的體悟

閱讀一本書籍,我總是會先從書名開始思考,本書的核心關鍵字有三個:企業應用程式(簡稱 企業AP)、架構(architecture)、模式(pattern)。 企業AP 會有什麼樣的特性,又與一般的 Web-based AP 有何差異? 我的心中大概就是浮現出大規模的企業AP特性有三:穩定、效能與彈性,三者缺一不可! 而因為有這些各個構面的考量,所以在設計議題上要相當慎重嚴謹,對於開發團隊甚或客戶而言,那種整體性的架構觀是要能有共識的。再來,由於構面與涉及的各類設計議題太多,從無到有是很辛苦的,是否可以借重 “前人” 的設計經驗來應用在現實的開發上,所以,所謂的 “模式”,包括分析、設計、乃至於實作類,期能可以協助我們來解決一再重覆發生的問題。

從關鍵字去推論目前心中的一些想法,其實也沒有什麼對或錯,心中先有個底,再去研讀內容,就會比較有感覺,也可以比較一下作者與自己想法上可能是相同也有可能是不同見解的落差。 本書從大綱的編排上,是分為兩大部分,第一部份是作者稱之為 “Narratives” 的敘述,就是我所說的,Fowler 總是以閒話家常的方式,來表達出他對某些主題的主觀想法。真的是很充分表達出他的觀感,但讀者又不會覺得有壓迫感或那種不是對就是錯的二分邏輯,實在高明之至;再來就是第二部分的 “模式”,這裡如同「重構」那本書一樣,是把每一個模式先歸納在某一個大類內,然後再給予一個名字,成為所謂的模式名錄。 本書我強烈建議的是,要先看 前言與介紹 的部分,價值非凡。 從前言你可以知道作者寫這本書的動機與所要討論的主要議題為何;而介紹也算是作者的一個導讀,也是各個主題的精要解說,甚而是會讓讀者知道可以先從哪裡看起,哪些地方又可以先略過不看,事半功倍。

前言與介紹的部分真的是太精彩了,讓我是逐字細讀來品味作者的想法。Fowler 說他是一位物件導向的狂熱份子,他也不說教,而是從敘述的過程中,讓讀者去瞭解到物件的主要優點在於對複雜的邏輯易於處理。 然後他又提到了一個很有趣的想法,他認為所謂的企業邏輯(business logic)是最沒有邏輯可言的,因為企業邏輯的複雜性,是無法被套用在任何的邏輯性模式,它就是被用在企業人(business people)來贏得商業利益的;任何一點的小改變都有可能贏得商業上的交易,而這也意味著,每一次的小改變都會導致系統的複雜度。為了應付這種 “瞬變” 的無邏輯性,企業AP 就是要被設計成很能禁得起變動,所以本書會討論的設計議題有六大項:企業AP的分層(layering)結構, 企業(領域)邏輯的結構, WebUI 的結構, O-R Mapping 的設計議題, 在 Stateless(無狀態)環境中處理 session(會談) state, 分散的原則。 在介紹這一部份,Fowler 提到了他對一些字彙(術語)的看法,我印象最深刻的就是他說他不懂架構該如何解釋,也不敢去冒犯這個詞彙 (我在想,如果連他都不敢去解釋架構的話,那還有誰能?)。 不過,他還是盡其所能說明架構對他的認知而言,第一個想到的就是 “分層(Layering)” (例如常談及的展示層、企業邏輯層、資料來源層)。 嗯,這裡我倒是也可以分享一下我對架構的看法,我以為架構是一種整體觀,整體需要時常凝聚各種不同角度的觀點,那是一種動態的調和。 另外,作者還有談及包括 效能(performance) 的設計議題,以及對於模式的應用想法。 Fowler 提到了,模式的關鍵點在於具體的實踐,是觀察人們於日常生活與工作中,觀察發現到某一個特定的解決方案;使用模式的關鍵是不能盲目去使用它,所以好像會看到同一個解決方案,但沒有一次是相同的。

設計是務實,是要能調和理想與現實的

500 多頁看來好像好多的內容,其實作者有說只要研讀第一部份即可。這一部份是屬於觀念上的引導,才一百頁而已,而每一個主題又都能分開去看它,其實讀起來並不費力。建立了在平台面設計議題的相關基礎知識與觀念後,就可以參考第二部分作者所整理提供的各類模式,例如 O-R Mapping 的相關設計模式,讓你知道如何建立 Data Mapper 的機制,來橋接領域模型的物件與關連式資料庫的表格。有需要再去看、去查這些模式,否則會很悶,這是作者對讀者的中肯建議。

先前我曾提過,許多所謂的物件導向基本教義派就是掛在無法把他們所認知那種理想美好的那一面(例如,建立純粹是領域的物件模型),給應用在現實的平台環境中。因為,現實上,沒有如此大的記憶體可以容納都是活生生的物件,所以需要給 “冬眠(hibernate)” 到如關連式的資料庫內;因為系統的資源有限,所以需要作資源的控管,包括資料庫連線與物件數量等管理;因為 WebUI 要服務更多廣眾的 Internet 用戶,所以被設計為 “無狀態(stateless)”,但是企業用戶需要的是 “stateful” 服務,如何把 stateless 作成像 stateful,就是考驗了設計者對資源與狀態控管上能否權衡的好。

這是一本專注在系統平台面設計議題的書籍,是討論關於如何把理想美好、能表達出軟體主結構的物件領域模型,橋接至利用現實系統業者所提供對企業層級的開發平台框架與應用伺服器等。對於想要瞭解企業層級的應用系統是如何調和彈性、延展度、穩定與效能等,本書絕對是必備參考的經典鉅作。