CSDN教师节感恩专题活动网址:http://subject.csdn.net/teachers%27/
感谢华工科技大学物理系 李元杰老师
当我进入大学的时候,还不知道计算机长啥样。只是听说过程序,以为和计算器也差不了太多。当我接受计算机入门教育的时候,唯一感兴趣的就是一个叫“TT”的指法输入程序,因为觉得“盲打”的确很酷,并且每次都能看到自己输入速度的提高。我曾经乐此不疲地拿着一张5寸盘奔波于各个机房,就仅仅是为了练习指法。如果没有遇到李元杰老师,也许我就是一个普通的机械工程师,会用计算机画画CAD、聊聊天、上上网。你几乎不能想象通过入门的计算机应用读本能够学会编程、操作系统,正如你不能想象一个班上30个学机械的人中竟然有了6个程序员一样。而我们的程序入门,必须归功于李老师的影响,而李老师是教物理的。
现在回想起来,李老师懂的程序或者计算机知识也许并不太多。他最习惯用的一句话似乎是:“程序嘛,很简单。你把公式改一改,参数变一变,这个东西就做出来了嘛。”我们的任务很简单:编写程序用图形来模拟物理现象的效果。比如:弹簧振子的运动、小球弹性碰撞、木块在斜坡上的滑动模拟等等。但是约束条件很多:大一的我们没学过C语言,也没有计算机,甚至也不懂微积分。老师没有投影仪,只有幻灯片加黑板。这几乎就是Mission Impossible嘛。但是,绝大部分的人都做出来了。
秘诀在哪里?细细想来,可以归结在如下三个方面:
1.专注逻辑、简化外部环境。
你可以试着给一个不懂程序的人来讲解一下:怎么用计算机来绘图。如果你是给一百个人同时讲呢?你可以会想,要先讲讲GDI,还要讲讲程序,哦,对了还要讲讲变量是怎么回事。不仅如此,还要保证这一百人能够上机调试成功,看到结果呢?哈,这几乎是不可能完成的任务。
但是,李老师教的方法并不是这样的。
简化,简到不能再简。他给我们提供一份代码模板,main函数写好了,输出点或者画线的函数告诉你了,如何清屏的函数也告诉你了。我们要做的,就是把一个数学公式,变成一段代码。做一次写一行代码,做多次,就得用for。编译错?哦,这种情况下编译错就基本只有变量没有定义了。怎么变,李老师用黑板讲一遍,把公式中的所有变量都定义为程序中的变量。然后呢? 没有然后了。这样就能够比较顺利地开始专注于逻辑了(也许当时要更痛苦一些,但是,有了第一个试验成功者,然后就有了一堆成功者)。现在想来,这种化繁为简的能力相当有效。每个人都能有成就感,也能立竿见影地看到效果。尤其是机房的管理员都来啧啧称奇的时候,这种感觉相当美妙。
2.持续挑战。
把一个程序写一百遍可能还是不能真正理解,但是写一百个不同的程序可能就会有所突破。一个学期,一本物理课本上有好多不同的物理现象。正是李老师并不是拿一两个物理现象玩票,而是实实在在地想用这种方法来增进我们的理解。这样,我们就有了好多的机会来进行不断地训练。当用自己的程序来试验出一个个不同的物理公式的时候,不仅仅增强了编写代码的能力,更增强了对物理公式的理解。这种互通的方式,相当有效。这种持续的成就感,也促使我拿着几个软盘,泡遍了各个机房。
3.开拓思维,破除神秘感。
查文献、写论文、投稿、答辩。有在大一就干过这样事情的吗?何其幸运,李老师就给了我们这样的机会。选定一个简单的方向,或者说,找好一篇文章,看懂。看看中间哪些有可能提高,然后写程序验证,最后写成论文。不用参加考试,论文和你的程序来见真功。一切都由你自己说了算。有结果出来就行。对,研究生干的就是这一套,我们提前干了。并且是在没有太大的压力下的情况下干了,当然为了平衡,是多人一个小组的。这样既增加了团队协作,又降低了项目的风险。
也许李老师并没有给我个人太多特别的辅导。但是,当我了解和思考的越多,我越来越感觉到从李老师身上学会的这套方法的重要性。
这种方法不仅仅带领我进入了计算机编程的大门,在我后续的学习过程中,也产生了巨大的影响。从参加“程序员”考试开始,到自己找来计算机系的书啃,自己开始写一些程序,不断地提高,最终也学到了更多的计算机知识。
回到《编程之美》这本书上,这套理论也能说的过去。
简化:找一个最简单的解决方案。
持续挑战:继续前进,找出更好的方法。
开拓:突破条件的限制,来挑战题目各种各样的变化吧!
“献给老师,我的编程之路”系列文章
邹欣:回忆编程路上的启蒙老师
刘铁锋:物理老师的程序入门课
莫瑜:编程,从简单的开始动手
胡睿:感谢清华大学计算机系的朱仲涛老师
梁举:恩师的鼓励,从数学到计算机
李东:我的编程起步
陈远:兴趣是永远的老师
张晓:我与程序