目前正在重讀《Core J2EE Patterns》這本書。經歷了幾年的編程生活和系統設計,重讀這本書的第二版,感觸良多。 恰好看到gigix在blog中發表的“那本”J2EE書——《J2EE核心模式》(第二版)譯者序 。 雖然我很少看中文的技術書籍,但是這篇譯者序卻值得收藏,收錄在自己的blog中。借此,感謝譯者翻譯這本書,為廣大的中國程序員帶來了一本好書。
“那本”J2EE書
劉天北 熊節
(原文刊登于《中華讀書報》2005年2月23日號)
翻開這本《J2EE核心模式》,你首先就會注意到軟件方法論領域的兩位大師GradyBooch和MartinFowler撰寫的序言。在這樣兩份序言后面再附上一篇“譯序”,這個念頭本身就足夠荒謬和僭越,不啻于在莎翁之后再寫一出關于丹麥王子復仇的劇本。大師們的判斷是中肯而毫不含糊的:“沒有這本書,就別開發EJB。”他們的擔保足以確認本書在其論域中舍我其誰的地位。它就是“那本”J2EE書(THEJ2EEbook)。
當然,對于廣大中國開發者而言,我們早就已經在“沒有這本書”的條件下開發了大量J2EE、乃至EJB應用系統。那些充滿了波折和磨難的開發歷程似乎讓不少程序員產生了某種自信;在掌握了若干API細節、若干應用服務器配置訣竅、若干框架類庫用法之后,他們或是公開、或是暗自地把自己當成了當之無愧的Java企業開發專家———不,這些話沒有任何揶揄的意思:我們想說的其實是,本書恰恰是為以上這一類開發者寫的。對于他們想成為 “Java企業開發專家”的隱秘欲望,這本《J2EE核心模式》就是最大限度的補救和成全。如果說,此前的各種教程都是在介紹J2EE開發中的“內容”要素———也就是,教給我們“做什么”———的話,本書關注的則是這里的“形式”要素,是“怎樣做”才能開發出高效的、優雅的J2EE系統。讀者從中學到的,將不僅僅是“J2EE技術”,而是“如何使用J2EE技術進行設計”。
換句話說,如果你以前沒有過J2EE實踐,但明早將應聘一個需要“1年J2EE開發經驗”的職位,本書中不包含你今晚要徹夜吞咽的那一類知識;相反,如果你,這位隱形的“Java企業開發專家”,追求的職位是“資深Java應用系統架構師”,如果你預料到未來的上司明天將問起“怎樣實現訪問控制”、“何時采用細粒度的接口設計”等“高階”問題,那么恭喜你,今晚———乃至今后———你選對了補課的讀物。
作為本書第一版的忠實讀者,我們(半是欣喜、半是驚訝)發現眼前的這部第二版構成了全新的閱讀經驗。作者們按照最新版J2EE技術規范(尤其是EJB2.1)全面修訂了技術細節;根據模式社區的研究交流,作者們補入了若干模式;即使是一些不涉及技術更新的部分,論述方式、示例也完全不同于第一版;原有的PSA項目(第一版“尾聲”一章)融入了其余各章的“示例代碼”部分;而新增的整整一章討論“微架構”的尾聲、對WebService 等技術的關注、對各種的持久化方案(定制持久化、EJB、JDO等)的深入討論,都體現出作者們對本書新版的持續投入。
受益于本書有年,在此我們也想不揣冒昧地為本書的中國讀者們建議一條高效的閱讀路徑:與第一章相比,第五章“J2EE模式概覽”是讀者更合理的起步點。請尤其關注其中對“分層”、“術語”和模式/策略區別的討論,這些都是貫穿全書的重要概念!其次,應該通讀第二章“表現層設計考慮和不佳實踐”和第三章“業務層設計考慮和不佳實踐”:即使你不打算使用任何模式,甚至,即使你根本不關心J2EE開發,只要你的工作與分布式企業應用系統有關,這兩章考察的問題都是你遲早會遇到的。至于每個具體模式本身,我們則推薦讀者留意其中詳盡的“策略”部分和那些散布其中的“設計手記”。前者討論了對同一個模式的多種實現方案,后者則突出介紹了特定開發領域的一些核心概念和考慮。
一部英文技術論著在漢語中的旅行,永遠是一段難以捉摸的行程。對于本書的漢語譯者,“技術難度”并非挑戰:全書討論的正是譯者們最為熟知的一個領域,所以我們能夠負責任地說,在這個中譯本里,沒有任何技術細節會因為譯者的無知或生疏而發生變形或曲解。這次翻譯的原則和前提是對原文的徹底領會。
事實上,譯者的工作中遇到的困難主要發生在“語匯”層面。簡單地說,J2EE專著的譯者總要面對“翻,還是不翻”的兩難處境:對象、函數的名稱,UML圖中的各種元素,這些內容由英語表示早就是約定俗成,即使是英語程度略低的開發者大概也都能讀懂,所以,在讀者能夠理解的部分盡可能保留原文似乎是一種合理的做法———畢竟開發工作最終是與代碼有關,而代碼則肯定是要出之以“英文”的。但在另一方面,翻譯的責任就在于讓不諳原文的讀者也能通達作品,如果譯文中大量段落(不包括示例代碼)都仍保留為英文或“類英文”,那么讀者也就無法直觀地獲得原文包含的信息。反復權衡之后,在這個譯本中譯者的解決方式還是折衷的。工作中我們采取了以下原則:
首先,術語盡可能采用通用文獻定譯,不自創譯法。對于各個模式的名稱、模式文檔模版各部分名稱、重構手法名稱,我們參考了李英軍等譯《設計模式》、熊節等譯《重構》等譯作,以及IBMDe鄄veloperWorks中文網站的部分資源。
其次,本領域的一些常見術語,如果沒有定譯,本書也不自我作古、強譯為中文,而是保留英文原字。這一類的術語包括:applet、 servlet、bean、entitybean、sessionbean、cookie、WebService等。根據我們的觀察,在日常工作中,國內的開發者已經習慣按原文使用以上術語。在一些情況下,我們也以注釋形式澄清了這些術語的用法。
第三,模式中的對象名稱,往往按照代碼風格命名,比如“BusinessObject”、“CustomerTO”等。如果對此完全不加翻譯,那么很多充斥這類表達的段落就很難理解。我們的原則是,在每個自然段第一次出現某個這類表達方式時,用括號注明,比如 “BusinessObject(業務對象)”、“CustomerTO(客戶傳輸對象)”等。希望這個做法能夠維持易懂和簡潔之間的平衡。
第四,書中示例代碼占有相當大的比重,而代碼注釋則是理解這些代碼的關鍵。我們把所有代碼注釋譯為中文。而對在視圖中顯示特定結果的代碼(比如調試信息等),我們沒有改為中文,只是在必要時對輸出信息的涵義加以注解。如果讀者更信賴代碼原貌,還可以從本書官方網站http //www.corej2eepatterns.com/下載。
第五,原書不包含注釋。目前的所有注解都是譯注。書中申義未暢處,譯文中以方括號“ ”加以解釋、補足,略去生澀。這與上面兩條原則一樣,都類似于在原作講話時的插嘴———但翻譯任務本身,似乎本就已經是一種“插嘴”了。在博學的讀者看來,有時候譯者或許還不如保持體面的沉默———但我們只能力圖做到插嘴而不多嘴。
原書經多人、多版修訂完成,難免存在打字、排印錯誤。譯本根據本書官方網站的最新勘誤表訂正,并結合參照本書第一版,另外修正了數十處錯誤。
(本文為即將于2005年3月出版的《J2EE核心模式》中文版的譯序,本報刊登時有刪節)