关于编程教材的一些想法

刚才看了一个python的教材,有些想法,小结一下。

首先教材的阅读对象可分成两种:一种是没有什么编程经验,或者一门语言也没学过的菜鸟,一种是已经学过一门或多门语言,有一定编程经验的人。对这两种人,显然教材的写法应该是不一样的。这里重点谈面向初学者的教材写法。

我已经有了一定的编程经验,所以对菜鸟的学习心理缺乏真切的体验。不过毕竟自己也曾经是菜鸟,虽然事隔多年,但有些感觉仍然有些印象。我觉得菜鸟容易碰到的问题,一是容易产生畏难情绪,即使鼓起勇气看一点教材,但不容易坚持下来,二是容易陷入细节的汪洋大海里,搞得似懂非懂,一头雾水,在理解教材的文字意思上花过多时间。

所以面向初学者的教材,首先要写得简明。书要薄,把基本的东西讲清楚,概念不宜多。不要怕内容介绍得不全,恰恰相反,要避免过分面面俱到,书太厚重,让人一看就怯阵。有一定编程经验的人大概会同意,一开始,没必要(也难以达到)掌握所有细节。比如学c#,作为初学者,我觉得掌握赋值,条件,循环三大语句,面向对象的常用知识(类,方法,属性(property),事件,多态),以及winform程序的大致框架就差不多了,很多很多细节,比如web服务(包括asmx服务,wcf,以及rest服务),反射,异步,等等,面向初学者的教材都没必要讲。

有些教材,概念讲得很细,似乎希望从一开始就培养初学者对概念的正确理解和养成良好的编程习惯。但其实这些应该在一定的编程实践也就是感性认识的基础上建立起来,理解才比较深刻。作为面向初学者的教材,这些内容占用篇幅过多,反而会造成初学者的阅读困难,去费劲理解概念的“深意”,却因缺乏感性认识而似懂非懂,一知半解,实际应用也只会机械照搬。记得有人曾批评谭浩强的教材,变量多用单个字母,不符合工程实践。这是有道理的,但作为面向初学者的教材,这不是大问题。比起概念的精确和符合工程实际来,更重要的是尽快引导初学者动手编程实践。

其次,一定要让初学者明白,编程最重要的就是实践。只有自己动手编程,发现问题,并解决问题,才能理解深刻,真正形成能力,而不是只停留在书本知识。

一般的教材,多数只提供一些纯粹为了理解概念而设计的例程和练习。固然,对于一门语言也没学过的菜鸟来说,这样的练习是有必要的。但光是这样又是远远不够的。因为做这样的练习,对于提高真正的编程能力,作用有限。有些教材,提供了一些稍大的例程,但只对程序的基本结构和功能做了一些介绍和分析。这些程序仅仅起到示范的作用,而教材缺乏指导初学者如何去学习这些程序以提高编程能力。

提高编程能力的过程中,我认为最重要的是这几项能力:看懂别人写的程序的能力,查资料的能力,调试程序的能力,以及模仿能力。而一般的编程教材,恰恰欠缺的就是这几方面的指导。

如何看懂别人写的程序?当然不同类型的程序有不同的读法,但大致可分为静态为主和动态为主。前者就是仔细阅读程序,适当做些调试,后者就是直接运行程序,直观地体会程序的行为,并搜寻程序,找到行为背后的程序。这里,最常用的方法就是利用文本编辑器的全局搜寻功能,查找关键字。比如运行windows桌面程序,为了找到某个按钮背后的代码,就用文本编辑器全局搜寻按钮的标签,然后再找到真正的执行代码。(当然,某些语言如ActionScript(Flash)和Salesforce,编辑器的全局搜寻功能比较弱,查找起来比较费事。)作为初学者,可以主要使用动态的方法。作为教材,可以提供一个稍大的程序,然后指导初学者通过搜寻一步步找到行为和背后的程序,逐步看懂程序。

查资料方面的指导简单一些。因为现在搜索引擎足够强大,基本上能满足查资料的需要,只是在关键词的选择上可以作一些指导。

调试程序的能力无疑很重要。以前我还是初学者时,听到过一种说法:如果编程序需要普通程序员的能力的话,那么调试程序就需要高级程序员的水平。这种说法虽不全面,但也说明了调试的重要性。初学者(严格地说有编程经验的人也会碰到)经常碰到这样的问题:把书上的程序看似原封不动地输入,一运行却出错,不知道哪里有问题。我当初学java时,第一个hello world程序就调不通,花了很多时间,才搞明白原来是因为没有把我写的程序路径加入classpath。而几乎没有一本教材把这个问题说清楚的。作为面向初学者的教材,要特别重视对调试能力的指导,不只是介绍一下几个工具的基本用法,而是通过实例来介绍完整的调试过程,容易碰到的问题和解决思路,比如,分步调试的思想,通过log理解程序运行路径等等。虽然调试能力和编程经验有关,但是提供一些这方面的指导,可以让初学者少走些弯路。调试大体似乎可分两种,一种是通过设断点,运行程序,动态跟踪,一种是通过各种log来理解程序在各个状态时的变量值和执行路径。log更需要经验,前一种方法更适合初学者(web程序动态跟踪比较困难,所以我觉得初学者最好学单机的桌面程序)。当然,这需要工具的支持。所以我建议初学者选择C#这样的语言,因为ide的功能很强大,提供了方便的调试功能。

总之,面向初学者的教材,知识的介绍要简明,不面面俱到,重点要引导初学者动手实践,指导他们提高学习编程的能力。

而对于有编程经验的人来说,教材的主要作用是帮助他们看懂程序,这个目的达到了,教材的任务也完成了。接下来我认为比较好的方法就是学习别人写的程序,在看懂的基础上尝试修改和增加功能。更进一步,在模仿的基础上独立开发程序。所以,对于有编程经验的人来说,教材不管好坏,大体都能用。写得比较简明的教材,主要是了解程序的大体结构和基本语法。比较厚重的教材,则主要是作为参考手册来查。细节主要还是在阅读别人写的程序的过程中,通过搜索引擎来查。当然有些知识点,在搜索引擎查询时,关键词不太好选。好的教材如果对这些知识点介绍得比较详细,这方面查考起来比搜索引擎方便。

总之,对于有编程经验的人来说,教材如何编,影响不大。当然也不可一概而论。这里说的,主要是指学习同类型的语言。比如最常见的所谓命令式语言如Java, C#,python等,javascript勉强也可算,学会了一种,再学别的,差别不太大。而如果学习另一种不同类型的语言,比如Prolog,Erlang,因为要换思路,换脑子,教材的好坏还是有影响的。

posted @ 2020-08-20 10:15  平静寄居者  阅读(178)  评论(0编辑  收藏  举报