All posts in 书评

Refactoring HTML 书评

很多年以前,面对上古时代遗留的 HTML 发出的腐臭,我捂住鼻子唉声叹气。刚练熟 web 标准的我,恨不得寝其尸食其肉,把一切推翻重来。但经理说,没有时间浪费在清理这些垃圾上,快给我把新的页面切了!可想而知,我是郁闷的。你也是,别装了,我知道。我常常处于崩溃边缘,作为一个有深度爱心和追求完美(这应该是所有程序员追求的品质)的 web 前端开发者来说,为何不许我为残障者着想,改善一些无障碍性?为何不许我把这些鸟b(读者最好不要连起来念),鸟i, 还有鸟u送上刑场?看着 W3C 校验器显示出的一串又一串的 erorr, 我灰心丧气,横眉冷对经理指,好像丫欠了我几十万块冥币,哦不,人民币……

皆因我不知道“重构”(refactoring)。

或许你第一次看到这个词,会欢呼雀跃,耶,“重构”,网站重构,一切重新再来?很明显,不是。相反,它的过程是逐步的,有时甚至是很微小的。作为一门在编程中的高级技术,重构是指“在不改变代码外在行为的前提下,对代码作出修改,以改进程序的内部结构”(《重构:改善既有代码的设计》,2003,中国电力出版社)。对于 HTML 来说,就是不改变 HTML 所表达意义的基础上,对 HTML 作出修改,以改进 HTML 的内部结构。是不是很简单?

读者都知道 web 标准的意义所在,很明显,重构的目的是改善既有的 HTML,向 web 标准进军。重点在于改善,而不是取代。在很多情况下,取代的代价远比改善大得多。如果才能做到最大化的投入产出比,很明显,答案是重构。

啰嗦这么多,到底怎么重构?特别是 HTML, 怎么重构啊,看着堆垃圾我就头痛,是不?很多公司的网站,我们可以看到,比如腾讯,雅虎的新推出的页面,都是基于 web 标准的了,但还是存在大量的旧页面,就算访问量巨大,也是纹丝不动。我相信,这很大程度上不是由于不想改,而是除了全盘推翻重头再来之外,实在找不到好的解决办法。重构是你的解药,宝贝。

由世界知名的 XML 专家 Elliotte Rusty Harold 所著的 Refactoring HTML: Improving the Design of Existing Web Applications 是你解药的配方。书中大谈特谈的章节不多,就第一章说说who, what, why, when, where,其他章节都是说 how. how, yeah, 就是到底怎么重构的锦囊妙计。书中从编程世界中“窃取”被证明是可行的、成熟的技术,很多可能是 web 标准实践者闻所未闻的技术,结合到 HTML 来,创造行之有效的新技术,解决 HTML 特有的难题。比方说,你关心过 GET 和 POST 是什么吗?知道为何 Google 爬虫爬一爬,很多页面消失殆尽吗?(嗯嗯,老油条们,我知道你知道(绕吧?),我在这里问的是“页面仔”)。关心过自动化测试吗?什么,你还刀耕火种,写一行就在浏览器刷一下看效果?知道怎么样批量校验你的页面吗?不要告诉我你一页又一页的把上千个页面轮番轰炸 W3C Validator…

不知道?那怎么还浪费时间看什么书评,赶紧的打开书来看啊!噢哦,没有书?google 一下,有得下。英文看不懂?很吃力?噢哦,明年中文版就会上市,嗯嗯,译者就是我……(终于露出狰狞面目)……

本书是探讨 HTML 领域的重构,是对重构这门技术的又一创造性运行。它从工具入手(我们知道,工具是重构的重要辅助),然后逐一分析良构(well-formness)、合法性、布局、无障碍、web 应用程序和内容等等需要重构的方面,提出问题,讨论理据(motivation)并提供行之有效的解决方案(mechanics)。对于接触 web 标准较少的人来说,提供了一个百科全书式的的参考,而对于我的同行们,sure, 亲爱的页面仔们,不仅可以查漏补缺,亦可学习程序工业中的先进经验,提升自己的“工业”素养。总之,这不是一本束之高阁的书。

编写 HTML 不仅是一门技术,更是一门艺术。你会了解的,在读了本书之后。在此我很严肃地说。仅以此献给中国所有的页面仔,共勉。

JavaScript工业时代的来临

半年前,当我对JavaScript还停留在只认识这几个字母的时候(again, XD),我在寻找学习JavaScript的学习途经,jQuery无意闯入我的眼帘,我惊叹于它的小巧和易理解性,在我还不懂JavaScript基本语法的时候,我已经能用它做很多对我来说是不可思议的事情。由此也认识了它的作者John Resig, 并关注其第一本书Pro JavaScript Techniques(projs).

其实把这篇文章归类于书评让我心戚戚焉,因为projs里面的某些高级主题作为入门者的我还不能理解,实属“无法评论”,若夸夸其谈恐会贻笑大方,虽如此,元旦放假期间还是硬着头皮翻完,虽不能一一理顺,但收获也不少。

比起ppk on JavaScript(ppk)来,我的第一感受是,projs太“高级”了。看完ppk后,你可能还不能理解现在流行的那些框架是如何工作的,因为ppk压根就不讲JavaScript的特性比如对象的构建,继承等,最重要的是,很多框架的根基——闭包。虽然我还不能完全理解这些特性,但有一种豁然开朗的感觉,并开始了解,创建可复用的,复杂的JavaScript应用的基础,不能不了解这些特性。遗憾的是,这些特性的介绍一直都只在网上零散流行(比如牛人的Douglas Crockford, Dean Edwards之类的个人网站),甚至是权威的犀牛书也就是一笔带过,并没有一个系统的概述。如今,Pro JavaScript Techniques就是一本应势而生的书,系统概述这些特性,看过后给您的感觉,我再说一次,豁然开朗。最重要的是,它能改变你的看法,如果你还认为JavaScript只是一门小打小闹的玩具语言。JavaScript实在还有很多“隐藏”的特性需要去挖掘,并使用它们来构建工业级的应用。

projs不厚,但含金量实在不低。它的核心就三部分:专业JavaScript开发、Unobtrusive JavaScript和Ajax。其实我个人看法,精华应该是第一部分。有人说JavaScript是基于对象但不是面向对象的语言,因为它没有传统面向对象语言的一些概念比如类。但不是说就不能不能在JavaScript里面向对象编程,因为JavaScript提供的高级特性更灵活,因为灵活所以也可能更容易出错和不易掌握。projs系统总结JavaScript如何面向对象编程,虽然大部分例子或者方法都来源于网上的牛人,但能够以系统的成文书籍来向读者介绍,我想这应该是世界上第一本。或许是第二、三部分个人有所了解并在一定程度生熟悉的缘故,个人觉得应该是John的经验分享了,概述十分入理,他的例子,尤其是在JavaScript and CSS的章节里(其实也是我比较能看懂的一章,呵呵),写得十分优雅和巧妙,其功力可见一斑。

因此projs的第一部分实属JavaScript进阶必看,而第二第三部分可以偷学很多有用的技巧,总的来说,是一本可以打四星半的好书。在JavaScript进入工业时代,您需要这Pro JavaScript Techniques来引导您开发更“工业级”的JavaScript。

更新:此书中文版《精通 JavaScript》已经上市。

通往终点的过程与终点本身同样重要

半年前,当我对JavaScript还停留在只认识这几个字母的时候,有一天我突然心血来潮,在网上下了DOM Scripting样章,照着里面的例子写了我平生第一个能让我知所以然JavaScript,在浏览器运行成功,兴奋不已,从此能把学习编程的热情持续半年以上,破了过去只能热一两个星期的记录,它带给我的影响不只是JavaScript本身,我同时已经初步入门了Ruby on Rails

为什么之前我之前也拷贝粘贴过JavaScript, 也曾试图学习过,但都无疾而终?除了这种JavaScript的经典学习方式不适合作为非程序员的我外,更重要的,网上或者市面上根本没有合适的教程,您所看到的大部分教程,除了让您一头雾水外,还可能把您引入岐途。随着web标准的发展,JavaScript的开发方式已经发生了质的变化,急需一本结合web标准理念来教学JavaScript的入门教程来革新旧开发者的观念,引导初学者一开始就走在正确的路上,这方面,我想没有谁能够比领导WaSP DOM Scripting Task Force的Jeremy Keith更权威。

最近,由人民邮电引进出版的中文版《JavaScript DOM编程艺术》终于面市,我第一时间购买了并阅读完毕,因此将我读后感发表出来与大家分享,如有什么高见,请留言不吝赐教,谢谢。

首先要说的本书的书名,原书名是: Dom Scripting: Web Design with JavaScript and the Document Object Method, 显而易见,本书是面向初学者的,而且对象比较明确,web设计师, 并且表明了本书的内容主要就是DOM, 因此想从本书里看到JavaScript奇技淫巧,想看到Ajax的高级应用什么的,肯定会大失所望。中文版的译名在我本人看来没能表达出原书名要表达的意思,当然基于市场考虑,加上“艺术”之流的字眼还是可以原谅的,最重要的,还是书本的内容质量。翻译来说,虽然有个术语比较别扭(如hook翻译成“挂钩”),但有些也相当精确(如graceful degradation翻译为“预留退路”)。比起CSS Mastery的翻译来,相当不错了。

为何面对设计师?(当然不是说不是设计师就不能看)当web标准越来越普及,使用XHTML和CSS来构建兼容标准的网页的设计师越来越多,接触了web标准的观念和大量使用CSS之后,对于DOM其实已经有了非常感性的认识,只需高人来点破即可迅速掌握DOM的基本操作,而在网页里,对DOM的操作,绝大部分是JavaScript. 所以,我觉得,如果您现在已经了解web标准并积累有一定的项目经验,那么,这本书对您来说,阅读应该很轻松,即使,您没有任何的编程经验。所以,书中对于怎么入门编程,其实就只是简介一下JavaScript的语法,而也不会使用复杂的语句来构建例子程序,绝大部分只停留在if, for等简单的逻辑上。

至于书的内容,我觉得您直接去看网上提供的目录就可以一目了然。在我看来,它只不过就是获取DOM节点及其类型和值,如何改变DOM节点的类型和值,如何插入和删除DOM节点,如果您CSS基础好,那么您简直就是在看一本CSS书籍中的选择器介绍,只不过DOM更强大和灵活,并活起来罢了。并简要介绍了JavaScript的动画原理,让您明白,动的背后其实很简单,还提供了一个制作整站实例的过程,对于一些非设计师来说可以一窥网站诞生的流程。最后一章展望,其实就是入门书都提供的,就是对JavaScript的一些高级应用的概述,来吸引您继续学习的兴趣。不过连展望都不忘提醒贯穿整书的理念:

JavaScript是用来充实网页而不是构建网页的,并基于web标准的结构,表现,行为分离原则。任何时候不要忘了无障碍,网页的核心内容在JavaScript缺席的时候不能受影响。

确实,这是本不折不扣的入门书,对于初学者更合适。但是,是不是说对于老鸟就不适合了呢?非也,前面已经提到,尽管本书的技术浅显,但始终贯穿书本的开发理念与原则,或许是作为老鸟的您从来没有听过或者一知半解的,我建议您可以把它当作一本小说来看,不必像初学者一样拘泥于技术细节。为何这么说?

Ajax引爆JavaScript的流行,流行展望当今JavaScript,大量框架的涌现,您已经可以不费吹灰之力迅速搭建一个JavaScript应用,这样让大家的应用看起来都一样,最终结果看起来似乎都一样:解决了问题。但是您有否想过,这相同结果可能在只有JavaScript的时候?您是否想过能在禁止JavaScript的情况下,人家的能用您的不能用?为何?书本不会直接给您答案,但我相信您能间接找到。没错,该刷新您的开发观念了。而且书不厚,您只需花一个下午。

通往终点的过程与终点本身同样重要。

如果非要找点瑕疵,那么就是,本书作者作为WaSP的成员,在里面的例子中竟然同时使用两次h1,有违W3C h1每页只出现一次的建议。另外,翻译中把”you”翻译成“你们”,让人感觉作者高高在上的样子,还不如翻译成“您”或“你”来得亲切。

无懈可击

请务必了解,即使穿上防弹衣,仍然有被击倒的可能,世上没有十全十美,无懈可击也有个度。但在恶劣的环境下,防弹衣可以保护甚至拯救您的生命。

常可翻译的Bulletproof Web Design: 《无懈可击的Web设计》 由清华大学出版社出版了,从印刷上说,相比其他国内出版书目,尚可算赏心悦目,全彩的印刷让阅读更轻松。

首先,作者Dan Cederholm在业界鼎鼎大名,他也并不像Eric Meryer是一位纯理论家,他投入实践,有着丰富的应用经验,他要着手解决的问题确实存在于现实的非理想世界中。这是我推荐这本书的第一个理由。

其次,译者常可属于国内比较早应用Web标准的先锋,同样拥有丰富的实战经验。值得一提的是,他是一位程序员而不是设计师,所以视角可能会更宽泛。这是我推荐这本书的第二个理由。

请使用Firefox打开一个网站,使用标准构建的更好(如果您着实找不到,我建议打开http://news.163.com), 使用字体缩放功能(按住CTRL,然后向下滚轮)放大字体,您会看到什么现象?举个简单例子,您会看到导航字体放大后超出框的边界或者被隐藏,框并未自适应放大后的字体,导致混乱的布局……您回头看看您的项目,是不是也有类似现象?如果您能翻开这本书,或许您能够在里面找到更多的例子让您似曾相识,是啊,这些“有懈可击”的例子或许就出自您手。

如果连业界楷模的网站都如此弱不禁风,我不相信您没有什么理由不看这本书,无论您是新手想学习到一种新技术,或者老鸟查漏补缺,最重要的是,不是把设计实现出来就万事大吉,而是帮您的设计穿上防弹衣,能够适应浏览器这个恶劣环境,让您的设计无懈可击。

本书开篇强调灵活,适应和亲和力,这三个元素是如此重要,贯穿本书的始终。从解决一个变态浏览器(您知道我指的是IE)的字体适应性开始,每一章都从现实世界中找到一个“有懈可击”的案例,然后一步一步教您如何无懈可击,代码详尽,您可以亲手实践,在学习CSS技术的同时,最重要的,是让您知道,“有懈可击”错在哪里,如何才能无懈可击。很多案例都有触类旁通举一反三之功。

总之,这本书不会教您怎么使用XHTML,不会教您CSS的基础,它建立在您有一定的CSS经验基础上,它不会教您如何开始,但是它会让您的视野更宽阔,教您如何提升设计的水平,全书只有一个目标:无懈可击。而且这个目标并不是不可能实现的。

Learn to Program书评

如何学习编程?一本好教材当然是不可缺少的。一本好的入门教材更是不可或缺的。为什么我说入门教材?我自己非理工科专业更莫说计算机相关专业出身,学习编程并不能像受过系统训练的人一样,拿来一本教材或者手册,熟悉一下词法(lexical)结构即可上手。皆因已经掌握编程的基本概念,语言只是工具而已。当我等菜鸟请教编程达人如何开始编程之旅,他们可能会忽略掉我等的非计算机背景,因此门非但不入,往往不得其法,误入歧途,半途而废……

cover of Learn to Program

今天,我要推荐一本书,即如图这本Learn to Program, 由The Pragmatic Programmers, LLC(是我喜欢的仅次于O’Reilly的出版社 :) )出版。这本书据说是给小孩子学习编程入门用的。所以,这本书给没有任何编程训练的我来说,入门是最合适不过的。如果你,像我一样,需要在设计或者编写HTML/CSS之余,还必须承担一定的前台程序编写,或者你对编程的兴趣比我还高,但尚未入门,又或者,你真的是五六岁的小孩(我有这样的读者吗 -_-)要学编程……那么这本书是你的不二之选。

这本书使用Ruby教学,虽然有种种非议,但不可否认,它属于世界上最接近人类语言的编程语言之一,所以,用来学习编程的基础概念,我相信,它比C更容易。

作者Chris Pine现供职于Opera,擅长于教学编程。Chris文风很幽默,一上来回忆编程,就想起怎么会有女孩脸红地看着他原来裤链没拉(真的是小孩看的书么-_-)……所以他让你学习枯燥的编程过程中并不枯燥,他时不时加点料子让你会心而笑。而且语言平实易懂,运用大量现实生活中的实例来解释程序中的术语,让你过目难忘。举个例子,书中是这样解释对象与方法的。假如钟表是一个对象,则时针的转动就是该对象的方法;假如对象是名词的话,方法则类似于动词,而方法的参数就类似于副词等等,只有亲自去阅读才能发现其中的乐趣。你会发现,从来没有能够如此轻松地念完一本讲编程的书。

这本书从如何在各个平台配置好Ruby环境开始,逐一讲解数字、字符、变量与赋值、方法、流程控制、数组与遍历、自定义方法、类、自定义类以及块和过程(Proc),基本上涵盖了Ruby的基本要素。就是说,如果学习完这本书,如果还想继续使用Ruby,那么,你已经准备好了!不想继续用Ruby怎么办?前面说过,这本书绝对不是Ruby的入门书而已,它也是编程入门书,你将从此书获得编程的基本技能,这些技能是所有程序都能适用的(如果是面向对象编程语言则更好),你完全可以开始投入另外一门语言的基本学习中去了。

如果你已经确定要学习编程,但还在犹豫选择什么语言,选择什么教材,那么,可以看看这本书,我相信,你一定能有所收获的。重要的是,这本书不厚,短短150多页,如果你浏览,1天不到可以看完,用心学,也不过一个星期。你觉得还有什么负担能阻止你学习编程吗?现在就开始吧。

更新:另外,IBM developerWorks 上也有此书的书评