作者:郑凯
其实《黑客与画家》是提前预订的,所以一发售就看了,但现在才动手写读后感,实在是因为回味无穷。
这本随笔集包含了很多观点,对我而言最重要那部分,就是押题的那段:真正的程序员跟画家是如此相似。其实我以前也有类似的模糊印象,但一直没法说清楚:
额外的一个话题,我发现很多人都在 Google Profile 上都写着职业 Engineer。我总觉得,写 Engineer 和写 Programmer 的,代表着两种完全不同的态度。
作者 Paul Graham 一直强调快速创造原型,顺便狂热鼓吹 Lisp,先说我理解的第一层意思,语言对于开发效率的影响。
虽然大家所用的语言都是图灵完备的,且不说能不能把函数作为返回值这类高级货,单看拿 Java 的 syntax作为靶子,确实惨不忍睹,明明都表达同一个意思,却要多写那么多的冗余关键字,这里要强调一个概念,香农的信息熵,以前我能明白这么个概念但一直不知道是什么词(最早想到这个问题是用来解释为什么 mp3 和zip 是不同的压缩方式,但 mp3 已经无法被zip 进一步压缩了),后来在谷歌黑板报的几篇数学之美系列的文章里得以窥豹,例如 输入一个汉字需要敲多少个键,比方说如果所有 method 都必须有范围,那最常见的 public 完全可以省略掉,虽然程序语言可以类比为自然语言,但也可以类比成都要输入汉字时,不同语言相当与不同输入法。很多动态语言的书写效率是五笔的话,基本上 Java 就是全拼了……但是 Paul Graham 宣扬的代码长度跟开发效率等比显然是歪理邪说了,虽然有特例,例如39年德国在欧洲的征服速度约等于行军速度,但放到42年的斯大林格勒就不是这样了。大家应该都碰到过这种情况:区区两三百行代码被反反复复写了好几天,还是两三百行,只不过不是之前的两三百行了。
跟 Java 的 syntax一样傻的,还有 DOS 换行符,虽然这可能是历史原因,干出这事的人可能有理由不被责备,但 \r\n 换行符确实很傻,就像没人会在写字的时候,把“句号”写成“逗号句号”。所有现代语言(就是除了 Java 之外我们常见到的)都在降低代码的信息熵,说白点就是如何在保证不产生歧义的情况下尽量减少各种符号。其实 ;\n 跟 \r\n 差不多傻,所以所有现代语言(就是除了 Java 和 PHP 之外我们常见到的)都把分号去掉了
第二层意思,语言的适用性
其实 Paul Graham 已经在一个不起眼的注释里,借其搭档之口间接的表达了这个意思:智力是分阶级的,而不同语言归属于不同阶级(这个理念属于书中《不能说的话》里说指的那类东西)
(中文版 P173 注释)
莫里斯觉得不用这么保密,因为即使竞争对手知道我们使用 Lisp 语言,对他们也不会有帮助:“如果他们真的聪明,早就已经在用 Lisp 编程了”
对于 Viaweb 为什么是用 Lisp 写的,我只能这么解释这个问题:掌握 Lisp 属于智力上的挑战,倚靠 Lisp 的特性来快速开发产品是极少数高智商的人能做到的事情,Lisp 的始创者将其作为数学表达方式,而从来没想过用 Lisp 做这么具体的产品。所以书中引用别人的话,建议黑客了解 Lisp,哪怕未必在实际工作中用到它,其实和王建硕对微积分的看法是一样的(人的脑子思考问题,除非经过特别的训练(微积分是训练的一种),都是线性的)。我的看法是,Lisp 绝不适合做开发,就像高斯的尺规作图十七边形不是你能做的一样。我想象的 Lisp 里大量使用所谓的 macro,可维护性相当于十七边形。
PHP 能足够流行,主要原因之一是这语言下贱,我想如果所有语言都能测一下开发者的平均智商的话,应该 PHP 的开发者的平均智商是最低的。但这话绝不是冒犯任何人,想承认他流行就必须承认这是因为连智商 90 的人都敢尝试给 PHP 写 Framework 才能导致这么流行,这是一个事实,跟任何一个具体的使用者是谁、怎么用无关。我在开始了解其他语言后,才知道这么个事实:其他几乎所有语言的基础库,都是用同样的语言写就的,唯独 PHP 的基础库都是靠 C 的。去年看到一片文章说 PHP 不是语言,深表同意,我认为 PHP 的位置实际处于伪代码和程序语言之间,以快和下贱为特色,你可以快速搭建原型,需要人手时可以找一群民工来写,这语言当然就很厉害了。《黑客与画家》给我最大的一个启示就是,尽管我明白优化乃万恶之源,但实际写代码的时候还是容易拘泥于细节,现在看来最痛恨的事情就是在给一个应用做第一版的时候,代码还不够伪代码化。你是程序员,你是画家,你要最快的速度让一个程序能跑起来。画一幅受欢迎的画是程序员要做的,把画印刷成无数分卖往全世界是工程师要做的。真等 facebook 的网站运转起来了,还愁这世界找不到人改进下 memcache 的 pecl 就节省出上万台机器么。
我之前相信语言争论的和事佬说法:语言各有各的精髓,但总的来说是相等的。Paul Graham 用一个简单的例子来驳斥:如果承认 Perl 5 比 Perl 4 强,那就应该承认不同语言之间也存优劣之分(这种手法我以前也用过,当时用自己一年间的差距来证明合作的困难)。其实以前看《软件随想录》里的一篇《你的编程语言能这样做吗?》时就在琢磨这个问题了,看到《黑客与画家》的时候又把这个问题强化重视了。你可以继续用 PHP 去谋生,但不可以不知道在一些语言特性上,PHP 相比 Python 或 Ruby差的有多么远。