zoukankan      html  css  js  c++  java
  • Programming WCF Services翻译笔记(一)

    一、缘起

    从去年的九月开始以来,我开始体验到了笔耕不缀的乐趣与痛苦。说是乐趣,是因为我非常享受码字的这种感觉,仿佛是小说家在倘佯在自己虚构的世界一般,任思想天马行空,无拘无束。虽然说技术要求严谨,但又何尝不需要一点点想象力呢?严谨方可以确保技术的正确与准确,然而如果没有幻想与创新,那么技术的突破就会成为奢谈了。

    托尔斯泰曾说到:幸福的家庭总是相似的,然而不幸的家庭却各有各的不幸。然而,对于创作的痛苦而言,文学创作也好,技术创作也罢,这种痛苦却是完全相似的。就像秀才作文,愁眉苦脸比自己老婆的生小孩还痛苦。那是因为老婆生小孩虽然痛,但好歹肚子里有一个小孩在;而自己腹中空空,什么也没有,怎么写得出来。我在著作《软件设计精要与模式》时,深刻体会到了这种刻骨铭心的苦恼。

    12月底,在诸方的催促下,总算如期交稿。在等待出版社校对与出版期间,一种创作的欲望似乎告别了冬眠,彻底地醒转过来。正巧当时没有什么项目开发任务,于是我寻思着把自己的《叩开C#之门》系列形成为书。简单地列了一个目录,然后就兴致勃勃地开始了创作。写书总是一件让我惶恐的事。因此,写了两章之后,我赶紧放到网上去,希望能看看大多数人的反应。没想到获得的好评极大地刺激了我的虚荣心与自信心,而此时清华大学出版社也开始联系我,想看看本书似乎有出版的价值。正想要开始我的C#创作之旅时,一天,机械出版社的陈冀康先生忽然找到我,问我是否愿意翻译Juval Löwy的Programming WCF Services一书。这一提议让我怦然心动,毕竟WCF正是我研究的方向,如果本书经我翻译出版,或许能够成为国内WCF著作的先行者吧。

    因为重装了机器,丢失了所有的邮件地址,我无法联系到清华大学出版社的陈小姐。反正,市场上有关C#的书多如牛毛,也不缺我这一本,因此优先级自动降到最低。于是,Programming WCF Services一书的翻译就开始提上日程了。在交付翻译的样章后,陈先生的效率很高,没有几天就与我签订了翻译合同。没想到这就开始了我的磨难。

    因为出版社要稿要得很急,如何在保证翻译进度的同时,保证翻译的质量,成为了我的苦恼。厚达600页的著作也不是那么容易啃下的。幸运的是,邀请到了徐宁先生与我共同翻译本书,总算把重担略为分出了一些。然而,陆续遇到的翻译过程之中的障碍,逐渐使得我视翻译如虎,却又不得不硬着头皮上景阳岗。
    翻译的过程真可以比得上是打虎的过程。不,应该说更难,因为我的目的不是打虎,而是要驯虎。而要驯服一头成年的老虎,给观众带来精彩的演出,更是难上加难。不过毛主席不是教导我们要将敌人看作是纸老虎吗?幸好这本书还真的是用纸印刷的,纸老虎而已,我也应付得下。

    因为我的一个旧习,我产生了将这次翻译过程记录下来的想法。我可以将翻译过程中收获的经验、体会以及困难一一记下。此外,也可以将本书的精彩之处撷取出来,与读者共享。最重要的是希望能获得更多的批评与建议,可以使得我驯虎的过程可以平坦一点。

    二、翻译障碍

    翻译的标准无非是“信达雅”三字。说易行难,毕竟这三个字尽数了翻译过程的三个境界。对于一般的文学翻译而言,要达到“信”的标准,相信不难。然而对于技术书籍的翻译而言,则未必尽然,最头疼的问题就是技术术语的翻译。特别是本书,由于WCF是基于.NET 3.0平台的SDK,可以说是一门全新的技术。我很难找到有关WCF技术的中文文档,也就是说,这就限制了我无法站在前人的肩膀上望远,也失去了“前人栽树,后人乘凉”的机会。

    如果是写技术博客,那么完全可以直接使用这些术语,有时候“不译”反而比“译”更容易让读者明白。然而,翻译书却不能这样,唯一的原因就是出版社不允许。我很佩服前人翻译技术术语的创造力,例如多态(polymorphism),架构(Architecture)、原型(prototype)等等,虽然读来平淡无奇,但却准确地体现了英文的原意。

    面对WCF的新奇术语,我就开始苦恼了,我在思考如何来翻译这些桀屈敖牙的名词。如果翻译不好,没准就会成为译作的硬伤。仔细思考,解决的办法大约有这么几个:

    1. 尽量与已有的翻译保持一致

    例如WCF中的contract(契约)、endpoint(端点)、Hosting(宿主)等等,基本上它们的翻译已经得到了大多数人的认可。如果我硬要将它们分别翻译为合同、结束点、运营者,那就是属于没事找抽了,何况这些翻译已经足够好了。

    有的词语比较少见,但我们可以借助网络去查找已有的翻译,然后比较一下,看是否可以采纳。例如Network Hops,当我看到这个词语的时候,就非常困惑。毕竟我对于网络技术比较陌生。在Google下查找之后,我得到一个答案,就是hops常常是hop count的缩写,一般翻译为“跳数”。因此,将Network Hops翻译为网络跳数,应该不会有太大的争议。

    2. 通过对上下文的理解创造新的词语

    这些词语往往是一些合成词或短语。以英文方式合成这些词语一点都不奇怪,翻译成中文时,就有些让人读不懂了。例如Ordered Delivery,应该翻译为什么呢?由于它的本意是代表消息的交付必须按照一定的顺序,最后根据这一层意思,我将其翻译为有序交付,或者可以说是差强人意。再例如Federated WS binding,根据上下文意思,知道它是由WSFederationHttpBinding类实现,支持WS-Federation安全通信协议,所以思考再三,决定将其翻译为WS联合绑定。类似这样的翻译,到处都是,但由于这样的术语可能是第一次使用,因此往往我会在翻译的词语中,增加英文原文的说明。

    3. 不翻译

    实在是不能翻译的,或许保留原文是最佳的办法。然而在翻译书中,这种情况只限于大家已经耳熟能详的名词,特别是缩写,例如WCF、HTTP等。

    为了保证技术术语的准确性,我会维护一个术语表,预备放到网站上,希望能获得更多人的建议。

    三、以开发的方式进行翻译

        虽然是翻译,但我们仍然可以将项目开发应用到整个翻译过程中。总结下来,大约分为这样几个步骤。

    1、 快速原型
    在软件开发过程中,经过需求分析阶段后,为尽快地获得客户的认可,最佳方式就是采用快速原型的办法,建立初步的软件模型,向客户提交一个Demo版本。对于翻译而言,就是尽快地将英文原文翻译为中文,里程碑目标就是“信”。在翻译过程中,可以基于自己对这门技术与英文的理解,获得一个粗糙但忠实于原文的版本。这个版本允许语言不通畅、允许不去分析代码,允许出现小错误,甚至可以对原文“不求甚解”。目前,对于Programming WCF Service一书,我已经完成了“快速原型”阶段。

    2、 定期迭代
    比之于瀑布模型而言,RUP的方式更容易控制需求变更。如果能够采用敏捷编程的定期迭代,则更能够快速地满足客户的需要。本阶段的里程碑目标是“达”。要求能够在“信”的基础上,做到逻辑清楚、语言通顺,同时要保证技术表达的合理与正确。要完成这一目标,必须深入理解作者的创作意图与实现目标。要实现这一阶段的里程碑目标,可以采用如下的方法:
    (1)重构
        在软件设计时,重构的目的就是改善既有代码的设计。翻译过程中,在“信”的基础上进行重构,就是要改进第一阶段译文的词汇、语序的用法。由于第一阶段仅仅是忠实原文意思的翻译,因此可能会出现西化方式的语序。尤其是长句的翻译,一大堆定语从句,如果如实翻译过来,会显得语句冗长不易理解。词汇也是如此,对于同一个英文单词,有许多相似相近的中文词语与之相配。特别是很多时候,需要对照上下文,才能获得准确表达原文意思的词语。重构,就意味着对词语的推敲,争取找到最适合的词语,表达原文的涵义。
    (2)持续改进
        持续改进主要是要修订第一阶段译文的原则性错误,特别是术语技术范畴的错误。那么前提条件就是必须对翻译的内容,有足够深度的理解。如果有代码,最好能通读一遍,完全理解。如果有示例,则最好能运行一遍,体会作者的意图。如果作者出现了错误,最好能够纠正这些错误。不能寄希望于持续改进的目标是一蹴而就,翻译的时候,可能需要反复地阅读原文与译文,争取能够使得译文与原文完全吻合。
    (3)变更控制
        变更控制比较特殊,主要是基于作者对原书的修改,例如原著作的勘误表。一旦发生了原著作的变更,好的做法就是要将这些变更体现在译文中。译者要翻译好书,最佳的方式是与作者进行无障碍的沟通。只有在充分理解作者意图的基础上,方能够创作出好的译文,通达的译文。而作者也可以通过这样的交流方式,及时将变更消息通知译者,好在译文中作出修订。

    3、 版本交付
    一般而言,在将软件交付之前,都需要执行测试阶段。对于翻译而言,特别是多人合译,那么最重要的测试过程就是:集成测试与UAT(用户验收测试)。集成测试需要统一风格、统一技术术语,统一描述方式。这是必要的,否则会给读者带来支离破碎的感觉。UAT的执行过程比较困难,因为翻译的客户就是读者,考虑市场的需要,译者不可能事先将译文交付给读者。少去了这样一个环节,确实会带来许多质量问题。但如果能有选择性的公布个别章节或个别内容,仍然是有好处的。
    版本交付阶段的里程碑目标是“雅”,因此除了bug的修复之外,持续地改进仍然是有必要的。“雅”的境界很难达到,但趋近于“雅”,越能够创作出经典的译作。就像软件开发需要优雅的设计一样,译者的全局掌控能力与细节雕琢能力,决定了这一目标是否能够达成。

    四、本书的内容

    本书作者的声名不用多说。他是IDesign的负责人,软件架构师,是《COM与.NET组件服务》、《.NET组件开发》的作者,还是Visual Studio杂志以及.NET杂志的特约撰稿人。他在.NET组件开发以及分布式开发领域,享有盛名。Programming WCF Services是他的又一部力作。

    本书一共分为十章,分别为:WCF基础、服务契约、数据契约、实例管理、操作、错误、事务、并发管理、队列服务、安全。内容几乎囊括了WCF技术的方方面面。通过阅读本书,可以使得你能够全面深入地了解WCF技术,并迅速成长为一名WCF专家。毫无疑义,通过对本书的翻译,在整个过程中我也在不断地成长,对WCF的理解也能愈发地深刻。这也正是我愿意本书最重要的理由。

    以下摘自我对本书序的翻译,简单介绍了各章的内容。

    第1章   WCF基础

    本章从一开始阐释了WCF的技术原理,并描述了WCF的基本概念和构建模块,例如地址(addresses)、契约(contracts)、绑定(bindings)、端点(endpoints)、宿主(hosting)和客户端(clients)。本章末尾还探讨了WCF架构,它将是帮助我们理解后续章节内容的关键。本章假定读者已经了解面向服务的思想与优势。如果你不具备这方面的知识,可以先阅读附录A的内容。即使你已经非常熟悉WCF的基本概念,我仍然建议你对本章作一次快速浏览,它不仅能够巩固你的已有知识,而且本章介绍的一些帮助类与技术术语将有助于你阅读全书。

    第2章    服务契约

    本章专注介绍服务契约的设计,以及如何使用服务契约。首先,你会了解到服务契约的相关技术,包括服务契约的重载与继承以及其它高级技术。接下来,本章将深入探讨契约的设计要素,以利于系统的重用、可维护性与可扩展性。最后,本章演示了如何通过暴露的契约元数据完成运行时的交互编程。

    第3章    数据契约

    如果客户端与服务的数据类型无法共享,如果没有采用相同的开发技术,那么应该如何处理它们之间数据的交换?通过本章,你可以看到一些有趣的现实问题,例如数据版本、元素集合的传递,究竟是如何处理的。

    第4章    实例管理

    究竟哪些服务实例处理何种客户端的请求,本章给与了一一的回答。WCF支持多种服务实例管理、激活与生命周期的管理,这些技术与系统规模、性能息息相关。本章介绍了每种实例管理模式之间的关系,指导读者何时以及如何有效地利用它们。本章介绍了与实例管理相关的论题,例如分流(throttling)。

    第5章    操作

    通过处理操作类型,使得客户端能够调用服务,并遵循相关的设计指导,例如如何改善和扩展基本功能,以支持回调的安装与销毁,管理回调端口与通道,提供类型安全的双向代理(duplex proxies)。

    第6章    错误

    本章全面介绍了服务如何报告错误,然后如何将异常回送给客户端。既然异常与异常处理的创建是与特定技术紧密结合的,因而无法跨越服务边界。本章深入探讨了有关错误处理的最佳实践,使得客户端的错误处理与服务实现解耦。同时,本章还演示了如何扩展和改善WCF基本的错误处理机制。

    第7章    事务

    本章一开始从整体上介绍了事务的动机,接着讨论了事务服务的方方面面,包括:事务管理架构、事务传播配置(transaction propagation configuration)、WCF提供的声明性事务支持、以及客户端创建事务的方法。本章末尾则讨论了相关的设计指导,例如事务服务状态管理与实例化模型。

    第8章    并发管理

    WCF针对并发与同步的管理,提供了强大然而简单的声明式实现。本章详细地介绍这一实现方式。然后,本章还展现了更多的高级技术,诸如回调、可重入性(reentrancy)、线程关联度(thread affinity)、同步上下文以及避免死锁的最佳实践与指导。

    第9章    队列服务

    本章描述了客户端如何实现将面向服务的调用放入队列,如此就可以采用异步方式,完成脱机工作。从一开始,本章就介绍了队列服务的创建与配置,然后集中讲解诸如事务、实例管理、操作失败以及它们对服务业务模型以及实现所造成的影响。

    第10章    安全
    通过将多方面的任务分解为基本要素,如消息传递、认证与授权,就可以揭开面向服务安全的神秘面纱。本章继续探讨了如何为intranet和internet应用程序等关键场景提供安全保障。最后,我介绍了针对声明式WCF安全所设计的框架,它可以自动配置安全,简化对安全的管理。

    附录A    面向服务概述

    附录A为那些渴望了解面向服务基本知识的读者提供。全篇介绍了我对于面向服务的具体应用。附录定义了面向服务应用程序(而非通常所谓的架构)和服务本身,并从方法学的角度,考察了面向服务体现出来的优势。附录还介绍了面向服务的原则,以及从大多数应用程序都需要的实用点出发,重点突出了面向服务的抽象原则。

    附录B    服务发布与预订

    附录B展示了我设计的框架,它能够实现发布-订阅(Publish-subcribe)事件管理系统。该框架能帮助你简化发布-订阅服务,只需要编写一两行代码即可完成。发布-订阅模式是第5章讲述的内容,之所以将其放到附录中,是因为它使用了其它章节的内容,例如事务与队列调用。

    附录C    WCF编码规范

    附录C基本上列举了书内书外所有与WCF相关的最佳实践。本编码规范只在于解释“如何做”以及“怎么做”,而不阐述其原因。规范背后隐藏的基本原理可以参见本书各大章节。本编码规范同样使用了本书讨论过的帮助类。

    是否渴望阅读本书的所有内容呢?目前,我已经完成了快速原型阶段,进入了定期迭代阶段,然而离版本交付还有接近三个月时间。如果你已经不耐烦了漫长的等待,那么请跟随着我的翻译笔记。这个系列会逐步展示本书的冰山一角,庶几可以满足你的部分愿望。

  • 相关阅读:
    ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
    ASP.NET Web API 框架研究 核心的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
    ASP.NET Web API 框架研究 ASP.NET Web API 路由
    ASP.NET Web API 框架研究 ASP.NET 路由
    ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
    MVVM模式
    RESTful Web API 理解
    C# 函数式编程及Monads.net库
  • 原文地址:https://www.cnblogs.com/wayfarer/p/783077.html
Copyright © 2011-2022 走看看