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