一本书,一句话

有时候我看了一本厚厚的书,可能大部分内容很快就会忘记,但有那么一两句话 却会一直深深的印在脑子里。

1 这本书是我仔细grep Linux内核源代码写出来的

在《Linux Device Driver》第一版的序里你会看到这句话。大学的时候我们宿舍 里一个计算机系的同学在看这本书,看到这句话的时候大为感叹了一番,“哇,这 个作者好强啊!光靠grep内核源代码就能写出这么好的书!”后来我自己也看这本 书的时候,看到这句话也觉得很受启发。Grep是一个很古老、很传统的Unix小工 具,它真的很有用。

所以后来我也一直坚持用grep阅读源代码。所以后来当我发现用grep读Android代 码慢得让我受不了的时候,我非常想解决这个问题,于是有了 beagrep: (0.23 秒grep两G代码)

2 机制与策略

这不是一句话了,而是一个很简短的关于软件编程的哲学。很多书里应该都能看 到这个话题,但我第一次看到它,也是在《Linux Device Driver》这本书里(所 以很有趣的一点是通过这本书我没怎么学会写Linux驱动,但我学到了别的很好很 强大的知识)。

后来搞Android,偶尔看到一个前同事在Android邮件列表(Google Group?)里发 了一封邮件,说自己觉得adb push一次只能push一个文件或者一个目录有点不爽, 所以hack了adb的C代码,让它支持一次能push多个文件、目录。我真的很想对他 说,小兄弟,一次能push一个文件/目录是一个机制,一次push多个文件/目录是 一种策略,后者可以轻易地通过脚本封装前者来实现。我们最好能把这二者分开, 因为它们是不同层面的东西。

对,说到分层了,我认为机制与策略就是分层的另一种说法。从tcp/ip的角度来 说,ip是一种机制,tcp是策略;从http/tcp的角度来说,tcp是机制,http是策 略…

复杂的软件问题,总可以用增加一个分层来解决;but,人生最厉害的就是这个 but,除了太多分层这个问题…

3 What you don't know, won't hurt you

这句话,我是在C++的设计与演化这本书里第一次看到的。看到之后如获至宝,奉 为至理名言,因为我终于找到理由可以让自己别那么费劲巴拉的学各种C++的偏门 语法了。因为你拼命想学会那些东西,只不过是受了你的一种恐惧的驱使——C++里 有那么多深奥的知识点,我如果不全盘掌握的话,真的好怕有一天会因此而吃苦 头…

C++的作者明确的告诉你,不要有这种担心,没关系的。让我如释重负。

联想到vim作者写的高效能编辑器使用者的七个习惯(让我想起古龙的七种武 器:-)),也曾经强调不要试图去掌握一个强大的编辑器的所有功能。

因为大部分功能,可能你这辈子也不会用到!

用到什么,再学什么。时时地审视一下自己,最近经常重复做什么样的编辑(或 任何其他编程相关)操作,然后去想办法、去学也好,自己造轮子也好,去优化 这样的重复的动作,让它自动化?给它设个快捷键?

又让我想起一句经典,没有测量,就没有优化。

和那一句,过早的优化,是万恶之源。

和那一句,万事开头难。为什么万事开头难?因为做过早的优化了…

和那一句,罗马不是一天建成的。为什么会想到这一句呢?因为任何想要在一天 之内建成罗马的尝试,想必已经做了所有的过早的优化了吧?想必已经掌握所有 C++/Perl的偏门语法了吧?

说到Perl,和C++同被我的偶像大嘴Steve Yegge尽情地无情地嘲笑的两门语言。 这一节的题目,一模一样的那句话,在Perl语言设计者自己写的(作者之一) Programming Perl那本书里,也出现了:-) 不过我几年前看那本书的时候根本没 有留意到那句话。

what-you-dont-know.png

说明这两种语言真的是复杂到一定程度了?那又如何,难道我就不敢用它们了吗? 勇敢一点!What you don't know,won't hurt you!

4 Coders At Work

这本书里有很多神级软件英雄的采访。

比如Jmz,XEmacs、Netscape浏览器最早的幕后黑手,被问到他如何编程时,“我 就列个单子,然后一条一条划掉”。

比如那个设计了Memcached的家伙,问到他如何读代码时,说用ls/find先看看目 录树。

比如Knuth,问他用不用TDD,说我一般只在捣鼓、熟悉一个新系统的过程中才会 写一些test。

比如Unix之父,Ken Thompson,问到重头开始自己的编程生涯的话,有什么遗憾 要弥补,说要好好练练打字…爷爷,难道您不会盲打?

5 还有很多很多

比如Code Complete,啰嗦的不行,但句句听起来是肺胕之言。

比如那本非常非常经典的SICP,里面有一句,许愿式编程。编程时就是许一个一 个愿,然后一个一个地去实现。Programming by wishing,这是我以前没有想过 的一种编程境界。好吧,我现在就许个愿先,愿自己勇敢一点,不要忘了,What you don't know, won't hurt you.