[转] 炮轰《JavaScript征途》,兼批技术社区的吹捧之风

龙三
2009-09-24 看过
原文:http://hax.javaeye.com/blog/474725

直到今天中午之前,我并没有打算要站出来炮轰这本《JavaScript征途》。因为在目前的技术出版形势下,原创作者面临了很多困难,出书并不易,而且看得出该书作者(朱印宏,网名css8)技术还是ok的,长久以来在技术社区里也做了不少传播技术的工作。这年头,积攒人品不容易啊!所以一切原本只是停留在51js论坛上随性而起的 一 些 评 论 而已。

然而这本书的作者对于善意批评所作出的连番回应,却令我大吃一惊,他对自己犯的多处低级错误不仅不以为耻、百般狡辩,还发出“没有其他意思……不是广告”,还不止一处,连参与讨论的一向儒雅和气的爱民,都唯有疯笑以对。尤其是今天上午因为china-pub上一位“5级评论员”提及了51js上的讨论,这有可能影响到该书的销售前景,于是css8就坐不住了,明着或暗着说我“危言耸听”、“不厚道”、“偏激”、“动机不纯”、“扣硕大的黑帽子”、“无知傲慢”……还大喊冤枉。这种无耻行径使我感到不能不把这个争论公诸于众,以正视听。

既然决定要对作者及其书进行公开批评,不得不牵涉到那些给此书写推荐书评的人。包括:

* 蓝色理想网站站长曾沐阳
* 《JavaScript王者归来》作者月影
* 51js超级版主Winter

在该书的宣传页上,你还能从推荐名单中找到若干经典论坛和51js的版主的名字。

蓝色理想网站及其经典论坛,还有51js,都公认是国内历史最悠久最有影响力的Web设计者、开发者社区网站之一。身为这些技术社区的版主、超级版主、网站站长,你们对于许多开发者和技术学习者来说,是标杆性的权威。你们理应比普通开发者更有能力来鉴别一本书的水准,你们也更有责任像孔雀爱护自己的羽毛一样爱护你们的声誉。你们的权威,不仅基于你们自己的技术水准,也基于社区整体的技术水准。因此你们这样的推荐可以说不仅代表你们自己,也代表了整个技术社区。

但是现在,看看你们所做的,仅仅出于朋友之谊,或盛情难却,就为这样一本未经过严格技术评审,仅仅两个样张就充斥低级错误的书,写出那样的推荐,你们如何对得起社区,对得起信任你们的开发者和学习者?诚然,这样一种吹捧风气,也不是web开发社区独有,但这次对js征途的推荐,blueidea论坛和51js论坛的大小版主可谓倾巢出动,这样一种集体性的失态,若继续发展下去,后果实在堪忧!

月影同学,你真的希望这样质量的一本书和你的《JavaScript王者归来》相提并论吗?仅仅因为“知道css8你写这本书不容易”,你就“一些不太明显的‘坑’也没有刻意说,或者有的时候不由自主地忽略掉”。你也知道“这些坑有一定经验的老鸟们固然一般不会掉进去,但初学者确实容易摔跤”,一句“我之前也没考虑充分这些”你觉得能作为理由吗?

Winter同学,我特别要批评你,月影也许没仔细看样张,你既然看过样张,怎么还能说出“如果回到学JavaScript的时候,我一定会买这本书”的昏话来?难道月影后来说的那些“坑”,你初学时就能腾挪避闪?初学者最忌什么?最忌就是一开始的基本概念出了差错,就好像欧阳锋练了掺过水的九阴真经,纵然他武功盖世,也最终练成了个疯子。而css8居然能在书中写出“浮点数是以字符串的形式进行存储的”,这谬误实在是稀罕到闻所未闻。

还有经典论坛的青蛙版主,你光看了个目录就敢写书评啊?你也知道“光从目录来评价一本书的好坏是有点主观过头了”,所以“鉴于这些,我只能从目录出发,从我个人的角度来说些什么”。甚至你的书评也有所保留,但是这些有用么?盛情难却之下,你还是被人当了枪手用。

还有51js超级版主Rimifon、客服果果等,你们在51js论坛里对多初级的问题都有问必答,这份对初学者的耐心我一直敬佩不已,自叹弗如。然而,今日却推荐这样一本可能有许多“坑”会让“初学者确实容易摔跤”的庸书,我实在无法理解诸位的心态。

最后曾沐阳,你作为一站之长,为blueidea付出多少心血,只有你自己清楚。今日却轻易的把自己的名声,还连带你一干版主的名声搭进去,值得吗?


其实平心而论,css8这本书未必是同类书中最差的一本,就样张而言,有些地方还是可以的。所以也许只能算一本庸书,但未到劣书之列。且他技术上也是有一定实力。但是他有个很大的问题,就是不是踏踏实实的把书写好,而是凭借自己在社区混得开,人缘广厚,就找了blueidea和51js的众人为他的书摇旗呐喊,炒作造势。你有那么多资源,你咋不找他们给做做技术评审?!!如果此书经过月影或Winter或任何一位51js上超级版主的技术审阅,我相信绝对可以消灭大量的低级错误。

不是请人做技术审阅,而是邀人做虚头八脑的推荐,如果此书真的写得不错,譬如像月影的《JavaScript王者归来》,那也无伤大雅,然而事实正相反。结果不仅拖累了那些为义气和面子帮他写推荐的人,更害了他自己,好不容易积攒的人品这次怕就要毁于一旦。


作为我来说,我其实很不愿意做炮轰这个事情,在一些朋友的善意劝告下,我一度想偃旗息鼓了。但是css8对于批评不仅不知反省,还要死撑,最离谱的是居然还引经据典妄图掩盖自己的错误。你自己犯错,你还要拿别人的经典著作给你垫背?是可忍孰不可忍。我觉得如果此事就无声无息下去,任由css8继续在技术社区里误导初学者,那无论作为51js技术社区的一员,作为blueidea BXNA作者群的一员,还是作为技术图书作者译者群的一员,都说不过去。

能力越大,责任越大。这句话,不仅适用蜘蛛侠,不仅适用《功夫》中的神雕侠侣,也适用技术社区中的大侠们。月影、Winter、社区的版主们、曾站长,我今日愿为诸君之诤友,希望各位也能担负起自己在社区中的责任,不要令这样的情况继续下去了。


附,就该书的基本常识和概念方面的错误,及作者css8对于善意批评的无耻回应列举若干。

所有问题取自该书的样张:第一章、第四章,粗体为我所标示。

引用
这个作用域链(Box.prototype.constructor.constructor.prototype)很长,长得几乎能够让人背过气,它是什么玩意?


这里只是若干级的属性引用,和作用域链(scope chain)风牛马不相及。然而在爱民指出这个问题后,他的回复是:

引用
“作用域(链)”通常是一个运行期的概念。这话没错,我列出的一个长长的属性存取,实际上它是原型域链,爱民后半句也提到了,原型域与原型域链在 JavaScript中是一个很重要的概念,不知道二位专家认可吗?就这个话题咱们还可以继续讨论,我当时在写作时,也是考虑到这个JS特性才这样写。是否正确,还有待专家指正。


这个回复罔顾左右而言它,明明写错了还要强辩“也是考虑到这个JS特性才这样写”,末了还“有待指正”,让人哭笑不得。更奇特的是,他又冒出来一个“原型域与原型域链”,还栽赃给爱民(“爱民后半句也提到了……”),实际上只有作用域链(scope chain)和原型链(prototype chain),不知道他哪里杂交出来一个“原型域链”,基本概念之混乱如斯,还问“不知道二位专家认可吗”?我代表我和爱民两位专家告诉你我们绝不认可!


引用
只有当闭包体的外部引用被全部设置为 null 值时,该闭包才会被回收。当然,也容易引发垃圾泛滥,甚至出现内存外溢的现象。


这段话本身前后连接就有问题,然而这里我并不是想说语文水平的问题。只说什么是“内存外溢”。作者难道是在说内存溢出(memory overflow)?

然而这里根本不干内存溢出什么事。内存溢出,如果有,那也是引擎实现的问题,跟闭包或者任何js语言特性有毛关系?

除非作者是把memory leak错译成了内存外溢。但是就算这样,我们也知道memory leak虽然跟闭包有关系,但是本质上并不是闭包造成的,而是引擎的bug,比如微软js引擎和dom对接实现上的bug。作者在这里没头没脑的来一句,初学者不明,恐怕还真会以为闭包是这样危险的特性了。

在我指出这个问题后,css8又是怎么回答的呢,他义正词严的说:

引用
是我的无知,还是你的傲慢,请你查阅一下《JavaScript权威指南》第5版第8章。


这可吓到我了。说老实话,《JavaScript权威指南》是人所共知的经典,不过我确实没从头到尾通读过,难道犀牛书里真有这种奇谈怪论?

然而当我下载了电子版仔细查阅后,我却实在气不打一处来。css8的荒谬已经到了无可救药的地步。

查JS权威指南第五版里从来没有一处提到过 memory overflow 。第八章,只有一段话提到了memory leak,全文如下:

8.8.4.2. Closures and memory leaks in Internet Explorer

Microsoft's Internet Explorer web browser uses a weak form of garbage collection for ActiveX objects and client-side DOM elements. These client-side objects are reference-counted and freed when their reference count reaches zero. This scheme fails when there are circular references, such as when a core JavaScript object refers to a document element and that document element has a property (such as an event handler) that refers back to the core JavaScript object.

This kind of circular reference frequently occurs when closures are used with client-side programming in IE. When you use a closure, remember that the call object of the enclosing function, including all function arguments and local variables, will last as long as the closure does. If any of those function arguments or local variables refer to a client-side object, you may be creating a memory leak.

连css8犯什么错误我都料到了,他居然还理直气壮的凑上来说他没错。本人是有点清高,但是不至于傲慢。不过在css8这种人面前,我不傲慢看来实在对不起观众。


引用
更为有趣的是:浮点数是以字符串的形式进行存储的。


基本概念的混乱其实是许多所谓给初学者写的书中常见的问题,有时候,一些整体不错的书里也难免会出现一两处。但是像这样有想象力的谬误实在是很稀罕。对此css8偏不信邪,还找到了NC Zakas写的Profressional JavaScript for Web Developers来为他背书:

引用
请你查阅一下《JavaScript高级程序设计》第2章,如果你没有书,告诉我,我复印给你看看。


好,我就去查了,看看原文:

引用
The interesting thing about this form of floating-point literal is that it is actually stored as a string until
it’s needed for calculation.

(这一段是斜体,大体是作者作为轶闻来说说)

我先姑且不论Zakas说的对不对——因为literal是否是保存到计算时再处理,还是预先就处理掉了,其实是由引擎决定的,而且我断言,现在的主要引擎肯定是预处理时都处理掉了,有看过spidermonkey、javascriptcore、v8源码的同志都可以验证一下。此外Zakas在这本书的第二版里已经把这段话删除了。

退一万步说,我们以这个第一版的说法为准,但人家讲的是literal啊。

literal是什么?可参见wikipedia条目: http://en.wikipedia.org/wiki/Literal_%28computer_science%29

我曾写过一篇讨论literal译名的文章也可参考:http://hax.javaeye.com/blog/160003

而且值得注意的是,在Zakas这本书同一页的下方特别用不同背景色且粗体标出:

引用
Floating-point values are stored in a 64-bit IEEE 754 format, meaning that decimal
values can have up to 17 decimal places. After that, the values are truncated, resulting
in small mathematical errors.


那么会不会可怜的css8是看了错误的译本导致犯下这样低级错误的呢?

于是我找到译本一看,人家明明翻的是:

引用
浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。


这句话虽然翻译的不太好,但是也明确说了是浮点字面量,以及是在进行计算前。到了css8这里却被copy不能不走样的成了“浮点数是以字符串的形式进行存储的”。更为有趣的是,他前一句还在说“浮点数一般都是64位数值”,后一句就成了“更为有趣的是:浮点数是以字符串的形式进行存储的。”这样前后两句自相矛盾的叙述,他居然视而不见,还据“理”力争,我们实在不能不惊叹于他具有优异的前后兼容性。

就在我写这篇博客的同时,css8还又再次长篇大论,又是引用文献,又是扔出一段与javascript浑身不搭界的eeprom的C代码,其囧其雷,令人叹为观止,我就不做分析了,各位可自行观赏之。


更多有趣的问题,请看完整的讨论记录:http://bbs.51js.com/viewthread.php?tid=85328&extra=page%3D1&page=1


最后我要指出的是,其实一开始我想提出的,倒是他书的写法,而不是这些基本的常识和概念错谬。比如我提出要:

区分:真生动 和 装出来的生动。
区分:口语化 和 啰哩叭嗦。
区分:循循善诱 和 堆砌内容。

此外他的两个样张里有时候过分武断地出现全称判断如“任何语言都……”,或没来由的一会儿夸赞一会儿贬斥某个浏览器,如“IE,没有什么好说的了,一个狂妄的巨人”、“IE 却是用户体验最好的浏览器之一”、“据说……Opera浏览器……瑕疵也非常明显”,这些褒贬似乎随心所欲,评论者追问一句,他就回说“对不起,请你自己动手试一试”,还自比于丹;有时候却又出现“这在普通开发中好像没有多大实际价值”、“好像这在实际开发中很少去考虑”,甚至“至于谁对谁错,看来只有根据具体情况而定了”这样后现代的无厘头之语。

不过,现在我已经不想就这些问题,以及如何为初学者写书这个大题目来与他争辩。因为一个犯下基本的常识概念错谬都要百般抵赖的人,我们能指望和他讨论一些更带有主观色彩的问题吗?




附送css8语录摘要(粗体为我所加):
引用

关于《JavaScript征途》这本书,质量是有保证的,不仅仅针对初学者,对于进阶者和高级读者来说也应有用。事实会证明这些,就让我们试目以待。

本书是一本好书。不然也不会班门弄斧,在这儿找骂。当然,好书是不怕骂的……我也非常理性的面对51js中几个网友的叼难……当然,由于愤青或者酸葡萄心理骂书,我也管不着,但是骂只能显示骂者的卑鄙。

你引出了这么多语句,已经说明了你的用心,但是我又非常认真的阅读、斟酌了一番,没有发现什么技术和表述问题……最好是你直接明说了,反正我还没有看出什么问题?

我可以负责任的说,“质量是绝对有保证的,不仅仅针对初学者,对于进阶者和高级读者来说一样非常受用。”,这话一点没有自吹自擂,我敢于在这里再重复一遍,我敢于对于我写的这本书负全责……在当前严酷的图书市场和读书环境下,我能够用近一年的时间非常认真的写作一本书,可以说是非常罕见的……有人从毛选中挑出了很多错别字,我在《JavaScript权威指南》中也挑出了不下20处的技术和印刷错误,……如果使用放大镜仔细读,可能会发现一些小问题,当然作为作者的我和出版社都希望这本书是完美无缺的,也真诚的希望大家刻意挑错,以利于我们改正。

本书最大特点就是性情中书,情感和思想比较盛行,如果你是一位技术高手,可能不习惯这种口水味,但是这正是广大初学者所需要的

我估计你是一位技术熟练者,有过深刻初学者的经历,但是这不能够代表现在的大部分初学者……历史会再次证明这个观点:越是骂得厉害的图书,市场肯定错不了。

飞思是国内IT图书的品牌,你竟然如此下结论,看来你对于IT图书市场了解不是很深,遗憾。

我的文笔在圈内是数得着,作为一位老的技术人员,老的技术写作人员,我还是很自信我的语言。至于你读起来是另一种味,或者读起来不适应,可能是你的口味问题

电子工业出版社是四大名社,飞思是国内IT图书品牌,本书策划编辑是国内最著名的编辑,获得多项大奖,策划了很多经典图书,我就纳闷了你为什么还有这个偏见,或者是你不够了解,或者是“一书障目”?

我不想与你在这里打口水战,现在没有时间和精力。我不会因为你说什么而怨恨,当然也不会在意这些流言蜚语。

最后,容我辩解一下:在追求技术严谨性和通俗性时,我多选择了后者,所以很多忽略了技术的严谨性,很多语言经不起专家的推敲,实在抱歉。不过,我是这样认为的:把技术写得更通俗、随和一些,往往读者更喜欢阅读。

先声明一下,发下面这个图没有其他意思,这不是广告,也不是怂恿。它是一位读者在论坛里发的帖子,我也是刚刚发现,原来在互动出版网买书还有这么大的实惠,以前还真的不知道。现在我发出来这个截图,只是想告诉那些有意购买本书的网友,建议不妨试一试。
[点击查看原始大小图片]

本书有错误码?有,hax帮助指出了……但是,如hax所言,错误随处皆是吗?这个就未必了,hax的言论未免让人感觉危言耸听……我统计了hax指出的所谓31处错误,真正算上技术错误的,也很寥寥,不过几个罢了……但是,真的如同爱民那样去分析,就会好吗?这个也未必。本书不是迂腐的学术专著,本书是通俗的科普读物。如果有人非要想把书中带有个性的、主观色彩的语言硬要往严谨的学术上靠,这个显得很不厚道了,有本事,你去一个字一个字的死扣扣《大话设计模式》或者《大话设计存储》。脑白金火了,大家都骂脑白金,但是脑白金不会因为被骂而萎靡不振,反而更受用户欢迎。……拿几个错误来说事儿,只能显示你的偏激。如果就技术话题进行讨论本书,也就罢了,但是有的人就是动机不纯,除了叫嚣着在这里骂,反而还倒咬我一口,甚至还跑到外面吆喝,实在可笑,你以为你在外面呐喊几声,本书就没有市场了。市场自有市场的规律,读者自有读者的选择。

hax的言过其辞,我不想多论。我强忍着怒火,仅就他所谓的错误从技术上与大家讨论。不然,因为hax的一席话,用一顶硕大的黑帽子扣在本书的头上,实在冤枉。

“据说”不是瞎想……让我拿出证据,我只能回敬:对不起,请你自己动手试一试。
你的这种言论,让我想起了于丹的《于丹论语心得》。于丹的书出来时,当时国内有十几个中国古代文学专家联名上书,甚至于起诉,说于丹言论偏离史实,有损《论语》的形象。但是,此事后来也无趣不了了之,于丹的《于丹论语心得》仍然是大家最爱看的书,那些专家们的《论语》解读也不知道被尘封在图书馆中多少年了。

书要有情感,只有作者有情感,要让书易读、易解,首先要解放作者的思想。

本来昨天这事儿就过去就算了。我也懒得理会了。但是今天在互动上看到有人发言,说清初学者在买书之前来看看hax和爱民的帖子。这话有点不地道,如果真是书的错误,我也认了,但是很多指责都是主观的,如果保持沉默,说明我认可了hax的指责,很冤枉

hax指出的几个错误,我可以接受,但是,凭什么说我要接受你的所有无理指责,这是什么世道,51js不是黑帮,为什么还要指责无辜劝和的版主。

但是,这些都不要紧,争论的本质是要证明真理,不管谁对谁错,先请个别人不要到处扣帽子,以人品论事儿。
14 有用
1 没用

查看更多豆瓣高分好书

评论 15条

查看全部15条回复·打开App

JavaScript征途的更多书评

推荐JavaScript征途的豆列

了解更多图书信息

豆瓣
免费下载 iOS / Android 版客户端