写书小记
我的书《Node.js开发指南》将要在7月10日左右出版上市,回想过去一年花费的心血,不禁感慨良多。借此良机,我记录了一下过去一年的些许经历,向大家大致介绍一下这本书是如何诞生的。
我已经忘了是从什么时候开始接触到Node.js的了,大概是2009年末或2010年初吧,那时Node.js还不像现在这么火,祗是刚刚诞生的众多前途未卜的新技术框架之一。一言以蔽之,Node.js就是一个让JavaScript运行在浏览器之外的东西。说起JavaScript,市场上JavaScript的书几年前就已经泛滥了,许多书的一个共同特征就是介绍以浏览器为基础的JavaScript,大多都是花很少篇幅介绍JavaScript语言本身,花大量篇幅放在DOM、BOM的分析或jQuery这样的框架上。想想看这也是理所应当的,如果在当时不介绍浏览器中的开发,学习JavaScript有什么用呢?
说起Node.js,它本质上并不是什么新东西,服务端的JavaScript十几年前就有了,异步程序设计也不是什么新思路,祗是把它们结合起来放在服务器端,多少看来像一个异端。我呢,虽然对前端开发有所涉猎,但并不工于此道,偏偏我又对JavaScript这个语言有所偏好,Node.js简直就是为我量身定做的了。不知为何,Node.js这个「异端」就这么火起来了。2010年是Node.js飞速发展的一年,它从一开始的默默无闻突然间变得大红大紫,这是我接触之初都始料未及的。2011年它的发展更是迅猛,众多巨头都加入了支持,甚至连开源宿敌微软都伸出了橄榄枝,这让Node.js实现了真正的完全跨平台。
任何一个新技术在诞生之初遇到的最大的障碍就是文档的匮乏,这一点祗有喜欢尝试的人才有所体会。早期的Node.js文档非常糟糕,没有任何教程,也没有成熟的「解决方案」供参考。遇到问题以后上Google搜索一般都是没有答案的,能依靠的祗有去邮件列表询问。询问还不一定有结果,所以很多时候要阅读源代码。
2011年7月,我刚刚放暑假,想想闲来无事,不如写一个Node.js的入门教程。想到便做,于是我打开当当网,在上面搜索了关键词Node.js,期望能有什么已经出版了的书以供参考,但没有任何结果,影印版也没有,这并不令我意外。我又上Amazon.com搜索,令我始料未及的是竟然才祗有一个搜索结果,那便是当时还未上市的《Node Web Development》。在我的印象中,凡是在国内买不到的书在Amazon上肯定有英文版,但这次竟然Amazon也没有!看来这个技术实在是太新了,导致市场上还没什么书。当下我的心中便萌生了一个大胆想法,我何不写第一本书呢?
这个想法简直太猖狂了!看看很多书的作者都是大学教授,或者产业界的领军人物,有无数的经验。而我呢,才不过一个大二的学生,写的书会有人看吗?甚至连能不能出版都是个问题。此外我除了有一个维护了五年的博客以外,没有任何写作经验,要写一本书谈何容易?也算是初生之犊不畏虎,我当时就决定大胆去尝试了,反正大不了就放到网上大家看呗。尽管完全不知从何下手,但想起某些国外的书上作者写着自己是用LaTeX写成的,所以就从学LaTeX下手吧。于是我花了一个星期看各种LaTeX的入门资料,学会了编辑一些简单的文档,看了许多高人留下的宏包和模板,但LaTeX的繁复还是远超我的预期,想排版出一本书真是太难了。挫败感第一次击败了我,五分钟热度过了以后,我对写书也提不起兴趣了。后来我才知道作者其实不用太关心排版的,出版社有专业的编辑,而且他们都用Word……不过我找到了更好的工具Sphinx,此后的整本书都是用它写成的。
一放就是一个多月,当我再次提起兴趣的时候,是我开始加入Accounts9的开发。之前虽然也用Node.js写过不少好玩的东西,但都是自己折腾,这是第一次用Node.js开发真正要应用起来的东西。实际项目开发的过程中让我学到了许多以前没有注意到的细节,我对Node.js的兴趣重新被点燃,于是我准备好好研究一下Node.js。我从Amazon花了几十美元买了全世界惟一的一本关于Node.js的书《Node-Web-Development》,到货以后便如饥似渴地读完了所有的篇章。令我有些失望的是,这本书写得并不怎么样,而且版本太老,Node.js在诞生之初的变化是极快的,许多API如过眼烟云,换一个版本就改头换面了。这毕竟也难以苛责作者,总要有人做先驱嘛。好在Node.js版本在0.6以后API已经趋于稳定,不会再「翻天覆地」了。静言思之,我发现面对的是一片未经开垦的处女地,因为祗要是第一本书,无论好坏总会有人买单。
冷静下来,我决定先拟定一个提纲,然后就开始动笔。我花了一个月写了两章,分别是「Node.js简介」和「JavaScript高级特性」,前者是一个对Node.js的综述性介绍,而后者则是针对服务器端开发的需求讲解JavaScript,与大多数围绕浏览器介绍JavaScript的书有很大不同。写了两章以后,热度再次减退了,因为暑假已经结束,各种课业的压力纷至沓来。尽管写成一本书很有成就感,但远水不解近渴,于是我又被击败了,写书之事又搁置了下来。
有道是「无巧不成书」,世事偏偏就是那么巧。有一次我和一个学姐(徐可可)一起吃饭,聊到她的家教工作,她说道她的一个学生家长是某个什么出版社的。我一听精神为之一振,便向她介绍了我已经搁置了的写书计划。她听完以后也挺感兴趣的,答应帮我询问具体出版事宜。后来得知,这位在出版社工作的学生家长竟然就是图灵出版公司的总编谢工。图灵出版公司啊,我仰慕已久,不知道读过他们的多少好书(《C++ Primer》、《JavaScript高级程序设计》、《黑客与画家》……)。通过她我与图灵的另一位总编杨海玲取得了联系,并且在CNode社区的北京交流会上见面认识了。杨海玲也是IT出版界赫赫有名的人物,她在来到图灵公司之前,她曾经是机械工业出版社下华章公司那一套黑皮的「计算机科学丛书」的出版负责人,像《算法导论》什么的当年都是她翻译引进的。我斗胆把写好的两章稿子和提纲交给了她,忐忑不安地期待评价。几天以后,我得到了不错的反馈,简直像是给我注入了一针强心剂,我又有动力继续创作了。
转眼到了寒假,我开始把全部精力投入写书当中,回到学校时我的书也完成了接近一半。但随着写作的进度深入,终于遇到了瓶颈——有些章节我实在不知道该怎么写。再加上又一学期开始了,我写作的进程再次渐渐陷入了停滞。这次我清醒地认识到必须在找点激励了,于是我找到图灵,签订了出版协议。现在,有合同约定我要在4月1日之前交稿,我便不得不克服困难了。事实再次验证,往往是期限即将到来的那几天工作是最有动力的,我最终还是按照合同约定交稿了。写作到后期时,我找了不少人帮助审稿,在审稿的过程中我发现原本自己认为写得不错的地方还有很大改进的余地。我比较向往的出版方式是持久地修订,而不是一次性交稿,但限于目前的现实条件,这还做不到。
并不是说交稿以后就没事了,我还要和编辑共同审教、排版,后期的排版过程中我又发现了一些错误。所以说,一个出版公司的好坏很大程度上看编辑后期是否认真,图灵在这方面可以说是佼佼者。再到后来图灵还帮我设计了几个封面,最终我选中了下图这个方案:
感谢对这本书提出宝贵意见的我的朋友们,他们是牟瞳、李垚、周越、钟音、萧骐、杨旭东、孙嘉龙、范泽一、宋文杰、续本达、田劲锋、孟亚兰和李宇亮。他们为本书的结构、内容、语言表述等方面给出了许多有建设性的建议。感谢CNodeJS社区的贾超和田永强,微软亚洲研究院的杨懋,以及VMware公司的柴可夫。他们不仅帮助审阅了本书,还解决了许多技术问题,给这本书提出了许多改进方案。还要感谢我的朋友徐可可、图灵教育出版公司的杨海玲、谢工、王军花以及其他各位编辑,他们给我提供了许多帮助和鼓舞,没有他们的激励,我很难顶着巨大的学业压力坚持写完这本书。
特别要感谢的是弓辰开发的Rime输入法,我依靠它完成了本书的创作。本书写作的时候是准确的传统汉字,出版时按照版署要求转换为了简化字(通过OpenCC)。
最后引书中的一段文字: 在过去JavaScript一直不被人重视,很大程度上是因为它太低效了——不仅速度慢,还占用大量内存。但如今Javascript的效率却令人惊讶。历史总是如此相似,正如没有Shockley发明晶体管就没有电子科技革命一样,如果没有2008年以来的JavaScript引擎革命,Node.js就不会这么快地诞生。
2008年Mozilla Firefox的一次改动,使Firefox 3.0的JavaScript性能大幅提升,从而引发了JavaScript引擎之间的效率竞赛。紧接着WebKit开发团队宣告了Safari 4新的JavaScript引擎SquirrelFish(后来改名 Nitro)可以大幅度提升脚本执行速度。Google Chrome刚刚诞生就因它的JavaScript性能而备受称赞,但随着WebKit的Squirrelfish Extreme和Mozilla的TraceMonkey技术的出现,Chrome的JavaScript引擎速度被超越了,于是Chrome 2发布时使用了更快速的V8引擎。V8一出场就以其一骑绝尘般的速度打败了所有对手,一度成为JavaScript引擎之王者。于是其他浏览器开发者的重新开始奋力追赶,与以往不同的是,Internet Explorer也加入了这次竞赛,并取得了不俗的成绩。
时至今日,各个JavaScript引擎的效率已经不相上下,通过不同引擎根据不同测试基准测得的结果各有千秋。更有趣的是,在不知不觉中JavaScript的效率已经超越了其他所有传统的脚本语言,并带动了解释器的革新运动。JavaScript已经成为了当今速度最快的脚本语言之一,昔日「丑小鸭」终于成了如今惊艳绝俗的白天鹅。
这是单独介绍本书的页面:Node.js开发指南。