我曾经在学校工作了十年之久,在这段时间里,我从事过软件开发,钻研新技术,做过网络管理员,也讲过课,做过科研。幸运的是,我始终近距离接触软件技术,主要以微软的技术为主,偶尔也涉及一些平行的技术,比如,与Windows对应的Linux,与COM对应的CORBA。
离开学校的环境以后,虽然身处工业界,但这学期我又有机会在清华大学计算机系讲授一门课程。姚旗智先生在清华组织了一个软件科学实验班,每年招收一个班级,微软亚洲研究院提供几门课程的支持。我讲授其中一门关于程序设计与算法的基础课程。
我始终认为,从事教学工作是一种奉献,无论是新技术的课程,还是传统的基础课程。我所处的工作岗位并没有讲授课程的要求,但我还是很愿意尽我所能做一些教课工作。我原来的计划是今年秋季到北大开一门Windows操作系统的课程(主要的动因是,2005年秋季在微软校园行活动中有同学在大会上提出来希望我能回北大讲课),很早时候已经跟主管教学的老师商量好了。但后来,由于有了清华的教学任务,我便放弃了北大的计划。
这是我第一次为本科生讲课,很基础的课程,但我付出了很多的努力,基本上每个周末都在准备讲义,有时候还会写一些小程序来配合教学。虽然辛苦,倒也其乐无穷。因为这是针对计算机科学专业的基础课程,所以,我拟定了三个目标:
(1) 算法是基础,忽视算法永远是个错误。计算机算法建立在现代计算机体系结构的基础之上,已经形成了自己特有的一套理论体系,有大量经典的算法应用于各种计算环境中。没有算法内涵的程序设计是肤浅的,所以,我的课程有相当大的比重在介绍计算机算法。
(2) 关于程序设计或编程的教学,我倾向于由底向上的方法,而不是自顶向下的方法。对于非计算机系的学生,可以使用自顶向下的教学方法,但是对于计算机系的学生,一定要让他们知道程序下面发生的事情。细节不可忽略。
(3) 要有足够的代码量。我起初要求这门课程的代码量在10,000行C/C++代码,有些人(不仅有学生,也包括我的同事和朋友们)认为这个量太大,后来我降低到5000行,实际上,最终我要求达到3,000行。我的理由是,没有足够的代码量,很多程序设计的概念是很难体会到的。大学低年级的同学大多没有编程经验,所以,我希望这成为他们的一次编程体验。(不过,有人可能会恨我 :( )
虽然都是很传统的内容,而且绝大多数内容也正是我所擅长的话题,但我仍然认真准备每一次课。所以,这也成了我自己的一次再学习和整理的过程。收获还是颇丰的。以前有一些模糊的概念和算法,这次彻底搞清楚了。我自己上大学期间,没有正式地学习过程序设计类的课程,这次算是补了一回。因此,上完这门课以后,我有一种步入科班行列的感觉。
在计算机教学方面,我的观点是以基础为重,配合适度的训练。学生可以在课外找一些训练的机会,或者自己弄一些题目来做做。课堂上只能照顾知识点,起到引领的作用而已。我的幸运在于,我始终面对最优秀的学生,所以,我更加不得马虎,毕竟,耽误好学生比耽误一般的学生更加罪过。另外,通过教学我也发现,大多数同学在计算机方面的能力和悟性都超出了我的想象,比我们当年上大学时不知强了多少倍。从长远来看,中国的计算机事业是很有希望的,毕竟中国不乏人才。