原文地址:Lax Language Tutorials
Andrew Binstock

每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁。从这些年的评审经验来看,这些语言类教程的写得都不错,但除此之外,少有亮点。换句话来说,这些书都很严谨、很精密,如果读者有足够的定力,通过它们掌握一门语言的编程技术还是不成问题的。可是,即便对那些卖得最好的书,除此之外我都想不出来还能多说几句什么样的赞美的话了。

这些书普遍存在的一个缺点就是把简单的任务复杂化。最大的或者说最常见的一个问题,是作者们混淆了教程与一本面面俱到地介绍一门语言的专著的区别。由于种种原因,出版行业似乎特别热衷于后一种体裁,结果就导致了一些令人瞠目的大部头。我曾经看到过一本“介绍”Java语言的书,厚达1480页。如果说入门读物都得这么厚,显然是不合理的。不消说,这本书深入地讨论了一下AWT和Swing,然后笔锋一转,又给读者罗列出各种各样的第三方库,关于虚拟机的研究当然少不了,而最终则收尾于并行程序设计。谢天谢地,到这里终于全书完。鉴于这本书已经出到了眼前的第4版,有理由认为它体现了作者对它最终的心理预期。那就是,这实际上是教程兼参考书。而且,既然书的重量都达到了4.5磅(约2.04千克),我想多半也只能把它当作参考书来用了。Mark Lutz的《Learning Python》是Python语言图书中与此类似的一本。其他语言类图书中,像把Ruby介绍给西方读者的“鹤嘴锄书”(《Programming Ruby: The Pragmatic Programmers’ Guide》),作为此类图书也是当之无愧。书的前一半是教程,后一半明说就是参考。这种方法就好多了。不用管其中的Ruby教程占了多少篇幅(418页),仅就其质量而言,就充分说明它大受欢迎是有理由的。

第二个常见的问题,就是作者忘了读者在打算学一门新语言的时候,最想做的是什么;当然,无非就是要写几个小程序,借以熟悉语法。然而,很多教程通篇都是只有一两行的微型代码示例,只够演示某个功能,但没有一个独立有用的程序。如果语言还有一个内置的shell(或解释器),比如像Ruby、Groovy、Scala,那这个倾向就越发地明显了。

比如说,Odersky、Spoon和Venners合著的Scala教程(《Programming in Scala》)就能清楚地反映出这个问题。在这本书的前200页里面,超过20行代码的示例只有一个;大部分都不会超过10行。[而在K&R(Brian W. Kernighan和Dennis M. Ritchie)那本书(稍后会说到)里,第一个20行代码的示例出现在第26页。]结果呢,按照我自己的经验,就是看了半天书,也敲了不少代码,由此了解了不少功能,但却始终没有写出一个有点什么用的程序来。实话实说,这种现象简直太普遍了。现在,我眼前就摆着两本书,一本Clojure,一本Groovy,也都是这个套路。
查看全文 »

http://radar.oreilly.com/2011/02/2010-book-market-2.html
Mike Hendrickson
2011-2-14

在这一部分,我们按照技术门类来分析一下计算机图书的销售情况。

在上一部分,我们把数据分成六大“门类”:系统与程序设计、Web设计与开发、商业应用、数字媒体应用、消费者操作系统与设备、IT人文(Computer Topics)。

这六大门类下面,是一级分类、二级分类、三级分类、四级分类,一共5层。比如说,系统与程序设计门类下面的一级分类有编程语言、数据库、软件工程、通用程序设计、安全,等等。

本部分将对比2010年与2009年的第四季度,也会将2010年与2009年的情况进行对比。

为了方便起见,下面给出了上一部分中展示过的Treemap,其中包含各个门类与一级门类2010年与2009年第四季度的对比。

这张图中的红、绿、黑色方块基本上反映了市场的波动情况。其中,代表高度增长领域的浅绿色方块非常少。但不要忘了这是2010年第四季度与2009年第四季度的对比。两个最大、最亮的绿色区域是“Android编程”和“Android消费者应用”,这两类图书从2008年微不足道的小方块成长为2010年相当可观的大市场。
查看全文 »

原文地址:How browsers work

简介

Web浏览器恐怕是用户最多的软件了。本文将介绍浏览器的工作原理。想知道从你在地址栏中输入“google.com”,到窗口中显示Google主页的过程中都发生了什么?本文会为你揭开这个秘密。

要讨论的浏览器

今天,人们主要使用5种浏览器:Internet Explorer、Firefox、Safari、Chrome和Opera。这篇文章的分析源自开源浏览器——Firefox、Chrome和Safari,Safari是部分开源的。根据W3C对浏览器使用情况的统计信息,当前(2009年10)Firefox、Safari和Chrome共同的市场占有率已接近60%。因此,可以说开源浏览器已经占据了浏览器市场的半壁江山。

浏览器的主要功能

浏览器的主要功能就是呈现你选择的网络资源,换句话说,就是你向服务器请求资源,然后浏览器把它们显示在自己的窗口中。资源的格式通常是HTML,当然也有PDF、图像等等。资源的位置是使用URI(Uniform Resource Indentifier,统一资源标识符)来指定的。与此相关的内容在后面讨论网络的时候还会详细介绍。

浏览器如何解释HTML文件是由HTML和CSS规范规定的。这些规范是由W3C(World Wide Web Consortium,万维网联盟)维护的,W3C是负责制定Web标准的组织。

HTML当前的版本号是4(http://www.w3.org/TR/html401/),HTML5还在制定中。CSS当前的版本号是2(http://www.w3.org/TR/CSS2/),CSS3也正在制定过程中。

多少年来,浏览器厂商各自为战,纷纷埋头开发自己的扩展,对规范的支持始终不给力。结果就给Web开发人员带来了生死攸关的兼容性问题。而今天,大多数浏览器对规范的支持程度仍然参差不齐。

浏览器的用户界面大同小异,其中相同的界面元素包括:

  • 用于输入URI的地址栏
  • 后退和前进按钮
  • 书签选项
  • 用于刷新和停止加载当前文档的刷新及停止按钮
  • 返回主页的主页按钮

说来也怪,并没有哪个正式公布的规范对浏览器的用户界面作出规定,浏览器目前的外观是多年来浏览器厂商之间互相模仿和不断改进的结果。HTML5规范中没有定义浏览器必须具备的UI元素,但列出了一些公共元素,其中就包括地址栏、状态栏和工具栏。当然,有些浏览器还有自己专有的一些功能,如Firefox的下载管理器。相关的更多内容将在后面讨论用户界面时介绍。
查看全文 »

《JavaScript高级程序设计(第2版)》上市将近一个月了。这期间,为了制作勘误,我在重读这本书。与此同时,几位热心读者也将发现的一些错误迅速通过邮件发给了我,或者在出版社(图灵公司,http://www.turingbook.com)网站本书页面中提交了勘误。经过确认,目前有11处需要修改的地方(详见后面列出的查看勘误的页面)。

这些勘误信息主要来自@凌空一叶同学,特此致谢!

需要特别说明的是,图灵公司自今年以来,面向广大读者推出了“图灵5周年系列活动之‘有奖DEBUG’活动”。只要读者针对图灵公司新近出版的图书提交勘误,经过确认,每个错误向读者赠送价值5元的“购书码洋”,待累积到一定数额,就可以换取等值图书。此举旨在鼓励读者反馈勘误,提升图书质量。活动详情请参见:http://www.turingbook.com/Newswires/ShowNewswire-174.aspx

欢迎广大读者朋友踊跃迅速地反馈勘误信息,以便在后续印次及时更正,惠及更多读者。反馈勘误之前,请务必注意:

  1. 为了确保您的反馈得到积分奖励,请统一到图灵公司网站本书页面(附后)提交勘误;
  2. 请不要重复提交已经确认的勘误,在提交勘误前,请先查阅已经确认的勘误;
  3. 已经确认的勘误不再积分,未确认的勘误,只给先提交的读者计算积分。

提交勘误,请到如下页面:

查看勘误,请到如下页面:

本想先找本算法和数据结构的书参考一下,但转念一想:不如考考自己的总结和逻辑表达能力。

loop、iterate、traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇。众所周知,这几个词分别翻译为:循环、迭代、遍历和递归。乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思。那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下。

  • 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
  • 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
  • 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
  • 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。

有了以上定义,这几个概念之间的区别其实就比较清楚了。至于它们之间的联系,严格来讲,它们似乎都属于算法的范畴。换句话说,它们只不过是解决问题的不同手段和方式,而本质上则都是计算机编程中达成特定目标的途径。

一个星期前,由于网站崩溃,我需要学习备份数据库和站点文件。一位朋友主动向我伸出援手,把他自己编写的Shell脚本共享给我,并通过聊天工具耐心地指导我配置脚本选项。由于我把数据库编码一项误写成了“utf-8”,而系统又轻易不返回错误消息,导致了我们俩从晚上8:44一直Debug到23:28。(严格来讲,是他在不停地查手册、重写脚本,而我不停地用他给我的脚本覆盖服务器上的脚本并重新运行)。最后,他终于“想到把那个错误问题输出”了。根据错误信息,我们查了一下,原来MySQL默认的字符集是“utf8”而不是“utf-8”——去掉中间的短划线,问题就解决了。

说起这位朋友,其实我们早在2005年就认识了,当时我们都在翻译正则表达式方面的书。想一想那天晚上Debug的情景,心里不禁涌起丝丝暖流。

两个月前,由于种种原因,我需要学习使用SSH。一位朋友主动向我伸出援手,通过聊天工具耐心地给我讲解SSH客户端软件以及相关浏览器插件的配置和使用方法,直至我终于入了门为止。刚才又翻了翻当时的聊天记录:两次聊天用时大约90分钟,你来我往的文字有200余行!更令人感动的是,由于担心我从头开始配置太烦琐,这位朋友还把他的配置文件共享给了我。

说起这位朋友,其实至今我还只知道他的英文名——JerryChoi。现在回忆起来当时聊天学习的情景,心里仍然会泛起阵阵感动。

老子《道德经》第七十七章是这样写的:“天之道,其犹张弓与?高者抑之,下者举之;有余者损之,不足者补之。天之道,损有余而补不足。人之道则不然,损不足以奉有余。孰能有余以奉天下?唯有道者。是以圣人为而不恃,功成而不处,其不欲见贤。”

山西古籍出版社卫广来译著的《老子》,对这一章是这样解释的:“天的道,不就像拉开弓射箭吗?目标高了,就把它压低一点;目标低了,就把它抬高一点;弓弦过满了,就把它减少一点;弓弦不够满,就给它补充一些。天的道,减少有余的,用来补给不足。人的‘道’却不是这样,减少不足的,用来供养有余的。谁能拿出多余的财物来供给天下呢?只有‘有道’的人。因此圣人,为万物尽了力而不恃其能,办事成功而不自居功,他不愿意表现自己的贤能。”

这是老子在2500年以前说过的话,到了今天改变了吗?没有。前面说到的两位朋友在某些方面强过我,其实他们就是“能有余以奉天下”的人,而相对于他们我就是“不足”的人。他们对我的帮助,可以说是“损有余而补不足”,是顺应了“天道”,而他们自然也就是“有道者”了。

说到“不足”,我这个站点的域名跟这两个字其实大有渊源。早在2007年注册域名的时候,之所以想到cuckoo这个词,就是因为“布谷”和“不足”是谐音。当时的想法其实比较“自私”,我认为自己应该永远是“不足”的。这就相当于一个杯子只盛了少半杯水,这样才会有更多空间接受“替天行道”的“有余者”倾倒过来的“水”,才能让自己越来越“足”起来。

今年以来,我越来越多地联想到杯子和水的比喻。人生世间,每个人都可以决定自己是一杯水,还是半杯水;如果是半杯水,还可以进一步决定自己的杯子举得比别人的高,还是比别人的低。道理显而易见,只有没盛满水的杯子才能从别人的杯子中获得补充,而且更重要的是,只有自己的杯子举得比别人的低,别人杯子里的水才有可能流注到你的杯子里面来。

感谢上述两位朋友,也感谢曾经以这样或那样的方式帮助过我的更多朋友。

俗话说,“覆巢之下无完卵”。主机服务器硬盘损坏了,数据全都丢了,作为一颗“蛋”保存在坏掉的硬盘这个“巢”里的本站能幸免于难吗?当然不能。这正是本站自7月25日(左右)以来无法正常访问的原因——它跟着那块服务器硬盘一块牺牲了。

然而,掉到地上的“蛋”在“粉身碎骨”之后,不仅能够“破壳重圆”,而且还变得更加“完美”,这不禁令我对“祸兮福之所倚,福兮祸之所伏。”这句话有了身临其境并且更加深刻的体会。

自从网站无法访问后,不少朋友通过聊天工具、邮件、微博问我:你的网站怎么了?开始我还以为是服务器重启这类的操作造成的,没当回事儿。这也跟我最近很少写博客有关。又过了几天,发现网站还是打不开。于是,不得不在“所有程序”里找到几乎被埋没了的“××的”聊天软件——QQ2010。原来是这样啊——主机提供商已经在群里作出承诺了:24小时恢复数据。

事实上,给博客换个洋家也不是现在才有的想法。某某部出台了限制.com域名注册的规定(只有企业才能注册,个人不能注册了),后来又传出站长必须亲自到主机商那里照相备案的消息(后来据说只要把带脑袋的照片传过去,就有人用PS负责把你的头像放到官方的背景上),已经让人忍无可忍了!不行,得出国,得让我的这颗“宝贝蛋”出国。也就是说,兴搬家这个念头少说也有小半年光景了。

幸好,原来的那个“窝”完蛋了。24小时恢复数据,没问题。三下五除二,我就从淘宝上买了一个国外空间。登录后台CPanel面板一试,这才觉得自己以前太“恋家”了。这个新“窝”不限制子域名(支持泛域名解析)、不限数据库数量、可在线解压缩、有后台邮件通知,……。相比之下,原来那个“窝”的租金又贵限制又多还不怎么好用。跟现在这个窝比一比,一个银窝,一个金窝吧。换句话说,原来的银窝也不太差,差就差在它的价值与价格背离得太远了。

话说“银窝”的东家说到做到,数据库的数据居然恢复到了7月25日(但这已经不重要了,因为我最新的一篇博客写于6月24日)。再话说,由于我没怎么深入鼓捣地过“银窝”的后台,不怎么熟悉备份导出数据的操作,不得不一边探索一边向人家求救。结果,几乎在我自己鼓捣出备份的同时,人家也通过QQ把10M大小的.sql文件传给了我。在此道一声谢!(我预测,他一准会听到的。)

拿到数据后我就吃了一颗定心丸。先把Wordpress版本升级到3.0(支持多站点),然后在本地XAMPP环境下先尝试恢复了一下数据,一切顺利。然后,临时叫停了老婆那吃掉我大量带宽的游戏,正式恢复站点数据,破镜重圆。

结果大家都看到了,表面上跟7月25日以前没有什么区别。但是,经历了这次搬家和数据恢复之后,我突然发现以前写过的那些东西并不像我一开始想象得那么不值一提。在老东家恢复数据期间,我用自己备份的数据(WRS格式的XML文件,通过Wordpress导出的)恢复过几次,虽然是5月份才导出的,按理说也就只会丢失几篇文章而已,但几次恢复居然都只能恢复到2008年10月;从2008年11月到2010年5月,居然有18个月的数据断档。我因此作了最坏打算,如果主机商的数据也不能恢复,那就卷土重来,给自己的站点重新定位、重新设计、重新开博。

然而,眼瞅着后台那些十根手指头都数不过来的Ping链接,我清醒地意识到还有不少站点在引用和转载我以前的文章。如果这些引用都变成了空链接,不仅我面子上不好看,也会给不知道有多少读者学习深造带来极大不便。毕竟,在这个网络时代,作为其中的一个结点,我和这个站点都已经不再孤立存在了,而是与千千万万的其他结点建立并保持了千丝万缕的联系。如果数据真的丢了,可让我怎么面对那些素未谋面,而将来又有可能谋面但因此又可能永远也不会再谋面的花朵一样灿烂的脸孔呢?想到这里,我原来如释重负的感觉一下子无影无踪了,一种因失职而难逃其咎的负罪感油然而生。

当然,在老东家的指点和帮助下,数据都完整无缺地找回来了,灾难并没有真的发生。站点恢复如常了,我又可以做一个负责的结点了。与此同时,我发现由于“年久失修”,过去的一些文章有的图片打不开了,有的代码格式变得不好看了。看来有必要把这些年来的文章好好地捋一捋,修补一下,让站点更“完美”一些。这正是我接下来几天一段时间内的一个工作计划。

除了修补过往旧文,我还计划挑选整理一个《精华文章汇总》的页面,把那些价值相对较大的文章从“垃圾”堆里挑出来,摆在明面上。这样就不会过多地浪费读者诸君的宝贵时间了。现在,这个页面的链接已经有了,今后还将不断充实:2007-2010年精华文章汇总

最后,也是最重要的:从今以后一定坚持做备份,每周至少一次,雷打不动。还有,真心感谢在我站点无法访问期间纷纷提醒、慰问我的朋友,感谢在我测试新“窝”期间,奋不顾身地在测试文章下留言,最后留言又被我忍痛割爱而没有留下任何痕迹的朋友,感谢那些热心转载推介我的文章,让我从一个孤立的结点跟千千万万结点发生了关系的朋友!

锡林郭勒草原

2010年06月19日 原创

草原

天光

起伏

奶牛

风车

路漫漫……

罗伯特·C·马丁
2003年4月26日
原文地址:http://www.artima.com/weblogs/viewpost.jsp?thread=4639

显示摘要

我曾经是一个静态类型的偏执狂,而且偏执了很多年。我在使用C的过程中饱经磨难,得到很多教训。愚蠢的类型错误曾经导致了不计其数次的系统崩溃。因此,在C++问世的时候,我马上就成为强类型的积极拥护者和推动者。听到Smalltalk程序员抱怨缺少灵活性,我还嘲笑过他们。毕竟,安全性与灵活性相比,前者要重要得多——况且,只要遵循良好的依赖关系管理原则,就能够保证软件具有灵活性,同时还是基于静态类型的。

4年前,我接触到了XP(eXtreme Programming,极限编程)。我很认同其中关于软件开发的实用性观点,也很认同其中关于测试的观点。于是,我又迷上了测试,以至于不使用测试驱动的开发,我都不觉得自己是在写软件。我不敢想象如果没有一套完整的单元测试套件来支持开发,后果将会怎样。

大约在两年前,我发现了一些问题。我越来越少地依赖类型系统所提供的安全性,因为单元测试可以帮我避免类型错误。对单元测试的依赖越多,对Java或C++(这是我选择的语言)类型安全的依赖就越少。

我觉得应该做一个实验。我先后尝试用Python和Ruby(都是以动态类型著称的语言)编写了一些程序,在发现并没有出现什么类型问题时也没觉得特别不可思议。因为单元测试确保了我目标清晰、范围明确,过去那么多年一直对静态类型检查的依赖也被我抛到了九霄云外。

而且,我认识到动态类型语言的灵活性也让编写代码变得异常轻松。模块容易编写,也容易修改。根本就不存在构建时间的问题。动态类型世界的生活让我感到无比轻松自释。

现在,由于项目需要我又改回了使用Java编写代码。但动态类型语言给我的轻松感觉每时每刻都在诱惑着我。我真希望自己是在使用Ruby、Python,甚至是使用Smalltalk在编程序。

还有谁有我这种感觉吗?随着越来越多的人接受测试驱动的开发(我觉得这是一个大趋势),他们一定能体会到我所说的这种感觉。到了2010年,是不是我们都应该换成使用动态类型的语言来编程了?

寻人启示

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月