Posts published during August, 2009

LISP 语言是怎么来的–LISP 和 AI 的青梅竹马 A

LISP 语言的历史和一些番外的八卦和有趣的逸事,其实值得花一本书讲。 我打算用三篇文章扼要的介绍一下 LISP 的早期历史。 讲 LISP, 躲不过要讲 AI (人工智能)的,所以干脆我就先八卦八卦他们的青梅竹马好了。

翻开任何一本介绍各种编程语言的书,都会毫无惊奇的发现,每每说到 LISP, 通常的话就是”LISP 是适合人工智能(AI)的语言”。 我不知道读者读到这句话的时候是怎么理解的,但是我刚上大学的时候,自以为懂了一点 LISP 和一点人工智能的时候, 猛然看到这句话, 打死我也不觉得”适合”。 即使后来我看了 SICP 很多遍, 也难以想象为什么它就 “适合” 了, 难道 LISP 真的能做 C 不能做的事情么? 难道仅仅是因为 John McCarthy 这样的神人既是 AI 之父, 又是 LISP 之父, 所以 AI 和 LISP 兄妹两个就一定是很般配? 计算机科学家又不是上帝,创造个亚当夏娃让他们没事很般配干啥? 既然本是同根生这样的说法是不能让人信服的, 那么到底这句话的依据在哪里呢? 我也是后来看 AI 文献, 看当年的人工智能的研究情况,再结合当年人工智能研究的指导思想, 当年的研究者可用的语言等历史背景,才完全理解“适合” 这两个自的。 所以,这篇既是八卦,也是我的心得笔记。我们一起穿越到 LISP 和 AI 的童年时代。 虽然他们现在看上去没什么紧密联系, 他们小时候真的是青梅竹马的亲密玩伴呢!

让机器拥有智能, 是人长久的梦想, 因为这样机器就可以聪明的替代人类完成一些任务。 二战中高速电子计算机的出现使得这个梦想更加近了一步。二战后,计算机也不被完全军用了,精英科学家也不要继续制造原子弹了,所以, 一下子既有资源也有大脑来研究 “智能机器”这种神奇的东西了。 我们可以随便举出当年研究繁盛的例子: 维纳在 1948 年发表了<控制论>, 副标题叫做 <动物和机器的控制和通信>,  其中讲了生物和机器的反馈,讲了脑的行为。 创立信息论的大师香农在 1949 年提出了可以下棋的机器,也就是面向特定领域的智能机器。同时,1949年, 加拿大著名的神经科学家 Donald Hebb 发表了“行为的组织”,开创了神经网络的研究;  图灵在 1950 年发表了著名的题为“计算的机器和智能”的文章,提出了著名的图灵测试。如此多的学科被创立,如此多的学科创始人在关心智能机器, 可见当时的确是这方面研究的黄金时期。

二战结束十年后, 也就是 1956 年, 研究智能机器的这些研究者, 都隐隐觉得自己研究的东西是一个新玩意,虽然和数学,生物,电子都有关系, 但和传统的数学,生物,电子或者脑科学都不一样, 因此,另立一个新招牌成了一个必然的趋势。John McCarthy 同学就趁着 1956 年的这个暑假, 在 Dortmouth 大学(当年也是美国计算机科学发展的圣地之一, 比如说, 它是 BASIC 语言发源地), 和香农,Minsky 等其他人(这帮人当年还都是年轻人),一起开了个会, 提出了一个很酷的词, 叫做 Artificial Intelligence, 算是人工智能这个学科正式成立。  因为 AI 是研究智能的机器, 学科一成立, 就必然有两个重要的问题要回答, 一是你怎么表示这个世界,二是计算机怎么能基于这个世界的知识得出智能。 第一点用行话说就是”知识表示”的模型, 第二点用行话说就是“智能的计算模型”。 别看这两个问题的不起眼, 就因为当时的研究者对两个看上去很细微的问题的回答, 直接造就了 LISP 和 AI 的一段情缘。

我们各表一支。 先说怎么表示知识的问题。 AI 研究和普通的编程不一样的地方在于, AI 的输入数据通常非常多样化,而且没有固定格式。 比如一道要求解的数学题,一段要翻译成中文的英文,一个待解的 sodoku 谜题,或者一个待识别的人脸图片。 所有的这些, 都需要先通过一个叫做“知识表示”的学科,表达成计算机能够处理的数据格式。自然,计算机科学家想用一种统一的数据格式表示需要处理多种多样的现实对象, 这样, 就自然的要求设计一个强大的,灵活的数据格式。 这个数据格式,就是链表。

这里我就不自量力的凭我有限的学识, 追寻一下为啥链表正好成为理想的数据结构的逻辑线。我想,读过 SICP 的读者应该对链表的灵活性深有感触。为了分析链表的长处,我们不妨把他和同时代的其他数据结构来做一比较。 如我在前面的一个系列所说,当时的数据结构很有限,所以我们不妨比较一下链表和同时代的另一个最广泛使用的数据结构-数组-的优劣。 我们都知道,数组和链表都是线性数据结构,两者各有千秋,而 FORTRAN 基本上是围绕数组建立的,LISP 则是围绕链表实现的。通过研究下棋,几何题等 AI 问题的表示,我们的读者不难发现, AI 研究关心于符号和逻辑计算远大于数值计算,比如下棋,就很难抽象成一个基于纯数字的计算问题。 这样,只能存数字的数组就显得不适合。 当然我们可以把数组扩展一下,让这些数组元素也可以存符号。不过即使这样,数组也不能做到存储不同结构的数据。 比方说棋类中,车马炮各有各自的规则,存储这些规则需要的结构和单元大小都不一样,所以我们需要一个存储异构数据单元的模块,而不是让每个单元格的结构一样。 加上在AI 中,一些数据需要随时增加和修改的。 比如国际象棋里,兵第一步能走两步,到底部又能变成皇后等等,这就需要兵的规则能够随时修改,增加,删除和改变。 其他问题也有类似的要求,所有的这些,都需要放开数组维度大小一样的约束,允许动态增加和减少某一维度的大小,或者动态高效的增加删除数组元素。 而一旦放开了单元格要同构和能随时增加和删除这样两个约束,数组其实就不再是数组了,因为随机访问的特性基本上就丢失了,数组就自然的变成了链表,要用链表的实现。

所以,用链表而不是数组来作为人工智能的统一的数据结构,固然有天才的灵机一动,也有现实需求的影响。当然,值得一提的是,在 Common LISP 这样一个更加面向实践而不是科学研究是 LISP 版本中,数组又作为链表的补充,成了基本的数据结构,而 Common LISP,也就能做图像处理等和矩阵打交道的事情。这个事实更加说明,用什么样的数据结构作为基本单元,都是由现实需求推动的。

当然,科学家光证明了列表能表示这些现实世界的问题还不够, 还要能证明或者验证额外的两点才行, 第一点是列表表示能够充分的表示所有的人工智能问题,即列表结构的充分性。 只有证明了这一点,我们才敢放心大胆的用链表,而不会担心突然跳出一个问题链表表达不了;第二是人工智能的确能够通过对列表的某种处理方法获得,而不会担心突然跳出一个人工智能问题,用现有的对链表的处理方法根本没法实现。只有这两个问题的回答是肯定的时候,列表处理才会成为人工智能的一部分。

对于这两个问题,其实都并没有一个确定的答案,而只是科学家的猜想,或者说是一种大家普遍接受的研究范式(paradigm)。 在 1976 年, 当年构想 IPL, 也就是 LISP 前身的两位神人 Alan Newell 和 Herbert Simon ,终于以回忆历史的方式写了一篇文章。 在这篇文章中,他们哲学般的把当时的这个范式概括为: 一个物理符号系统对于一般智能行为是既充分又必要的( A physical symbol system has the necessary and sufficient means for general intelligence action)。 用大白话说就是,“智能必须依赖于某种符号演算系统,且基于符号演算系统也能够衍生出智能”。 在实践中,如果你承认这个猜想,或者说这个范式,那你就承认了可以用符号演算来实现 AI。 于是,这个猜想就让当时几乎所有的研究者,把宝押在了实现一个通用的符号演算系统上,因为假如我们制造出一个通用的基于符号演算的系统,我们就能用这个系统实现智能。

上面我们说过, 链表的强大的表达能力对于这个符号演算系统来讲是绰绰有余的了,所以我们只要关心如何实现符号演算,因为假如上面的猜想是对的,且链表已经能够表示所有的符号, 那么我们的全部问题就变成了如何去构建这样的符号演算系统。后面我们可以看到, LISP 通过函数式编程来完成了这些演算规则的构建。

这里,需要提请读者注意的是, LISP 的全称是 LISt Processing, 即列表处理,但实际上 LISP 是由两种互相正交的哲学组合形成的, 一个是列表处理,另一个是函数式编程。 虽然在下面以后,我们会介绍 S-Expression 这样美妙的把两者无缝结合在一起的形式,但是为了清晰我们的概念,我要强调一下列表处理和函数式编程是两个正交的部分。实际上,我们完全可以用其他的不是函数的方式构建一个列表处理语言。在历史上,早在 FORTRAN 出现之前,Alan Newell 和 Herbert Simon 就用汇编实现了一个叫 IPL 的语言,而这个 IPL 语言就是面向过程的对列表处理的,而后,McCarthy 一开始也是用一系列的 FORTRAN 子程序来做列表处理的。比如 LISP 里面的 CAR 操作,其全成实际上是 Content of the Address portion of the Register, 顾名思义,寄存器的地址单元内容,也即列表的第一个元素(和C表达数组的方式类似,这里寄存器中存着指向列表第一个元素的指针)。 函数式的却不以列表为基本数据单元的语言也很多,比如 Scala ,就是以对象为基本数据单元。 因此,函数式和列表处理是不一定要互相耦合的。 那么,到底是什么原因使得 LISP 选择函数式,这样的选择又为啥更加适合当时 AI 的研究呢, 我们下节将继续介绍当时 AI 的研究范式,强弱 AI 之间的辩论和函数式编程在当年 AI 研究上的优点。

(待续)

(“高级语言怎么来的“ 系列仍然有后续,这篇是临时插入)

程序员心底的小声音

编程大约有三个境界,新手,高手,和高不成低不就的中手。这三个境界,大致和王国维先生划定的做学问的三个境界一一对应。 一般来说,如果不经过几十万行的代码的锤炼(衣带渐宽终不悔,为伊消得人憔悴),或者长期在一个高手团队里面打磨切磋,那么无论怎么样的理论熟悉,打字熟练,考试全A,编程起来,都应该算是中手。一个中手如果机缘很好,得到高人亲自指点,则能很快成长为高手,如果没有这样的机缘,那就要在“众里寻她千百度”这个层次苦苦的求索锤炼很久,才能“蓦然回首”。

读书是一种很好弥补没有高手在场的方法,都说书是最好的老师嘛。 可是现实是,高手写给中手的书很少。 在任何行业,适合新手的入门的书很多,适合中手的书就很少。 原因有两个,一来高手极少愿意耐心的的指点成长秘诀,就算写了,也是蜻蜓点水,因为这些经验啊结论啊,都被他们本身提炼成了珠玑,他们觉得最重要的也就是这么寥寥几句,也没有太多的废话好写。 而读者如果没有类似的经历,则看到这些珠玑,只是觉得把玩颇为有趣而已,极少能有同感。 鲜有高手,能把技术书写成散文集,如 Brooks 一样,在《人月神话》中把经验教训和经历背景等一一道来,并且从这些经历中抽出一般性的知识。 所以,高手的风格一般是浮光掠影概括一下大致自己领会到的几个原则和教训。 这些寥寥数语的珠玑,对于其他高手来说一看就懂,但是对于中手来说就很难以理解。 所以很多高手写出来的给中手看的书就曲高和寡。 二来,中手其实水平差异巨大,偏好也各不一样,有的或许根本认识不到自己应该走的成长轨迹,有的认为这些书籍是片面知识,所以把不喜欢的书都给扔垃圾堆了,光捡自己喜欢的书看;有的未必看得上高手的经验,认为高手说的那些自己也早就领悟到了。所以,也不喜欢购买这些书籍。这两个原因,就造成了高手提携中手的书在市场上很少见到。

不过这样的书倒不是没有,比方说在编程领域, 我至少可以推荐四本这类的书,这四本分别是
《Pragmatic Programmer》, 《The Art of UNIX Programming》, 《Elements of Programming Style》 和 《The Productive Programmer》. 这四本书,都是高手所写,都属于高手指导中手的典范。第二第三本我原先都介绍过。 而第四本余晟同学的书评比我写得好几百倍,所以我就以 《Pragmatic Programmer》 为例说明这个问题。

我们前面说了,对于中手,特别是在“寻她千百度”这个层次的中手来说,或许本身已经捡到了一些珠玑,或许对于像 《Pragmatic Programmer》 里面说的那些 Tip,有的是深有同感的。 比如 DRY (Don’t Repeat Yourself 不要重复你自己), 基本上大家都知道,可是在实际中(至少我自己)还是不停的一次一次的犯错误,做事情不符合 DRY 原则(一次一次犯这个错误本身也是一个 DRY 错误, 因为 DRY 原则要求你对于每种错误你只能犯一次)。 读到的时候深有同感, 写代码的时候却忘到 Java 国去了,这还真不是个案,是非常普遍的现象。

能不能让正确的原则指挥正确的行动本身,其实就是区分是否是高手的一个显著标志。 试想,两个都了解 KISS 原则的程序员在一起写代码,高手的代码必然是自然流露出 KISS 的优雅,而中手或许需要旁人提醒和多次重构,才能达到理想的状态。 出现这个问题的原因很明显–中手没有完全内化 KISS 原则,所以尚且不能“运用自如”。 内化是一个非常复杂的认知过程,本身涉及到大脑中 mind set 和 paradigm 的切换, 所以必然不是一个简单的隔夜就能完成的过程,这也就是为啥能够“消得人憔悴”,但是切换一旦完成,实践中就会自然流露出这种新的认识,也就是到了一个新的境界,发现灯火阑珊处。

那么原则和知识的内化这个过程怎么能够加速呢?也就是说,怎么较快的到达高手境界呢? 可以肯定的说,光靠对自己说我“下次一定按照这个原则这样做”是不行的。认知科学认为,频繁的高强度的外部刺激和自主的有意识的反复提醒是加速内化的两个重要方法。 第一个方法需要外部环境的支撑。 试想,如果一个程序员不是天天和复杂文本处理打交道,他必然没有足够外部刺激来熟悉和内化正则表达式; 如果一个程序员不是天天和极度复杂的大项目打交道,用全自动编译环境和自动单元测试也显得无甚必要,所以,除非你正好掉进了一个天天有高强度训练的环境,否则全靠第一点是不可能的。 尤其是自学一门语言和一门技术的程序员,往往在没有高强度训练之前就拿着这些技能投入工作了,因此想成为某方面的高手,只能采取第二条路,就是有意识的强化实践和反复提醒。

《圣经》里有个故事,说一个人在沙漠里,信心丧失的时候,突然听到 “A Still Small Voice” (平静的小声音), 即上帝的启示。这个平静的小声音把他从绝望中拉了回来。 其实对于这个人来说,他本身的实践能力在 “平静的小声音” 出现前后并没有多大的改变,唯一的不同就是他知道该怎么做了。

内化一个知识或者认识的时候所循的路径也是一样的。 我们常常会“忘了”应该怎么正确的做一件事情(这个地方的“忘了”,指我们之前从书中或者其他渠道读到看到了正确的原则或方法,但是在那一刻脑子里压根没考虑这个原则或方法,因为这个原则或方法压根没有亲自实践过,所以根本不是自己的一部分,不属于自己)。 在这个时候, 如果突然有一个平静的小声音跳出来,说,“嘿,你是不是该遵循这个原则,用这个方法?” 无需说,我们对问题的思考就能顿时全面起来, 也会更加深刻的理解原先读到看到的不属于自己的原则和方法。当然,我们更加感兴趣的是,如何能够在身边没有高手和上帝发出这样的平静的小声音的时候,自己发出这样的小声音?

怎么靠自己呢,记得鲁迅小朋友破坏公物在课桌上刻的“早”么?是的,我们需要抽象出一些简单的词句和规则,靠记忆和不断的提醒,小规模的内化这些小声音,让这些简单的小声音能够时刻从大脑里跳到耳边,提醒自己。 具体来说,在阅读上面的几本书,尤其是阅读 《Pragmatic Programmer》 的时候,如果仅仅是以普通的浏览的方式阅读,就会很简单的陷入 “啊,这个我知道了,啊,那个我了解了,恩,这个以后要注意” 的套路中。 这样的阅读方式,只会强化原有的自己已经知道的部分,而不大可能把“以后要注意” 这部分全部内化。所以,自负的读者读完了之后必然觉得“哈哈,高手不过如此,大部分我也知道嘛”,而不是“是的,我还有不少要注意”。 这两个态度,就把高手和易于满足的中手永恒的隔开了。 我觉得,想要内化这些小声音,还是要靠实践,如果不实践,即使你把这些小声音写在 100 块钱的高档笔记本上也没有用。我个人觉得,理想的阅读状态应该是先大致理解和记住里面的 Tip, 然后每周争取实践 2-3 个 Tip。其实如此做完一圈也就是半年,在这一圈之后就会记住所有的 Tip 的内容,这时候,小声音就成了自己的一部分了。然后在剩下的几年里,只要时时有这些小声音挑出来,告诉你,“要自动频繁的测试”,或者“别手动做繁琐的工作”,你会很快的被强迫转换到高效而优雅的工作状态。 到了那个时候,这些小声音就再也不会跳出来了,因为你早就自然的遵守这些小声音的要求了。

《Pragmatic Programmer》 和 《The Elements of Programming Style》 这些书里面的 Tip 都不是来自上帝的话语,却都是值得随声带着的小声音。 其实只要是处理过实际问题,编过几万行程序,大多程序员都差不多都会有或深刻或浅显的对各个 Tip 都感悟,而且我相信或许对有些 Tip 的认识能比原书的作者还要深刻,这是很正常的。 事实上每一个 Tip 只是一句话而已,对这一句话的理解层次, 则完全不这一句话能够覆盖的。 比如说,一天写了两个 Hello Word 的程序员也会领悟到 DRY, 一个刚刚重构扔掉掉几千行重复代码的程序员也领悟到 DRY, 而这两个 DRY 所在的认识层面, 必然是不一样的。 再好比说我在“编程珠玑番外篇”这个系列里面写的有些文字,看上去很有道理,但我本人对这些文字的认识可能比我的读者要浅, 但是这倒不妨碍引发读者思考。 即使有些牛人觉得上面这几本书的作者在某些原则上的认识不够深刻,或者觉得作者只是在罗列一些小碎片,读这些书,特别是 《Pragmatic Programmer》 这本书的那些小 Tip,依然是有益的, 因为他或许能触发你高于作者的思考,然后在你脑中形成更加圆润的珠玑。而对于像我这样属于中手下游平时又没有大项目训练的人,《Pragmatic Programmer》 这本书,和其他的几本书一起, 实在是很好的“小声音汇编”。

17 comments

第二批合租

今天检查了一下合租服务器, 还有很大的空间, 可以再容纳一些独立博客. 正好这几天好几个朋友问我什么时候放出第二批. 所以这次继续放出 10个合租名额.

附上次的六个要求(略有修改)

1. 原先有网站或者博客在国内(任意 BSP 或者独立博客), 想移民的.

2. 流量不会超过每月100G

3. 自己有域名

4. 我不对非人为原因造成的数据丢失或者连接被重置负责任

5. 因为服务器在美国, 要遵守美国当地法律. 不许利用互联网煽动颠覆美国国家政权, 推翻美国资本主义制度,或者煽动分裂美国, 破坏美国统一. 不许恶毒攻击美国国家和地方政府领导人, 美国执政党和美国政府, 否则走人.

6. 服务免费, 但是服务没其他人好. 如果要专业服务, 请访问周曙光或者数字游牧.

这次想合租的同学, 我有三个简单的额外要求 (基于第一次的经验):

1. 我没有太多时间精力帮你解决技术问题, 有问题你只能自己看文档.
2. 只限于搭建个人博客, 博客仅限用 WordPress 程序的(服务商只给了我WP程序), 如果自己装其他程序也可以, 但一定要提前告诉我一下.
3. 遵守版权法, 不上传不符合美国法律的东西. 如果有这样的内容, 这个帐号有可能被服务商停掉.

(另外: 原来给我发邮件或者留言要求第二批合租的我刚才都发邮件回复了, 如果你还没有收到, 尽快给我发信)


(Update: 截至到目前,名额已经达到14个,我会一一用邮件确认,看上去14个都符合条件,所以只好请大家不要继续报名了)

118 comments

我的大学

(应博文视点的几位编辑之邀, 总结了我大学本科的一些经历. 博文视点的新书<我是一只小小鸟>八月即将出版, 收录了我和其他将近20位的大学经历和感悟. 本文特别欢迎读者留言, 编辑说将选择一部分读者留言和这篇一起放到书中去)

我的大学

虽然标题是”我的大学”,但大学中的一切,其实都和大学前的经历和学习习惯有关。因此,我还是从我小学时的一件对我以后人生,包括大学影响巨大的事情说起吧。

数理化和好老爸

我的小学是在农村里和爷爷奶奶度过的。我的父母住在小镇上,两人平时都要工作,没空照看我和我弟弟。所以,我只有周末和放假才到镇上,和父母弟弟在一起。四年级升五年级那个暑假,我到了镇上,和父母在一起。因为一起抓鱼钓虾的玩伴都在老家,百无聊赖的我开始乱翻父亲的书橱,找书看。某天,我翻出了一本叫做《平面几何一题多解》的书,那是本封面很好看的书。我把整本书翻下来,每个汉字我都认识,但每个符号我都不懂。好奇的我于是问父亲,这个书讲的是什么呀,怎么从来没见过这些奇怪的符号呢? 他就告诉我说,书里讲解的这个东西,叫平面几何。他接着问我说,“平面几何是个很有趣的东西,你想不想学呢?” 我说,当然想啊。那时的我,其实只是一个好奇的小学生,迫切想知道这个书中的图画和符号的意思。我肯定不会想到,这个很随意的决定,改变了我其后的整个人生。

听了我肯定的回答,我父亲立即从书橱里层(我家书太多了,书橱太小,书橱里书分里层外层,外层的书挡住了内层的书脊,我从来都不知道里面还有宝贝)变戏法一般的翻出了本《数理化自学丛书–平面几何》。对于我父亲这一代人来说,《数理化自学丛书》是代表着知识,荣耀和梦想的。我感觉他翻出这本书的时候的动作是虔诚的,但当时的我并不知道我父亲在这套书上寄托的希冀和梦想。我只记得他告诉我,当年这套书,用去了他大半个月工资。就这样,从五年级开始,我就在父亲的指点下,开始蹒跚前进学习《平面几何》。从一开始不知道什么叫 “证明”, 需要他一字一句帮我厘清逻辑关系,到后来全是自学不需要他教,我很快就喜欢上了自学这种学习方式,每天自己看书并且做八道题。暑假过完后,我就回到了爷爷奶奶的老家。父亲让我继续自学,并且布置我一周做八道题。我在爷爷奶奶家,每天放学回来不做家庭作业也不看动画片,就赶紧做一道几何题。做几何题的妙趣,是不融入其中的人不能理解的。比起小学里的抄生字,抄课文这种作业,做几何题是脑力和体力的双重享受。当时,我周围没人可以讨论切磋,全靠自己。遇到不会的题目,我只能自己冥思苦想,或者熬到周末和父亲讨论,因此,常常被一道难题从周一折腾到周日。好在这套书是粉碎四人帮后出的第一版,当年学生的数学水平比不上现在的学生,而这本书又是以自学为主要切入点,所以题目相对也简单,我冥思苦想几天后大体上也能想到解题思路。因此,我能够常常体验百思得解的愉悦感。我觉得,这种时常拜访的愉悦感,让我很早就开始相信独立思考的力量。

每个周末,父亲都用吱吱作响的自行车带我到镇上洗澡理发,然后批改上周我做的几何题。在自行车上的时候,他常常信马由缰,随口说些说些初中物理和初中代数知识,比如看到船就说浮力,看到马就说做功,看到三角形就说余弦定理等等。我也就半懂不懂的听,有时候插几句话,有时候能睡着了,没有丝毫的压力和拘束。很早就被中学数学物理知识装备的一个小学生是可怕的,我那时候觉得知识就是力量,因此我一定要用自己的数学物理知识做一台柴油机,我很自信的认为我懂得做柴油机和机动车的一切知识,说不定还能做出第二类永动机。我爸爸屡次告诉我不可行,而我反过来一直屡次告诉他,你是个没有理想的人。我爸爸不愿意打消我的理想,只是扔给我更多的书,希望能够打击我制造柴油机和永动机的热情,而我的知识理想,在读了更加多的书以后,变得更加的坚固了,我相信,学习知识是我人生第一重要事,有了知识,虽然不一定能做柴油机,但一定能做更多强大的事情。同时,我通过学习几何和其他的一些父亲扔给我的书,开始对自己的学习能力有了自信,我相信,找书自学是学知识的好方法,同时,把题从头到尾做一遍是很好的自学方法。

所以,我带着三个理念进入了大学,第一是什么东西都可以自学,第二是慢即是快,笨笨的做一遍题是学习的捷径;第三是知识理想主义,知识就是力量。而读书学知识能够消除蒙昧,掌握改变世界的力量,所以是一件快乐的事情。

大一,极端自负和极端自卑

我的高考成绩还很不错,高中还拿了一个数学联赛一等奖,所以,我是带着对自己数学知识(为了准备数学竞赛,我看了很多闲书,有很多就是大学数学系的教材)和学习方法的自信满满,和对南大数学系这个相对不好的选择的遗憾和自卑(当时的高考分数可以填报更加好的学校或更加喜欢的专业)来到大学的。当时我的心理状态可以用八个字概括: 极端自负,极端自卑。 这种心态,一直笼罩了我上大学的头两年,而且总是以一季度为周期,在两极之间交替变化。我在学期开始往往很自负,到期中考试左右很自卑,然后再自负,再自卑,不断反复。

在我看来,极端自负这个心态,其实不是因为自信,而是因为极端自卑生出的应激反应–为了掩盖自卑,只好用自负来掩饰。为什么我极端自卑呢,大体来自两个方面,一个是我的成绩排名在高中都是很前的,但是到了大学就 20 名开外了。尽管我觉得自己的数学水平很不错,考试却总是不怎么样,觉得考试考不出真水平。另一个是觉得自己没有在一个自己满意的系。我喜欢动手的工科,当时我觉得比起计算机系和电子系这样的“牛” 系,数学系并不“牛”。可即使在不牛的系,我都不能做到前10,更别说看上去更加牛的计算机系了。为了掩饰这种这种自卑,就自然生出了极端自负。那时候,我上课根本不听讲,理由是“书上的东西太简单了”。为了证明自己智商还可以,我总是坐在最后一排,显示自己并不热心于老师讲课。我这样持续了两年, 以至于到最后, 我连班上每次都坐在前面的几个同学的名字都不知道。这样的心态明明是错的,我却缺少一个很好的动因来改变它。

不过最原始的三个理念还是在的,我告诫自己即使不听讲,也不能浪费时间。所以,我把听课做作业上节省下来的时间,用在了看喜欢的计算机书和学习编程上了。于是,整个大一大二,我凭借着简单的自学的理念,开始了两件事情,敲 《Thinking in Java》(TIJ) 和 《The TeXbook》 上的没一个样例。

敲 TIJ 的机缘其实很简单,我是在软件学院听课的时候看到他们教 Java, 但是他们用的 《Java 大学教程》太贵了,我舍不得买。 我在网上搜了一圈,发现 《Thinking in Java》是一个免费的英文电子书。 于是,我就在数学系的机房,每天下午和晚上,开着一台计算机,屏幕上放着这个电子书,再用我的很土的笔记本,运行着未注册的 JCreator, 一个字母一个字母的敲 TIJ 上面的程序。我很偏激的认为拷贝粘帖的程序记不住,所以每个字母都自己手敲。 就这样,花了一个学期,居然就把所有的程序敲完了,基本上 Java 的方方面面,我也了然于胸了。

敲完 Thinking in Java 之前没几天,我们就期末考试了。那一次考试的试题是 LaTeX 排版的,而不是手写的。 我考试的时候就问监考老师这玩意怎么排版出来的,因为我知道 Word 这个软件做不到这个效果。监考老师除了对我不认真考试表示不满外, 还算仁慈,告诉了我 LaTeX 这个名词。 寒假里,我就买了一本 LaTeX 教程。然后,突然认识到,原来 TeX 居然是我最热爱的 Knuth 的杰作,于是我就疯狂的开始学 TeX。 我的方法还是一样, 敲例子。 记得 TeXbook 上有一个程序, Knuth 让大家自己照着敲入计算机, 然后还很幽默的说,实验证明,只有很少的人会按照他说的敲入这个程序,而这部分人,却是学 TeX 最好的人。看到这里我会心一笑,觉得自己的方法原来也不算笨。从此,一字不漏敲入一本书的程序成了我推荐别人学习语言的最好办法。 我后来大四又敲了 A Byte of Python,前段时间又敲玩了 The Awk Book,都是不到一个月瞬间从初学者成为细节很熟悉顺手拈来使用者。顺着这个方法,大二我把 《组合数学引论》 和上海交通大学出版的一本 《离散数学》 上的题目都做一题不漏做完了。当时选者两本书也没有特别的目的,就觉得这东西应该是计算机的数学基础。这些积累,在大四全部都显现了出来。

我个人认为, 《Thinking in Java》 和 《The TeXbook》都算得上是理论和实践结合的精品书,是经典的英文原版书。我一上来就读了这两本书,阅读品味就上升了不少,而且变得“崇洋媚外”了,任何时候都以英文原版书为第一选项了。也因为此,虽然我自学的过程中没有高人指点,但自学最重要的一个环节—选书–的盲目性就大大减少了。我记得那时候我看得最多的书就是华章引进的书,黑封面的,我们图书馆里有将近半书架,如果一一细读,穷尽四年是看不完的。但华章的书也不是本本经典,我那时候开始注意选择,细读开头十几页后,基本能决定这个书该不该看。所以即使当时没人指点,全靠自学,读的书还算过得去。那时候南大计算机系的教材,有的我看,有的我觉得不适合自己,就找替代品了。我觉得选书这个事情上,因为有前两本书的标杆,我少走了不少弯路。从这两本书开始,我疯狂的读书就开始了。南大的浦口校区的硬件条件并不好,唯一有空调且可以上自习的地方恰好图书馆。因此我每个暑假,基本上都是很早就过去占位,晚上很晚回去睡觉。我对小说等其他书也不感兴趣,就整天看自己觉得好的计算机书和数学书,做笔记。某天,我开始了一个雄心勃勃的计划:读完 TP312 书架。

大二,而今迈步从头越

大一大二基本上就是在不断的心态波动中前进。我学会了 Java, 也做了不少题,但是考试成绩一直不是很好,因此我比较苦闷,迫切的想要改变这种状态,我的想法是,要么转系,要么好好学习数学。但是转系阻力重重,我又不愿意耐心去学习数学,所以我一度非常纠结。但是大二下学期,我遇到了两个对我人生产生影响的两个人,这两个人让我从正弦曲线般的心态沉浮中跳了出来,让我一下子变得目标坚定了。

第一个人是我的同学以及非常好的搭档,现在在 IBM 工作的李获鼎,另一个是我的叔叔。他们让我变得沉稳,消除了原有的浮躁,学业和心态都走向了正轨。

大二上学期要结束的时候,我们数学系的学生会主席就说,在下次数学系搞的文化节上,要弄一个叫做 模拟股市 的软件,让大家来炒股。我那时候觉得挺简单的,也特自信,就说,明年我来搞吧。后来我记不得是我找获鼎还是他找我了,反正两个人决定一起搞。 寒假他在家自学 JSP, 我就在家看 JDBC 和 SQL。 开学没多久,我们就开工了,他负责写前端 JSP, 我写 Java Bean。两个人编程比一个人好多了, 可以相互看代码,而且可以轮流工作,克服浮躁感。我写程序比较粗线条,基本上功能有了,细节就不管了。他比我认真细致多了,前端一个表格的宽度和颜色都要调好久。在他的影响和“胁迫”下,我做事情也变得细致起来,因为我不细致,他的前端就没法正常工作。那时候他也是一边写一边学,对着书一行一行的敲JSP,态度比我敲 TIJ 时候还认真。和他在一起工作了 20 天,把玩具项目写完后,我也变得踏实起来。做完了模拟股市这个小程序,玩这个系统的同学都挺喜欢的,我的自信心也就有了,心态也平稳了,态度也踏实了,自然地,自卑心理就没了。随着自卑的消失,极端的自信也消失了,简单的说,我心态变得正常了。这时候,虽然还有点小迷茫,我开始思考以后干什么的问题了,听课,做作业也比以前认真不少,成绩也上去了不少。

和我叔叔不能算是遇到,算是再发现吧。我叔叔是个很有冒险精神的人,具有不折不扣的企业家精神。 我非常小的时候, 他帮人家修电视, 然后迅速就搞了计算机,买了我们全市第一台 486。搞了很多年计算机以后, 又自学了单片机,以写汇编为乐。我对叔叔一直的映像是“善于抓住机会”, 倒没有把他和 “耐得寂寞” 很紧密的联系在一起。所以大二升大三的暑假,当我在看 8051 单片机的指令的时候,我叔叔突然告诉我说,他现在就是做这个的,还立即送了我一个编程器,你可以想象我那时候因为惊讶眼睛瞪得比灯泡还大。我那会儿,已经被 Linux 内核折腾得不行了,觉得汇编更加难。若是要在资源受限的系统上做出工业级强度的东西,我觉得就更加远超过我能力范围了。而叔叔,完全半路出家,通过自学,一个人,几年时间,就把这条路走通了。他现在写的汇编程序,运行在千家万户的水表中,完全是积累出来的硬功夫。我叔叔给我的震撼是巨大的,因为我一度怀疑过自己的自学能力,觉得有些事情,我永远没法做,就像童年想做的柴油机一样,只是幻想。我叔叔给了我一剂强心针。

有获鼎和我叔叔这样两个踏实勤奋的人的影响,我也一改以前轻浮的习惯,给自己定了三个简单的要求: 1. 更加多看书,看好书,并且一定一定要做笔记 2. 多编程 3. 开始背 GRE 单词。 就这样, 我就开始了疯狂学习的大三。

大三,深度迷茫和深度积累

大三是我看书最多,思考最多,积累最多的时候。大三我并没有做任何其他事情,主要就是沉稳冷静的做事情,用不断的做事情看书和思考,压抑心底深处的对前途的迷茫。其实整个大三,我都不知道自己要干什么,在干什么,只知道就像一个运动员一直往前奔。大三我们班很多同学都开始准备 GRE 了,我也就跟风准备 GRE。说实话,当时我捧起红宝书的时候,出国的动机并不强烈。那时候我并没有对美国和中国在各方面的差距有清晰的认识,且过于小看环境对人的影响。潜意识中,我想读计算机,但是考研比出国转计算机要简单多了,学长也告诉我,申请计算机专业很难,我们数学系也鲜有先例。因为正方面没有很强的激励,反方面又觉得困难重重,我就不是太把出国当回事,除了背背单词,我把主要的精力放在了读计算机书上。我专门扫荡 TP.312 (计算机理论和编程)那个分类,同时看了很多英文原版书。TP312 中的大部分书,我都是囫囵吞枣的看,做一些总结性的笔记;只有少数几本,如《计算机程序设计艺术》,《编程珠玑》这几本书,是认认真真看的。这时候的我已经没有时间,或者说耐不下性子一条一条做题了,只能浏览一些题。即使这样浏览,也让我在后来大四的工作面试中占了很多优势。

我有一个从高中就开始的习惯,就是把每天胡思乱想的东西记在一个笔记本上,算是思维快照。我还常常翻回去自省,看看过去和现在的变化。大一大二的时候,这本笔记本上记载着的是和生活和感情有关的琐碎小事,或者宏大空泛的目标和叙事。而大三记录下的内容明显具体起来,比如这周看完了什么书,下周去图书馆借什么书等等。现在我回看这些记下的文字,明显就可以发现,我写下的这些计划之间是没有很具体的头绪的,这些要做的事情后面,并没有一个明确的线索串起来,而是向无头的苍蝇一样到处尝试,到处碰壁。举例来说,我的笔记本里清楚的记下某周要看操作系统,可是下周还没看完操作系统的时候,又记下这周不看操作系统了,看编译原理。就这样,好似饥饿的狗熊在掰玉米棒子,看上去很勤奋的在掰,掰下来,啃两口,扔掉。当时我也能感觉到,知识饥饿感永远在那里,永远填不满。不过,我又总觉得前方应该有那么一个玉米棒子,能够填满自己的饥饿感,所以就一直向前奔跑。其实这种奔跑,不管多勤奋多刻苦,因为不够深入踏实,永远都是事倍功半的。好在我在不求甚解的同时,很注意整理自己的既得知识,写在小本子上。后来我到大四的时候,写论文也好,考研和找工作也罢,很多知识我都是临时突击的,好在有这么一本小本子,我可以按图索骥的去深入强化当时无头苍蝇般乱看的一些书。如果用搜索引擎的工作原理打一个比方,我觉得我大三疯狂的读书和学习,就好比是在建索引,等大四要搜索结果的时候,就再也不需要每本书全文检索了,直接按照本子上的索引找到当时看的书。

踏实和勤奋这两个从我叔叔和获鼎身上借来的优秀品质,加上取之不尽的TP312书架和背不完的单词,使我并没有被深度迷茫拉入自信和自卑的反复中,相反,随着这些积累越来越多,我变得越来越自信了,虽然这种对积累的自信尚未被现实验证过。

大四,书到用时

大三的迷茫让我不确定以后的方向,未被现实验证的自信又让我蠢蠢欲动,所以,我就自然的产生了“赌一把”的心态。 如果以赌博为喻,我就是在所有的盘口上都了下注,要不全输光,要不总能赚,而我相信至少能赢一盘。

所以,大四甫一开始,我就拟了一个时间表,自信满满地想要在考研,找工作和出国的三条战线上都有所突破。我设想 11 月之前弄完出国材料,并且把简历弄漂亮,顺带找工作。1 月前寄材料,套磁,准备考研,4月前搞定一切,等 offer。 5-6 月我就写写论文,然后周游中国了,等我周游回来,至少三个机会让我碰到一个吧,我就从了那个就行了。从这个狂妄的计划中可以看到当时的我的自信,不过我这个自信倒是有一定根据的,因为我研究了考研的模拟题和找工作的不少案例,我当时想,好好准备,应该可以上南大,工作应该可以进腾讯,出国我没底,所以我也想用前面两个来保底。

大四只有一门课,所以我就四处乱跑,乱逛。学校有国际会议,我就跑去和老外搭讪;鼓楼有关于佛教的演讲,我也跑去听;IT 公司的宣讲会和笔试,遇到好的我就去参加参加。如果没事,我就上自习,继续读鼓楼图书馆的书。就这样,我遇到了一个又一个的机会,基本上不管成功失败,都算是有付出就有回报,当然运气成分也不少。

10月左右,微软(MSN)来我们学校面试。这是我第一次面试,很紧张,前一天看书看到1点多,第二天午觉就睡过了一点,加上箱子里唯一的一件衬衫皱巴巴的完全不能穿,所以干脆就穿着拖鞋和 T 恤冲去了。面试的人很友好,面试也很顺利,有的同学还在等第二轮的时候,我的四轮就结束了。我当时的感觉是,微软的面试题太简单了,除了问我南京市新街口周边有多少辆车外,其他题目都是中规中矩的计算机面试题。面试出来之后,我和一个软院的同学在食堂讨论题,他说,题怎么这么难啊?我就很奇怪,说,这些题《编程珠玑》上不都有的么? 后来我才知道,其实看过《编程珠玑》的人,不是我想像的那么多。我也是在书架上乱翻才偶然看到《编程珠玑》。在 2005 年的时候,没有Web 2.0 和社会化推荐,我的世界,就只有面前的书架那么大,我幸运的在那么大的书架上遇到了几本经典书,并且细读了,吸收了。

很快,微软给了我一个在上海做测试的职位。 当时我一心要去北京,就不大喜欢上海这个职位,就没要这个 offer。不过有了这一轮,我也知道面试怎么回事了,这次面试,更加强化了我的自信,于是,我又开始比较狂妄了,觉得自己能进当时互联网中最热的,宣称招 50 个李开复博士的关门弟子的公司, Google 中国。

找工作还没全展开的时候,我就要准备考研报名了。我选择了北大生物系的生物信息学专业。其实这是一个让我可以到北京的小聪明,而不是一个全面慎重思考的结果。当时我看到,这个专业只招两个人,而且试题是和计算机系一样,于是我想,除了我这样的一门心思想去北京的,哪个人会绕这么大一个弯子去学生物而不去学计算机呢?其实我自己也不敢挑战计算机系,因为我知道难度太大了,但是我又很想到北京去,就想了这个暗度陈仓的办法。我当时还想, 考上了,要是不爽,读一年俺就退学找工作。2005 年末的大环境和现在是不一样的,那时候 Web 2.0 的呼声很高,让我觉得搞创业比读研有前途多了。 不管怎样,我自认为很小聪明,就报名了,当然考完才知道,就为了这两个名额,有40多个人来考。

我要感谢当时同系的两个同学苗文建和王琨,他们都是准备考北大计算机,即和我考同样的试卷。他们资料很全,我就和他们一起上自习,蹭他们的看。大四我买书花钱很快,到了考研这时候是真的舍不得花七,八十块钱买自己看不上的辅导材料和教材,所以就借他的看。那时候考研的教材是北大的 《操作系统》和 《离散数学》。其中操作系统的教材,行家都知道这本教材参考了不少 Tanenbaum 的,我也看过 Tanenbaum,就不大愿意再买一本。前面我提到过,我大一大二做过一本离散数学教材上所有的习题,所以离散数学我没化太多精力。至于政治,我是经历过3+X 高考的人, 基本上考过政治的人都知道,考好考差和复习不复习无关,至于和什么有关我就不在这里多说了,总之就那么几句话翻来倒去的,命题套路很容易掌握,比揣摩圣意的命题者更加聪明,对于受过大学教育的考生,是个很简单的事情。我最后成绩还不错,考了个专业总分第一,其中数学完全是离散数学的功底,考了个 136, 英语也是靠准备 GRE 托福的底子,考了差不多80。政治也差不多 80,专业课运气很好,正好 90 分搭线,就这样糊里糊涂的考上了。

考研这个事情,我至今觉得运气远大于真正的付出,结果也非常出乎我的预料。记得结果刚出来,同学帮我查分的时候,我根本不相信自己考这么好,还放话说如果考这么好,请全宿舍吃饭(我记得兜里面当时只有200块钱,根本没法请人吃饭,后来还是借钱请客的)。考研结果出来之后,迷茫的我得到了一个非常好的保底,我就比较得陇望蜀了。其实在当时我的心里,我并没有认真想过以后要具体干什么,只是隐隐约约觉得要不去北京,要不就去美国。有了北大这个机会,我就调高了自己的心理标杆,定下了两个大的,具体的目标,或者说是圣杯,一个是进 Google 中国, 一个是到美国名校读计算机,有了考研这个保底,在2月份过完年,我就不慌不忙的认真准备这两件事情了。

我10月份的时候给 Google 投了一份简历,很快在11月份就被拒了。 而我的搭档李获鼎在签了 IBM offer 的第二天,却收到了 Google 的面试邀请(我相信凭他的实力,如果晚一天签约, 现在就在 Google了)。我听了之后觉得很奇怪,按说我们两个,做的项目是一样的, 学得科目也一样的,写的简历互相也看过,都差不多的,我被拒了,他被邀请了,这个好像不大对。 我心里的不服气,反应在行动上,就是每天上网看 Google 中国最近又招了几个人,怎么招的。那时候互联网上盛传的故事是一个人给李开复用很多不同的邮箱发邮件,以保证简历能够万无一失到达,结果瞬间被录用了。这个故事的内容和合理性放在一边,我对故事主人公的精神很感兴趣。我觉得我也可以再试试,说不定坚持就是胜利。正好那个时候,Google 的一些副总裁到北大有个宣讲活动, 说好了现场接受简历的。 我从当时在北大的女友那里得到了这个消息,回来把简历梳理了一下,让她帮打出来,又交了一次。这一次,简历直接交给了某个副总裁,成功了!几周后,HR 就给我打电话,安排机票和宾馆,让我去 Google 面试。

面试的过程平淡无奇,题目不是《编程珠玑》上的,就是《计算机程序设计艺术》上的,再不然就是网上贴出来的。我个人感觉,面试题就那么多,多做做基本上就了然于胸了。我从找工作一开始,就做了个有心人,每天都上网看面试题。这次面试前,我又把《编程珠玑》这些书复习了一遍。同时我知道自己在面向对象编程方面很欠缺,又看到有面试过的人说面向对象也考,就顺带看了《设计模式》。我还比较有心,花了几个晚上,捣鼓了一个移植于 Mac 的,基于 MVC 的可以当场演示的 Java 小游戏,面试当天我还给面试官演示了这个小游戏的架构和用到的设计模式,这样,我感觉,自己面向对象开发方面的弱点就让这个小游戏的演示给弥补了,面试官也一致说好玩。 很快,四轮面试就结束后, HR 把我带着去见李开复。李开复博士是个风趣的,或者说很善于观察人的人。他见到我的第一句话竟然是半调侃的 “小伙子, 我们 Google 不能解决北京户口啊”,我承认当时的确穿得很民工,因为网上说Google 是个很随意的公司,我是继续以凉鞋装备和鸟巢一样的头发去面试的。我也做了一些功课,所以谈话总的来说还比较和谐。说了一会儿后,我就抛出了为什么 Google 拒我一次又让我再面试这个问题,他说这事情还很罕见,要是我再网申,基本上简历是不可能的浮出水面的, 因为数据库里面已经有标记了,不过我这样二进宫算是精神可嘉。这时候我才回忆起面试的一个MM手上拿的简历,的确是我第二次提交书面简历的复印件,而不是网申的打印版,可见还是坚持再投一次好。(这个坚持,我也是和搭档李获鼎学到的, IBM 二面就有拒他的意思, 他要求 HR 再给一次终面的机会,终面刚结束,HR 就和他握手恭喜他加入 IBM 了,所以面试这个事情,坚持到最后的才是胜利者)。 当天和李开复谈完出来,HR 冲我笑笑,握握手,说,就你和他谈得时间最长。我基本上知道, 这个事情成了。

出国的事情也没闲。我觉得直接靠寄材料申请计算机希望渺茫(我先前直接申请了几家数学和计算机,都是拒信飞飞),所以我就押宝在套磁上。另外,我觉得得弄篇论文才能让材料有分量,就回忆以前乱读的一些论文,再找看有没有最新的值得跟的工作。就这样不着边际的乱找,还真的就碰到了一个感兴趣的题目,一个不大成熟的想法,和一个正在征稿的会议。于是,迅速的写论文。凭着数学功底,编程功底,和 LaTeX 熟练程度,几天敲玩了文章主要部分,然后就是不断的改,不断的语法检查,写程序,做实验。总的来说我运气很好,7天之后,压着截至日期,把文章交出去了。 2006 年的 LNCS 还是被 SCI-E 索引的,那时候我觉得自己一个本科生独立弄篇论文还是挺不容易的,很得意,于是拿着新的简历,一边准备考研,一边套磁。

我现在的导师 Yixin Chen 是一个非常杰出的年轻教授(科大少年班出身),我和他套磁的时候,他是刚刚从事教职,因此很需要学生。我之前也发了几封信,到了 4.15 左右的时候,他的另一个原来录取的学生因为某些原因去不了了,所谓就和我说,我可以过来。 那时候我还在等 Google 的 offer, 我的导师说, “Google 的 offer 不难,你读了书以后可以拿美国 Google 的 offer ,我也拿过。而来美国读书的机会就这么一次”。 那时候我想问题并没有现在这么深刻,加上比较想去北京,因此一直犹豫不决,还在催 Google 的 HR 快发 offer, 心想你们哪个 offer 先到我就从了哪个算了。我爸爸,我叔叔都不含糊,一个一个的轮番教育我。然后加上我导师说了上面这番话,我就毫不犹豫的答应了,说我一定过去。于是,我告诉 Google 的 HR, 我不去了。 就这样,我所有的自己认真谋划认真准备的路都没有走, 反而最后通过误打误撞和套磁的路,选择了美国。

其他闲话

总的来说,面试也好,考研也好,写论文写好,之所以能够比较顺利,我觉得都是大一大二一个键一个键敲出来的,也是大三一本书一本书读出来的。我写这篇文章的时候, 把相关的前因后果放到了一起,是为了解释有些事情的前因后果。 不过我不想给读者一个误解,即我恰好运气特别好,一路直行没有任何弯路。相反,我觉得我走了不少弯路,但是我很高兴走这些弯路。比如说,我上大学的时候,很多精力花在了做数论题上,《现代数论经典引论》这本书的习题我差不多一题一题都做完了,但是我出国申请学习数论没拿到中意的 offer, 现在也不从事相关的研究,所以这些积累至今没看到有什么直接的作用;我一度认为自己要做一个电子工程师,我大一大二还旁听了电子系的模拟电路,数字电路,还混到电子系实验室学 ARM 开发板,但是现在这些除了吹牛外也没什么作用,学到的一点皮毛也还给老师了。我是个兴趣很广泛的人,看过的杂书,做过的笔记,最后有用的,我觉得有十分之一就已经很好了。大学的时候,为了让自己精力不耗散,我限定自己每次借书,一定要保证四本计算机/数学,外带一本社科人文书,还有一本任意的书,而且那四本一定要做笔记精读。因为这样,我才能够最终没把有限的人生耗费在无限的浅尝辄止上。

即便这样,如果纯按照现在需要的知识看,我在“没用” 的东西上浪费的时间还是很多。不过我倒不愿意称这些为浪费, 在我看来,成长路径中有很多的偶然,没人知道在一些关键时候需要什么样的知识储备,所以踏实地多储备一些是好事。我在大四的经历和其他的一些经历都告诉我,以前通过看书,自学,彻底的弄懂的一件知识,会在某个不经意的时候,突然被用到。这时候对当年积累的庆幸和再发现的快乐,就像蓦然回首见到灯火阑珊处的秋水美人一样,是没法用文字描绘的。另外,我有个切身的教训,就是要踏实的积累。我读书涉猎很广,很多东西我都能大概知道怎么回事,但是就是学得不深刻,所以即使当时花了很多力气,需要的时候还要花大功夫重头捡起。 所以我的教训就是,与其两个半瓶水,不如一个满瓶水。 这个道理用在读书上就是说,一本好书读两次要胜过两本好书各读一次。要是大学能重新来过一次,我会少读一些书,多读透一些书,这可能是我觉得当年猛读书的唯一遗憾。

小时候我嗜书如命,我爸爸老是担心我会成为一个不懂人事的书呆子。大学中的我,几乎天天泡在图书馆,可以说是个不折不扣的书呆子。其实除了读书外,我的大学生活的其他方面也是很快乐的。我有非常玩得好的同学们;靠着帅哥室友们的魅力,我还常常和他们一起,和联谊寝室那些青春活泼的姑娘们打球,打牌。我还谈了一次恋爱,让我对感情的事情有了深刻的认识,这些事情,交替的穿插在我这个书呆子平淡无华的大学四年,让我的大学生活如此美好,但这些细碎的星星点点的人生经历,都不足为外人道了。

我就在自学和读书,乱读和乱逛中,过完了我的四年。博文视点的编辑和我约稿的时候,我就已经读了这个系列其他作者的一些文章, 很多作者都写了我没有的很多经历,很让我羡慕。自学和积累始终是我大学的一条主线,我也写不好那些支线的事情,因此文章平淡少趣味,只希望读者海涵了。我是个不合格的学生,我差不多忘了不少任课老师,忘了我的学号,忘了班上不少美丽的女同学的样子,却没有忘记某个夏天的中午,汗流浃背的我冲进图书馆,跳入一阵凉爽的书香;以及某个春天,我在草坪上读书入了迷,喷水龙头把我后背全打湿了还浑然不觉。这就是我的大学。

(本文主要参考In Defense of American Liberties: A History of the ACLU 但经过了我的编译和总结, 也参考了其他一些资料)

没有什么事情是一帆风顺的, 100 年前的美国就是这样的例子.

1914 年, 欧洲爆发了第一次世界大战. 其实这是一场欧洲的战争, 美国只是在旁边看着. 到了1917年, 美国政府感觉到利益和胜利都向自己招手, 于是对德国宣战. 美国是一个传统上执行孤立主义的国家, 加上欧洲和美国的亲缘关系, 大部分的美国人是不愿意帮助任何一方的。 美国的共产党和社会主义者也将这场战争解读为帝国主义战争, 因此也宣传让美国不要介入, 让劳工阶层不要参军。

在美国国会已经宣战的情况下, 国内依然有反对意见, 美国政府自然很生气。 为了和谐反对意见, 美国政府和国会陆续通过了一系列严厉的法令, 如间谍法,  这些法律看上去是为惩罚通敌卖国的, 其实落实下来, 就是抓反战人士. 美国很多社会主义政党的全部的分支, 能够在一夜之间全部被司法部门的没有搜查证的执法人员捣毁. 当时美国的一些所谓的爱国商人, 还组织了一个爱国联盟, 其实就是私人武装, 宣扬爱国, 暴力迫害持有反对意见的人。 他们居然在1917年7月3日, 为了第二天国庆大典的和谐气氛, 在全国各地冲入剧院, 沙龙等人聚集的地方, 一举抓捕六千多可疑人士, 全部在未经正常程序审判的基础上投入监狱, 而这是美国宪法的人身保护条款明令禁止的。 美国的大学也失去了独立性, 不够”爱国”或者反战的教授不被允许任教. 以自由和独立著称的纽约时报, 在 CLB (ACLU前身) 成立的时候, 在报纸上写道: “监狱在等着这些人呢. 言论自由当然是重要的, 但是也是有限度的. 一个国家在卷入战争的时候, 好的国民应该为国家的好处和福利着想”. 华盛顿邮报也为政府的这些袭击打气, 说在此关键时候,对于对自由的侵犯的指控是吹毛求疵。 就这样,从上到下,全国一致的在迫害持有反对意见的人。

每天, 全国数不清的人被秘密警察和爱国私人武装逮捕, 报纸上充斥着支持战争的言论. 任何反对战争的人都和受共产国际这种外部势力挑唆划上等号。 就连非常支持战争非常爱国的某个导演, 因为在拍摄美国版开国大典的时候, 不小心把英国的形象塑造的高大了一点, 让美国军队不够光荣正确, 也按照间谍法被判刑.  美国邮政宣布审查邮件, 并拒绝邮寄任何有反战言论的出版物. 美国政府专门成立了一个公共信息部, 用现在的话说叫真理部, 用大家都知道的说一百次谎言就成了真理的方法, 向社会宣扬战争的好处. 国会也坚持多数人的民主的概念, 宣称只要有大多数人同意了, 国家意志就可以毫无障碍的强加给任何公民. 连因为宗教原因不愿参与战争的一些基督徒, 也被关押受审, 侵害了第一修正案规定的他们实践宗教的自由.

ACLU 的创始人 Roger Baldwin 原来是 St Louis 当地的一个律师, 当时我们学校社会学系的一名教授. 他到了东部海岸之后, 亲眼见到了这些情况, 决定成立一个旨在保护公民权力的机构. 当时这个机构的名字叫做 CLB, 公民自由局, 专门为那些因为违反间谍法而受到迫害的被告辩护. CLB 当时成立的宗旨就是要维护公民权力, 一方面, CLB 立志于从政府和狂热爱国分子手里, 争取异端的言论自由; 另一方面, CLB 又要和实用妥协主义做斗争 (有些进步党人和改革派, 认为赋予政府更多的权力让政府进行彻底的社会改革, 就可以制造一个完全美好的未来, 为此他们不惜牺牲少部分人的利益). 如读历史的大家所知, 第三帝国和当时的日本走了第一条路, 变成了法西斯和战争狂; 苏联和一些其他国家走了第二条路, 成了 1984  国, 一批一批的人被清洗. 只有美国好像天生受到上天的眷顾, 不偏不倚的走了中间这条路, 巧合乎?

或许因为 Roger Baldwin 和我们学校历史上的关系, 我可以在图书馆查阅到很多 ACLU 的书. 有本书这样写道: “Roger 认识到, 民主并不是自由的同义词, 多数人的意见并不能消除少数人拥有异端的权力, 他感到只有从美国宪法第一修正案出发, 才能改变现状. 因此, 他把维护宪法第一修正案中的言论自由当成 CLB 的宗旨, 而不考虑这些言论本身的内容和对错. “  Baldwin 是一个温和的, 有较高社会地位的人. 创办 CLB 之后, 他要邮寄印刷材料, 还提前和美国司法部打招呼, 在确信材料没有违反上面说的间谍法之后,才开始印刷。 因为邮局拒绝邮寄一些邮件,他还事先问了邮局这样的出版物有没有问题,邮局说没有问题。 即使是这样的小心, 最后邮局还是偷偷的把他邮寄的 3500 份材料拦截了。 虽然 Baldwin 告上了邮局,但在当时,这种案子只能是不了了之。 就是这样的一个温和的推动公民权利的人,也被联邦政府看上了。 1918年,美国司法部门切断了 CLB 的电话, 并且胁迫房东驱逐 CLB。 八月,联邦执法人员持枪闯入办公室,开始抄家。 友善的 Baldwin 几乎是温和的协助了他们的抄捡,联邦公诉人如获至宝的在日后拿这些抄捡来的材料诉讼 CLB 颠覆国家政权,这是后话。 政府看不惯 Baldwin, 而Baldwin 却依然继续工作, 那么, 政府必定会找理由继续惩罚 Baldwin。 终于,他们发现按照征兵法, Baldwin 是一个应该到征兵局注册的人, 而 Baldwin 却没注册。 就这样,他们弹冠相庆,逮捕了 Baldwin, 在一场毫无理由的法庭辩论上,宣布胜利,并且把 Baldwin 关进了监狱, 时间是一年。 其实, 没有任何一个监狱能锁住一颗自由的心, Baldwin 把这段经历看作是“去政府度假”, 他在自己的 TODO 表上,写下了在监狱期间要做的事情, 要写的文章,直到一年后出狱。

Baldwin 在1919年出狱后,开始了组建 ACLU 的历程。  ACLU 成立的初期,有两种人,一种是坚决的自由斗士,在原则上决不妥协, 认为和当时混帐的司法部门协商简直是与虎谋皮; 另一种是坚定的渐进主义者,一次一次的把各种各样的 case 上诉到最高法院。 前一种,让 ACLU 在这么多年,即能够为共产主义者辩护,也能为3K党辩护,从不因为言论的内容而区别对待; 另一种,则不断的取得一些小的进步,解开冰冻三尺的严寒, 一次不行,两次,通过一个个著名的判例,让政府终于被宪法牢牢约束(ACLU是最高法院的老主顾, 每年,除了美国政府外,和最高法院打交道最多的,就是ACLU, 一年 ACLU 要处理数以千计的例子, 其中的核心案例,通常最后都是最高法院裁定)。 而 Baldwin 作为 ACLU 早期的领导,在原则和实践两个层面都能处理好, 实在是一位划时代的领导者。

(Update, 感谢细心的读者, 原文有一些笔误, 已经改正)

以前我在博客里说过我用 Gtalk 控制我家的空调,这样我在回家之前就可以先开空调, 到家的时候正好家里凉爽起来了。 这个技术很简单, 只需要弄一个所谓的 X10 设备就行了。 我的朋友 Bao Sheng 做了一个视频, 有兴趣的可以看看他的演示和讲解。

X10 是一种非常方便的协议, 所有的控制信号都通过家中的电源线传播, 所以设备一插到插座上, 就可以被控制,不需要另外布线, 即插即用,对于我这种租房的人来说非常方便。 X10 设备有很多控制的方式。 有一种 X10 设备, 可以连接在计算机上, 然后计算机就可以发送指令控制其他X10设备。 计算机和X10 之间的接口是串口,所以如果你觉得不爽,用单片机和一个 MAX232 芯片就可以控制了,不需要庞大的计算机。

如果家中的电灯等不是插在插座上,而是通过墙上开关控制,你只需要将家中原有的电灯开关换成支持 X10 的电灯开关就行了。这种 X10 的电灯开关, 和普通墙上开关大小一样,功能一样, 但在 eBay 上的售价比在 Home Depot 买的普通开关还便宜,所以完全可以把家中开关全部换掉。这样就可以用计算机控制家中原有的电灯。

空调, 电饭锅, 风扇, 电视机等电器都可以如此控制。 至于我说的网络控制,就更加简单了, Gtalk 协议都是公开的,只需要写个客户端挂机监听就行了。 如果想玩这套东西的, 我这里有源代码。 X10 还有无线射频接口, 所以可以在车上控制车库的门或者门口的灯, 在家也可以躺在床上一键关灯,都是无线接口能干的事情,这里面的技术,和电动车锁的原理是一样的,你甚至可以把家里面的锁换成车上那种,一有人撬,立即杀猪似的发出警报。

控制电器有很多应用, 比如看电影的时候,能够达到一键打开电视和DVD以及关掉大灯的效果。早晨也可以通过控制灯慢慢亮起来让人自然醒来。至于控制空调,电饭锅这些,都是完全看需要看想象力了。

以上这些玩意,属于第一代智能家庭,我家基本上都部署了。 我现在考虑把我们家往二代智能家庭进化, 具体来说要能做到以下几点, 有些技术细节我没想好, 所以写出来请各位读者大牛出主意。

1. 在计算机上可视化控制一切电器

这个不难,只要写一个 GUI 客户端就行了。 如果想做得比较好玩一点,可以像  Second Life 一样, 把家中做成一个虚拟现实系统, 人走到哪个房间, 哪个房间灯自动点亮。 这个需要一个人的定位机制, 而且人身上的传感器要很小, 便于携带。 这个目前还没想好怎么弄。 大家帮我出出主意? 虚拟现实有什么好的软件? 是不是在门口装个摄像头做一下 Motion Detection 比较好?

2. 语音控制

我想语音控制所有的家电。 我看到别人 hack 了一个无线对讲机,让这个对讲机的信号送到计算机里面,但是随身放一个对讲机好像太庞大了,目前正在考虑弄一个蓝牙耳机,这个蓝牙耳机和计算机连接起来,做语音识别,然后发送信号到家电。 计算机端的语音识别软件很多的,应该很好弄。

3. 大脑直接控制和其他控制

BCI 技术还不成熟, 不过带一两个传感器的检测眼球运动的东西早就有了,如果要控制的东西不复杂,可以使用 Ocz Nia,  如果要复杂一点, 可以使用 Emotiv. 唯一的不好就是要带个帽子到处走,倒没有一个随身的车钥匙大小的遥控器方便。 自从有了 WII, 我们可以 Hack 一个 WII Remote, 然后在家挥一下 WII Remote, 就可以让灯亮起来。 要是 WII Remote 再小一点,或者自己买一个加速传感器和位置传感器粘在筷子上, 就很有魔棒的感觉了,到时候对着灯一点,灯就亮了, 哈里波特保证拜你为师 :)

4. 传感器通信

我家现在卧室的门上面都装了一个红外发射器(垃圾堆上捡了个电视遥控器,用了里面的红外发光二极管)和一个接收器,人进入屋子的时候会切断红外线一次,我就自动打开屋子里的灯,本来是贴在地上的, 可是我们家的猫老是走来走去,干扰系统,所以我不得不放在半人高的地方,可是这些器件总是要拖很长的线才能把信号送回去,我现在放半人高的地方,线拖下来, 猫就老在我接出去的线上面蹭痒,搞得系统三天两头挂掉。 各位知道有没有什么便宜的无线协议,能够把这些小器件之间的无线通信问题解决? 市面上的 WIFI 传感器都要大几十美元一个,不够便宜,这些小器件走 X10 也不行,我家没那么多插口, 而且我还得投资 TTL 到 X10 的接口。 蓝牙和WIFI 模块都太贵,RF 技术我是白痴,而且也不知道怎么做一个不互相干扰的系统,各位有高人指点指点?

5. 微型化计算机

我最近找了一些不带风扇的,可以跑 Linux 的作为家庭媒体存储中心和控制中心的计算机, 我的要求是体积要小,耗能要低,可以放在客厅或者锁在锁在壁橱里面。 其实一个几十块钱的二手计算机就可以干这些事情了,但是噪音太大,长得难看,实在不适合放在客厅。

还有就是接口,至少要支持一些 USB 口,这样我外面才能接其他的外设。 我找了一顿没找到什么好的。 各位有什么建议? 我目前找到的包括 WD My Book World Edition, 中科梦龙盒子(太贵), Foxboard, 和 Marvell Plug Computer. 或者自己 DIY 一个 ATOM 芯片的机器, 或者买一个 ARM 开发版, 或者 Hack 一个  20 块钱的二手 TiVo. 我现在还在这些技术之间纠结,想要找性价比最好的。

同时我还想搞一块很节能的液晶面板,带触摸的,算是家庭控制中枢,可以看到所有的灯和传感器的工作情况,就是不知道有便宜的小触摸面板没有?

我的目标是建立一个智能的,让我安居乐业的家。 各位读着还有什么奇妙的想法?