20111130

使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(1)

使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(1)
引言
听着douban电台,很多新的旧的听说过和完全不认识的歌者在网络的另一端歌唱。我也不知识他们和她们都在想些什么,为了哪些感动的事情而快乐忧伤,我知道的是,这些歌声是某种数据流,彩色的发光的,在网络中穿行,最后然后驱动线圈振荡,驱动膜片振荡,驱动我的耳蜗。
这些背后,是信息论和电子学,以及无数理论支撑的结果。因为这些,世界才可能令这样美丽。
听说,BBC声称,编程技术正成为拉丁文学一样的东西。我们正尽享生活,就越来越不屑于了解世界背后的原理。令人不禁想起古罗马一片欢乐声里那些正催吐,以便吃下更多美食的达官。他们正忘记如何战斗,也正失去古希腊探索世界本源的精神。
读罗马史,我看到了散落一地的破碎镜片,很多碎片闪着耀眼的光,也同样是在这些碎片中,我看到我们自己的影像。
----
计算机由语言操纵运行,语言表达了人类的思想。人类的,或更精准的更形式化的语言要转化为机器唯一能了解的代码,然后,机器方能听命于人。
这种翻译人类可识读语言(C/C++,java,python,perl...html)为机器语言的工具,名为编译器。
Antrl是一款编译器生成工具,Stringtemplate是同一作者开发的模板工具,供编译器在解析输入文件后,填充模板中保留的占位符为另一些东西。此作者是一位大学教授,网页上的照片把两只手张开放在脑袋旁边,不知是在戏仿兔子还是蝙蝠,孩童一样微笑着。
他的硕士研究生,做了antlr+stringtemplate的PPT报告,用了童稚的字体,还有他模仿导师动作的个人照片。
导师模仿兔子,我们模仿导师。人类的动作具有丰富的内容,据说甚至承载了超出语言的信息量。不过,动作和表情传达的信息又是模糊的,对于计算机而言,模糊的指令甚至不如没有指令。
在讨论计算机精确的指令系统以前,我想先介绍一些别的。然后到了明天的博客,非计算机专业的同学,就基本可以无视了。
刚刚,我在音乐里睡着了,醒来的时候手里捧着罗素的《自由之路》还没有掉到地上。也许,我只不过迷糊过去了不到一分钟。如果我注意了刚刚在听什么歌,也许我可以判断时间。但是,我唯一知道的是,灯光仍亮着,屏幕仍黑着,长夜仍刚刚开始,我正读的,仍然是那一页
政治与自由。
一般我们认为,罗素是数学家,逻辑学家。他同时还有另一个身份,他也是一位哲学家。他以哲学著作获得诺贝尔文学奖,因为他的文字中对于人类的关怀。
在读《自由之路》的过程中,我不断地发现许多书页中夹着的暗红色叶子,并为此而感动。这当时许多年前某位读者放进去的,某个秋天,她读了其中的很多页,把那个秋天的纪念放在这里。后来的很多位读者,都看到并保留了这份心意。
我执意认为,这位读者当是一位女士。因为男士少有此种闲情。而她之所以令我感动,并非出于性别,而是智慧。读了这些书页的,能读懂这些书页的,应该具有与性别无关的智慧。我见过许多美女抱怨"他喜欢我一定只是因为我的容貌",就像男子抱怨"她喜欢我绝然是为了我的钱"。他们和她们都没有想过一个问题,那是否因为你的智慧并非明显地超出你的容貌或者金钱。
当你的智慧超出性别,那么人们自然尊重你的智慧,与性别无涉。当你注视罗素在很多年前,把他的智慧倾吐在这些纸上的时候,你见到的是一位长者,还是一位老帅哥?
尤其是当岁月洗去他的容貌和声音以后。当你与他的生活毫无交集,因此绝无情感置于你与他之间。
你所看到的,是一个人,他在探索人类所未知的领域。
那些领域,哪怕仅是我们自己所未知的,而别人尽已了解,也仍然是非常有意思的事。
而有些人,不是这样做的。他们并不想了解这个世界,只是想消费它。
听到一个笑话,就是牛顿说我不是牛顿,我站在一平方米上,所以我是帕斯卡那个。我看到有人说:我是文科生,看不懂,猜那是公式,所以我笑了。
所以我叹气了。有些人,并不想了解这个世界,只是想消费它。牛顿每平方米不是大学物理中的公式,而是高中知识。也就是说,能说"我是文科生"的人,既然已分文理,他一定是学过这个公式的。
他只是不愿意去看去想,这个世界,只是他发表意见的垃圾筒,他根本不屑于明白。我确实十分不明白,对于一个你不了解的领域,这整个世界,你怎么敢于发表一丁点意见。
对于我们未知的领域,保持探索,这是后面这个例子的引子,也是antlr+stringtemplate这系列博客的引子。
-----
这个例子,是探索仅我未知的世界,这个领域的人,早就知道了。
前几天以蜡烛做为质料,做了几个小东西,有小兔子,有小娃娃,还有一头小驴子。后来想做松塔,失败了。
其中一种方法是这样的。
第一步,把橡皮泥在橡皮泥的模具(材质是塑料)上压紧;
第二步,小心揭下橡皮泥,不要整变形了;
第三步,把热熔的蜡烛烧在橡皮泥里;
第四步,等蜡烛冷却凝固,把橡皮泥扣下来。
似乎是这样的,这些步骤在某个学科里都是有专门名字的,这些东西也是有专门名字的。
我仅约略知道,在这里,第一步中的橡皮泥模具,塑料的那个,称为母模(还有一种说法,公模母模,按这种说法,这应该是公模);第二步里以橡皮泥为材质的那个,称为阴模,或者简称模具;第三步和第四步里蜡烛的那个东西,叫做什么呢,我们称它为产品吧。
以上的这些步骤看似简单,其实里面诸多细节,任何一个细节的卡死,可能都会令你全盘失败。
有的同学会问,都成功80%了,那也叫失败么。谁说的来着,失败只有一种,就是半途而废。后面种种理想,只要没有实现的,也不过是你大脑里的一些神经电脉冲而已,能有几毫瓦呢。
凡是没有做出产品的,就是完全失败的。这也是为什么某些表现为领导者的干部令人厌恶的原因,他们完全没有实施的能力,只有观点。
在操作以前,有些细节,由于学科训练,我能够想到,有些,则完全没有预料到。
我想到的,书里也提到,蜡烛加热是件危险的事,要始终看着火温。我们都知道那是易燃品。我想到的方法是水浴,即隔水加热,这能保证在加热中蜡烛只会融化,不会燃烧。
水浴,这个方法很令我得意。我还跟包师弟吹嘘来着,同时提到数据,石蜡的融点是47-64度。包师弟说,水什么浴什么热,我做个电子的恒温器。
这就是能力差别。因为他还将避免另一个我在实验时发现的问题,烧铸的时候,蜡的温度非常重要。如果温度过高,会把橡皮泥中的水析出来,留在橡皮泥和蜡液之间,这非常影响对模具细节的表现。如果温度过低,蜡液将开始成为半流体,容易断裂。
我猜到,有些同学正对这些细节不屑。那是因为你只有观点,既不打算了解这个世界,也不解它,因此并无亲自实施的习惯。
这些细节足以使你的作品变成垃圾。
就像你的那些错别字,那些矮油的感叹把你从一个严肃讨论问题的公民转变为一个戏谑或无知的看客。因为你既不尊重你讨论的对方,也不尊重你讨论的问题。这正如打CS的时候作弊,你当然有这样的自由,但是没有人乐意陪你玩,又或者陪你玩的人是和你一样或更不严肃的人,你们一起把这个游戏变成甚至不如一个的游戏。(这里,感谢子龙和兔子的教诲,打CS作弊是不对的。)
同理,antlr+stringtemplate中的细节,也都是非常重要的。仅知道它们干什么的工具,并不能帮助你有能力使用这些工具--仅达到指手划脚的能力吧。
为什么我要提铸模这个例子呢?
因为从明天的博客开始,我会使用母模、阴模、产品这样的比喻。
我将谈到:antlr, stringtemplage的基本原理,我将用它们从下面这样的杨氏语言中生成c++源代码,包括头文件,cpp文件,调用它们的cpp文件,能编译并执行的。
杨氏语言的一个例子:
mario:pipe_a 123 | pipe_b | pipe_c
peach:stage_1 123 | stage_2
bowser:lose_1 123 | lose_2 | lose_3 | lose_4 234
没错,这就是超级马利的一个粗糙模仿。马利同学依次穿过了pipe_a,pipe_b,pipe_c,并且在pipe_a那个场景里得到了123这么个道具。
最后生成的cpp代码大致像这样:
 o_mario->pipe_a(123)->pipe_b()->pipe_c();
o_peach->stage_1(123)->stage_2();
o_bowser->lose_1(123)->lose_2()->lose_3()->lose_4(234);
生成的代码中,还包括o_mario等这些对象的类的声明和实现。
另外,下面这种调用方法,就是fluent interface的实现手段之一:methodchaining。是不是看着挺人性化的?
o_mario->pipe_a(123)->pipe_b()->pipe_c();
明天开始,我们整个模具生成它们。明天,我们先看母模啥样。

pics

.

20111124

我想买个键盘:用户需求可以多么刁钻

我想买个键盘:用户需求可以多么刁钻

套用那句著名的"我想要的很简单",今天我想要的也很简单,我想买个键盘。

为了这个简单的愿望,不仅昨天在网上查了半个晚上,今天又跑了半天。这证明,所有的用户需求都是不简单的,包括某些看起来非常简单的。

只要这个要求是特异的,那么就不简单;如果这个要求不是特异的,它根本就不会存在。

如果我要求键盘上面有ABCD几个字母,那么你就会哈哈大笑,这个要求容易满足。如果我要求这个键盘只有数字,要非常的小,你会问我"是不是银行里输密码的那种布局"。如果我明白什么是布局的话,那么你我就可以很好的沟通。如果我想要的是无线蓝牙或者有线,那么你可能推荐我罗技。

这些,都不是我想要的。

1.我想要的键盘应该只有"基本区":用户的基本需求,不同于平常的

键盘从左到右可以划分成三个部分,最右边区域是数字小键盘,中间的区域是翻页和光标移动键,最左边的区域就是我说的"基本区"。我要这样的一个键盘,它从基本区的右侧切了一刀,右边的都不要。

昨天晚上,我在网上找,"迷你",找到的是一巴掌宽的那种。我想要不是这种,而是尺寸正常,只是切除了右半边的。

2. 我不喜欢苹果:用户需求变更

在百脑汇,老板们给我找到了不少符合我上述需求的。但是我突然发现,它们有个共同特征,像苹果的键盘。

苹果引领了新时尚,但我打算不跟随啊。苹果键盘的键帽,表面有个不同以往的特征。咱们传统的键盘的中间是凹下去的,而苹果的键帽上面是平坦的。

那个洼洼兜对我非常重要,它能让我在全黑的环境下也能确保每个手指都在正确的键位上。F和J上的小突起,仅能帮助我定位这两个手指的位置,但是我是否按到了键盘的边缘以外,是不是一直都打在键的正中心上这个洼兜。平坦的键顶,让我恶意猜测苹果的大多数用户都是偶尔才使用键盘的,或者键盘只是玩具,而不是工具。可能不止苹果,所用的计算机用户都步入娱乐的时代了。无线键盘很难找到单独卖的,而鼠标和键鼠套装却可以,也是一个旁证,大家不再那么需要键盘了,而是更依赖鼠标。鼠标可以用于选择,就像答ABCD的选择题,鼠标也能用来表达思想么?就像转载能用来传达态度,转载也能用来表达思想么?

我需要工作,需要即使在黑暗中也能准确定位按键,所以,我不能用苹果风格的新潮键盘。

有人可能会建议开灯低头看一眼。恩,有一种技术叫做盲打,是程序员的基本功。
3. 右边的CTRL:用户说,看到了才知道,这不是我想要的

终于找到了符合上述要求的。此时,如果是我们在做用户需求,可能已经报怨过了,"你不喜欢苹果的,为什么不早说,我白给你拿来。"

此时,你还会再次抱怨。因为符合上述要求的,仍然不符合我的要求。因为用户说"只有当我看到了你的作品,我才知道,这不是我要的。"

而用户想要什么,你永远也不能提前预知,因为连他自己也还不知道呐。我就是在看到了符合上述所有要求的键盘,并且按了几下,才发现,还是不行。

手感啊,键的行程啊,按下去半天不弹起来啊,没有后背上方的小支架啊,这些也就算了。20元+的键盘,你还能有什么更多的要求呢。

可是,怎么可以没有右边的CTRL键。

我之所以想要一款这样小的键盘,是因为我用EMACS编程。所以,1.我不需要光标移动键和翻页键,2.我有时会用鼠标,为了编程的时候上网查资料。这时右侧的数字键和编辑键区域就是累赘,那正是我的右手腕要通过的区域,我的右手腕从那里伸向鼠标。

你可能会建议,把键盘向左移一下,不就行了么?如果键盘向左移动10厘米,确实为右手腕空出了地方,但是当我要用键盘输入的时候呢?我的手腕不得不为了键盘在左侧而扭曲。而编程,毕竟是键入比上网的时间要多。如果手腕再向右呢?你可以试试右臂张开的角度,并保持一段时间,而此时你的键盘"基本区"在你的正前方。

顺便说一句,我不需要数字区,是因为1.我很少连续输入数字,2.我能半盲打所有的数字和它们的上档键。

这些跟右CTRL有什么关系呢。用户MOJI完上面这些,你可能会问。用户会接着 MOJI下去,他认为重要的事情,并传达一下情绪。

很多人用EMACS的时候都会遇到一个问题—恩,很多问题,这是其中的一个。许多人用EMACS时间长了,会左小手指疼,因此有些人还会把CAPSLOCK和左CTRL交换。我没有这个问题,一个原因是我不仅使用左CTRL,也会使用右CTRL。Ctrl-C,就是用右CTRL。而且,这是标准做法。

问题来了,符合上述所有要求的键盘,居然个个的右CTRL都缺失了。也不知道是大家伙山寨哪位大爷最初设计的结果。应该是CTRL的地方,换成了INS和DEL键。DEL还算有用,我一辈子能按INS键几次啊。

4. 后来我终于找到了基本符合要求的:拒绝用户部分需求

其中一款是微软的,300元+。小众么,就会是这么个结果。非量产,小资情怀,纯手工,它们都具有共同的特点,那就是贵。后来发现,它是苹果风格的,之前只看大家评论的优点,忽略了。

另一款不那么贵,不到100元。右CTRL非常窄小。这适用用户需求获取的另一个原则:拒绝不那么重要的用户需求。我准备映射一下,把右边那几个键都改成CTRL,这样就不容易按错了。

用户是上帝,前提是用户付得起钱。或者说,用户打算承担由这些变更或需求引起的时间、费用、人力上的开销。用户喜欢花样百出,但是只要你坦诚地告诉他,花样都可以满足,不过是要收费的,用户往往就突然变得不喜欢这些花样了。

其实我们应该喜欢这些花样,这是我们存在的原因和用户付我们钱的原因。但是,往往天不遂人愿,工期或者用户的荷包刚好不敷。

这个世界上,就没有简单的需求。无论多小的需求,都可以极尽刁钻。不仅缺失的是问题,比如右CTRL,有时连多出来免费提供的也是问题,比如编辑区和数字键盘区。

还有的用户,像孩子一样,只会哇哇大叫,表达的是"我不舒服我不爽"。但是他需要的是什么,连他自己也不知道。这又让人有什么法子呢。

我们,就真的知道自己想要的是什么吗?如果你真的知道,为什么没有去做,没有尽力去做。

你真的想要的是什么?

20111118

没打游戏,我非常难过

没打游戏,我非常难过

雾气在窗玻璃上凝结了薄薄的一层,慢慢滑落,勾勒出几条平行弯折的河流。河
流的底下,是毫无亮光的浓黑,如同大地。

我是多么地想打游戏啊。

升到最高级的投石车轰开在森林里轰开一条小径,三五弓骑兵悄悄潜入敌人的基
地。突然间警钟响起,骑兵开始射杀农民矿工和猎手,远方的敌军驰援而回。另
一处,据河防守,城门铁闸升起,成群重装骑兵火速冲出,去砍断攻城器的木架。
攻击器收起退入戟兵丛中,追击的骑兵头上红缨如火般抖动。

在某一种森林,雾气升起,只看到林木的剪影,敌人隐藏其中。背后追击的,精
灵族满怀仇恨,因为我们收留了与我们同样身为人类的强盗,前方拦截的,不死
族蓄势已久,正等着截断我们的归路。我们是一群老弱残兵,不敢与任何强敌稍
加接触。我们结成人墙,把医生和法师围在当中。当遇到攻击,活下来的人听到
的是满耳的战友的悲号,但是没有一个人敢稍作停留反击。只有毫不停息,才可
能有人活下来回去通知故乡的人立即组织防御。

我不记得了。是不是每一次,当丛林散尽,终于能见到天日。看一条大河横在面
前,河上只有一桥,桥上是一名敌人的悍将。是不是每一次,欲哭无泪的时候,
都有一员使长枪的将军站出来大喊一声:我来断后。

应该是的,不然,我们怎么能够走出这么远。

"我来断后"的意思是:只有我在战线的最后,只有我与敌人接触。请你们,无论
谁也不要回顾、迟疑、救援。

一句话的意思,就是它本身的意思。而不是它背后隐含的意思。

下午听ZHUMAO报告,并参观机房。之前我提到:只许看啊,谁也不许碰。中间有
人靠近,有人碰了。

事后我说,这件事需要说一下,然后我说,我并不是批评某一位同学,因为有另
外一位同学也碰了。

其实我的表达不清晰。并非因为有别人也碰了,所以不批评你。我说不是批评你
的意思,就是不是批评。因为,我并有因此对你所做的事情也并未因此对你做出
任何否定。你之所以那么做,是因为你还不了解。不知者不为罪。

这里我又提起,是因为很多人在说"我不是批评你"的时候,她的意思恰恰是"我
就是在批评你"。我完全不是那样的人。我说不是批评的时候就是不是批评,如
果我的意图是批评,我也会直接说:我就是在批评你。

关于为什么不能碰机房的机器,我下午说过了,可能你也并非计算机专业的同
学,不必了解更多。只需猜想,不影响我接着扯。

前几天与编辑讨论,编辑大人说:秉笔直书,只管描述。

我说:如果我这样这样再这样描述,你觉得行么。

当然不行,那体现了作者错误的人生观价值观和...世界观(?)。俺们学校是有
要求的,要求教师不仅在学术上,也要在德育上教育学生。我真的得小声地说:
我道德水平本身就非常不咋地,怎么能够再在道德上教育学生。

下午跟ZHUMAO还提到,当然,我还算有点自知之明的。还有道德水平比我略高,
却远低于正确三观标准的,仍然坚持德育学生,这是正确啊正确啊还是正确的做
法。

我们怎么能够教育学生我们自己都不相信不执行的东西?

-----------------

描述就是描述,观点就是观点。捍卫观点,从来也不是问题,把观点伪装成客观
描述,就很成问题。

国人用词暧昧娓婉,语多曲折,不输于小鬼子。很多时候表面上看是出于尊敬,
其实多是伪装中肯。

前些日子某机构发文,要求某些同事去拍照。文件写的大意就是:这是给大家的
机会。

我写信询问,到底这是福利呢还是行政命令。如果是福利,我不喜欢,不想参加。
我没有说的是,如果是行政命令,我们来讨论一下管辖权。

明明是命令你的时候,偏要说:你看,这样做比较好,尤其是对你比较好。让我
想起多年前,老板们找你干活,偏偏要说这是对你能力的锻炼,给你创造机会。

-----------------

又想起下午在ZHUMAO那里提起的一件事。讲C++的时候,胡同学曾经在课程结束
后跟我要课件。我说,不行。后来考试结束了,胡同学说:老师,这回可以了吧。

我说,不行。

胡同学问:为什么呢。

我的回答是:因为那是我的啊。

我知道你可能猜测我不给课件的原因,是担心考试题目吧。不是。原因是...因
为那是我的,所以我可以不必给出原因而拒绝。

我只是把你和所有的组织机构上级领导一视同仁。我的,就是我的。那些完全属
于我的东西,除我以外,没有任何人可以用任何方式替我做任何决定。

你与组织机构上级领导是一样的。我与你,也是一样的。我与你一样,是多么地
想打游戏啊。

会有很多同学表扬胡同学的钻研精神,大加鼓励...最后以各种借口不能给出课
件。

-----------------

与某些同学所不同者,我没有用矫词伪饰,并以为那是对别人智商的侮辱。

你之于我,正如给笼子里的狗喂水的那位富妇人。无论言辞多么漂亮,举止多么
优雅和符合韵律,多少升同情的眼泪,在我的称谓前加上多少形容词顺便彰显你
的文化,总归不能脱出这样的事实:在你的眼里,我是狗--或者可资使用的物件。

加多少尊重、掩饰,对于本质也没有什么改变。

除此以外的情感,回忆里的美好,我希望能放在另一个时候来谈:当没有利害关
系的时候。

昨天读到《查太莱夫人的情人》的评论时注意到,那位男主人公说:很多人都没
有得到,但是他们假装得到了;如果我没有得到,我决不能欺骗自己说得到了。

决计不能欺骗自己。我非常想打游戏,我没有打,我非常难过。

20111116

教学相长,和我的学生

教学相长,和我的学生

今天下午被要求听讨论教学的会。高哥提到两句对我非学有启发:一句是教学相
长。这篇日志都是关于这个的。另一句是,马克思说,人的创造力在于他的自由
时间。自由--我努力追求能让内宁静的自由。

以下是教学相长的。

1. 大毅同学

一大清早去单位,有讨论。

趁正题开始前,我画了半个白板的某架构或者工具链。又一次燃起雄心壮志整那
个难整的东西。绘图控件。

很多年前,刘同学就开始和我整这个,用了好几种编译器生成器。到现在,那些
中间结果都没有用上。而他已经要毕业了。他和建一一起提到,这世界,更多的
需要做web前端的什么的。

我坚定地相信,底层,或者说深入核心的部分,仍然需要有人去做,而且一定是
我们。我们不跟踪时尚,我们固守那些基本的原则,并不断深入探索。

但是,我不敢去触动做了好几年也不敢整的绘图控件。按与包师弟谈时我提到
的,我甚至不敢开始。

刘同学说:你找个本科生,就光做这个呢?

他指的是本科中的强人,我们都知道指的是谁。

我说:比如那位某某吧。我舍不得啊。

他说:做不出来就算了呗。

我说出我的顾虑:那学生不就毁了么。

我想的是多年前,我们做了好几年的编译器生成器。那些没有成果的工作。心怀
愧疚。

刘说:其实做不出来,学生也有收获。

后来同学们问我,为什么看起来很累。我说:我晚上1点多睡的。又说,一大早
KFC关门,没喝成咖啡。

这些都不是原因,我在想刘同学的话。也许你们是真的对咱们啥也做不出来的那
些工作心无抱怨,但是我却不能没有遗憾和抱歉。

糟烂工作之所以糟糕的原因,正应该归疚于导师或者项目组长或者技术负责人。

也许吧,刘同学说的对,即使我们什么也没做出来,却仍然有收获。


2. 建一同学

建一同学也快毕业了。前一段公安厅的项目,请他帮助我指导齐同学,齐同学甚
有收获。

我后来问建一,你咋整的呢。

我之所以问,是因为我经常把同学们整得JJWW的,感觉我逼得很紧太过严厉,同
时我经常觉得这些简单的问题都应该你们自己整,咋能啥都指着我手把手教呢。

我问建一,你咋整的。齐同学出成果太快,大大出乎我的意料啊。我记得是期待
一周,结果三天左右吧。

当时的任务是写个GUI,把我写的业务逻辑包起来。齐同学将在这里看到项目中
的分工,接口,写代码的经验。我希望建一不亲自参与写代码。

建一把任务分成了三步,让齐同学去做。第一步是建个简单的GUI,啥消息响应也
没有;第二步是添加一些控件,就是我在项目里要求的那些,图片label,文字
label等等;第三步是把GUI套在我的业务逻辑之外,调用我提供的函数。

于是事情就成了。

我想起了袁师弟以前教我RESET笔记本。

我说:这破玩意根本从来就不好使。不是按4秒就重启么。

袁说:你不能这么数4秒,1234,你得这么数,1--2--3--4。

他按住reset,于是机器重启了。而我此前从不能成功。

我太缺乏耐心,不能等待各种反应缓慢地发生。

当年家教的时候,那学生的妈妈说孩子挺聪明的。我就信了。我讲完基本概念和
解法以后,问:你明白了没?

明白了。

我从书后找道难度还可以的题目,他不会。

很多年以后,二猫妈提醒我:你得整一道跟那原理完全完全相同的题目,让他有
成就感。

我说:那不是侮辱他的智商么。

我缺乏耐性如此,而我的学生们一直一直忍耐着我,等我明白。

而且,你们教会我:

2.凡是不能一蹴而就的任务,其中好多可以分解成一个个阶段,依次完成。

那些无法划分阶段,或者每个阶段我们仍无法完成,或者穷我们毕生也无法完成
这些阶段的,就是不能完成的。对于不能完成的,我们又有什么遗憾的。

而且,1.即使一无所成,我们仍有收获。

人生,正是如此。谢谢教导,敬受教。

20111111

牛人与弱手的区别,不是线性的,而是指数的 及他们之间的道路

牛人与弱手的区别,不是线性的,而是指数的 及他们之间的道路

1.误操作

今天傍晚,我删除了整个下午的工作成果。误操作。执行的是那个著名的指令
"rm * -rf"。

我发了会呆,再三确认是这个目录,然后手悬在键盘上不知道该敲些什么。我跑
到GOOGLE,没有解决方案。牛同学说,能不能恢复啊?

我说:不能,十好几年前我就知道不能恢复。

这命令太著名,且令人印象深刻了。上网查一下,只是安慰一下自己。恩,我并
不孤独,傻子真多啊。

有多少人有这样的经历呢,先是对着心爱的人喊"我再也不想见到你",当如愿以
偿的时候,开始对着空虚哭泣。

rm是remove,-f是不必再问一次,-r是递归。递归的意思是,把目录下的目录下
的目录下的...东西,都照此处理。类似于,我烧掉你的信,烧掉提到你的信的
日记,烧掉提到日记的作文,烧掉提到作文的...我想你明白了。

大半夜的,刚又调了半宿,我可不是跑这伤感来了。当时,我对着屏幕发了一会
呆,然后对张宇同学说:你回家吧,今天的观摩到此结束。最重要的内容你刚刚
学到了,今天学不着啥了。

然后,我开始键入,跟张健一边回忆下午的全部工作。我们花了大约1小时20分
钟,把整个下午的工作完成了。接下来的半个晚上,我证明了这1小时20分中,
大部分时间是在试图解决一个暴露出的新问题,而不是恢复下午的工作。

一整个下午 对比 1小时20分,其实这正是令人悲哀的差距。

1小时20分 说明,我们,具体地说就是我,一整个下午,大部分工作是在发现错
误和改正错误,而真正的工作,1小时20分钟足以完成。

这就是高手与我们这样的低手的差别:我们引以为豪的一整个下午的工作,对于
不犯那些愚蠢错误的高手而言,只值1小时20分。

2.效率之差

高手通过避免错误节省时间,从突显出他的效率。即使犯了错误,他也能更快地
发现错误的原因,也更快地修正错误。

想起ACM比赛,牛人和面人之间的差距,岂可以道里计。相信有过比赛经验的同
学深有体会。在工程中,面对牛人深感绝望的各位也一定深有同感。

更可悲哀的是有一些同学尚无法看到自己与牛人的差距,动辄认为:我也能整出
来。

他所看到的,是现实或者电影里牛人几乎不犯错误的流程,并投射到自己,却不
知道 不犯错误本身正是至难的事情;犯了错误能够以别人几乎无法发现的速度
发现和更正,也并非人人能够。

我们把大部分时间都花费在犯错误上了。

骄傲的同学认为:其实再给我一点时间,我也可以。

时间。这个世界最吝惜给予我们的,恰恰就是时间。

如果我们有足够的时间,我们就可以在战场上迂回到敌人的后方;如果我们有足
够的时间,我们就可以比对手更早地把刀切在某个部位;如果我们有足够的时
间,我们就能把这些兵那些兵都调到敌人的基地,把所有的矿全占了……

所有这些愿望,只需要一个前提,那就是当我们拥有时间的时候,别人没有同样
拥有。

你这为这个前提可能实现么?

时间。这个世界最吝惜给予我们的,恰恰就是时间。所以,我们在战场以下用小
时计算以天计算以年月计算的时间,却换取战场上的几秒钟。

我们用这些时间训练自己避免错误,也训练自己迅速改正错误。这样,在战场
上,我们就可以有更多的时间做正确的事。

经常有年轻人抱怨,失声痛哭,为什么结果会是这么悲惨。为了让你自己好受一
些,请假设我在讨论的是中国男足。其实结果如此悲惨的原因非常简单而直接,
在过去所有的岁月中,你做出了这样的选择。

我们与牛人能有多大的差距,在甚至不足一生的努力之后?

想想你和你的小学同学现在的差别,和你的高中同学,和你的大学同学。有一些
人,如偶像YMH,对够达到令我认为 对比是没有意义的,因为永远不可能达到,
更遑论超越。

据说巨牛的程序员的效率是面手程序员的10倍。我想,做出这个统计数字的人,
一定没有参观我们的教室和实验室。

3.图书馆案例

正确的方法与糟烂的方法效率之差能有多大?一个真实的案例,但是今天不细说。

当年在图书馆导数据出来。

预定的方案导出全部书目所需的时间是:200个工作日左右,每天8小时,需要一
位工作人员陪着机器。

我们经过1个月还是一周的研究,最终的方案导出数据花费了:半小时,人类按
键花费了不到1分钟,然后就离开了。

如果我们更牛,避免错误技术路线的尝试,这两个方案的对比就是 200天
vs. 30分钟。

4.于同学的问题

周三李记者讲座以后,于同学留言问到:

"其实老师,我还有一个问题没有问(我怕老师们回答不了):如果一个人很热爱
代码,很喜欢计算机,但是他学的就是不好,编程就是不如别人,他还有存在的
价值吗,他如何生存(可以译为小人物的生存之道)。习编程。"

其实这个问题一点也不难回答。初步的回答是:

"我唱歌跑调挺严重的,但是我学习弹琴;我体质挺差的,但是我坚持做俯卧撑--我
一直在进步。結果并非总是重要的,过程也是我们所追求的;试想,人生如果忽
略过程,只看結果,还有什么意思。"

只要努力总会进步,而且进步是成指数,而不是线性的。牛人,一般都是从面人
过来的,当年也都面得可笑。

很难想像热爱却不能精通,如果你用一生的时候去追求。

是的,由于天份所限--我们不得不承认--直到生命最后一刻,我们也没有成为巨
牛的牛人,但是你的高度已经可以被很多人仰视了。你三两岁的时候,如果像现
在这样畏难,一定会被自己当时走路和语言的能力吓得每天哇哇大哭。

我知道,你当时确实是那样做的,每天哇哇大哭。现在,请别再以另一种形式继
续哭了。

而且,我们的人生并非用来与人比较,这一进步的过程,也正是我们所享受的。

我们终无可能踏入神的队列,但是我们从未停止努力的脚步。正是持久的努力之
路,而并非结果,令我们不同于凡俗。

20111109

2011年11月9日,我的理想

2011年11月9日,我的理想

2011年11月9日,历史从这一天改写了。

李记者下午讲座,问同学们,以后想干啥。王同学说:想做像杨老师那样的人。

我非常激动。极其激动。

当年去丹麦和Lars闲扯。他问我,你想你的学生们么?我说:想。他给我看大家
的照片,我愈加想念。Lars说你的学生都挺喜欢你的。我说:啊。L

又经过了若干谈话,Lars说:做一名教师,应该能够让学生希望将来成为自己这
样的人。

今天,当我听到王同学这样说的时候,我想起了Lars的话,想起了几次中丹合作
项目,回想起我们成功和失败的项目。

人生不如意十有八九,今天这算是人生的一点亮色。偶而,我做教师也有成就感
的时候啦。

领导和上级的评价不足为凭,学生喜欢老师扯淡吹牛讲笑话也不足为据,学生N
多年以后后悔或感谢你当年的教诲也算不了什么。但是,我的学生想成为像我一
样的人。谢谢,我很自豪。

----

晚上吃饭,提到风投啊,就业形势越来越好啊,什么的。好象我们已经整到了很
多钱,可以大把地花了。

我说:我要把那些钱都发了。每个学生每个月四十万。每个人再发条狗,有男朋
友女朋友的都带着,每天就是去大连海边遛狗。没对象的,一人发一个对象。男
生发个女朋友,女生发个男朋友。

恩,如果有男生要求男朋友的,也可以满足。

考虑到中国的男女比例,我在女生要求女朋友这犹豫了一下。后来想想,也行。