教学相长,和我的学生

教学相长,和我的学生今天下午被要求听讨论教学的会。高哥提到两句对我非学有启发:一句是教学相
长。这篇日志都是关于这个的。另一句是,马克思说,人的创造力在于他的自由
时间。自由--我努力追求能让内宁静的自由。以下是教学相长的。1. 大毅同学一大清早去单位,有讨论。趁正题开始前,我画了半个白板的某架构或者工具链。又一次燃起雄心壮志整那
个难整的东西。绘图控件。很多年前,刘同学就开始和我整这个,用了好几种编译器生成器。到现在,那些
中间结果都没有用上。而他已经要毕业了。他和建一一起提到,这世界,更多的
需要做web前端的什么的。我坚定地相信,底层,或者说深入核心的部分,仍然需要有人去做,而且一定是
我们。我们不跟踪时尚,我们固守那些基本的原则,并不断深入探索。但是,我不敢去触动做了好几年也不敢整的绘图控件。按与包师弟谈时我提到
的,我甚至不敢开始。刘同学说:你找个本科生,就光做这个呢?他指的是本科中的强人,我们都知道指的是谁。我说:比如那位某某吧。我舍不得啊。他说:做不出来就算了呗。我说出我的顾虑:那学生不就毁了么。我想的是多年前,我们做了好几年的编译器生成器。那些没有成果的工作。心怀
愧疚。刘说:其实做不出来,学生也有收获。后来同学们问我,为什么看起来很累。我说:我晚上1点多睡的。又说,一大早
KFC关门,没喝成咖啡。这些都不是原因,我在想刘同学的话。也许你们是真的对咱们啥也做不出来的那
些工作心无抱怨,但是我却不能没有遗憾和抱歉。糟烂工作之所以糟糕的原因,正应该归疚于导师或者项目组长或者技术负责人。也许吧,刘同学说的对,即使我们什么也没做出来,却仍然有收获。
2. 建一同学建一同学也快毕业了。前一段公安厅的项目,请他帮助我指导齐同学,齐同学甚
有收获。我后来问建一,你咋整的呢。我之所以问,是因为我经常把同学们整得JJWW的,感觉我逼得很紧太过严厉,同
时我经常觉得这些简单的问题都应该你们自己整,咋能啥都指着我手把手教呢。我问建一,你咋整的。齐同学出成果太快,大大出乎我的意料啊。我记得是期待
一周,结果三天左右吧。当时的任务是写个GUI,把我写的业务逻辑包起来。齐同学将在这里看到项目中
的分工,接口,写代码的经验。我希望建一不亲自参与写代码。建一把任务分成了三步,让齐同学去做。第一步是建个简单的GUI,啥消息响应也
没有;第二步是添加一些控件,就是我在项目里要求的那些,图片label,文字
label等等;第三步是把GUI套在我的业务逻辑之外,调用我提供的函数。于是事情就成了。我想起了袁师弟以前教我RESET笔记本。我说:这破玩意根本从来就不好使。不是按4秒就重启么。袁说:你不能这么数4秒,1234,你得这么数,1--2--3--4。他按住reset,于是机器重启了。而我此前从不能成功。我太缺乏耐心,不能等待各种反应缓慢地发生。当年家教的时候,那学生的妈妈说孩子挺聪明的。我就信了。我讲完基本概念和
解法以后,问:你明白了没?明白了。我从书后找道难度还可以的题目,他不会。很多年以后,二猫妈提醒我:你得整一道跟那原理完全完全相同的题目,让他有
成就感。我说:那不是侮辱他的智商么。我缺乏耐性如此,而我的学生们一直一直忍耐着我,等我明白。而且,你们教会我:2.凡是不能一蹴而就的任务,其中好多可以分解成一个个阶段,依次完成。那些无法划分阶段,或者每个阶段我们仍无法完成,或者穷我们毕生也无法完成
这些阶段的,就是不能完成的。对于不能完成的,我们又有什么遗憾的。而且,1.即使一无所成,我们仍有收获。人生,正是如此。谢谢教导,敬受教。

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

牛人与弱手的区别,不是线性的,而是指数的 及他们之间的道路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.于同学的问题周三李记者讲座以后,于同学留言问到:"其实老师,我还有一个问题没有问(我怕老师们回答不了):如果一个人很热爱
代码,很喜欢计算机,但是他学的就是不好,编程就是不如别人,他还有存在的
价值吗,他如何生存(可以译为小人物的生存之道)。习编程。"其实这个问题一点也不难回答。初步的回答是:"我唱歌跑调挺严重的,但是我学习弹琴;我体质挺差的,但是我坚持做俯卧撑--我
一直在进步。結果并非总是重要的,过程也是我们所追求的;试想,人生如果忽
略过程,只看結果,还有什么意思。"只要努力总会进步,而且进步是成指数,而不是线性的。牛人,一般都是从面人
过来的,当年也都面得可笑。很难想像热爱却不能精通,如果你用一生的时候去追求。是的,由于天份所限--我们不得不承认--直到生命最后一刻,我们也没有成为巨
牛的牛人,但是你的高度已经可以被很多人仰视了。你三两岁的时候,如果像现
在这样畏难,一定会被自己当时走路和语言的能力吓得每天哇哇大哭。我知道,你当时确实是那样做的,每天哇哇大哭。现在,请别再以另一种形式继
续哭了。而且,我们的人生并非用来与人比较,这一进步的过程,也正是我们所享受的。我们终无可能踏入神的队列,但是我们从未停止努力的脚步。正是持久的努力之
路,而并非结果,令我们不同于凡俗。

2011年11月9日,我的理想

2011年11月9日,我的理想2011年11月9日,历史从这一天改写了。李记者下午讲座,问同学们,以后想干啥。王同学说:想做像杨老师那样的人。我非常激动。极其激动。当年去丹麦和Lars闲扯。他问我,你想你的学生们么?我说:想。他给我看大家
的照片,我愈加想念。Lars说你的学生都挺喜欢你的。我说:啊。L又经过了若干谈话,Lars说:做一名教师,应该能够让学生希望将来成为自己这
样的人。今天,当我听到王同学这样说的时候,我想起了Lars的话,想起了几次中丹合作
项目,回想起我们成功和失败的项目。人生不如意十有八九,今天这算是人生的一点亮色。偶而,我做教师也有成就感
的时候啦。领导和上级的评价不足为凭,学生喜欢老师扯淡吹牛讲笑话也不足为据,学生N
多年以后后悔或感谢你当年的教诲也算不了什么。但是,我的学生想成为像我一
样的人。谢谢,我很自豪。----晚上吃饭,提到风投啊,就业形势越来越好啊,什么的。好象我们已经整到了很
多钱,可以大把地花了。我说:我要把那些钱都发了。每个学生每个月四十万。每个人再发条狗,有男朋
友女朋友的都带着,每天就是去大连海边遛狗。没对象的,一人发一个对象。男
生发个女朋友,女生发个男朋友。恩,如果有男生要求男朋友的,也可以满足。考虑到中国的男女比例,我在女生要求女朋友这犹豫了一下。后来想想,也行。

lambda过程作为返回值的例子-分析,及一个作用域的例子

lambda过程作为返回值的例子-分析,及一个作用域的例子1. 昨天的例子的分析昨天整完lambda过程作为返回值的例子就被二猫叫走了,没来得及分析.以下是分析及另一个的例子(似乎出自SICP,记不大清了).以下混用过程和函数.: guile> (define (foo x)
: (cond ((= x 1) (lambda (y) (+ y 10)))
: ((= x 2) (lambda (y) (+ y 20)))
: (else (lambda (y) (+ y 0)))))这段代码可以理解为(define (foo x) (啥啥东西))这意味着,定义了一个过程名为foo,有一个参数.我们再看 (啥啥东西) 的里面: (cond ((= x 1) (lambda (y) (+ y 10)))
: ((= x 2) (lambda (y) (+ y 20)))
: (else (lambda (y) (+ y 0))))一个条件判断,有三种可能,每种可能都形如: ((= x 1) (lambda (y) (+ y 10)))其中 (= x 1) 是 判断条件部分,后面的 (lambda (y) (+ y 10)) 是整个表达式
的值,即foo这个过程的返回值.这个返回值是什么呢?: (lambda (y) (+ y 10))这个返回值是一个函数,匿名,有一个参数,函数体是 (+ y 10),即把这个参数
加10以后返回.整理一下.
1.foo这个函数返回值是一个函数;
2.这个作为返回值的函数,函数体是 (+ y 10).我们再测试一下.: guile> (foo 1)
: #<procedure #f (y)>意思是:foo这个函数传参数值为1,返回值是个函数,有一个参数.: guile> ((foo 1) 23)
: 33当foo的参数为1的时候,cond求值为
: ((= x 1) (lambda (y) (+ y 10)))(lambda (y) (+ y 10)) 的参数是
: guile> ((foo 1) 23)
中的23.即,把(foo 1)代换为(lambda (y) (+ y 10)),这正是对(foo 1)求值的结果.那么 ((foo 1) 23) 就成了 ((lambda (y) (+ y 10)) 23).在一个参数的函数上,传参(apply)值为23,所以值为(+ 23 10),即33.以下例子请作为练习分析.: guile> ((foo 2) 23)
: 43
: guile> ((foo 3) 23)
: 23
: guile> ((foo 2) 33)
: 532. 新的例子.2.1: guile>(define (f x y)
: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y)))即 (define (f x y) (啥啥东西) )定义函数f,有两个参数.啥啥东西是:: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y))这是什么呢?这是 ((lambda (a b) (又一个啥啥东西))
(东西1)
(东西2))这是什么意思呢?这是 (一个匿名函数 (参数1) (参数2)).其中 参数1 = 东西1; 参数2 = 东西2.请先回顾一下,然后我们继续.所以这是什么呢?这是给有两个参数的一个匿名函数传参,求值.这个匿名函数是什么呢?(lambda (a b) (又一个啥啥东西)原文是 (+ (* x (* a a)) (* y b) (* a b)).2.2所以,我们退回去一些,下式得到了解释.: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y))它的意思是"这是给有两个参数的一个匿名函数传参,求值."再往回退一点,第2节提到的式子,如下,得到了解释.: (define (f x y)
: ((lambda (a b)
: (+ (* x (* a a)) (* y b) (* a b)))
: (+ 1 (* x y))
: (- 1 y)))我们定义了一个函数名为f,两个参数,这个函数f的作用是 给两个参数的一个匿
名函数传参求值.我们测试一下.: guile>(f 1 2)
: 42.3这个例子的求值,一个关键因素是那些 x、y、a、b 的值,或者说,它们的作用域。在没有被覆盖的情况下,lambda里面的x、y就是f里面的x、y。请看下面的等价测
试。: guile> (define x 1) (define y 2) (define a 3) (define b -1)
:
: guile> (+ (* x (* a a)) (* y b) (* a b))
: 4