正在我决定鼓起勇气后来跟上,准备拿起一本DOS大全从头啃起的时候,一次偶然的机会我接触到了Linux。后来又因为The Art of Computer Programming,接触到了Knuth。我才发现,好多课程上讲的那些东西原来如此低级。有些东西学了就过时,学它干吗?我并不比别人落后多少。我一再的思考,什么是计算机科学?是什么让我们计算机系的人不同于其他系的。我有时候认为有了答案,但是后来答案又被我自己推翻。在思想的混乱中,我发现我逐渐摆脱了旁人的标准。我自己学会了Linux,学会很多种当时别人听都没听说过的计算机语言。我开始发现学习再多的语言也没有意义,我应该想办法发现它们本质的共同点,想设计一种完美的简单的语言。我学会了LaTeX,用来排版我的作业和本科论文,还设计了一个标记语言和一个程序,帮我爸爸自动排版出非常漂亮的英语试卷。我接触到MMIX这种先进而漂亮的处理器,还因为找出Knuth书里的错误得到两张支票和一些礼物。这并不是什么值得炫耀的,但是这给我对计算机的兴趣很大鼓舞。
但是我的生命中出现了这样一门课程。它改变了我对老师的看法,让我觉得上课原来也可以如此有趣。这就是计算几何。上课的人很少,只有十来个人。因为听说这门课很难,很多同学都没有选,但是我就是那种知难而进的人。老师上课的方式跟别的课程很不一样,大家坐在一个小教室里,老师有精美的幻灯片,有动画,不时还插入一段大科学家,大哲学家的名言。有一次老师讲前美国数学会长 Graham 的故事,他居然同时也是国际杂耍联合会主席,我才发现一个科学家也可以那么有趣。上课时老师会停下来很多次让学生提问题,下课大家都积极踊跃的讨论新奇的问题。课程的评分方法也很特别,平时成绩占到30%的分量,作业分为几种分值,可以自己选择做不做,作业的总分数乘以30%,加上最后大作业的分数乘以70%,就是最后的得分。我有一次因为没来得及按时交作业,后来发现作业的题目很有趣,就对作业要求的算法写了一个详细的分析,还花了一整夜写了一个算法演示程序交上去,老师也接受了这个迟来的作业。后来我的作业分数就大大超出了所要求的30分。说真的,这门课太有趣了,我就只逃过一次课。但是还是有时候人数不到一半,因为其他课程压力太大,有人都去复习别的课程了。但是老师从来不点名,还对逃课的同学表示同情。还问我们在座的有没有其他课特别紧张的,下次课可以不来。真是让人感动。
博士生论坛的时候,同学们都觉得有类似的问题,讨论不足,交流不足。所以我提议成立一个类似国外大学的 Common Room,用来讨论问题。可是大部分老师说:“这样一个房间,天天都要有那么多人在里面待着。谁来出这个钱?” 是啊,老师自己的办公室都要钱,哪里可能有什么 Common Room?就算有了 Common Room,在里面讨论的无非还是文章发到哪里的问题。制度决定了行为,我的设想太理想化了。
我的导师就是以前写了一篇有关这个的paper发到IEEE transactions。我觉得这篇论文还算有一定价值,但是年代已久。已经毕业的一个师兄就在他的论文基础上修改来修改去,发了好几篇paper。英文的不够还翻译成中文,投到国内的期刊。后来一个师姐又在这个师兄的基础上进行修改,又发了好多篇。可是在我看来,他们的论文纯粹就是炒冷饭,没有什么创新,很多时候就是加速一下。学过算法基础的人都知道,把NP-Hard问题分解成几个小部分,每一部分用一个别人的精确算法解决,然后再连接起来,就可以得到一个近似解。这种做法在解决具体问题时只需要一句话就能说明白了,可是他们却对每一个具体问题写了论文,而且一写就是好几篇。要是每一个问题经过这样的加速都写一篇文章,那文章数就可以成倍增长了!我们领域的很多问题形式化成一个规划问题就解决了,可是每次形式化一个问题就发一篇paper,而对方法完全没有改进,对于我来说是没有价值的,就像做小学应用题一样。虽然没有创新,还是可以发paper。主要是你怎样把你的 Introduction 写好?可以让别人觉得你的工作有意义?这就是功夫,作家的功夫。我有一次面见INRIA的头目 Jean-Claude Paul 时,他就对我说:“Tsinghua students are all writers, not scientists.”
学校有规定,博士生必须发4篇paper才能毕业,其中必须有一篇是SCI索引,或者两篇EI索引。看上去冠冕堂皇的SCI, EI,不就是跟 google 差不多的东西吗?被它索引了怎么样了?对文章的篇数作要求,而对质量没有判断。投一个SCI太容易了,只是很多人不知道门路。能力一般的人也能很容易的投够论文,然后就可以不思进取的等着毕业。但是不知门路或者被老板(一般研究生对导师的称呼)压迫干活的人就惨了,不知道怎么才能发论文,拖个六七年毕业是常有的。这样的学校又怎么可能有讨论,怎么可能有创造力?SCI=Silly Chinese Index。
Segmentation fault ! Core dumped —我写本文的目的
Repair what you can — but when you must fail, fail noisily and as soon as possible. —Basics of The UNIX Philosophy
修复你能修好的—但是如果你必须失败,那就尽快喧闹的退出。—UNIX基本哲学
在对清华的研究失望了之后。我就准备考GRE,TOEFL出国了。我去上了一个新东方的班,没学到什么英语方面的东西,倒是接触了很多新的思想。罗永浩的言论特别有趣。虽然我不是完全赞同他的意见,他说的很多话改变了我的思维定势。写GRE作文特别培养思维能力。我为了写GRE作文,常常为了一个不明白的问题到图书馆翻阅英文的哲学书籍,有关教育的书籍…… 对于很多问题我得到了完全不同的观点。大学的目的是什么?人的价值观是由理性决定的吗?等等等等。我读到了亚里士多德,柏拉图,康德等人的言论。甚至有个哲学家说 "All Animals Are Equal". 我看了他的文章觉得有很多可以批驳的观点。我看到迪卡尔的文章,说“要掌握科学就要掌握它的全部”,这句话真合我心意,我就是想做一个懂很多东西的人啊。我想结合艺术与科学。虽然我这个观点得到一些人的批判,但是我仍然相信迪卡尔。
计算几何课的一次作业,我为了写一个算法的演示程序,花了3天时间学了一点Java语言,正好能够完成那个程序。我开始接触到TeX的底层细节,看完了The TeXbook,并且找出一道练习题答案的错误。开始移植gbkfonts程序,作为我的CWEB语言的练习。看完了几乎所有 Xlib 的手册,了解了 XWindow 的工作原理。我接触到 Scheme,并且做完了 SICP 的大部分习题,还自己想出好多问题用Scheme实现算法。后来花了好几个晚上,把MIT课程6.001的录像下载回来。我才发现教授上课可以如此搞笑有趣,上课时戴上巫师的帽子,做一些滑稽的表演。我终于明白,有的计算机科学家居然可以去好莱坞演电影 这个课程让我领会到 LISP 的强大,改变了多年以来对这种古老语言的误解。它让我感觉到在看似纷繁复杂,不断更新的计算机语言的世界,还有那么一种永恒的美!我开始发现TeX语言过于复杂,想设计一种利用Scheme语言来排版的系统。接着我又学会了 Common LISP,并且开始用它来设计研究计算几何的一个函数库。另外还找了一些希奇古怪的程序来玩,写了一些心得体会放在网上给别人看。无可否认,这些都是工程技术的东西,不是科研。但是看到很多“计算机科学家” 写的程序一团糟,我才发现程序设计是一门艺术,而不是科学。我的心里对“程序员”这个词有了新的定义,在这种定义下,Don Knuth, Don Woods都是优秀的程序员。只要是有益的创造,就没有必要去在乎是不是科学。
我意识到自己数学还不够强,甚至有些怕,就开始看一些数学方面的书。Concrete Mathemtatics, What is Mathematics?, Science and Hypothesis, Godel Escher Bach, ... 虽然每一本都没有看完,但是我逐渐相信自己的数学能力,发现数学原来如此有趣,并不是做习题那么枯燥,也不像一辈子就拼命证明一个定理那么清高。才发现国内很多数学书用难看的符号把学生吓倒了,其实想通了就是很直观的原理。
我看了电影 A Beautiful Mind 之后深受感动,就去买了一本原著的书,它是数学天才John Nash的传记。它描写了20世纪初的Princeton,一群科学家生活的情景。我眼前浮现出在一个房间里,一群人在喝茶聊天下棋讨论问题激烈争论。我发现我从小内心向往的,就是那样的地方。我看到Nash是如何用“头脑暴力”解决一个他没有任何基础知识的问题。原来只要有了问题和探索的精神,就会有动力去获得解决它所需要的知识,最后将问题解决。发现有用的,重要的问题,而不只是寻找困难的问题,这样才会对人类有价值,才会有动力。我还看到一个数学天才是怎样的喜欢恶作剧,又怎样因为过度的傲慢狂妄,想向世人证明自己的天才而发疯。我发现世界上有远比科学更宝贵的东西。我不是一个天才,但是我要做一个好人。