翻开这本《J2EE核心模式》,你首先就会注意到软件方法论领域的两位大师GradyBooch和MartinFowler撰写的序言。在这样两份序言后面再附上一篇“译序”,这个念头本身就足够荒谬和僭越,不啻于在莎翁
当然,对于广大中国开发者而言,我们早就已经在“没有这本书”的条件下开发了大量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核心模式》中文版的译序,本报刊登时有删节)