从几个与 DOM 脚本编程有关的术语翻译说起

Posted by admin | JavaScript, 原创 | 星期二 14 8月 2007 1:36 下午

本文的关键词:Unobtrusive Javascript、Progressive Enhancement、Gracefully Degrade。

今天,刚开始学习 JavaScript 的人是有福气的,因为他们面对的 Web 世界虽然还不够完美,但毕竟较之从前已经是进步良多了。

为什么这么说呢?JavaScript 新手可能或多或少地知道,在早期浏览器竞争的背景下,各浏览器厂商标新立异,独树一帜,纷纷推出自己的独门绝技。“百花齐放,百家争鸣”的结果虽然催生了 Web 的早期繁荣,为 JavaScript 后来登堂入室埋下了伏笔。但同时也造成了 JavaScript 脚本编写者们苦不堪言的局面,大量的时间和精力被投入到了浏览器及版本检测上面。而且,为实现同一个功能往往要针对不同浏览器的不同版本多次重写相同的代码逻辑,导致了严重的人力资源浪费;在更深层面上,由于无法做到“编写一次,随处运行”,也就意味着将来的 API、库或者框架们根本没有诞生的土壤。而且,由于代码无法重用意味着开发效率难以提升,JavaScript 编程似乎永远是难登大雅之堂的“小玩艺”而已。

可怜的 JavaScript

可怜的 JavaScript! (摘自《Practical JavaScript DOM Scripting and Ajax Projects》)

在 W3C、ECMA 以及一些有识之士的不懈努力下,也是在 Microsoft 的 Internet Explorer 不断改进的基础上(毕竟 IE 的市场份额太大了),Web 开发产业终于等到了第二个春天--一个遵奉标准、笃行规范的 Web 新世界展现在世人面前。JavaScript 也从“世上最被人误解的语言” ,一跃成为 Web 开发产业中的又一主角,而且随着 Ajax 异步通讯模式的“重现江湖”并迅速大行其道,以 JavaScript 框架、RSS、XML 等诸多 Web 技术的创新应用为标志的富客户端概念再度流行。JavaScript 终于得到了它应有的尊崇地位。

JavaScript 获得了应有的尊敬

JavaScript 获得了应有的尊敬。(摘自《Practical JavaScript DOM Scripting and Ajax Projects》

如今,当初学者们随便拿起一本 JavaScript 书时,“Web 标准”都是出现频率最高的词汇。但在 Web 标准的背后,有三个重要的关键词注定将被载入史册,它们分别是:Unobtrusive Javascript、Progressive Enhancement 和 Gracefully Degrade。

提到这三个关键词,也要提到三个人:Chris Heilmann、Jeffrey Zeldman 和 Jeremy Keith。Chris Heilmann 最迟在 2005 年 6 月之前写成一篇长文,文章题目就是 Unobtrusive Javascript 。而 Jeffrey Zeldman 则在 2003 年 5  月出版了专著 Designing with Web Standards(中文版由电子工业出版社出版),该书较早地提倡“遵循 Web 标准进行设计”;而  Jeremy Keith 则是成立于 1998 年的 Web Standards Project (WaSP) 的 DOM Scripting Task Force 的领导人,也是 DOM Scripting(中文版由人民邮电出版社出版)的作者,对 DOM 脚本编程的发展起到了直接推动作用。

当然,Chris Heilmann、Jeffrey Zeldman 和 Jeremy Keith 只是倡导 Web 标准的众多有识之士中的代表人物,而 ECMA 262(ECMAScript Language Specification)和 W3C 的 DOM、Event 和 Style 等规范作为标准匆庸置疑地起到了中流砥柱的作用。

其实,最终还是想分享一下我对 Unobtrusive Javascript、Progressive Enhancement 和 Gracefully Degrade 这三个新兴术语的理解。

Unobtrusive Javascript,字面意思是“不唐突的 Javascript”或者“不莽撞的 Javascript”。虽然直译未尝不可,但显然不够精确。要精确地翻译这个词,就需要从其本质含义下手,追根溯源,查清它的来龙去脉。请看下面简单的代码:

function someFunc() {    if (!document.getElementById || !document.createTextNode){    return;    }   /* … 其他代码 … */ }

someFunc 函数的函数体内第一行是一个 if 语句,该语句判断的条件是

!document.getElementById || !document.createTextNode

即,如果浏览器不支持这两个标准方法中的任何一个,那么就返回--什么也不做;也就是说,只有当浏览器同时支持这两个标准的方法时,才会执行 if 语句之后的代码。这其实就是所谓的 Unobtrusive Javascript 的核心,很有点知难而退的意思,不是吗?翻译成中国话就是“知其可为而为之”或者“知其不可为而不为”。那么,这个意思怎么翻译,而且怎么用三、四个汉字来准确地表达相同的意思呢?为寻找合适的答案,我几乎穷思极虑,仍然不得要领。结果,苦思冥想了好几个月的问题,今天堵车堵在天通苑时,似乎找到了答案。不卖关子了,我想出的译法是--“有的放矢”,说全了就是“有的放矢的 JavaScript”。“有的放矢”这个成语的意思是“有靶子才射箭。比喻说话、做事都有明确的目的(金山词霸2007-高级汉语词典)”。Chris Heilmann 虽然不一定知道中国有这么好的成语,但他的意思肯定也是这样。总而言之,Unobtrusive JavaScript 是一种“文雅”的说法,如果不客气的说,那就是“不标准的浏览器我 JavaScript 不伺候!”。能想出这么一个词,也真是难为这些老外了,想想他们,再想想自己,苦思冥想几个月又算得了什么呢?

Progressive Enhancement 和 Gracefully Degrade 可以说是一对儿“双胞胎”。因为,如果只有它们其中一个,而没有另一个,那么整个“包容”的概念是不完整的。说白了(怎么老是忍不住用粗话呢?),为了给用户更佳的体验,我想做到 Progressive Enhancement。然而,要是人家浏览器不支持怎么办?好吧,那就 Gracefully Degrade 吧。换句话说,Progressive Enhancement 是代表美好理想的新体验,而 Gracefully Degrade 则是面对残酷现实的替代品。(难怪 DOM Scripting 的译者们会把后者译为“预留后路”呢。没错,要是美好的理想实现不了,也不能“一死了之”呀,所以要“留一手”才对)。这两个概念,也不是只有与 JavaScript 有关的书中常见,.NET 中同样有类似的术语。但就 JavaScript 而言,这两个概念应该如何翻译才好呢?字面意思, Progressive Enhancement 是“改进性增强”,而  Gracefully Degrade 是“优雅的降级”,没错,但还是不够准确(笔者在2006年6月份翻译 Chris Heilmann 的长文《从 DHTML 到 DOM 脚本编程》时就将前者翻译成了“进步性增强”,将后者翻译成了“适度地妥协”,但现在认为这仍然不准确)。同样经历了一个艰苦的去粗取精、去伪存真的漫长过程,也同样是在今天堵车堵在天通苑时,这两个术语似乎有了点眉目。

从本质上讲,这两个概念涉及到通过 JavaScript 提升用户体验(增加更多的便利功能)和保证网页的可访问性(不能“英勇就义”就算完事了)这两个重要的核心思想。而决定用户体验好坏的当然是 JavaScript 所提供的新功能。如果用户的浏览器支持标准(并且启用了 JavaScript),那么 JavaScript 就会通过提供更多的便利功能使用户体验更上一层楼;而如果浏览器不支持标准(或者出于安全考虑关闭了 JavaScript),那么就把这些便利功能统统撤掉,就当它们不存在,虽然用户不如在前一种情况下方便,但仍然可以保证访问到页面的内容。基于这个分析,我决定把这两个术语分别翻译为:“功能增进”和“功能减退”。这样,无论从字面上,还是从含义中,都能体现 JavaScript 在面临标准和不标准的浏览器共存(以及用户开不开启 JavaScript )的现状时,所作出的抉择。

PS:以上分析我在11月份有又了新认识 :)

以下是笔者在 2006 年 6 月翻译的 Chris Heilmann 的长文《从 DHTML 到 DOM 脚本编程》(1.0版)。其中,有些概念和用词并不一定准确,请读者诸君善自斟酌,本文仅供参考。

从DHTML到DOM脚本编程_v1.0

16 条评论 »

  1. 评论 作者 Chris Heilmann — 2007-08-24 @ 4:19 下午

    I just stumbled over this and I am impressed that you went through all this trouble translating my article :)

  2. 评论 作者 admin — 2007-08-24 @ 4:59 下午

    I am so sorry for translating your artilce before get your permission.
    but your article indeed inspire with me to translating it to my mother tongue,and shared it with all persons who want understand what it is that the change from DHTML to DOM Scripting.
    You do a good job! thank you. :)

  3. 广播 (Pingback) 作者 Chris Heilmann 的留言 — 2007-08-24 @ 8:02 下午

    […] [为之漫笔] 评论: 《从几个与 DOM 脚本编程有关的术语翻译说起》 […]

  4. 评论 作者 xhan — 2007-10-06 @ 10:23 上午

    翻译成“通用的”或者“健壮的”可以吗?

  5. 评论 作者 xhan — 2007-10-06 @ 10:24 上午

    Unobtrusive

  6. 评论 作者 admin — 2007-10-06 @ 12:33 下午

    xhan网友,对这几个术语译法的最新结论、也是我在翻译《Advanced DOM Scripting》一书过程中与出版社编辑商定的:

    • Unobtrusive还是翻译为“不唐突”为好。这样,像“unobtrusiveness”这样的词就可译为“不唐突性”
    • progressive enhancement译为“渐进增强”
    • graceful degradation译为“平稳退化”

    理由就是贴近原义翻译,保持原词的内涵及外延,也利于统一和推广。

  7. 广播 (Pingback) 作者 学习 DOM 脚本编程的捷径 — 2007-10-15 @ 8:52 上午

    […] 事物的本来面目往往很难吸引更多的目光,就是因为本质的东西太枯燥、太乏味、太没趣--甚至赤裸裸。在这个热衷于包装、追求感观刺激的时代,这本书以朴实无华(甚至笨拙)的语言,详述了 HTML、CSS 和 JavaScript 在 Web 标准化大潮中各自扮演的正确角色,书中的案例完全是“纯手工”打造,让读者一遍又一遍地感受到重用、DOM 逻辑,以及结构、行为和表现相互之间天衣无缝的结合过程。正是这一遍又一遍看似简单的重复,使读者逐渐培养起了结构、行为与表现三层分离的理念,巩固并提升了  Web 可用性、兼容性和可维护性的意识。最终,把读者领入了基于标准进行 Web 开发的殿堂。 虽然,书中的个别章节有“粗制滥造”之嫌(比如:from DHTML to DOM Scripting 一章,就不如作者的长文更具完整性),但瑕不掩瑜,它仍然是一本光辉的里程碑式著作。不用华丽的辞藻、没有深奥的理论、抛弃传统的桎梏、Make the life easy!这就是这本书的宗旨和口号。 […]

  8. 广播 (Pingback) 作者 JavaScript几个重要术语的翻译 — 2007-11-10 @ 8:32 上午

    […] 几个月前,曾经就这几个术语的翻译问题写过一些文字(从几个与 DOM 脚本编程有关的术语翻译说起)。但后来因了翻译《Advanced DOM Scripting》与图灵公司傅志红编辑交流中,又有了新的认识。所以,现在我的译法是: […]

  9. 评论 作者 Chance — 2008-03-06 @ 2:58 上午

    个人以为“稳妥”这个词挺好,唐突实际上现代汉语里很少用到了,感觉很正式,而且“不唐突”似乎有点不好理解。技术图书我个人觉得易读是很重要的,应该尽量使读者一眼看过去,就知道什么意思,而不是像阅读理解那样,很累地分析句子结构。

    无论是渐进增强,还是平稳退化,目的都是为了稳妥,不出现奇怪的,出乎访问者意料的结果。

    您关系的缓替我都很感兴趣,我也和刘江老师有过一些关于计算机图书的交流,希望有机会深入和您探讨!

  10. 评论 作者 admin — 2008-03-06 @ 10:53 上午

    Chance,你好!你说的“稳妥”也有道理,有机会咱们再讨论一下。

  11. 评论 作者 Jason.Chen — 2008-03-10 @ 5:25 下午

    The technique to completely separate Javascript from the other two layers of web development has become commonly named “unobtrusive Javascript”。
    楼主你怎么理解这句话。我的理解是 把javascript完全地从web开发的其他两层(html:内容,css:表现)分离开来的技术一般上命名为”unobtrusive Javascript”。同样,我在jQuery in action这本书上看到的unobtrusive Javascript,也是介绍如何将javascript从html中分离开的。所以我认为你理解错了。你还是个译书的,如果你确实是理解错了,那么将会误导更多的人。我没有别的意思,只是不希望错误的观点被传播—-假如我的理解是正确话。如果你确定我理解错误了,烦请邮件通知我,谢谢!

  12. 评论 作者 Jason.Chen — 2008-03-10 @ 5:40 下午

    而且,我认为现在刚开始学习JavaScript的人是没有福气的,在我碰到的很多新手中,感觉他们被如海般的新知识(例如各种各样的框架、ajax、RIA等)淹没,他们不再注重JavaScript作为一门语言的本质,不关心javascript的一些基础知识,分不清哪些是javascript core,那些是client-side javascript,0级1级2级DOM更是毫无概念,以为没有浏览器就无法运行javascript。动则谈这个框架那个框架,好像javascript已经被他们完全掌握。所以我认为新手们是不幸的,在他们眼前有太多的繁华,他们很难找到事物的本质。

  13. 评论 作者 admin — 2008-03-10 @ 9:12 下午

    @Jason.Chen

    根据我的理解——unobtrusive不仅仅是“从其他两层中分离开来”那么简单。分离的JavaScript(即完全使用外部JavaScript)也有可能是obtrusive(唐突的);相反,不分离的JavaScript也可能是unobtrusive(不唐突的)。呵呵,别以为我在“开历史倒车哟!”

    事实上,不能孤立地理解unobtrusive。这个概念就像是“物竞天择”的理念一样——原始社会适用这个理念,现代社会同样适用这个理念——这个理念并不会因为原始社会没有农村与城市之分就不适用,因为“物竞天择”意味着“优胜”和“劣汰”。同样地,理解unobtrusive也必须从它的含义着眼,即“progressive enhancement”和“graceful degradation”。只要你的JavaScript脚本能够适当地实现“渐进增强”和“平稳退化”,那么就是unobtrusive——跟分离不分离有什么相干?

    分离是为了提高代码可重用性、可维护性;而不唐突则着眼于“任何使用JS的行为增强都不能损害网站的内容有效性和可访问性,都必须考虑在没有JS支持或者JS被客户端浏览器禁用的条件下,如何让用户获得视图不同但却有相同信息量的页面”。

    至于现在学习JavaScript的人有没有福气,这是个价值观的问题。您去过沃尔玛、家乐福或者宜家吗?或者任何一家大型超市吗?每一种商品都有那么多的品种、花色、型号、档次、价位……您说消费者有福还是没福呢?如果您是位精干的家庭主妇,相信一定会巧妙运用选择的艺术;如果您是位不爱购物傻老爷们儿,那面对这么多花样简直就会烦死!

    对于一个善于学习的人,学习资源的丰富是一件何等的幸事!?对于一个事事都需要“老师”或者“父母”安排好了以后才去做的人,那么最最不幸的事莫过于选择太多、无所适从了!

  14. 评论 作者 Jason.Chen — 2008-03-11 @ 9:11 上午

    你回头看看你自己是怎么解析Unobtrusive JavaScript的,有提到分离吗?最基本的你都丢了,还说别的干嘛?再说了,你对完全分离javascript的理解就是错误的,你的理解是“即完全使用外部JavaScript”!还有,不要给javascript强加上那些所谓的啥啥啥!物竞天择,上超市购物都整出来了,你怎么就不来个佛家道家儒家法家呢,我告诉你,没用!你还不如告诉新手们,老老实实捧起犀牛书,认真去学习javascript的基础,这样还来得实在!
    还有,现在写javascript一样得为了多浏览器兼容而努力,ajax,dimensions,event,selector等等,我说的你都知道是什么吗?不要告诉我你就会写长篇大论的空话!
    多少想认真学习的人就是被糟糕的著作和译文给耽误了的!这责任应该谁来承担!
    为了说明白这件事,我已经多次帮你展示你那恶心的google广告了!你应该感谢我!

  15. 评论 作者 Jason.Chen — 2008-03-11 @ 9:24 上午

    哦,语气有点不善了,不好意思,我承认错误,下次我心平气静地说。

  16. 评论 作者 hax — 2008-04-14 @ 3:09 上午

    unobtrusive这个词就我的印象,老外用的时候,本身就没有统一确定的内涵和外延。不同作者往往在稍有不同的侧面在使用这个词。楼主和JasonChen所说的都是有这样用的。相对来说楼主所作的理解(渐进增强和适度降级)属于更为引申的含义。此外也有指一段JS脚本本身避免侵入和破坏其他脚本(比如修改Object.prototype的行为就被认为是obstrusive的,应该避免)。

    js用于behavior layer,要与其他层分离。以及要避免传统js的弊病。这两点我认为是unobstrusive的本义。基于这种理解,就翻译而言,我比较喜欢 不乱入 这种译法。相对来说,这个译法不是很容易表达出graceful degradation。

对这篇文章的评论的 RSS 聚合。 TrackBack URI

发表您的评论

验证码  If you cannot see the CheckCode image,please refresh the page again!