软件, 没有圣杯的荣耀, 只有梦萦的代码 — “Dreaming in Code”书评

code2.jpg当日我读完第三遍 “Dreaming in Code“,  是夜, 代码冰山入梦来. 我想, 应该整理一下我的读书笔记, 写一篇书评了.

两打程序员, 三年的时间, 4,732 个 Bug, 以及一个愿望: 打造一个卓越的软件. 这就是 “Dreaming in Code” 所描述的故事. 而这个故事, 却没有 “新机器的灵魂 (The soul of a new machine)” 那样波澜壮阔, 甚至没有 “人月神话 (The Mythical Man-Month)”  那样告诉你一个明确的教训. 单论情节,  这就是一个沉郁到极点的故事. 没有英雄人物, 没有情节跌宕, 所有的人草草的出场, 草草的收场. 可是依旧一个梦在那里. 这个梦让全世界的程序员心动, 萦绕每个敲下过 Hello World 的人 — 怎样打造卓越软件.

软件难做,  高德纳 (D. E. Knuth) 这样写道. 为何难, 他没有回答. 而 “Dreaming in Code” 带来了一个具体的例子, 一个鲜活的, 几乎失败了的例子. 一个有资金, 有优秀程序员, 有开放的管理文化和明确的雄心的项目, Chandler, 曾经如恒星一样耀眼, 又如流星一样湮没. 不禁要问: 为什么? “幸福的家庭是相似的, 不幸的家庭各有各的不幸”. 这句话用来解释失败的项目再合适不过了.  如 Fred Brooks 那个著名的论文 “没有银弹 (No Silver Bullet)”[PDF] 揭示的一样, 这个问题, 没有一个明确的答案.

即使没有答案, 人们也在求索. 这本书, 和 “人月神话” 一样, 都是探索怎样打造优秀软件的著作. 不同的是 “人月神话” 近似于总结, 而这本书, 却只有问题,  无数的问题: 为什么不能像架设桥梁一样打造软件? 为什么构建软件不能像搭乐高积木一样? 为什么一个创造奇迹的人不能再次创造奇迹? 为什么有的开源软件成功了, 有的却失败了? 太多的为什么, 太多的问题. 而这个问题的答案, 不在书上, 确在书的字里行间, 在读者的思考里.

我是个天天写代码的程序员, 也是个常常在开源社区参与项目的程序员, 说起来再熟悉不过代码这个东西了. 可是怎样编写代码来组建卓越的软件, 我没有答案, 谁都没有答案. 可是这本书能帮助你找答案. 我极其推崇这本书的原因是, 读完之后, 你能问自己一些问题, 答案是这个么, 是那个么? 这本书本身, 不是答案, 而是获得答案的钥匙. 随着记者特有的写实的文风, 你会在书的字里行间, 跟着作者找到这把钥匙.

对于想找钥匙的人, 这本书有两个优点. 一是提出问题多, 资料多. 都说提出问题是解决问题的一半, 这本书在这一半做得相当好. 问题的另一半, 也就是答案, 这本书没有具体给出. 但是这就给了读者独立思考的余地. 有人会说是因为没有风险投资的压力, 有人说是前期需求不明确, 有人认为管理混乱. 无论怎样的答案, 你都会找到翔实的资料来佐证, 或者推翻. 这是一部活生生的不带评论的记录片. 这样的一手资料, 是极其有价值的.  第二个优点是故事的本身. 这是一个让人郁闷的故事, 一个失败的故事. 成功的故事通常激动人心, 但成功的光环往往掩盖了很多问题. 在成功的耀眼光芒下, 即使钥匙就在阳光下, 也很难找到光闪闪的它. 而在失败的废墟和尘土中, 钥匙如小钻石一样藏着, 细微的光芒引导勇敢的探索者, 并给他高价的回报. 失败总是比成功, 更加容易获取教训.

这是一本文笔优雅, 细节具体的书. 可是缺点也是显而易见的. 最明显的就是琐碎八卦太多. 作者是一个知识面很广的人, 能够从日历软件扯到图灵机和停机问题, 也称得上科班出身. 但是有时候可能也是为了显示知识面宽广吧, 把不相干的概念堆砌在一起到了没有边际的程度了. 比如第九章, 完全就是软件工程领域的最最基本的知识, 从软件工程到GOTO大战, 再说到 Ajax 和 Google 的崛起, 这之间的逻辑线就完全是天马行空了. 任何一个称得上关心现代开发技术, 或者科班出身的开发人员, 对于书里面提到的这些琐碎的事情, 都是烂熟于心的. 概念的过分堆砌和琐碎事情的描述至少占了这本书的1/2. 幸好这本书是值得读很多遍的, 再次阅读的时候, 跳过去就好了.

如果这篇书评能有副标题的话, 我愿意写上: “五个月的时间, 三遍阅读, 三十二页的读书笔记和无数的批注, 以及一个萦绕在脑海中的思考: 如何打造卓越的软件?” 这就是我这个读者的故事. 这本书国内的翻译是韩磊老师做的. 他翻译做 “梦断代码“. 我更加喜欢 “梦萦代码” 这个名字 (Dreaming 翻译成梦萦, 意音俱佳).  当年希尔伯特被问起, 五百年后若是他重回世间, 第一件事情是什么. 他说, “我要一定问黎曼猜想有没有被证明”. 相似的是, 宋朝僵卧孤村壮志未酬的陆游, 当年眼见收复中原无望, 梦里恍惚见到铁马冰河,  一梦醒来后对子女说: 王师北定中原日, 家祭无忘告乃翁.  无数的开发者梦萦代码, 一梦醒来, 就想问一个问题: 软件工程有没有找到银弹? 这个银弹之梦, 打造卓越软件之梦, 会一直萦绕着开发人员, 直到永恒.

情系软件, 梦萦代码