太刻苦了。。。

Posted: January 24, 2011 by lefteyefocus in 瞎扯淡, Uncategorized

应该是位老中,我进去时从声音上知道,伊正在看新水浒,小石多管闲事和小潘吵架那段。。。听见有人进来了伊赶紧把声音消了,伊大概没想到会有别人七点就上班了。我这厢洗手的时候,伊旁边的格里又进去一位,想看个电视剧也不容易,阔年。。。

WP_000029

WP_000031

Advertisements

鸡头猪肚蛇尾。。。

Posted: January 20, 2011 by lefteyefocus in 侃大山

读完了《窃明》,前两天的担心不幸成为事实,《窃明》只能算是1/3本好书,好的那部分是从黄石去辽东直到黄石离开辽东。去辽东前的部分只能算鸡头,离开辽东的部分勉强算蛇尾。

鸡头的部分不多说了,说说蛇尾吧。全书在黄石“格杀”努尔哈赤的地方达到高潮,读到这段时还是很过瘾的,就是不知道对于已经改变的历史,黄石不担心努尔哈赤的死期也被改变了吗?如果这个是可能改变的,黄石这把赌得有点大。这部分稍稍遗憾的是,和赵二娘子之间的描写弱了点,赵二娘子完全成了黄石赴辽阳“杀”努尔哈赤的道具,努尔哈赤被诛后,这道具不知道该如何处理了。

虽然把黄石调离辽东的理由给得还算充分,但是黄石几乎不做努力地就范还是有些出人意料,似乎作者刻意让黄石离开好让辽东按原历史进程发展?另外黄石带着几万人从辽东到福建也太夸张了,这比后来从福建去云贵也近不了多少吧?有可能从辽东到福建全是走海上?

黄石离开辽东后,几乎就对辽东辽西的局势听之任之了,袁崇焕给努尔哈赤吊孝,议和,弄得蒙古各部心寒,后金攻打毛文龙,袁崇焕不动如山等等,黄石好像都没做任何反应,这和黄石前面听袁崇焕有议和意向时的强烈反应似乎有些不符合。

作者说开始袁崇焕无能,营私,妒贤等,还是有一定道理的,但是到后面把把袁崇焕往通敌叛国上写还是太偏激了,以至于很多逻辑错误都无法自圆其说。这几乎是所有汉奸论的致命弱点。从秦桧到汪精卫再到这里的袁崇焕,官基本上做得都已经位极人臣了,除非能当皇帝,卖了国也几乎没有可能做到更高位了。但中国的习惯是主战就是爱国,主和就是卖国。所以主和就是卖国求荣,但是逻辑上却说不同求的是啥子荣。《窃明》的作者在这里也落了俗套,而且落了这个俗套后,描写起人物来就极其脸谱化,不管是袁崇焕,毛文龙,还是袁崇焕,都带上了大大的忠奸脸谱在舞台上跳。

作者写战争,兵器,科技在兵器上的作用还是很靠谱的,但是写经济建设就相当地糙了,大概是为了在毛文龙死后能赶紧回到辽东,作者把黄石在福建搞经济建设的部分写得是粗枝大叶,漏洞百出。但不知道为啥,对于作者极为褒扬的毛文龙,作者除了让黄石给毛去了几封不痛不痒的信提醒外,就那么看着毛文龙死而无所作为。或许是毛文龙不死,黄石就无法成为抗后金的主角?

最后黄石奉旨抗后金后,故事就慌里慌张地结束了。感觉作者全书就是为了兜售”袁崇焕是个大汉奸“这个观点,这个观点兜售以后,再也没有写下去的兴趣了。。。

因为《三体》第三部中很硬的那些关于时间和速度的情节,因为穿越,现在开始读《时间简史》,没想到霍金的文笔居然这么好,开篇就很有趣。估计这本书读完了,我也可以写穿越文了。。。

差点放弃一本好书。。。

Posted: January 17, 2011 by lefteyefocus in 侃大山

本来对穿越文向来不是很感兴趣,当年的《寻秦记》,不管是小说还是电视剧,我都实在坚持不下去。后来读口碑相当不错的《新宋》,没觉得的糟,但也没觉得太好,搁下了也没有什么在拿起来的欲望。。。

《窃明》在网上的名头甚响,但因为知道是穿越文,也就一直懒得去读,但最近无书可读,终于还是把它拿了起来。开始两天,《窃明》开始的十多万字读得我是味同嚼蜡,数次都想放弃了,终于读到了黄石来到了长生岛,于是峰回路转,一切都不一样了。

我这个人很没品,读到和自己观点相近的书和文章就喜欢得不得了,《窃明》最让我喜欢的地方就是:我早就觉得袁崇焕不是个东西!(对袁崇焕的讨厌导致我《碧血剑》读了不到一半就扔下不读了)

现在这些在网上写东西的,怎么都那么能写啊!《窃明》读了几天了,堪堪读了三分之一,希望作者没有写得虎头蛇尾,更多感想,等读完后再八吧。。。

最烦的是程心。。。

Posted: January 10, 2011 by lefteyefocus in 侃大山

终于把《黑暗森林》和《死神永生》也看完了。第二部“水滴”攻击地球太空舰队那一段写得很气势磅礴,惊心动魄!不过当罗辑发现了“黑暗森林”法则,并以此对三体进行威慑有点虎头蛇尾,也许大刘是为了留点料在第三部里继续八。不过三体居然没有任何讨价还价就屈服于威慑,仅仅就是因为光脚的不怕穿鞋的?总之还是感觉太简单化了。

大史帮罗辑找到的那个完美老婆庄颜,大段大段的占了不少篇幅,让人读了觉得不过是意淫,最后人物还是很单薄,所以大刘最后只好让罗辑的老婆孩子有始无终。看来大刘写情还是差了点。。。

第三部果然很硬,光子攻击,思维空间,低纬度陷阱,低光速黑幕,小宇宙,等等等等,脑子都有点跟不上了。不知道在第三部里大刘是抱着怎样的感情写程心的,反正读完后我很烦她。开始我甚至以为大刘是用程心来反讽天朝的新一代核心胡面面,一点威慑力都没有,哪怕有毁灭世界的核武按钮在手中,也不敢按下去。

再往后读,发现大刘还是对他的女主角很厚爱的,先是解释程心没有按动宇宙广播开关时出于爱,是人类最高尚的道德观和价值观。然后又给程心最好的际遇,当全人类都在三体的铁蹄下被蹂躏时,她独得到智子的优待。也许是因为她是最大的“人奸”吧。大刘对“人奸”们给予了最大的理解和同情,他指出那些骂地球保安队的不过是报名加入保安队但是没有被录取的人们,并且对保安队在“大移民”时起到的保安作用给以了肯定。

后来三体得知蓝色空间号发出了宇宙广播,赶紧仓皇而逃。这里也有些蹊跷,既然已经广播了,又何必逃呢?地球被暴露后,都还要想办法怎么抵抗,为啥三体在知道背暴露后就只知道逃?难道三体知道抵抗是徒劳?后文里三体是知道如何发安全声明的呀。(或许是当时还不知道,三体世界毁灭后才知道的?)

三体从地球逃走后,地球保安队的成员都被当“人奸”给毙了,最大的“人奸”程心却如鱼得水,还开了间大公司,做了CEO,估计是首富吧。后来在造光速飞船时,程心又出来捣乱了,让光速飞船的研究耽误了关键的35年。但是最后这个罪魁祸首居然乘着唯一的光速飞船逃走了。大刘还怕她寂寞,还让她的闺蜜在飞船上陪她一起逃走。。。

大刘还是不擅长写感情戏,云天明对程心的那段感情就写得挺矫情的,更让人觉得突兀的是在三体监视下,云天明讲的那三个又臭又长的童话故事。那种时刻讲三个那么长的故事,很奇怪吧?三体居然没有任何怀疑?虽然大刘解释了半天三体没有怀疑的原因,还是不能让人信服。也许三体在计谋和撒谎上的能力还是太弱了。

不过我从读画师把人画到画里,再联想到前面提到的思维空间,就猜到后面的二维攻击,佩服下自己先。

“人奸”程心逃跑后,大刘意识到光有闺蜜还不够,又安排了云天明的约会。云天明海没来赴约,程心就出轨了,和关一帆又搞上了。。。

第三部的最后一章,试图把太多的概念和内容压进去,而演员只剩下一女主角,一男配角。后来大概觉得太寂寞,又把智子请了回来。不过还是有心无力。这使得第三部的结尾又有些拖沓和无力。大刘不会在计划第四部吧?

虽然在细节和情感的描写方面还有些瑕疵,还是得说《三体》是部很伟大的科幻作品,至少在国内还没有和大刘比肩的科幻作家。

尘埃,都是尘埃

Posted: December 17, 2010 by lefteyefocus in 干瞪眼

这两天读了《三体》,写得真是好!不管是想象力,技术细节,还是文笔,都很好!我很少觉得写科幻的文笔好的,大刘是个例外。

读了《三体》,最大的感受是:自己的事算个屁啊!连人类的事都连屁都算不上。还没有感受到这一点的同学,如果没有时间读《三体》,看完下面的这套图,估计就有了类似的感受了。。。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

程序英雄传(二)

Posted: October 25, 2010 by lefteyefocus in 侃大山

迪爷爷

今天开始八迪爷爷。谁是迪爷爷?就是那个和老婆和咖啡,一不小心喝出了个最短路径算法的Edsger W. Dijkstra爷爷。之所以想起先八他,是因为他在很多方面是高爷爷的死对头,当然,不是在个人恩怨方面,而是学术观点方面。

迪爷爷名字的发音也困扰了我将近半年,每次和同学谈到迪爷爷,我都是含混其词,或者用the creator of the shortest path algorithm来代替。和NND不同的是,我倒没有以为迪爷爷是印度人,我以为他是德国人,因为我当时的印象里,德国专产数学和物理大牛,像爱爷爷和冯爷爷。

第一次听说迪爷爷,当然是在学习迪爷爷的最短路径算法的时候,当时的印象就是:这厮真TMD聪明!怎么想出来的?当然,那个时候是我最初接触算法这个概念的时候,所以难免大惊小怪。事实上,迪爷爷算法虽然可称得上是最短路径算法的一个里程碑,但确实是迪爷爷的妙手偶得而已。据迪爷爷自述,那个算法是他和迪奶奶在一家咖啡馆的露台上喝咖啡时灵机一动想到的。我不厚道地猜测,迪爷爷是不是因为太专注自己的工作被迪奶奶骂,于是迪爷爷就想怎样找到一条最短的路迅速跑回家,于是就有了迪爷爷算法。。。

后来在学习操作系统时,又接触到了迪爷爷提出的五个团团围着圆桌坐的哲学家在餐桌上因为筷子不够而抢筷子的问题。这牛人的思维就是不一样,要是我碰到这样的问题直接就叫服务员:请帮我们拿几双筷子来,而迪爷爷想的是怎么样让五个人用五只筷子吃饱吃好。。。

后来又接触了无数由迪爷爷首创的概念,偶对迪爷爷的葱白与日俱增。尤其是迪爷爷在一些关于computer programming的基本看法上,和高爷爷针锋相对,看他们对对方的见解的辩论就像看绝世高手过招一样精彩,于是我从此走上了对迪爷爷的追星之路。。。

有趣的是,和高爷爷一样,迪爷爷大学本科也是学物理的。由于理论物理要进行大量的数值运算,所以迪爷爷也不可避免的在修习物理的同时,开始接触计算机,然后同样不可避免地发生了移情别恋。

在要不要和自己的原配物理离婚,把computer programming这个小三扶正这个问题上,迪爷爷当年还是进行了一番艰苦的思想斗争的。和今天很多人在纠结做programmer有没有前途一样,迪爷爷当年也不知道programmer能不能成为一个让人尊敬的职业。

在和programming私通了三年后,迪爷爷再也坐不住了,敲开了他当时在阿姆斯特丹数学中心的老板A. van Wijngaarden办公室的门,和老板进行了一次长谈。。。

当年22岁的迪爷爷搓着双手坐在老板的对面,谈论的中心话题就一个:是不是应该把小三扶正。迪爷爷当时的担忧是,原配physics毕竟是名门闺秀,这样的婚姻让人尊重,而小三programming虽然貌美如花,但是出生来历不明,娶进门来怕是要被人笑话。。。

在耐心地听完小迪同学的纠结后,老A深沉地对小迪说:虽然还没有什么辉煌的生世来历,计算机已近来到了这个世界上,你难道就不能做一个给她辉煌生世的缔造人?

年轻人的特点就是心比天高,牛人更是这样,小迪被老A这么一忽悠,变得热血沸腾,是啊,吃软饭和养活养好一个尤物之间的成就怎么能够相比?!在走出老A办公室时,小迪已经和几个小时前走进办公室时判若两人了,走进办公室的小迪心里只有一个字:乱。走出办公室的小迪心里还是一个字:离!

迪爷爷后来谈到这次谈话,他承认这次谈话对他的一生产生了不可磨灭的重要影响。而且所幸得是,是正面的影响。迪爷爷语重心长地对其他老牛人们讲:以后我们在给年轻人什么人生建议时,一定要慎之又慎,因为有的时候他们真的会照着去做的。(开复GG你别东张西望,就是说你呢!)。。。

迪爷爷的担心不是没有道理的,当时programmer根本就不能算是一种职业,在迪爷爷的祖国荷兰更是少有人知道programmer是啥东东,以至于1957年迪爷爷新婚大喜的时候,去政府部门登记结婚,在要求填写职业时,迪爷爷填了一个programmer,被公务员一把把表格扔了回来:捣什么乱?!啥是programmer?没这个职业,重填!迪爷爷只好郁闷地重新填了个理论物理学家,才算顺利地把迪奶奶娶进了门。迪爷爷后来不无骄傲地说,他是荷兰进入computer programming领域的第一人。。。。

迪爷爷最初的编程训练是从在剑桥大学的一个夏季课程开始的,这个课程教授一些机器语言的编写。当时教授这门课的是英国计算机界的大牛 M. V. Wilkes。老M还要求迪爷爷从老板老A处要了封推荐信,证明他的数学足够了才允许迪爷爷选了这么课。

不知道当初老A忽悠迪爷爷选了programming为终身职业是不是出于私心,反正迪爷爷在上完了老M的夏季编程课程后,老A把迪爷爷招回数学中心refactor自己当年写的程序,于是迪爷爷就成数学中心的一名小程序员。

在发表了最短路径算法后,迪爷爷声名大噪。但是没过多久,迪爷爷就向世人证明了迪爷爷算法不过是一只大牛的牛刀小试而已。。。

从上个世纪50年代开始,随着需要计算机解决的问题渐渐开始不仅仅局限于数值运算,所需要解决的问题越来越复杂,迪爷爷算就是一个例子。于是对于一个更加结构化得语言的呼声渐趋强烈,Algol 60就在这个时候应运而生。。。

Algol语言是继Fortran语言之后的第二个高级程序语言,迪爷爷婚后第二年就投身到Algol 60的标准制定中去了。虽然参加很多次标准制定会议,但在Algol 60标准定义的最终报告发布时,在13人的作者名单里却看不见迪爷爷的名字。原因是我们的迪爷爷长脾气了,因为对其中的很多标准的不认同,迪爷爷拒绝把自己的名字加到作者名单里。从这个时候开始,迪爷爷在开始扮演CS界的双重身份,一方面是个软硬通吃的大牛(当然主要还是吃软),另一方面就是一个语不惊人死不休的CS愤青。。。

从1962年开始,迪爷爷被TH Eindhoven (Eindhoven Polytechnic)聘为终身教授,虽然在米国同类职位已经被称为计算机科学系教授,但是迪爷爷反对这种叫法。他认为计算机科学的专业基础是数学,所以他应该是数学系教授。他的所有学生也要经过三年的系统的数学训练。(估计滑铁卢大学采取的也是迪爷爷的主张,当年偶想报滑铁卢大学的CS系,结果被招生办告知:我们没有计算机科学系,我们只有数学系。。。)

不久,迪爷爷就被他在TH Eindhoven数学系的同事们惹怒了。原因是迪爷爷带了一个PHD学生,该学生是迪爷爷的得意门生,结果该同学的毕业论文被迪爷爷数学系的同事们判了死刑,迪爷爷的得意门生屁挨不着地。TNND,打狗还要看主人呢,哦不,不看僧面还得看佛面呢,从此,迪爷爷死瞧不上他的那些数学系同事们。

他后来在“How do we tell truths that might hurt?"一文里说:Programming is one of the most difficult branches of applied mathematics; the poor mathematicians had better remain pure mathematicians. 他这句话就是挤兑他的那些数学系同事们的。

数学系的教授们反驳说:切!programming有啥牛逼的?我们个个也都会编程做数值运算呀,迪爷爷接着说:The easiest machine applications are the technical/scientific computations. 反正就是他那帮数学系同事怎么看怎么是怂人。。。

迪奶奶后来说,那段时间迪爷爷过得是相当地郁闷,但是迪爷爷这样的大牛是不会让自己被郁闷淹没,而是把有限的郁闷投入到无限的工作中去,正是这个时候,迪爷爷开始写他著名的 Notes on structured Programming.

于是Structured Programming的理论横空出世了。大概是为了报复迪爷爷,迪爷爷的数学系同事们对于Notes on structured Programming的发表反应表现得相当冷淡。不但没人给迪爷爷打电话索要签名版留作纪念,很多更是装着都没听说有这回事。迪爷爷哪吃这一套,他把自己的notes印了几十份,给自己欧洲加美国的同事们每人寄了一份去。。。

关于Structured Programming,具体内容就不八了。要提的一个八卦是,有一次迪爷爷笑话高爷爷写的程序是”没结构“(instructed program),高爷爷当时也没敢反驳,不过后来高爷爷提出Literate Programming时,终于报了一箭之仇,他说迪爷爷写的程序那叫一个”没文化“(illiterate program)。。。

迪爷爷勇于得罪人,特别是勇于得罪同行是出了名的。一次他应邀旁听另外一名很有名的教授讲课关于computer network的课,迪爷爷拿了大堆问题把人家炸得晕头转向,然后他大摇大摆地课半中间走了。还有一次MIT的一位很牛掰的科学家去迪爷爷的学校客座讲课,这位教授讲得非常卖力,累得她说了句:I am losing my voice。也不知道她说的啥观点惹了迪爷爷不高兴,迪爷爷接下茬儿地回答到:Thank God。结果是系里面赶紧给迪爷爷擦屁股,系主任赶紧发了封道歉信向人家道歉。

迪爷爷在CS界就是一个坑王,随随便便几句话,就往往引起业界的激烈讨论和争论。其中非常有名就是GOTO大战,他的一个两页的笔记”GOTO considered harmful“一石激起千层澜。他的语言经常辛辣得让人难以接受,比如说他讲:It is practically impossible to teach good programming to students that have had prior exposure to BASIC,as potential programmers they are mentally mutilated beyond hope of regeneration。

这这这,太伤人感情了!不知道比尔大叔看到这句话是什么感受(比尔大叔就是从BASIC开始写程序的),反正N多当时正在用BASIC的,以及以前曾经用过的,不管是票友还是专家,都坐不住了,像迪爷爷抗议,抗议他严重伤害了BASIC爱好者和使用者的感情。。。

迪爷爷才没功夫和反对者打嘴仗,他在我心目中像邪派顶级高手任我行一样,昂然一笑又开始挖新坑了。迪爷爷的paper大都很短,很多就2-3页,但是这些个只言片语,最后很多都成了CS界的一个专门的研究领域,真是随手成坑啊!

这些发表的paper还只是迪爷爷武功的一小部分,大部分武功他只在自己写的程序中去验证,发表论文往往是为了应景,还要加上句:请勿置顶。。。

牛人就是牛人,得罪再多的人他也是牛人,甚至是更牛的人,为了表彰迪爷爷在compiler construction, operating systems, distributed systems, sequential and concurrent programming, software engineering,以及graph algorithm这样广泛的领域做出的卓越贡献,1972年的图灵奖决定颁发给迪爷爷。

迪爷爷在图灵奖颁奖感言的时候做了个名为The Humble Programmer的演讲。当底下的业界同行们惊奇迪爷爷居然也学会Humble了?看来给他发图灵奖还是有好处的。十分钟过去后,底下的人慢慢咂摸出滋味来了,这哪里是个humble programmer,这简直就是个BSO programmer嘛!

整个演讲简直就是迪爷爷给他的学生们上课一样,迪爷爷以不容置疑的口吻对computer science, computer programming的过去进行了总结,并指定了未来的发展方向。整个演讲里大概和humble扯得上一点关系的就那么一句:The competent programmer is fully aware of the strictly limited size of his own skull…

也许是意识到肯定会有很多人不买账,在演讲结束前,迪爷爷说:In principle I leave it to you to decide for yourself how much weight you are going to give to my consideration, knowing only too well that I can force no one else to share my beliefs.

听见没有,是”原则上我应该这样那样“,实际上你要不听我的,嘿嘿。。。

拿了图灵奖后的迪爷爷依然是我行我素,他每星期二去一次大学,后来这天就成了著名的”星期二俱乐部“,星期二俱乐部相当于一个研讨会,不过他们没有固定的议题,有点像”太太的客厅“一样,大家啥都聊,虽然很多专业上的讨论,但也不乏八卦花边。

参加俱乐部的有他的PHD学生,但是也有一些业界知名的同行,迪爷爷又了自己虽然不大但是很稳定的粉丝团,很多人模仿他文风,模仿他用自来水笔,甚至模仿他穿的拖鞋。。。

说到迪爷爷的自来水笔,要好好八一八。迪爷爷一生数千篇文章,没有一篇是计算机里打出来的。迪爷爷先是用打字机,后来干脆他的Mont Blanc自来水笔抄。每篇文章都编为EWD****,EWD是他名字的initials,CS界把他的文章称为EWD reports。迪爷爷最后用自来水笔来写文章有可能有BSO的成分在里面,因为迪爷爷的字那是相当地漂亮。后来有人在Macintosh机上设计了Dijkstra字体,字体设计好后,有人用这个字体打了封信给迪爷爷寄去,把迪爷爷给吓了一跳:我不记得我写过这么篇东西啊???

和高爷爷一样,迪爷爷的文章也写的好。有意思的是,提倡literate programming的高爷爷专门为了文章中的公式排版去写了Tex,而主张structured programming的迪爷爷却尽量不在文章中用任何公式,他那篇著名的Cooperating sequential processes就一个公式都没有,他还极力反对用图来表达概念以及解释算法。一个精于graph algorithm的人,居然反对使用graph,矛盾吧?

不光是字和文章写得有特点,迪爷爷说话也有特点。初次和迪爷爷说话的人很不习惯,你一个问题问完了,迪爷爷那边啥反应没有。你正怀疑他是不是耳背,准备把话重复一遍时,迪爷爷开开口回答问题了。他没句话出口前都要经过思考,从而可见,迪爷爷是个主张三思而后行的人。

关于迪爷爷对三思而后行的拥护,还有个八卦,是我们上Software Engineering课的时候教授讲过给我们听的。说是有记者采访迪爷爷,问他对于Software Engineering有些什么看法。迪爷爷跟记者说,在他们家乡有个软件公司,公司里有一条规矩,那就是如果项目的时间还没有耗过70%,开发人员不允许写任何code,只允许不断地做设计,修改,再设计,再修改。有一次在项目时间过去一半多的时候,有一个dev去问项目经理:咱可以开始写code了吗?项目经理回了句:你就不能找一件有意义的事情做吗?迪爷爷的故事让记者听得一楞一楞的。迪爷爷补充道:这个公司做得很成功。

关于testing,迪爷爷也有一个很牛的见解。他说:Program testing can be very effective way to show the presence of bugs, but is hopelessly inadequate for showing their absence. 就是说测试查出了bug,说明了这个程序有bug,但是测试查不出bug,不代表没有bug。然后他说真正有效的抓bug的方法是用证明来显示程序的正确性。照迪爷爷的要求来看,tester就太牛了,因为不但要有理解程序中的结构和算法的能力,更要有证明结构和算法正确性的能力。。。

高爷爷大概对这点不以为然,所以高爷爷说了那句著名的:Beware of bugs in the above code; I have only proved it correct, not tested it。这俩爷爷就这样经常你来我往地过招。很多人都爱拿高爷爷和迪爷爷做对比。有一次有人说到高爷爷带过24个PHD,然后问迪爷爷:你带了几个PHD啊?迪爷爷倒也没怒,笑着说:2个,so what? 爱因斯坦还一个都没有呢。。。 (注:后来迪爷爷又带出来两个PHD,所以迪爷爷总共带了4个PHD。)

自上世纪70年代起,迪爷爷就开始致力于程序正确性证明的研究,他反对程序全部写完后再弄个又臭又长的证明,因为你还得证明你证明的正确性。所以他主张编程和证明相辅相成,携手共进,边编边证。这个主张可能是来源于小时候迪爷爷妈妈的教诲。迪爷爷的妈妈是个数学家,而且是为很有个性的数学家。迪爷爷小时候妈妈教他学数学,妈妈对迪爷爷讲:儿啊!任何一个证明,如果你的证明要超过六行,或者说明你的问题可以分解为子问题,或者说明你已经证错了。。。

从发现算法到证明算法,显示了迪爷爷从一流高手到超一流高手的转变。王国维在《人间词话》说:“古今之成大事业、大学问者,必经过三种之境界:‘昨夜西风凋碧树。独上高楼,望尽天涯路’。此第一境也。‘衣带渐宽终不悔,为伊消得人憔悴。’此第二境也。‘众里寻他千百度,蓦然回首,那人却在,灯火阑珊处’。此第三境也。” 这个说法也同样适用于computer programming,尤其是算法领域。

第一重境界是大部分本科毕业生就应该能够达到的理解算法和应用算法;第二重境界则应达到迪爷爷早年那样发明算法,改进算法;第三重境界则不但能够证明算法的正确性,而且能证明算法的最优性,甚至先证明了可能的最优级别,然后根据证明逆向发现算法。

正当大家屏息等待迪爷爷再次在CS界搅起巨澜的时候,迪爷爷因癌症在自己荷兰的家中与世长辞了,不知道当时全体CS界是长长的叹息,还是长舒了一口气。于我,网上有篇悼文完全能代表我的心情,现在全文抄录如下,用它来结束我对迪爷爷的八卦:

2002年8月8日,我象往常一样查看自己在extremeprogramming电子小组上订阅的newsletter。突然看到这个小组上的稀客、OO教父Grady Booch的发言,题目是Dijkstra。我以为大家在讨论Dijkstra教授提出的什么难题,定睛一看,才知道是一篇类似生平介绍式的讣告——在与癌症进行了多年的斗争之后,伟大的荷兰计算机科学家Edsger Wybe Dijkstra已经于2002年8月6日在荷兰Nuenen自己的家中与世长辞!终年72岁。

原来如此!

这个Dijkstra,就是那个提出“goto有害论”的Dijkstra,就是那个提出信号量和PV原语,解决了有趣的“哲学家聚餐”问题的Dijkstra,那个Dijkstra最短路径算法的创造者,第一个Algol 60编译器的设计者和实现者,THE操作系统的设计者和开发者,那个与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。

阿兰图灵的自杀是在办个世纪之前,冯诺依曼去世也已经多年,作为这个相对新兴的行当中的从业者,我们似乎已经很习惯于从相信,从书上读到的每个名字都是仍然在世的活生生的人,都是我们这个时代的骄傲。

无论是仍然健硕的D. E. Knuth,Fred Brooks,Dennis Ritchie, Ken Thompson, Brian Kernighan, 还是正当盛年的Bjarne Stroustrup,Grady Booch,Steve McConnell, Andy Koenig, Robert Martin, Kent Becker, Martin Fowler, James Gosling, 再或者是青春年少,意气风发的Linus Trovalds,Andrei Alexandrescu,我们似乎都习惯于认为,只要一封email,这些书本上的名字就会立刻成为你的朋友。Internet把地球变成了一个大村庄,每个人的距离都那么的近。

但是可惜,Internet却无法缩短跨越生与死的冥界。今天,一颗真正的巨星在我们的眼前陨落!作为一名普通的程序员,我从内心感到惋惜和悲痛。这种悲痛,两年半前在我最初得知Richard Stevens的逝世时,也曾感受过,然而却不如今天来得这么强烈。毕竟,当我对编程还是懵懵懂懂的时候,就知道有个叫Dijkstra的人劝告大家不要滥用goto,而在那之前,goto在我看来就是编程的全部奥秘所在。之后我在学习算法、数据结构、操作系统等课程的时候,Dijkstra这个名字一次又一次从书里跳出来,我对于这个名字的崇敬也越来越深。我知道他晚年疯狂的迷恋C++,这也几乎是我这个C++ Fan所能感受到的最大荣幸。我曾想过,有朝一日,我会给他写一封email,什么也不说,只想表达我个人对他的感谢和敬意。没想到,如今连这个机会也没有了!

Dijkstra引导了并且将继续引导这个星球上所有的程序员,他的贡献和影响将与世长存,让我们祝他安息!

程序英雄传(一)

Posted: October 25, 2010 by lefteyefocus in 侃大山

高爷爷

我床头常年放了套我每年都要心血来潮地捧起来摩挲一番的书,但是每年都是读了不超过50页就放下了,所以这么多年过去了,这三本一套的精装本除了第一本头50页略微有些旧以外,第二本和第三本还基本上是崭新的。不过这并不妨碍我今年会重新再拿起这套书摩挲一遍,并且在将来继续这么做下去。这套书就是高爷爷的《The Art of Computer Programming》。。。

学CS的都知道高爷爷吧?我第一次听说高爷爷的名字还是从我一个清华学计算机的朋友口里听到的。我那阵子心血来潮想学习计算机,让我这位朋友给我介绍些入门的书看看,我这位朋友就让我到他家自己挑。别看我当时P也不懂,我会看那本书装帧比较漂亮呀,结果我就看上了他书柜里的那套《The Art of Computer Programming》了。。。

我的要求当然遭到我的朋友的断然拒绝。两个原因,一是因为那套书是他托人几百美金从国外带回国的,他不外借(去amazon上查了下,不到两百美金,这厮不是故意吓我,就是被人敲了竹杠),第二个原因更充分,那书我根本看不懂(确实看不懂)。。。结果那天的借书的结果是我把我朋友大一的教材抱回了家,以及装了一肚子高爷爷的八卦。。。

我当年最为在意的一个问题就是,如果大学不是学的计算机,半路转行还有没有可能将来做出点成就,我清华的那位朋友给我大灌迷糊汤:能!怎么不能?!高德纳当年上大学的时候还没决定好主修音乐还是主修物理,后来因为拿了物理系的奖学金,所以决定学了物理。后来高爷爷又拿了个数学的PHD,但最后再CS领域做出了卓越贡献。。。

我老人家当初是听得五迷三道,脑袋发烧,原来半路出家也能那么牛逼!我那个时候不知道CS和数学之间的密切关系,更不知道人和人不能比的!哦不,应该说人和牲口(大牛)是不能比的!

高爷爷的传奇故事从初中二年级就开始了,当时他们学校有个比赛,看谁能用"Ziegler’s Giant Bar."这句话里的字母组成最多的单词,比赛组织者准备好的complete list有2500个单词,结果当年的小高同学估计当晚多次了两个汉堡包,一发狠,弄出了4500多个单词。按说当时他还没有机会接触计算机呢,也不知道咋弄出来的。这次比赛小高赢得了一台电视机加上全班每人一根棒棒糖。发奖的那一天,小高被请上主席台发表获奖感言,小高同学的政治觉悟比较低,没有首先感谢国家,也没有感谢父母,只是说,我还可以找出更多的来。。。

高爷爷在Case Institute of Technology上本科,在那儿他才开始了他的编程生涯,在那里他使用的机器是IBM 650,后来他在写TAOCP时还专门提到这一点:"This series of books is affectionately dedicated to the Type 650 computer once installed at Case Institute of Technology, in remembrance of many pleasant evenings."

高爷爷作为物理系学生(后来转为数学系),不务正业,经常接私活给各公司写compiler,要说高爷爷和比尔大叔比,确实没什么商业头脑,他的compiler经常几百美元就卖给那些公司了,而那些公司转手就卖几万甚至十几万美元。。。

高爷爷在加州理工学院读PHD时,John McCarthy(1971年的图灵奖获得者)组织了一个编程大赛,高爷爷参加了比赛并获了头奖。获头奖不是传奇,传奇的是据说高爷爷是在纸上写的程序,程序交出后输入计算机一次编译通过。要知道这可不是写Hello World,竞争对手是一群在Stanford AI的大牛们,其中包括Alan Kay。。。高爷爷针对这个传说后来辟了谣,他说实际上是编译了两次。。。

高爷爷写compiler写得牛的名声立刻就传开了,于是著名的科技图书出版社Addison-Wesley的编辑在高爷爷刚刚屁挨着地的时候,就向他约稿,请他写本compiler方面的书。高爷爷欣然答应了,编辑同学就喜滋滋地回家等去了,这一等就等了三年。。。

后来小编同学等不下去了,给高爷爷打电话说:小高啊,你咋回事捏?都三年了,约你写的书写得怎么样了?高爷爷回答说:绪论写得差不多了。小编一听急了:啥!?三年你就写了个绪论?!你介不忽悠人吗?高爷爷解释道:这个绪论有的长,现在写了3000多页。。。

小编一听傻了,啥?3000多页的绪论,就算1.5页手稿正式出版变为1页的话,也2000多页了,原计划的写一本书肯定是不行了,改多卷本出版吧。高爷爷心里盘算了下,也行,那就暂定为七卷吧。

又过了三年(1968年),在高爷爷30岁的时候,高爷爷的传世之作TAOCP的第一卷《Fundamental Algorithms》面世了。。。

也不知道该说高爷爷太牛了,还是说他他起书名太狠了,这第一卷《基础算法》这几个字害死了不知道多少人啊,包括我和够味这样的。基础算法你总不能不懂吧。再加上比尔大叔当年那句话:"If you think you’re a really good programmer,…read [Knuth’s] Art of Computer Programming….You should definitely send me a resume if you can read the whole thing."

比尔大叔当年其实也只是读完了第一卷而已。相比起高爷爷来,比尔大叔算是厚道的,他说的是你如果想成为一名好的程序员你应该读高爷爷的书,而高爷爷则说:你要读不懂我的书,就不要做程序员了。。。妈的!怎么办?读不懂就不要做程序员了,又想做程序员怎么办,那就买来读吧。

也不知道是不是因为高爷爷这句话,TAOCP的第一卷,以及后来1969年出版的第二卷及1973年出版的第三卷几年内一下卖出去一百多万本(我敢肯定这个世界上肯定没有一百多万个好程序员)。

按原计划的七卷看,那么三卷还没过半,但这已经把整个CS界给震住了,咱一般人被震震也就算了,但是图灵奖评审会也被震得坐不住了,于是在第三卷出版的第二年,也就是1974年,把图灵奖颁给了高爷爷,高爷爷时年36岁,至今保持着图灵奖最年轻的获得者的记录。。。

也不知道是不是这图灵奖发早了,高爷爷自满了,还是别的什么原因,反正正当满世界翘首企盼高爷爷的神作TAOCP第四卷再创辉煌之际,高爷爷宣布下面没有了。。。

我靠!难道真的是好作品都是要太监的!?于是大家开始议论纷纷,说给高爷爷的荣誉太多太早了,这下高爷爷江郎才尽了。但是不管他人的议论是什么,高爷爷对外宣称的原因是,由于在给前三卷的排版时,他很不满意当时的电子排版软件的ugly排版。我们今天不满意啥工具软件所做的第一反应是上网download一个好用的,而高爷爷一怒就决定自己写一个,于是Tex, Metafont诞生了。。。

大概是为了体现出自己是个数学PHD,Tex版本编号是向圆周率无限逼近,现在的最新版本是2008年三月发布的3.1415926。而Metafont的版本编号向自然常数无限逼近,现在的最新版本号是2.718281,也是2008年三月发布的。。。

关于高爷爷给那些在他的程序里发现bug和错误的人发check的事迹很多八卦都说了,就不细说了。要补充说几点的是,高爷爷虽然自视很高,但是作风还是很严谨的,虽然他对自己的Tex很自信,但是不像我们一些“牛逼”的程序员,来不来就宣称自己的程序bug free。有一次针对Tex里的一段code,高爷爷说:“Beware of bugs in the above code; I have only proved it correct, not tested it.” 很多tester都爱拿这就话来说明testing的重要。。。

高爷爷总共给挑错的人发出了2000多张check,据说只有9张去银行兑现了。有个叫Edward O’Connor说:Intelligence: Finding an error in a Knuth text;Stupidity: Cashing that $2.56 check you got. 高爷爷在一次公开演讲时公布了一个去cash check的人的名字,结合Edward的话来开,简直就是公开进行人身攻击嘛。。。

在近30年的时间里,除了TAOCP第四卷不见踪影外,高爷爷还是干了不少事情的。除了写了上百个中小程序外,为那些抱怨TAOCP太深奥的人们,他和Ronald L. Graham还有 Oren Patashnik合著了一本书,帮助大家补习点CS所需要的数学基础,这本书叫做《混凝土数学》(Concrete Mathematics),因为该种数学是CONtinuous and disCRETE数学的混合物。

这本书我也买了,这本书我也没看完。这本书没看完的原因是因为每次把求和那部分看完后,我就觉得已经功力大涨,后面的暂时不用看了。。。

也许是分析complexity分析上瘾了,高爷爷还写了篇论文叫做The complexity of songs,他的研究成果是:如果歌的长度是N,那么歌中的refrain则使歌的复杂度减小至c*N(c < 1),然后他证明出歌的复杂度是O(sqrt(N))。后来一个苏格兰农民把歌的复杂度改进到O(log N)。。。

高爷爷最深得我心的还是他把文章搞得美观得像艺术品一样,把程序搞得美观得像文章一样。所以后来高爷爷提出了Literate programming概念。简单地讲,就是要把程序写得像散文,甚至散文诗一样;Compiler应该根据人的自然语言的逻辑去编译,而不是人根据Compiler的规矩和逻辑去写程序。

Literate programming的概念给了我很大鼓舞,程序能写得怎么样我没谱儿,码字儿我还是有一定信心的。看来以后写程序就当是码字儿就行了,我码的字儿如果通不过编译,不是我写的程序不好,而是compiler写的不好。。。

高爷爷自己就是个写作高手,TAOCP真要慢慢读,并不晦涩深奥,高爷爷的文风清新可人,他是把TAOCP当小说来写的。高爷爷曾经说把文章写给普通人看,那么专家也看得懂,如果把文章写给专家看,别说普通人了,专家也看不懂。

值得说一下的是,CS界很多大牛写文章都是一把好手,Stephen A. Cook当年给我们布置的作业读上去都让人颊齿生香。难怪Joel Spolsky当年写给CS学生的七条建议里的第一条就是:Learn how to write before graduating。。。

我常常想起无知者无畏这句话,越是无知的人,越是觉得自己已经知道了一切,这点在有关政治和宗教方面,尤其正确。前段时间看到一个猛批基督教,猛战风车的同学,就给人这种感觉。斯坦福大学有个规矩,除了宗教系和政治系以外,课堂上不允许谈论政治和宗教。高爷爷在斯坦福任教,每学期的最后一节课都是Q&A,学生们可以问任何政治和宗教以外的话题。

但是高爷爷后来在1999年应邀用了6节课做了一个报告,专门谈Things A Computer Scientist Rarely Talk About。具体内容就是谈信仰与科学的关系。。。高爷爷是个虔诚的基督徒,笃信上帝。也许是意识到基督教和科学教两大教派之间水火不容的关系,Things A Computer Scientist Rarely Talk About是高爷爷第一次,也是最后一次在公开场合谈论宗教信仰的问题。但他的这次报告还是给人留下了深刻印象,后来高爷爷去Google做报告时,好像被问的第一个问题就是:作为一个基督徒,你是怎么做到让科学家们这么喜爱的。。。

其实很多科学家本来后者后来成为虔诚的宗教信仰者,比如说牛顿。也许是学得越多,懂得越多,越意识到人的智慧的局限性,意识到人的渺小。人别说理解世界了,人就连自己的思维是怎么回事都不了解。有一次对高爷爷的访谈,高爷爷被问到对人工智能的前景有何看法,高爷爷表达了很不乐观预测。。。

高爷爷是个完美主义者,他说他的文章里不会出现is faster这样的词句,他要写一定是写is 12% faster。他还说:一个人要把事情做的完美,只有当他跟上帝的意图保持和谐。。。

所幸的是,高爷爷终于再次感觉到天人合一了,他说上帝不让他做太监,上帝让他开始写TAOCP第四卷了。

终于在第三卷出版三十多年之后,第四卷面世了!第四卷是分册写的,现在出版了0,1,2,3,4册。从0开始编号开始并不是因为CS的习惯是从0开始计index,而是写完第一册后高爷爷发现还有东西要加在第一册的前面,于是就有了第零册。

在高爷爷的website上,我看到他的写作计划是2015年完成第五卷。那个时候高爷爷就77岁了。还剩下第六卷和第七卷,希望不会太监吧。。。