我在上程序设计课程的时候,会在课堂上当场编程。而我见到的大多数老师喜欢
事先备好课,用PPT或WORD以更大的字体展示程序内容。
为了能够更好地展示现场编程,我试过一些办法:尽可能缩小班级人数、不用投
影仪而是用机房的广播系统。这确实带来一些麻烦,更不用说,现场编程比事先
备课更容易出错,挂在黑板上。
那么我坚持现场编程序的原因是什么呢?
1. 过程
我要向同学演示代码由无到有的过程。
事先备好课确实有很多优点,但是当我是同学的时候,我总感觉是在看场魔术。
老师拿来个帽子,展示一番,然后,突然从里面掏出只兔子来,有毛能跑的。如
果我只是观众,哈哈,很逗。但是如果我是学魔术的同学,我就会特别想看到慢
动作地重放--从空帽子到兔子的过程。
而这个过程,如果事先备好课,通常就只是打开工程,然后编译,运行,出结果
了。结果就是老师说的那个,但这一点也不令人意外。
我想看到代码修改以后还能跑么?最好是从什么都没有,开始创建一个工程,然
后代码逐渐增多。不然,除了神奇,我什么也没有学到。
作为同学我这样想,我私下猜测,同学们也会这样想吧。所以,我想展示给同学
代码的过程,而不仅仅是代码本身。
代码本身能学习和分析的东西确实很多。我们对着早就墨迹干涸的红楼梦也能分
析出比它本身厚得多的著作来。但是,如果你站在曹雪芹的身后,越过他的肩膀
看他把红楼梦写出来,那样的话,收获该是多少呢?你能看到他删除掉了哪几个
人物,哪几个人物原本不是这样的,她们 (想想真似乎没有几个男子,所以不妨
直接用女字旁了) 的命运、性格原来是那样,历经了几次修改……
但是我们都没有那样的机会。所以,"披阅十载,增删五次",作者不得不感叹,
这样好的过程你们都没有看到。
我们要看画家作画的过程,看不到甚至要用X光去还原底下一层层都是些什么。
我们要看鲁迅或韩寒的手稿,最好是不清楚的勾勾抹抹的那种,才能了解当时当
事,都发生了些什么。
代码,也是一样的。如果我们跟踪Linux核心的所有历史版本,而不仅是分析最
近的,会得到更多的东西--为什么某个特性那么迟才添加进去;最初的有力地构
成整个系统是,是哪几个要素?
同学们看到那一大砣代码时想问的问题:你咋把它整出来的。
过程说:呶,先这样,再这样。
如果只给最后的结果,那就是:你猜呢。
2. 出错
我想让同学看到 老师也会出错,挟带的私货,更重要的是学习老师解决错误的过
程。
bug人人会造,代码能跑起来靠的一个重要功夫就是把各种bug杀掉。同学们最初
遇到bug的时候容易感到惊慌失措,并倾向于自我否定,"怎么会这样呢?"然后
就想知道,如何从"这样"恢复,最终把那一砣代码整出来并跑起来。
从bug中恢复过来,除了归类总结,文字材料以外,很重要的是让同学看到:呶,就
是这样。
没看过血的,理论学得再好,也当不了临床医生。
我甚至特意造出bug,大家一起傻眼,调吧。然后,我们一起看看调试bug的过程。
也演出了编程习惯。比如一对大括号,要先写前面后面,再添中间。这些,亲眼
所见与纸上看来,对初学者,终究有所不同。
说到这里插一个话题。颇有些研究生同学喜欢看视频学习的,我和几位学长都认
为非常不可取。理由非常多。其中一个是视频太慢,还有一个是视频往往太肤
浅。还有一个是视频可能会对初学者造成一个困扰--"为啥老师那么整能行,我同
样的操作,现象就不一样了呢?之前,我只有一步有一小点不同吧。版本不同,
那是什么?"
之所以课堂上的展示不必讨论上述话题,是因为无论展示编码过程,还是只展示
结果,然后分析,视频的弊端都是存在的。
3. 还是过程
稍微大一点的代码,都不是一次成型的。尤其,一定不是从头往后写的。
小学作文老师教我们,要有大纲。写代码也是的。可能,我们一个键也没有敲,
但是此时已胸有沟壑。这个时候老师得把这些沟壑都画图画图交代一翻,指点
好,这里我要写啥,这里我要写啥。
此外,为了保持一直可以编译、测试,而有时代码写作要持续几天的时间,中间
不可能连个厕所也不去。有时代码非常长,超出了初学者直接写作的能力。这个
时候,我们会一点点写--重要的是,在这一点点写的时候,始终保持可编译和测
试。所以,有时中间结果与最终的差别非常大。代码可能先多起来,然后又慢慢
删除掉一些,后来成了最终的样子。而不是像有的同学想的,一直由少到多。
我的一个比喻。如果你体力不济,还想游过一个大湖,我们要做的不是横渡,而
是沿着湖边,不停地隔一会上岸歇会。我们确实更慢了,更是安全更重要。
这样,最终的代码 (到达对岸)与中间的代码的差别会非常大。有时,我们很难
一下子就想像到中间发生过些什么。
你能从残局猜到那些死掉的车马炮都怎么牺牲地么?我们用过程向同学们展示这
些。
4.保证
向同学们保证,你看代码确实是活人写的,因此你也能写出来。身边活人的榜
样,比书上印好的铅字更有说服力。
想当年我跟韩老师去北京学习,他买了个魔球 (能变成棒子还能变成三角什么的)。
没见过的同学,你可以把它当成三维的七巧板。韩老师很快拼了好几个形状。
拼,也正是看图纸上的最终结果,把过程猜出来。后来到球形的时候,他放弃
了,说这个不行。然后轮到我玩。他看我拼出球来,让我拆了。拿过去没两分钟
就把球拼出来了。
所以说,身边活人的榜样,比书上印好的铅字更有说服力。我用课堂上编码的过
程向同学们展示:活人编的啊,真是活人编的。
当然,让同学展示,比让老师展示的效果更好。不过同样,一旦同学们把这位同
学当成与他们不一样的人,那就失效了。这个时候,我真的也不知道该如何告诉
同学们:你真的也行。
装睡的人,你是怎么也叫不醒的。
5. 例子
我见过周老师讲JSP的时候,就在课堂上现搭环境,现写代码。见过林老师讲
win32api编程的时候,现写代码。
6. 未来的工作
考虑过做视频发布,但是我们的视频站点目前的清晰度,是为了看大片或小片准
备的,看代码,似乎清晰度还不够。再就是p2p上传了吧。