原文链接:JavaScript: The Definitive Guide Sixth Edition pdf download ebook

每次,只要我的新书一出来,我准会因为盗版生一肚子气。为这事,我都在Twitter上发过消息了,但在Google搜索框里只有写长一点你才会发现微妙的差异。这篇文章题目是什么意思?就是Google对搜索我的书的人给出的建议。

要是有足够多的人把链接指向我这篇文章,没准搜索建议会把那些找盗版书的人都引到我这个页面,而不是盗版电子书网站 :-) 。[更新:太好了,到今天晚上为止,选择上面截图中的任何一条搜索建议,我的这篇文章都会排在那些电子书下载站点前面!庆祝一下这个象征性的胜利!]

好,下面我就想到哪说到哪,不过可不止140个字符啊,谈谈我对盗版图书的看法。 查看全文 »

原文地址:Got Any Quotes from Coders At Work

编程人生

最近,我看完了Peter Seibel的《编程人生》。哈,这是一本世界顶尖程序员和计算机科学家的访谈。看看都有谁,这些牛人在Wiki上都有自己的条目:Jamie Zawinski、Brad Fitzpatrick、Douglas Crockford、Brendan Eich、Josh Bloch、Joe Armstrong、Simon Peyton-Jones、Peter Norvig、Guy Steele、Dan Ingalls、Peter Deutsch、Ken Thompson、Fran Allen、Bernie Cosell和Don Knuth。

这本书固然非常棒,我非常喜欢,不过囿于访谈这种体裁,比较被采访人关于相同话题的观点也确实有点麻烦。但不管怎么说,作者Peter Seibel还是忠实地记录了他们的言论,所以我就想自己从这些智慧箴言中再提炼出一些真正有用的观点来。

经过一番努力,我按照自己的兴趣(静态类型和不变量)分别挑选出了一些重要的话。我这种分法未必合理,供大家参考吧。

查看全文 »

原文地址:How to advance your career? Read the Passionate Programmer!

我刚看完Chad Fowler的Passionate Programmer(中文版《我编程,我快乐:程序员职业规划之道》),这本书讲的是如何在软件开发行业中取得非凡的成就。我编程,我快乐:程序员职业规划之道

以下是根据这本书总结的,作为程序员,要取得非凡成就需要记住的15件事。

1、走一条不一样的路
在有利于自己的市场中竞争,如果你满足于“泯然众人矣”,那恐怕就得跟那些低工资国家的程序员们同场竞技了。

2、了解自己的公司
以我在医院、咨询公司、物流企业以及大技术公司工作的经验来看,这一点所言不虚。

不同公司的运营模式差异极大。如果你理解企业的运营模式,那你就不一样了!在这家公司中(或者对客户而言),你是参与业务运营的资产,你的工作能直接产生效益!

3、与最优秀的人为伍
很早以前,我喜欢打篮球,被分配到一个水平比较高的队里。一开始适应的确很困难,但环境的压力越大(重大比赛),我的长进也就越明显。

每个领域其实都一样:你周围人的水平(以及对你的期望)越高,你就会变得越优秀。

4、制造差异
每年学习一门新编程语言。为什么不呢?不断尝试新事物,你关注的技术种类越多,脚下的路就越宽广,你的职业生涯就会日新月异。不知道几年后Java的趋势如何?那就学习Clojure。学Ruby还是Python?这两种语言都可以试试啊。然后你才能知道哪种语言更适合某个特定的项目。看,掌握的语言多了,才能在需要的时候信手拈来吧。

5、畏惧,是最大的敌人
还是直接从书中摘一句吧:“在畏惧中做出的职业规划,很可能会让自己后半辈子就一直被‘圈禁’在小隔断里,永远不会有创造明天辉煌的时刻。没错,那样是安全,但有意思吗?”

6、要成为多面手
如果你掌握了所在领域的知识,那你只能是一名专业人士。用PHP编程?花点时间设置一台Apache服务器,让PHP和MySQL都跑起来。一直在用jQuery?试试Prototype。你懂了吧。

7、一个字:做
别指望别人过来教你该怎么做,出去,自己学着去做!
查看全文 »

Tags: , ,

原文链接:A Brief History of Markup
2010年9月23日校毕

A Book Apart 的第一本书,由Jeremy Keith执笔;本文是该书第1章。

HTML是World Wide Web上统一的语言。使用它所提供的标签,人类已经创建了令人惊奇、姿态万千的超链接的文档网络。看看AmazoneBayWikipedia,再看看个人博客和专为猫咪建立的站点,无一不是HTML的杰作。

HTML5是这门通用语言的最新版。虽然这次升级的变化之大史无前例,但HTML更新换代已经不是第一次了。这门语言从诞生之日起一直在发展。

在发明Web的同时,Tim Berners-Lee先生创造了HTML(HyperText Markup Language,超文本标记语言)。1991年,他写了一篇名为“HTML Tags”的文档另见更早的www-talk上的记录),其中建议人们使用20来个元素编写网页。

说到用尖括号包围文本的标签,并不是Tim先生的首创。更早的SGML(Standard Generalized Markup Language,标准通用标记语言)中就开始使用这种标签了。Tim先生当时并没有发明新语言,而是着眼于利用已经存在的技术——在HTML5的发展过程中,这个倾向依然得到了体现。

从IETF到W3C:HTML 4诞生记

HTML 1?这个版本实际上是不存在的。最早的HTML官方规范,是由IETF(Internet Engineering Task Force,因特网工程任务组)发布的HTML 2.0。这一规范中的许多特性,都是在已有实现的基础上归纳总结出来的。比如说,1994年居于市场领导地位的Mosaic浏览器提供了一个<img>标签,作者可以通过它在自己的文档中嵌入图像。后来,img元素就出现在了HTML 2.0中。

W3C(World Wide Web Consortium,万维网联盟)继IETF之后成为HTML后续标准的制定者,其官方网站是http://www.w3.org。20世纪90年代中期以后,W3C对HTML进行了几次升级,直至1999年发布HTML 4.01

此时,HTML的发展走到了一个十字路口上。
查看全文 »

原文链接:http://www.kohala.com/start/rstevensfaq.html
校对时间:2010年9月19日

问题TOC

问:你怎么想到要写UNIX Network Programming返回TOC

1980年代,我在Health Systems International工作,那时候我们先后为很多平台开发过Unix[1]软件。我们跟大多数同时代的创业公司一样,经历过一系列硬件的变迁:起先是VAX-11/750[2],运行4.2BSD[3],然后是个头稍大的VAX(785),接着又是多台VAX(又加了一台8500),有几台PC运行着一种风格的操作系统(Venix、Xenix[4]、DOS),另外还有一台IBM大型机运行VM。因为有多台VAX运行4.xBSD,所以我们就通过以太网把它们连接起来运行TCP/IP,当然装有Unix系列操作系统的PC和那台大型机也都可以运行TCP/IP。除了使用标准的实用工具(ftp、rlogin),我们还着手使用套接字自己开发工具。当时几乎没有文档可查(我从一堆4.3BSD手册中找到两本Leffler等人编写的文档,但非常破旧),因而在想解决某个问题时,就得查源代码。就这样查了一段时间的源代码之后,我意识到应该把自己发现的东西诉诸文字。1988年我开始写UNP,因为每天都要工作,所以这本书写了两年。

我相信UNP以及我的其他书之所以能够获得成功,是我的背景起了决定性的作用。换句话说,我既不是Berkeley也不是AT&T的开发人员,因此写作中就没有“内存转储”[5]的问题。书中的所有内容都是我自己经过深入钻研想明白的。在深入钻研和思考各种原理的过程中,我经常会绕很大的弯子,有时候甚至会走进死胡同。但这个过程对于理解新知识是极为必要的。有很多次我想在书中把某方面的工作原理写出来,自己也觉得很明白,但才刚写了几个测试程序,马上就又碰到了新的、不懂的问题。我在自己的几本书中也尽力传达了这种探索的盲目性,因为我觉得看到某个问题的错误解决方案(并理解它错在哪里),常常要比直接看到正确的解决方案收获更大。

问:你为什么要写Advanced Programming in the UNIX Environment返回TOC

整个1980年代,我翻看最勤的就是Marc Rochkind的Advanced UNIX Programming。但那本书的内容只涵盖了System III[6],我也知道他没有升级那本书的打算。所以,我决定自己写一本高级的Unix图书。

问:你为什么要写TCP/IP Illustrated, Volume 1: The Protocols返回TOC

我对TCP/IP产生兴趣始于1987年夏天在菲尼克斯(Phoenix,美国亚利桑纳州首府)召开的Summer Usenix[7]大会,当时我买了一本Doug Comer的Internetworking With Xinu[8]。(我是在Jim Joyce的书店买的这本书,这个书店开在酒店的一个套间里,他可能也是第一个尝试在Usenix大会上卖书的人。会场上是不允许卖书的。)在回康涅狄格的飞机上,我从头到尾看完了这本书。撰写UNP期间以及1990年代早几年,Doug Comer“卷I”的第1版和第2版先后都被我翻得书脊开了胶。我毕竟是一个业内人士,相对于理论阐述,我更关心对实际工作有指导意义的内容。在翻阅Doug这本教材的过程中,我不断提出一些非常实际但又在书中找不到答案的问题。与此同时,一位在IBM教TCP/IP的朋友也时不时地向我询问一些问题,而这些问题不管是在RFC规范还是其他任何教材中同样也找不到答案。我开始编写一些小测试程序,观察程序运行的结果(参见我这本书的“附录C:sock程序”的开头),冥冥之中感觉到以这种方式来写一本书倒是个不错的主意。我也知道有很多唾手可得的现成工具(大多数都是Van Jacobson写的,了不起!)可以帮我理解这两个协议,这些工具谁都可以拿来用。比如说Tcpdump吧,它不仅仅是一个诊断网络问题的工具,更是一个辅助理解协议原理的无价之宝。最终,在经历了数年的网络编程之后,我慢慢地认识到:80%的网络编程问题根本就不是编程问题,都是对协议运行原理理解不够造成的。

问:你为什么要写TCP/IP Illustrated, Volume 2: The Implementations返回TOC

同样,我是Doug Comer的“卷II”(TCP/IP的Xinu实现)的忠实读者,但在遇到没有实现的功能时总会感到很无助,况且Xinu也不是标准。Berkeley的实现才是事实标准,而且其代码基也“小”(15000行C代码)到可以用1本书——尽管是一本“大”书——来讲完。

问:你为什么要写TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the Unix Domain Protocols返回TOC

这本书实际上是由3本更小的书构成的。第一部分“TCP for Transactions”是对Volume 1第24.7节的重要扩展。这一部分从两个方面讲解了T/TCP:一是通过实例讲解TCP协议扩展(第1至4章,延续了Volume 1的风格),二是分析了4.4BSD-Lite连网代码对T/TCP的实现(第5至13章,延续了Volume 2的风格)。第二部分“HTTP(Hypertext Transfer Protocol) and NNTP(Network News Transfer Protocol)”是对Volume 1的补充,因为这一部分讲解了构建于TCP之上的两个应用层协议。其中有一章详细地解释了繁忙的World Wide Web服务器上实际的数据包,展示了多变的、有时候完全不可思议的TCP行为及实现。这两部分的主题完全取材于Volume 1和Volume 2,而且都是相关领域中重要而流行的实际应用。第三部分“Unix Domain Protocols”是对Volume 2的补充,因为这一部分专注于这些协议在4.4BSD-Lite连网代码中的实现。所以说,最后这一卷其实是对前两卷的一个延伸。

问:我应该看其中哪本书?返回TOC

这取决于你对哪个领域感兴趣。UNP是一本网络编程教材:包含15000行C源代码和大量有关网络编程的详细解释。但是,UNP只介绍了基本的Unix和TCP/IP。相对而言,APUE则完全是一本Unix编程教材,没有涉及网络编程。事实上,可以将APUE看作是对UNP第2章的一个重要扩展。TCP/IPIv1纯粹讲协议:这些协议怎么运行,为什么那么运行(是对UNP第5.2节的一个重要扩展)。这本书里连一行C代码都没有。TCP/IPIv2讲的是TCP/IP的实际实现:包含15000行内核中的C源代码。TCP/IPIv3则是由协议(T/TCP、HTTP、NNTP)和实现(大约2200行内核C源代码)构成的。

我自己对网络编程非常感兴趣,但是我发现要做好网络编程,必须理解网络底层的运行系统(APUE)和底层的协议(TCP/IPIv[123])。

问:你跟Doug Comer合作写过书吗?返回TOC

没有,那个人是普渡大学的David L. Stevens。我们不是一个人。

问:写一本书要花多长时间?返回TOC

每一面大约要花2小时左右。这个时间包含了为出版商制作可供照排机使用的PostScript[9]文件的时间。这样算来,一本600页的书,大约要花1200小时。如果你不制作供照排机使用的文件(例如,让出版商自己排版和做索引),还可以节省一点时间,但我喜欢完全控制最终结果。

问:在写这些书的时候你是通过哪些方式来学习的?返回TOC

我阅读了大量源代码。实际上,阅读源代码的技能大学里通常都不会教,但其实要看懂代码也不是一件多难的事。(还记得John Lion在1977年出版的那本完整展示和分析UNIX Version 6源代码的A Commentary on the UNIX Operating System[10]吗?我很幸运,读研究生的时候,Dave Hanson就拿这本书当教材给我们上课。)虽然我看不到大多数Unix商业版的源代码,但好在仍有不少系统的源代码可以供我研究,例如:4.4BSD-Lite、FreeBSD、Linux、Minix、GNU,等等。

另外,我还会从一些有用的Usenet新闻组中学习。在新闻组里,可以看到解决相同问题的不同手段,可以学到从来没听说过的新知识,也可以目睹别人遇到的一些问题。我每天在Usenet上面阅读和发帖的时间大约是25分钟。

以下是我经常上的一些新闻组:news.admin.announce、comp.security.announce、comp.protocols.tcp-ip、comp.dcom.sys.cisco、comp.unix.bsd.bsdi.announce、comp.unix.bsd.bsdi.misc、info.bsdi.users、comp.unix.solaris、comp.unix.internals、comp.unix.programmer、comp.protocols.dns.bind、comp.protocols.dns.std、comp.protocols.dns.ops、comp.programming.threads、gnu.groff.bug、gnu.announce、gnu.gcc.announce、gnu.g++.announce、misc.books.technical、comp.protocols.time.ntp、comp.protocols.tcp-ip.domains、comp.org.usenix、comp.mail.mush、comp.protocols.nfs、comp.std.unix、comp.text、alt.sys.sun、comp.sys.sun.announce、comp.sys.sun.hardware、comp.std.announce、comp.os.linux.announce、comp.lang.java.announce和comp.lang.java.programmer。

问:你会回复读者的邮件吗?返回TOC

当然。我的电子邮件地址印在了这几本书前言的末尾,我会看收到的每一封邮件。不过,由于邮件的格式混乱,可读性差,这几年我还设计了几种推荐的标准格式。想知道这个标准格式的最简单快捷的方法,就是把你想让我帮你调试的源代码发给我(别笑,要是知道我收到过多少封包含这种请求的邮件,你就不会惊讶了)。其次,可以把构建书中某些源代码期间得到的make输出发给我,并问我怎么解决——出版商好心好意地提供了全部代码下载,但这些代码也只是提供下载而已,并不意味着他们配备了专人来答疑解惑。诸如此类的问题大多数都应该贴到相应Unix版本的新闻组中。

还有不少邮件询问我几年前写过的某篇文章中的某个具体的问题,信不信由你,这些细节我很难一下子都想起来。我的基本原则是,只要我能想出问题的答案,而且不必敲太多次键盘,我就会马上回复。可如果回答问题还需要翻箱倒柜地找书,乃至查阅相关资料,或者需要跟发件人来往通几次信以便了解问题的更多细节,我想我是没有这个时间的。

有很多读者通过邮件问我的编程问题,都应该发到某些Usenet新闻中去——特别是comp.unix.programmer。

问:我也想写一本书。我该从何做起呢?返回TOC

技术书市场跟小说市场完全不同。技术出版商无时无刻不在寻找好书,作者有没有名气都没有关系。我建议你先写出来一些东西(比如,书中比较主要的几章),然后再联系出版公司。联系出版公司的最佳途径是参加技术会议(Usenix、Interop,等等),到他们的展台前当面谈。正常情况下,他们都会对你非常热情的。

再给几个简单的建议:

  • 不要在太细节的内容上花过多时间。我保证这样写出来的东西90%都要改。
  • 不要在导言那一章(通常是第1章)花太多时间,等写完全书再回过头来写。一般来说,这一章是全书最重要的一章,因为它肩负着向读者介绍其他章节内容的重任。想想看,在写完全书之前,有些内容没准是会变的。
  • 如果承受不了批评就不要写书。以下是UNP第1版征求意见稿反馈回来的一些评论,你听听:“啊!这家伙难道一点语法和表达都不懂吗?”“怎么这个人我从来都没听说过呢?”“把括号里那些废话都删了算了”“术语前后不统一。”UNP第2版也有一些难听的话:“整本书到处都是以……开头的句子,根本没法理解。”

另外,要做好重写、重写、再重写的心理准备。这是UNIX Network Programming, Second Edition, Volume 1中的一页(280K的GIF图),看了之后你就知道我说的重写是什么意思了。这是该书第92/93页定稿前的一张照片,愿意的话你可以比较一下。而且,这还只是我自己校正某些表述时所做的修改,是交给其他审稿人审读之前的样子。

问:能谈一谈UNIX Network Programming是怎么出版的吗?返回TOC

前面说过,我是1998年开始写UNP的,基本素材是我整理的一些记录Berkeley连网代码工作原理的内部笔记。至于为什么要写这方面的书,我现在好像也没办法说得很清楚,不过倒是有几个小理由。首先,我已经在一家创业公司(HSI)工作了6年,公司发展很快,编程人员也越来越多,我可以多腾出一点时间来去做些别的事情,不用成天写代码和补漏洞了。加之,我取得博士学位也已经有6个年头了,而我在技术方面的著述还是零纪录。最后,我在HSI又招聘到了这个新人(Gray Wright),刚刚走出校门,思维敏捷,我只有在技术上不断进取,才不至被他落下。(UNP的前言里面提到过Gary,他是第一个阅读我写的所有文字的人。)

在决定了写书之后,接着还得决定要写什么。我个人想写一本计算机图形和网络方面的书。1987年我到楠塔基特岛(Nantucket,位于美国马萨诸塞州东南沿海的岛屿,避暑胜地)过感恩节,我记得当时还带着Tanenbaum[11]的Computer Networks和Foley与Van Dam合著的Fundamentals of Interactive Computer Graphics。但在我回到家以后,我就决定写一本网络编程方面的书。说写就写,我最早给这本书起的名字叫Network Programming。跟大多数新作者一样,我白天上班,晚上利用“闲暇时间”写我的第一本书。

我至今还保存着1989年1月Usenet上的一个帖子:“我正在找一本关于Unix的好书(难道你们大家不想吗?)。我对Unix以及C和Shell编程都已经非常熟悉了。现在打算学习Unix通信方面的知识,例如:套接字、协议,等等。”一周后,另一个标题为“IPC的问题”的帖子询问了实现IPC(Internet Process Connection,进程间通信)的各种方法的细节,我看那些内容都是Marc Rochkind[12]的书里没有讲到的。这些提问让我感觉到自己的决定是正确的。还有一个帖子是Rick Adams在1988年11月23日发的:“终于等到这一天了,不含ATT代码的4.3BSD文件现在人人可用了。”这意味着我可以在这本书里使用Berkeley的代码了。

就这样埋头写了几个月之后,我觉得应该看一看自己写的这些东西有没有出版价值。我跟贝尔实验室一个在Prentice Hall出版社出过书的朋友联系,他给了我那里一位编辑John Wait的电话号码。1988年6月我打了电话,并给他的秘书留了言,然后他竟然给我回了电话!他说话很有意思,想看看我写的东西,告诉我他会参加那一年在旧金山举行的USENIX大会。我注册了这次会议,但最后是让Gary Wright替我去的;他戴我的胸牌。Gary把我的手稿(278页)交给了John。(Gray不久后又在Unix Expo大会上遇见了John,同样还是挂着写着我的名字胸牌。为此,John甚至怀疑书稿其实都是Gray写的,他只是假托是别人写的而已。如果你在哪一届Unix大会上遇见一个人,他的胸牌上写着“Rich Stevens”,你可以这么跟他打招呼:“噢,想必你一定是Gary Wright。”)John说他需要把我写的这几章发出去审校,然后他要么(1)立即开车到纽黑文跟我签合同,要么(2)把合同寄给我,否则(3)跟我说干脆死了这条心去干点别的吧,不要继续写了。随后,我就去夏威夷去度假了,一个月之后我回来了,发现有一条找John的电话留言。我提前并不知情,原来审稿人里面还有Brian Kernighan[13],Brian对书稿的评价是:“相当不错,值得出版。……总之,具备一本好书的潜质。……不管怎么说,都很有必要继续写下去。”John把合同寄给了我,于是我接着往下写。

问:你并没有使用troff写书,是吗?返回TOC

当然用了。还有其他软件吗?troff在业内是首屈一指的,我花了好几年功夫学习它。我在写书的时候用的是-ms宏的一个修改版。在通过troff格式化页面之前,我在输入中添加了很多“微调”指令,很难想象如果用Frame这些细节上的调整怎么做到。我还使用pic制作了所有插图。我用键盘比用鼠标熟练得多,所以使用依赖菜单的绘图软件很耽误时间,也很难受。之所以没有使用TeX,是因为那几年TeX和PostScript不能很好地协同。要是书里数学方面的东西多一些,可能会考虑TeX。

关于生成供照排机使用的文件,我想多说一点。1989年,在我写完UNP的时候,出版商还没有条件处理供照排机使用的文件,当时只有类似贝尔实验室这样的机构才有自己的排字机。因此在写完UNP之后,我又写了15页的PostScript文件,保存在6张1.2MB的MS-DOC磁盘里,并亲自开车把这几张盘从纽黑文送到罗得岛州府普罗维登斯[14]的Typesetting Service Corp.。两天后,他们通过联邦快递(FedEx)把排版后的页面送到Prentice Hall,排版费也是我刷的Visa卡(781页,每页4美元,共3124美元),Prentice Hall后来又把这些钱补给了我。今天,作者只要把最终的PostScript文件通过ftp传给出版商,出版商就可以排版了。

问:你使用哪种Unix系统?返回TOC

我每天都在使用的是运行在Sparc Ultra 5上的Solaris。原因很简单:1990年我在买第一台工作站时,只有SparcStation SLC的价格低于5000美元。那几年,大多数工作站厂商都瞧不上低端市场(有些厂商到现在还是如此)。后来我把SLC升级到ELC,然后又将ELC升级到SparcStation4,最后又换成了现在的Ultra 5。(我大约每3年就升级或更换一次硬件。)我的机器里也安装了很多可自由使用软件(GNU C、GNU troff,等等),而且我发现大多数这类软件都会率先被移植到Sun平台上来,因此感觉还是很舒服的。

运行我这个kohala.com域名的服务器中安装的是BSD/OS(HTTP、匿名FTP、电子邮件、DNS,等等)。BSD/OS是非常优秀的系统,非常可靠,它可以一直运行下去不出任何问题。我喜欢它还因为它的源代码是开放的,平常可以时不时地看一看,偶尔也会自己动手解决一点问题。不过我也买了他们的服务,让他们自己来发现和修复一些bug。(对Sun和BSDI的所有产品,我都是照单付钱的,因此以上所说都是非常客观的。)

我的办公室里还有很多其他计算机,运行着各种风格的Unix(在写UNP第2版时是9种;参见该书原版第21页)。我主要用它们来编译和测试我在其他系统上写的代码,同时也可以方便地在不同的主机环境下运行客户端和服务器。

这些系统和Cisco路由器的管理工作完全由我自己负责,要是连这些都做不了,还怎么写Unix网络和编程的书呢。

问:你喜欢哪些技术书?返回TOC

以下是一个书单,排名没有先后之分。

  • The C Programming Language(Kernighan与Ritchie合著)。我始终很纳闷,为什么有人说这本书太复杂或者太粗糙。这本书简洁、明确,还配有很多示例。
  • Software Tools(Kernighan与Plauger合著)。这本书展示了如何设计然后实现许多简单版的Unix工具:grep、sort、ed等。(没错,连ed都有,这可是每个系统管理员都应该知道怎么使用的编辑器啊。我自己每年都要用很多次,经常在单用户模式下使用,编辑一些基本的配置文件。)我最喜欢引用这本书第250页中的那句话:“同样,如果你打算构建一些东西,一定要保证它们概念上的完整性——不要把一堆无关的‘功能’撺在一起。而且要以增量方式来构建,不要一下子全弄出来。”
  • The UNIX Programming Environment(Kernighan与Pike合著)。经典,在我看来现在仍然“没有过时”。这本书介绍了一些标准Unix命令行工具的用途(以及一些C编程知识),而Software Tools则是一本讲编程的书。
  • The TeXbook(Knuth)。我不用TeX,但我在排版时经常参考这本书。
  • The AWK Programming Language(Aho、Kernighan和Weinberger)。我经常用AWK,主要是编写小程序。不,我不用Perl——我认为它是一种只适合写不适合读的语言。
  • The Elements of Programming Style(Kernighan与Plauger合著)。这本书仍然是所有程序员的必读。
  • On Writing Well(Zinsser)。教你写作的一本好书。
  • Webster’s New World Guide to Current American Usage(Randall)。告诉你怎么克服高中英语课上灌输给你的那些不良表达习惯。

时刻放在我桌子上的两本书分别是Merriam Webster’s Collegiate DictionaryThe Chicago Manual of Style

你也知道,我不只看技术书,我喜欢的小说作者(或者说,他们书的精装本一上市我就出手的那些作者)有:David Baldacci、Patricia Cornwell、Michael Crichton、Patrick Davis、Nelson DeMille、Joseph Finder、Frederick Forsyth、Stephen Frey、John Grisham、Payne Harrison、Greg Isles、Douglas Kennedy、Phillip Margolin、Steve Martini、Douglas Preston和Lincoln Child, 以及Stuart Woods。不过,只有坐飞机的时候看这些书才是为了解闷的。

问:你名字中的W.表示什么?返回TOC

William。我父母想用我舅舅(叔叔)Bill的名字,但又想叫我Richard。他们觉得“William Richard”叫起来要比“Richard William”更顺口。

问:为什么专门为MTS(Michigan Terminal System)写APUE呢?返回TOC

我是1968~1973年在Michigan上的大学,我用的第一台计算机是运行MTS的IBM 360/67,作为未来的工程师,每个人都要上机学习Fortran编程语言。我们使用的课本是Brice Carnahan和James Wilkes自己编写的,Elliot Organick的那本Fortran IV是补充教材。MTS系统本身非常不可思议,包含了很多巧妙的想法,而且差不多是与Unix同时被开发出来的。与Unix一样,MTS蕴含的思想也领先于它的时代,这一点与其他IBM大型机操作系统相比尤其明显。只不过MTS运行在昂贵的IBM大型机上,而Unix则运行在便宜的PDP-11系列上。结果呢,也就不言自明了。

问:你编写的程序里为什么会包含goto?返回TOC

请参考高德纳1974年12月发表在ACM Computing Surveys, Vol. 6, No. 4上的论文,题目叫 Structured Programming with go to Statements。(事实上,那一期的Computing Surveys完全堪称经典。)我想给绝不使用goto的程序员出一道题,就是请在不使用任何goto语句的情况下重新编写tcp_input()(TCP/IPIv2第27章和第28章),注意不要造成任何性能损失(这道题看似简单,实际上可不好解)。


[1] Unix操作系统(官方商标是UNIX,有时候也写作Unix )最早是1969年由美国AT&T公司贝尔实验室的员工肯·汤普逊(Ken Thompson)、丹尼斯·里奇( Dennis Ritchie)、布赖恩·凯尔尼汗(Brian Kernighan)、道格拉斯·麦克伊罗(Douglas McIlroy)和 Joe Ossanna开发的。Unix是1971年最早在在PDP-11(PDP,Programmed Data Processor;PDP-11由DEC公司制造)上运行的操作系统,具有多用户、多任务的特点,支持多种处理器架构。AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进,形成了所谓的“Unix变体”,这些变体反过来也促进了Unix的发展,其中最著名的变体之一是由加州大学柏克利分校开发的BSD产品。后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学术机构,并对之前的Unix及其变体声明了版权权利。结果,导致了一场旷日持久的版权官司。这场官司一直打到AT&T将自己的Unix系统实验室卖掉——同时也为Linux的诞生创造了难得的条件,新接手的Novell公司采取了一种比较开明的做法,允许柏克利分校自由发布自己的BSD,但是前提是必须将来自于AT&T的代码完全删除,于是诞生了4.4 BSD Lite版,由于这个版本不存在法律问题,4.4BSD Lite成为了现代BSD系统的基础版本。要了解完整的Unix及其变体的时间线,请参考:http://www.levenez.com/unix/。——译者注

[2] VAX(Virtual Address eXtension)是一种可以支持机器语言和虚拟地址的32位小型计算机。VAX最初由DEC(Digital Equipment Corporation)公司在20世纪70年代初发明,是原来16位PDP-11的扩展产品。DEC公司1998年1月26日被Compaq(康柏)公司收购,后者2001年9月4日又被HP(惠普)公司收购。VAX被誉为最成功的小型机,其设计师、DEC技术灵魂、小型机之父戈登·贝尔(Gordon Bell)的个人主页为:http://research.microsoft.com/en-us/um/people/gbell/。——译者注

[3]]1974年,伯克利加州大学(University of California, Berkeley)从AT&T公司获得修改UNIX的许可,并在此基础上发布BSD(Berkeley Software Distribution,伯克利软件套件);换句话说,BSD是Unix的衍生系统。1BSD(first Berkeley Software Distribution)是1977年由伯克利的研究生比尔·乔伊(Bill Joy,Sun公司的联合创办人)整理开发出来的。1978年、1979年和1980年,Joy分别发布了2BSD、3BSD和4BSD。4BSD以后的版本由1980年成立的CSRG(Computer System Research Group,计算机系统研究小组)负责发行。该小组于1981年6月发行了称之为4.1BSD的新版本——不是5BSD。由于AT&T觉得5BSD会使用户将它和AT&T Unix System V混淆,Berkely同意改变BSD将来版本的命名规则,将版本号仅保留在4BSD上,以后只增加4后面的小版本号。到1995年CSRG解散时,BSD的最高版本是4.4。1990年代初、中期,NetBSD、FreeBSD以及OpenBSD(从NetBSD小组中分离出来)小组相继成立,它们努力的结晶成为BSD的三个主要变体。BSD的另外两个主要变体NeXTSTEP和Darwin(Mac OS X的核心, 由FreeBSD 4.5和NeXTSTEP混合派生)如今已经演变成苹果公司Mac OS X及iPhone OS的核心。BSD对Unix最重要的贡献之一是TCP/IP。BSD有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4以及4.4-lite。这些发行版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前身,包括AT&T System V 和Microsoft Windows。——译者注

[4] Xenix是微软为微型计算机推出的Unix版本。由于微软购买的授权无法直接让该操作系统以“UNIX”为名,便命名该系统为Xenix。微软在1979年从美国电话电报公司购买了 Version 7 Unix 的授权,并于1980年8月25日发布面向16位系统的版本,由SCO公司将该系统移植至英特尔8086/8088架构。在Unix V7的基础上,Xenix整合了BSD的技术,再加上当时x86处理器的价格低廉,很快便成为当时最受欢迎的Unix发行版。据The Design and Implementation of the 4.3BSD UNIX Operating System(Samuel J. Leffler、Marshall Kirk McKusick,Addison-Wesley,1991.3)称:“如果就运行它的机器数量而言,Xenix可能是发行量最大的一个Unix版本了。”——译者注

[5] “内存转储”原指把内存中的二进制数据以原来的表达方式转存成文件,用于对内存的运行状态进行事后分析。在这里指的是作者不会照搬开发文档,因此书的内容框架和语言表达自然更接近一般读者。——译者注

[6] UNIX System III (有时也称System 3)是由AT&T的Unix Support Group(USG)于1982年发布了一个Unix版本,也是第一个面向贝尔实验室之外发布的版本。UNIX System III综合了多个AT&T版本: PWB/UNIX 2.0、CB UNIX 3.0、UNIX/TS 3.0.1和UNIX/32V。System III支持DEC PDP-11和VAX计算机。之所以将这个版本称为System III,是因为它是UNIX/TS 3.0.1和CB UNIX 3这两个由贝尔实验室内部支持的Unix系统的对外发行版。这个版本的文档叫做UNIX Edition 3.0。之前,根本没有System I和System II这两个Unix版本。而且也没有官方发布的UNIX/TS 4.0(否则,就会有System IV了)。换句话说,System III之后就是基于UNIX/TS 5.0System V了。——译者注

[7] USENIX协会(USENIX Association)是一个高级计算技术协会。其前身是成立于1975年的Unix Users Group(Unix用户组),主要致力于Unix及类似系统的研发。1977年,AT&T的律师通知这个小组不能使用UNIX这个词,因为它是Western Electric(截止到1995年一直是AT&T的生产部门)的注册商标。于是,该小组遂更名为USENIX。这个协会受到了计算机操作系统领域的众多业内人士、开发人员和研究人员的推崇。这个协会每年都会举办一些会议和研讨会,最著名的是OSDI(USENIX Symposium on Operating Systems Design and Implementation ,USENIX操作系统设计与实现研讨会)、USENIX Annual Technical Conference(USENIX年度技术大会)、 USENIX Security Symposium(USENIX安全研讨会)、 FAST(USENIX Conference on File and Storage Technologies,USENIX文件及存储技术大会),以及SAGE(The USENIX Special Interest Group for Sysadmins,USENIX系统管理员特别兴趣小组——非盈利的专业系统管理员的国际性协会)主办的LISA(Large Installation System Administration Conference,大型系统管理员大会)。——译者注

[8] Xinu是一种类Unix操作系统,1980年代由Douglas Comer为教学在普渡大学(Purdue University)开发。Xinu这外名字既是递归缩写(Xinu Is Not Unix),又是“Unix”的反向拼写形式。这个系统曾被移植到很多硬件平台,包括DEC LSI-11和VAX系统、 Sun-2 and Sun-3工作站、Intel x86、PowerPC G3 和MIPS等。——译者注

[9] PostScript是1982年由John Warnock和Charles Geschke专门为打印图形和文字而设计的一种页面描述语言和编程语言,它与打印的介质无关,不管是在纸上、胶片上打印,还是在屏幕显示都没有问题。PostScript的主要目标是提供一种独立于设备的能够方便地描述图像的语言。独立于设备意味着,不需要借助任何具体设备的特性(例如,打印机的分辨率)来描述图像,因而这个描述不需要经过任何修改即可在其他的PostScript打印机上进行打印。PostScript作为一种语言,自己有语法和格式规范,这种语言描述的页面由PostScript文件表示。PostScript文件本身只是用PostScript语言描述了所要显示或者打印的文本及图像有哪些特征、参数,在显示或者打印PostScript文件的时候,再由PostScript解释器解释并打印或者显示。PostScript不仅与设备无关,而且与操作系统无关。无论是Windows操作系统,还是Unix操作系统,都可以阅读和打印PostScript文件。由于PostScript文件是以文本形式存储,因而文件比较小,适合在Internet上传输。(1982年12月,John Warnock和Charles Geschke离开施乐公司创建Adobe,以开发和销售PostScript为生。后来成就了Adobe“帝国”。)——译者注

[10] 完整的书名是Lions’ Commentary on UNIX 6th Edition, with Source Code,据说有中文版,暂时没找到。——译者注

[11]Andrew S.Tanenbaum获得过美国麻省理工学院的理学学士学位和加利福尼亚大学伯克利分校的哲学博士学位,目前是荷兰阿姆斯特丹Vrije大学的计算机科学系的教授。还出版过《分布式操作系统》(Distributed Operating Systems)、《分布式系统:原理与范型》(Distributed Systems: Principles and Paradigms)、《计算机组成:结构化方法》(Structured Computer Organization)、《现代操作系统》(Modern Operating Systems)和《操作系统:设计及实现》(Operating Systems: Design and Implementation)等计算机专著。其中,《操作系统:设计及实现》一书和书中示例的Minix操作系统(也是Tanenbaum领导开发的一个免费用于教学目的的类Unix操作系统)给予了林纳斯·托瓦兹创造Linux操作系统内核的灵感。在他的自传《Just For Fun》(英文意为“只是为了有趣”)中,托瓦兹把这本书描述为“引领我到达新高度的一本书籍”。Tanenbaum是ACM会员,IEEE资深会员,荷兰皇家艺术和科学学院院士,获得过1994年度ACM KarlV.Karlstrom杰出教育家奖。根据Pearson官方网站公布的信息(http://www.pearsonhighered.com/tanenbaum/),Computer Networks, Fifh Edition将于2010年10月出版。

[12]最早的Unix编程专著Advanced UNIX Programming(Addison-Wesley,1985)一书的作者,该书第1版出版19年后,作者推出了“升级版”——第2版,在自己的网站里(http://basepath.com/aup/),作者戏言:“说升级也许有点不恰当了。新版的篇幅达到750页,而旧版中差不多只有20段话没有改过,上一版介绍了70个系统调用,而这一版则达到了300个。”

[13]Brian W.Kernighan,贝尔实验室计算科学研究中心高级研究人员,著名的计算机科学家。他参加了UNIX系统、C语言、AWK语言和许多其他系统的开发,同时出版了许多在计算机领域具有影响的著作,包括The Elements of Programming Style、The Practice of Programming、The UNIX Programming Environment、The AWK Language、Software Tools等。

[14]从康涅狄格州纽黑文到罗得岛州府普罗维登斯大约105英里,约168公里。——译者注

《JavaScript高级程序设计(第2版)》

寻人启示

lyongde 同学,请尽快将你的名字发到我的邮箱里面(lsf.email[at]gmail.com),以便在第二次印刷时加到译者序中以表感谢。

儒家经典《大学》将“格物致知”奉为做学问、养身性的最高境界。

尼古拉斯•扎卡斯重新修订的这个最新版本,为各层次的JavaScript爱好者和Web前端开发人员提供了一条“格物致知”的捷径。

新版本的原书不仅篇幅由原来的600多页增加到800页,而且几乎全部更新、重写了上一版的内容,删除了上一版中与今天的职业需求无关的主题,新增了大量比上一版更有价值、更能反映JavaScript最新发展成果的内容。从颇具深度的JavaScript语言基础到作用域(链),从JavaScript引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)到客户端检测,从文档对象模型(DOM)到基于事件的Web脚本编程,从错误处理到前端调试,从XML(E4X)到Ajax及JSON,从高级前端开发技术到前沿的客户端存储,从最佳编程实践到展望即将成为现实的API,直至JavaScript未来的发展。全书基本上囊括了JavaScript技术的各个方面,几乎涉及到了Web前端开发的所有热门话题。值得一提的是,本书还涵盖了当前最受开发人员关注的HTML5和移动设备(如iPhone)开发的内容。可以预见,本书一定会成为Web前端开发人员不可多得的经典之作。

需要提请读者注意的是,本书第22章讲到了JavaScript未来的变化,里面大部分讲的是ECMAScript 4/JavaScript 2,而ECMAScript 4已经被放弃了,新标准是ECMAScript 5。请读者参考http://www.ecmascript.org/。感谢周涛(Snandy)指出此问题。

本书文前和第1章至第17章由李松峰翻译,第18章至第22章及附录由曹力翻译。武卫东老师审读斧正了序的翻译,责任编辑朱巍为本书早日出版多方协调,执行编辑毛倩倩发现了译稿中多处错译和漏译,排校负责人董秋霞、谢凌老师严把三道排校质量关、谢廷晟全面审校了第1章至第17章,吴玺喆(George Wing)、吴生辉(千年一梦)、周裕波、梁超(LC)、张树恒(shuzai)、罗永德(lyongde)也审校了前17章的部分内容,为确保本书翻译质量起到了重要作用,在此对上述老师和同学致以深深的谢意。

译者
2010年5月

眼下,我正在翻译Beginning Android 2(Apress,March 2010)这本书。之所以翻译这本书,一来是因为这本书比较急,而全书又有接近400页的内容需要翻译,如果找其他译者,少说得3个月;而我打算在1个月左右搞定。二来也是为了学习一下Android开发,以后审稿子也可以做到“胸有成竹”。

之所以想到公开征寻技术审稿人,一是上一本书的样章吸引了120多位朋友的热情参与(“经典名著,精选样章”),几位热心的朋友在出版前也为我指出了一些问题,而这些问题在出版前都得到了妥善解决,保证了最终出书的质量;二是在今天这个开放的环境下,如果还延续那种一个人关起门来翻译的模式,不仅会显得译者自己缺乏公开的勇气,更会拖延译稿中问题的解决(译者无法解决书中全部问题很正常),影响出书进度。况且,样章早晚都是要放出来给潜在读者先睹为快的,后放不如早放,这样也有利于潜在读者提前了解这本书的价值所在和翻译质量——“先尝后买”嘛。

当然,征寻技术审稿人的主要目的,还是为了请领域专家来给译稿把关,尽最大努力来消除翻译中存在的错误或问题,确保最终出书的质量。下面就说一说对技术审稿人的要求:

1、对Android开发有浓厚的兴趣和一定的开发经验;
2、愿意花时间“先睹为快”并有能力指出错误和问题;
3、有一定的中文文字表达能力,能够看懂英文原文。

有意参与这本书技术审校的朋友,请给我发邮件(lsf.email[at]gmail.com)吧,邮件标题请填“Beginning Android 2审校”(以便过滤归类)。

声明一下:对所有参与审校的朋友,我会在译者序中具名致谢。对参与审校而且指出问题较多的朋友,届时将赠送样书(样书可以是本书中文版,或者我翻译过的其他图书,或者图灵公司出版的其他图书——届时我们可以再商量)

另外,对于只是想“先睹为快”的朋友,也可以给我发邮件,邮件标题请填“Beginning Android 2试读”,我会给大家共享部分样章。

期待Android开发专家、高手、大牛、爱好者,伸出援手、不吝赐教!让我们共同携手,为Android开发社区和爱好者又快又好地奉献一本优秀的引进版图书。

Beginning Android 2

Beginning Android 2

在一年一度的新春佳节即将到来之际,应热心读者的要求,为满足大家先睹为快的愿望,也为了答谢朋友们对本博客长期以来的支持,即日起到春节前夕,本站将发布尚未出版的《JavaScript高级程序设计(第2版)》一书的样章(暂定为3章,约115页)。

申请办法

1、发邮件到:[email protected]
2、邮件主题:《JavaScript高级程序设计(第2版)》样章;邮件内容:您的Email地址。
3、24小时内收到样章,先睹为快!

备注:样章格式为PDF,托管在“Google文件”,可以在线查看(无须登录),也可以下载和打印。希望在线查看PDF的朋友,请在邮件正文中注明“希望接收Google文件”字样,即可收到样章的链接(也可以下载);否则,将收到PDF文件(*请确保有5M以上的空余邮箱空间)
样章列表(详细目录

第3章 基本概念
第4章 变量、作用域及内存问题
第5章 引用类型

《JavaScript高级程序设计(第2版)》简介

本书是人民邮电出版社图灵公司引进出版的大畅销书、JavaScript权威著作《JavaScript高级程序设计》的最新升级版。《JavaScript高级程序设计》自2006年11月出版以来,已经累计销售逾30000册,而且至今仍然十分畅销。这一点可以通过北京新华文化发展有限公司(新华书店)近期的店面销售数据看出来(大家可以自行比较一下其他畅销书的销量)。应该说,在Web 2.0革命爆发的同时,人民邮电出版社图灵公司引进出版的本书成就了计算机图书市场上难得一见的奇迹。

本书作者尼古拉斯·扎卡斯(Nicholas C. Zakas)现为Yahoo!公司首席前端工程师,世界顶级Web技术专家。原书第1版曾被选为Yahoo!公司YUI(Yahoo! User Interface Library,Yahoo!用户界面库)团队的内部培训教材。

2009年初,本书第2版面世(《Professional JavaScript for Web developers, 2nd Edition》)。新版本不仅篇幅由原来的600多页增加到800页,而且几乎全部更新、重写了上一版的内容,删除了上一版中与今天的职业需求无关的主题,新增了大量比上一版更有价值、更能反映JavaScript最新发展成果的内容。从颇具深度的JavaScript语言基础到作用域(链),从JavaScript引用类型到面向对象编程的最佳实践,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)到客户端检测,从文档对象模型(DOM)到基于事件的Web脚本编程,从错误处理到前端调试,从XML(E4X)到Ajax及JSON,从高级前端开发技术到前沿的客户端存储,从最佳编程实践到展望即将成为现实的API,直至JavaScript未来的发展。全书彻底涵盖了JavaScript技术的各个方面,几乎涉及到了Web前端开发的每一处细节。可以预见,这部著作一定会成为Web前端开发人员不可多得的又一部经典。

目前,《JavaScript高级程序设计(第2版)》的翻译工作已经进入后期阶段(全书22章,所剩不到5章)。而且,为确保新版及时上市与读者见面,出版社采取了与译者同步翻译、同步编辑审校的特别措施。新版本预计2010年上半年可以上市;当然,在确保出版品质的前提下一定会尽量往前赶!

样章详细目录

第3章 基本概念 1
3.1 语法 1
3.1.1 区分大小写 1
3.1.2 标识符 1
3.1.3 注释 2
3.1.4 语句 2
3.2 关键字和保留字 3
3.3 变量 4
3.4 数据类型 5
3.4.1 typeof操作符 5
3.4.2 Undefined类型 6
3.4.3 Null类型 7
3.4.4 Boolean类型 7
3.4.5 Number类型 8
3.4.6 String类型 14
3.4.7 Object类型 16
3.5 操作符 17
3.5.1 一元操作符 17
3.5.2 位操作符 20
3.5.3 布尔操作符 26
3.5.4 乘性操作符 29
3.5.5 加性操作符 30
3.5.6 关系操作符 32
3.5.7 相等操作符 34
3.5.8 条件操作符 35
3.5.9 赋值操作符 36
3.5.10 逗号操作符 36
3.6 语句 37
3.6.1 if语句 37
3.6.2 do-while语句 38
3.6.3 while语句 38
3.6.4 for语句 38
3.6.5 for-in语句 40
3.6.6 label语句 40
3.6.7 break和continue语句 41
3.6.8 with语句 42
3.6.9 switch语句 43
3.7 函数 45
3.7.1 理解参数 47
3.7.2 没有重载 48
3.8 小结 49

第4章 变量、作用域和内存问题 1
4.1 基本类型和引用类型的值 1
4.1.1 动态属性 2
4.1.2 复制变量值 3
4.1.3 传递参数 4
4.1.4 检测类型 6
4.2 执行环境及作用域 6
4.2.1 延长作用域链 9
4.2.2 没有块级作用域 10
4.2.3 声明变量 10
4.2.4 查询标识符 11
4.3 垃圾收集 12
4.3.1 标记清除 12
4.3.2 引用计数 13
4.3.3 性能问题 14
4.3.4 管理内存 15
4.4 小结 15

第5章 引用类型 1
5.1 Object类型 1
5.2 Array类型 3
5.2.1 转换方法 6
5.2.2 栈方法 7
5.2.3 队列方法 8
5.2.4 重排序方法 9
5.2.5 操作方法 11
5.3 Date类型 12
5.3.1 继承的方法 14
5.3.2 日期格式化方法 15
5.3.3 日期/时间组件方法 15
5.4 RegExp类型 17
5.4.1 RegExp实例属性 19
5.4.2 RegExp实例方法 19
5.4.3 RegExp构造函数属性 21
5.4.4 模式的局限性 23
5.5 Function类型 23
5.5.1 没有重载(深入理解) 25
5.5.2 函数声明与函数表达式 25
5.5.3 作为值的函数 26
5.5.4 函数内部属性 27
5.5.5 函数属性和方法 29
5.6 基本包装类型 31
5.6.1 Boolean类型 32
5.6.2 Number类型 33
5.6.3 String类型 35
5.7 内置对象 42
5.7.1 Global对象 43
5.7.2 Math对象 46
5.8 小结 49

埃里克·米拉利亚(Eric Miraglia)

从诞生至今的大部分时间里,焦虑、抨击、蔑视和误解一直与JavaScript如影随形。JavaScript刚刚问世那几年,很多“严肃的程序员”都认为它不够严肃。

相比之下,.COM泡沫时期加入Web开发行列的许多文科生,则普遍觉得JavaScript深不可测、晦涩难懂。就算那些耐力和韧性俱佳者能够把JavaScript琢磨得很透,但仍然摆脱不掉竞争性浏览器提供的不同实现给他们带来的麻烦。凡此种种,最终导致粗制滥造的脚本越来越多。另一方面,拜Web前端代码的无比开放性所赐,各种坏习惯不断从一个站点被粘贴进另一个站点的源代码中。那些实现活该臭名昭著,可是,JavaScript这门语言也因此被严重拖累,背上了不该有的坏名声了。

2001年前后(随着Internet Explorer 6的发布),浏览器实现已经大为改进,Web开发实践也开始得到改善,呈现出了二者水乳交融的局面。作为Ajax核心的XMLHttpRequest对象正慢慢地为人们所发现,一种新的桌面风格的用户交互模式出现在浏览器中。允许JavaScript操作Web文档结构和内容的DOM API已经定型。而CSS,不管人们如何曲解或者无视它,也无论浏览器开发商怎样丧心病狂地实现它,都已经成长得足够茁壮,它的美妙和反应敏捷令它能够与新的Web交互能力配合无间。最终,JavaScript一扫颓势,变得令人惊诧、让人兴奋、使人敬畏。想想2004年第一次使用Google Maps时的情景吧,那种感觉你或许还记忆犹新。

Google Maps是新兴应用程序的典型代表。这类浏览器编程与后端编程并重的应用程序,不禁令人对Web浏览器窗口中那块“画布”的未来浮想联翩。(除Google Maps之外,早在2003年就基于网页邮件客户端提供类似Outlook功能的Oddpost,也是这类应用程序的一个了不起的先驱。)随着这类应用程序如雨后春笋般大量涌现,以及支持它们的浏览器的市场份额不断攀升,一个Web应用全面复兴的时代真的到来了。“Web 2.0”诞生了,Ajax也成了“IT”技术。Web似乎在一夜之间脱胎换骨,重新激发起了人们的兴趣。而JavaScript作为唯一的Web编程语言,也变得更有意思了。

有意思,但用好它却不简单。JavaScript以及在DOM和BOM中为其定义的API不一致的实现,给跨浏览器编程造成了比原本大得多的困难。前端设计行业还远未成熟。大学教学计划并没有(至今仍没有)做出相应的调整,以满足相关的培训要求。

到2004年底,JavaScript无疑已经成为最重要的编程语言。但从学术角度看,它依然不具备进入一类学科的资格。Web虽然已经翻开了新的一页,但在培养足够的知识全面、训练有素的人才方面,我们依然面临着严峻的挑战。

为此,很多技术作者挺身而出,撰写了不少有关JavaScript的图书。几年来,这类书虽然也出了不下几十本,但总体来说仍然不尽如人意。其中有的在推销与落伍的浏览器有关的技术,有的则在卖弄容易剪贴但却不好扩展和维护的技术。让人想不通的是,许多JavaScript图书让人觉得作者好象并不真正喜欢JavaScript,或者他们不认为读者应该喜欢它,再或者他们根本不相信读者能够完全理解JavaScript。

2005年,Nicholas C. Zakas这本书的第一版面世,为前端工程领域奉献了一本真正的好书。当时,我和雅虎的同事们正在创建YUI(Yahoo! User Interface Library,Yahoo!用户界面库),打算将其作为公司前端工程的基础,同时也借以推广我们这门新学问的最佳实践。每到周五,我们就聚到一间教室里讨论前端工程,也向大家讲解JavaScript、CSS以及在浏览器中创建Web应用程序的知识。我们从已出版的高级JavaScript及DOM脚本编程方面的图书中认真挑选了几本,想让新工程师通过它们掌握如何构建耐用、基于标准且容易维护的Web应用程序。Zakas的书一出版,马上就被选为我们的JavaScript内部培训课本。

从那时起我们就一直使用他的书。我们一致认为这本书太有用了,于是就跟Zakas商量,让他加入雅虎帮我们建立公司的前端工程社区。

Zakas在书中传达的理念与众不同——JavaScript既需要严肃认真地对待,但也是完全可以理解和掌握的。如果你是个程序员,这本书会告诉你JavaScript与各种编程语言的关系,以及如何运用你已经习以为常的各种编程模式。你可以理解JavaScript的继承机制及其固有的动态特性(虽不合传统,但却十分自由十分强大),可以从Zakas这位尊重和理解JavaScript的同道那里学会欣赏JavaScript这门语言。

如果你曾经是一名文科生,在网络泡沫时期步入了这个行业,至今也没有转行,而且想要弥补自己在JavaScript方面的不足,你会发现Zakas是一位难得的良师益友。他可以帮你实现从“会做”到“做好”的转变。他能让你认真地理解这门严肃的学问。最重要的是,他不会让你先入为主地产生对这门语言应该理解多深的想法。相反,通过他严肃、耐心、通俗易懂的讲解,你自然而然地会对这门语言有同样深刻的认识。

本书是经过扩展、更新和改进后的第二版,删除了上一版中与今天的职业需求无关的主题,并用我们在2005年至2008年学习的新知识更新了剩余的内容。这几年是JavaScript发展的重要时期,Zakas则始终位于最前沿孜孜不倦地学习这些新知识。他这些年一直在致力于建造新一代最流行的Web个人门户(My Yahoo!),以及开发Web上最受欢迎的站点(Yahoo!主页)的新版本。Zakas以他作为老师和作者的独特视角,筛选出由这些超复杂、超大型应用程序磨砺出的经验,并将这些经验融入到了本书的字里行间。

他给出的解决方案远远超出了一本好书的范畴,只有每天都与代码同呼吸共命运的人,才有可能与读者分享如此具有实用价值的知识。

说实话,本书新版的面世对我和各位读者而言真是个莫大的喜讯。因为它的内容比上一版更有价值、更能反映JavaScript最新的发展成果,因此也更加令人不可错过。

埃里克·米拉利亚(Eric Miraglia)
YUI高级技术经理 哲学博士
于加利福尼亚州森尼维耳市

Nicholas C. Zakas,Yahoo!主页首席前端工程师Nicholas C. Zakas,Yahoo!主页首席前端工程师,个人网站www.nczonline.net。《Professional JavaScript for Web developers, 2nd Edition》作者。最新专著《High Performance JavaScript》(O’Reilly Media; 1 edition,March 15, 2010)。