|
回复:信息技术获奖论文选
关于程序设计教学
──论中小学计算机课程设计之二
吕品
[内容提要]:文章首先澄清了几个易混淆的概念:计算机语言和程序设计语言;学习程序设计和学习程序设计语言。然后讨论了几个目前争论较大的问题:
1、程序设计是中学生计算机课程的基本内容吗?
2、必须“尽快终止”程序设计的教学吗?
最后提出了作者的看法:“中学计算机课程要以基础性知识和技能性操作为主,程序设计是更高层次的学习内容” 。在时间和学生的接受水平允许的情况下应该并尽可能早地在计算机课中安排一些程序设计内容,但内容和深度要根据不同年龄的学生认知特点做精心的安排。
当前关于中小学计算机课程设置的一个争论焦点是计算机课程中要不要有“程序设计”的内容,如果有,应该要求到什么程度?下面我们专门来讨论这个问题。
一、澄清几个概念
1. 计算机语言≠程序设计语言
在一些教师的脑中和普及计算机知识的书中,常把这两个概念混为一谈。例如一本全国范围发行的计算机普及读物中写道:“为了和电脑交流信息,也要通过语言,……,由于电脑语言就是用来告诉电脑按次序干什么事情的,所以电脑语言又称为程序设计语言。”可见这个问题不是个别人的问题,而是带有普遍性的问题,必须加以澄清。
什么是计算机语言?“①狭义的指计算机可以执行的机器语言。②广义的指一切用于人与计算机通讯的语言。包括程序设计语言,各种专用的或通用的命令语言、查询语言、定义语言等。”[1]现在一般采用后一种说法。
什么是程序设计语言?“泛指一切用于书写计算机程序的语言,包括汇编语言、机器语言,以及一般称为高级语言的完全符号形式的独立于具体计算机的语言。”[1]
上面两段引言很清楚地说明了计算机语言与程序设计语言之间的区别和联系。计算机语言是外延较大的概念,程序设计语言只是计算机语言下的一个属概念。“我们和计算机打交道,就要用计算机语言”这句话是对的,但用计算机语言与计算机打交道,不一定要用程序设计语言。我们用DOS命令,就是在用计算机语言棗命令语言;我们用鼠标单击某一图标,让计算机执行某一操作也是一种计算机语言。但它们都不是程序设计语言。当然这些命令语言,最后都要翻译成机器语言去执行,但这是计算机内部运行机制的问题,绝不能以此为理由把这两个概念混为一谈(否则也不用区分机器语言、汇编语言和高级语言了,因为它们最终也都要翻译成机器语言)。
弄清了这两个概念的不同,一些说法的正确与否也就不言自明了。例如有人说:“人们交流要通过语言,人要和计算机打交道,也要通过语言,所以要使用计算机必须学习程序设计语言。”前半句话指的是计算机语言,而后半句话指的是程序设计语言,由于“偷换”了概念,推理不合逻辑,结论也就不可靠了。当然说这句话的人,我相信绝不是有意的诡辩,而是由于概念的混乱,自己欺骗了自己。 我们使用计算机,和计算机打交道,一定要学习计算机语言。我们学习DOS命令,学习Windows操作,就是学习管理计算机资源的语言。我们学习某种应用软件的操作,也是学习计算机语言。总之,我们在学习计算机知识的过程中一直在学习计算机语言,一直是通过计算机语言和计算机打交道,但这不是程序设计语言。也就是说,学习使用计算机,一定要学习计算机语言,但不一定要学习程序设计语言。
2. 学习程序设计≠学习程序设计语言
在讨论中另一个模糊的概念是把学习程序设计和学习程序设计语言混为一谈。
我国著名的科学家马希文教授写道:“用一串符号把一个计算机过程描述出来,就是一个程序。……要制定一些严格的规则,以确定什么样的符号表示什么样的程序。这些规则的总和就叫做一种语言。”[2]
马希文教授又接着写道:“一个完整的程序设计过程大体有以下几个步骤:(1)要把程序的功能描述清楚。……(2)用程序语言把预定的计算方案书写出来。这是程序设计中最有特色的部分。简单的计算可以直觉地进行程序设计。复杂的计算往往可以由简单的程序按照各种模式搭配而成。然而,却没有一种机械的办法可生成各种程序,换句话说,程序的设计是一件具有创造性的工作。(3)证明程序的正确性。……(4)在实际工作中,试算和修正是不可缺少的。” [2]
从上面两段引言中可以看出,语言是“严格的…规则总和”,我们学习一种程序设计语言,就是学习这种语言的规则,即学习语法、语义、程序及其他一些规定。这里涉及的是严格的定义,严格的书写方法,没有任何的创造性可言(一个字母一个标点都不能错)。而学习程序设计是学习“设计过程”,内容主要是描述功能、书写方案、证明正确性和试算和修正。程序设计“是一件具有创造性的工作”,两者有着根本性的区别。 当然学习程序设计一般应选用一种语言作为工具,学程序设计就必须学程序语言,学习时两者是不可能绝然分开的。但问题是各自的地位是什么?以哪个作为重点?我们中小学的教学目标是什么?是让学生掌握一种程序语言呢?还是把程序语言作为一种载体,一种学习程序设计的工具,而把教学目标和重点落在程序设计的思想方法上?这就是当前计算机教学中的带根本性的分歧点。目前很多计算机教师在进行程序设计教学时,往往把很大的精力,甚至是主要精力放在语法和语义上,他们不自觉地把程序设计的课上成了“程序语言”课,违背了我们的教学目标,原因就是没有真正区别清楚程序设计和程序语言这两者之间的不同。
二、程序设计是中学生计算机课程的基本内容吗?
1.一部分人明确地提出计算机课中必须有程序设计内容,理由是“它是计算机学科的核心内容”。这里涉及到两个问题,一是程序设计是否是核心内容;二是中学计算机课程是否应该按计算机学科专业要求来设置内容。
对于第一个问题,在大学计算机本科教学计划《计算机教学计划1993》中列出了计算机学科主科目有九项,而“程序设计”仅是其中一项[3]。为什么在9项中只选择了“程序设计”这一科目为核心科目?为什么不选其他科目?理论上和实践上的根据是什么?
对于第二个问题早有定论,中学是基础教育不是专业教育,课程应该主要根据社会的需要来设置,同时考虑学生的接受能力和学科本身的需要。提出上述看法的人,不自觉地受到了“学科中心论”的影响,其理论基础就是错误的,因此论点也就不能成立。
2.有人认为,选“程序设计”内容是因为它可以培养学生的“分析问题和解决问题的能力”。这个论点在一定条件下说是正确的。我国十几年来在国内外计算机程序设计竞赛中,涌现出大批的优秀人才,这些学生的分析问题和解决问题的能力,通过程序设计锻炼确实有不同程度的提高,他们进入大学后的表现也证明了这点。 但研究任何问题不能脱离实际抽象地论证。我们这里谈的不是竞赛,不是少数优秀学生的课外活动,而是全体学生都要学习的计算机课程,即素质教育。目前我国计算机课一般在高一开设,总共只有60-70学时。在这几十学时内要学习计算机基本知识、基本操作,还要学习应用软件的使用以及操作系统的初步知识。这样留给学习程序设计的时间至多只有30多学时。在这样少的课时内,能学多少程序设计的内容?全体学生能达到什么水平?分析问题和解决问题的能力能有多大提高?根据笔者十几年的教学实践,至少需要40以上学时大部分学生才能学会初步BASIC程序设计,80以上学时才能进行真正的程序设计(算法设计),这时候才能真正谈及能力的提高。
另外,我们这里讨论的不是一些小问题,而是涉及到国家政策的制定,关系到千百万学生的大问题。因此结论必须有比较可靠的理论和实践根据,只凭个人直觉和的经验是不够的。提出这一结论的人能拿出什么比较可靠的科学的依据证明这一点?目前我们还没有看到。而国外一些实验却对这一假设作出了否定性的结论。美国的玛霞·林和她的同事在1985年的一份报告中表明,“在普通学校,学生在学习程序设计语言时,一般能力是重要的。能力低的组,最后程序设计语言成绩评定也低。能力高的组,最后成绩也高。”[4]美国银行街的柯兰德等人的报告也指出:“要成为程序设计的专家,至少要有500小时以上的上机时间,而大部分只有10-12台微机用于程序设计课的学校,上机时间很少,即使一些学生家里有计算机,对他们最后程序设计能力的测量,效果并不显著。”[4]虽然我国与美国相比有很多特殊性,美国的结论不能照搬到我国来,但还是有很大参考价值的。 因此,在较短时间内的程序设计课,能否使大部分学生的分析问题和解决问题的能力有所提高,仍是需要研究的课题。
3.有人提出学生学习BASIC程序设计目的是为了使他们懂得“计算机能做什么,是怎样工作的?”
这句话如果是在70年代或80年代初讲的,有一定的道理,因为那时计算机软件还很不丰富,使用计算机解决问题,大多数情况下还必须使用者自己编程。并且在编程时必须了解计算机的软硬件结构和工作过程。但在计算机的软、硬件的功能、数量和质量极大发展的90年代,还拿来作为学习程序设计的主要理由,似乎有些过时了。目前在简单的BASIC程序设计和具有强大功能的应用软件之间已产生了一道鸿沟,两者之间差距非常大,要通过简单的BASIC程序设计学习来了解现代计算机系统的功能,犹如“瞎子摸象”。在应用软件中表现出来的一些计算机能力,在简单的BASIC程序设计中很难得到。例如文字处理软件中的块操作和排版功能,超文本链接功能,在简单的程序设计学习中就很难体会到。反之,通过应用软件学习所能了解的计算机功能却大大超过简单程序设计中的功能。例如应用软件中的打印功能已大大超过BASIC中PRINT(打印)语句所能了解到的功能;输入功能也大大超过INPUT语句所能提供的信息。
马希文教授也早就指出:“我们研究程序设计时,可以选用一种适当的语言。这样,我们就可以只研究用语言书写的程序,而不去过问这种程序在具体计算机上到底是怎样实现的。从这个意义上说,语言就是一种抽象的计算机。”[2]也就是说学习程序设计,特别是高级语言的程序设计,了解的是抽象的计算机。什么是“抽象”?抽象就是“从许多事物中,舍弃个别的、非本质的属性,抽出共同的、本质的属性。程序设计中的抽象,马希文教授在上面这段话中已说得很明白,即“只研究用语言书写的程序,而不去过问这种程序在具体计算机上到底是怎样实现的。”。既然舍弃了“在具体计算机上是怎样实现的”内容,怎么能通过程序设计来懂得“计算机能做什么,是怎样工作的”呢?
当然上述说法在一定意义上还是有可取之处。一个计算机系统可以被看作是由硬件和软件按层次方式构成的,每层表示一组功能和一个接口。每一层都在一定深度和范围反映计算机系统的功能和工作状况[5]。学生们学习应用软件的知识和操作只是从最高层面上了解计算机的功能和工作状况。而学习程序设计则是从更深一层面,即语言处理层面来了解计算机的功能和工作状况。因此我认为如果上述说法改为“学习程序设计是从更深的层面,从语言处理的层面上了解计算机能做什么,是怎样工作的。”就无可非议了。
三、必须“尽快终止”程序设计的教学吗?
1997年国家教委收到了两封信件,一是联合国(UNDP/CPR)首席技术顾问大卫·艾伦写的;另一封是纽约市立大学约克学院传播技术级电脑中心主任黄哲操写的。信中他们对我国的计算机教育事业提出了很多好的建议,但也以美国为例对我们发出了警告:“尽快终止中小学作为普遍的教学要求的计算机语言课”“如不彻底改变方向,一切证据表明中国中小学计算机教学将面临最大的灾难。”
对于这样严厉的警告,我们应如何看待?当然应当认真地研究他们的建议和批评,吸取其中有用之处。但我认为,最了解中国的是我们自己,中国和美国相比较,在经济发展上,在文化传统上有很大的差别。在美国是好的经验,在中国不一定是好的;在美国行不通的、失败的办法,在中国可能会成功。我们已经有了十几年的计算机教育经验,我们必须根据我国的国情,来决定我们的政策。
我国的一些教师也有以上类似的看法,他们认为:“计算机学科没有必要学习程序设计,只需要学习计算机操作方法和一些社会上流行的软件使用就可以了。”而且还提出了“一些学生在学校学习了程序设计,到社会上完全无用,仍需从头学起”的说法。 由于计算机信息技术的发展,大量的软件涌现,计算机处理各种信息的速度和功能大大提高,一般的应用都有现成的软件,不必要自己编程。因此上面看法有其正确的一面。过去的计算机课教学,由于各种原因以BASIC语言教学为主,忽视和根本没有实际操作和应用软件的使用。不论是中学还是小学,不论是普通中学还是职业高中,无一区别都是一个模式。因此在一定程度上造成了学非所用的结果,特别是对准备毕业后立即就业的那部分学生。
但上述说法从基本点上、从理论上说是不正确的。首先,这种说法指导思想是受了“社会中心”论的影响,即当前社会上需要什么就学什么,是一种急功近利、实用主义的做法。
我们不反对从社会需要出发来考虑课程的设置,不但不反对,而且要提倡。我们也不反对学习一些实用的应用软件,而且赞同在新教材中增加一些应用软件的内容(我个人认为,在初中的计算机教材中,实用部分可以占全部内容的 70%到 80%)。但在这里,我们和持这些观点的人有一个根本上和原则上的区别:我们不但考虑社会当前的需要,而且更注重社会长远的需要。我们不但着眼于学生当前学习和就业的需要,更注重学生将来的学习以及终生教育的需要。出发点不同,在内容的选择上,在教材的安排上,以及在教法上,就会有根本性的区别。 上述观点第二个错误是混淆了不同教育的性质。普通中小学教育是素质教育,它与职业教育不同。上述观点把素质教育与就业教育等同起来了。
就是职业教育,上述观点也是不完全正确的。我们教给学生的不仅仅是知识和技能,而更重要的应该是能力。这就不能是“知其然,而不知其所以然”。不懂得汽车的基本原理也能开车,但绝不可能成为一名优秀的驾驶员。同样道理,如果只会一些具体应用软件的使用,不懂得有关的基本原理和知识,就不可能很好地使用计算机,成为一名优秀的计算机应用人员。我很赞同下面一段很有哲理性的话:“必须坚持技术基础教育和实用技术教育兼顾,... 如果不进行技术基础教育,就缺乏后劲,难以掌握高技术;如果不学习当地的实用技术,就不易起步,难以把最基本的科学技术运用于生产,把可能的生产力转化为现实的生产力。……按照布鲁纳的知识迁移理论, 扎实的技术基础教育,有利于学生去掌握实用技术,起到举一反三作用;良好的实用技术教育,有利于扩展和提高技术基础教育,起到触类旁通的作用。”[6]而且将来的社会职业的变动将是很频繁的,一生中职业变动四五种是常事。这就更要求我们的教育从学生的长远着想,注意基础知识的教育,注意能力的培养。
四、程序设计方法尽可能早学习
我认为计算机课程还是应该安排一些初步的程序设计的内容,而且越早越好。为什么要安排一些初步的程序设计内容?我的理由与上述的几种不同。
第一个理由是,计算机学科有于其他学科很不同的特点。关于这一点,当代著名的计算机科学家唐·依·克努特(D.E.Knuth)在他的巨著《计算机程序设计技巧》中有很精辟的论述。他写道:“能把问题的解法表达成计算机能够‘理解’的一种明显形式(这些机器没有普通的感觉;它还不会‘思考’。但它能准确地不折不扣地去做让它做的事情。当一个人初次试图使用一台计算机时,这是最难以掌握的概念)。”[7]。但是这个“最难以掌握的概念”又是真正学会使用计算机所不可缺少的。怎样来掌握它呢?经验告诉我们,学会计算机的初步操作,学习一些应用软件的使用,能初步了解这个概念。但是要真正理解和掌握这个概念,学习程序设计是一个较好的途径。程序设计要建立数学模型,要进行算法设计,这些就是克努特所说的“把问题的解法表达成计算机能够‘理解’的一种明显形式”;在用计算机语言进行编程时,就要了解有哪些语句,它们的功能的什么。这些实际上就是了解计算机“能准确地不折不扣地去做让它做的事情”。
第二个理由前面已说及,即学生们学习应用软件知识和操作只是从最高层面上了解计算机的功能和工作状况。而学习程序设计则是从更深一层面,即语言处理层面来了解计算机的功能和工作状况。
第三个理由是程序设计虽然不是计算机科学核心课程,但它是一个基础课程。计算机学科的其它课程,如操作系统、数据结构等,除学习一些理论外,很重要一项就是在计算机上实验,这些实验大部分要编程序,也就是要会用一种计算机程序设计语言编制相应的程序。所以大学计算机专业都把学习一种程序设计语言作为基础课程之一。如果在中学就给学生打下这方面的基础,就有利于学生今后的继续学习。那些在中学已学会了程序设计的大学生回来的反映,很清楚地证明了这一点,我们的基础教育任务之一是为高一级学校培养后备力量,也为学生将来进一步深造打下良好的基础。在中小学打下程序设计的基础,有利于他们进入大学的深造和就业以后的继续教育。
为什么要“尽可能早学习”呢?在计算机普及工作中,很多教师都有这样一种体会,只要内容和教法适当,程序设计入门,初中学生比高中学生容易,甚至高年级小学生比初中学生容易,最困难的是成年人(这里不是针对个别人,而是大多数人来谈的,即从统计的角度来谈的)。这种“怪”现象如何解释呢?
根据现代认知心理学的理论,人的头脑中的知识,不是杂乱无章地或简单地存储着的,而是有一定的结构,即认知结构。学习就是科学的逻辑结构和人的头脑中的认知结构之间的矛盾和转化。“当儿童认识一种新事物时,总是先用原有的图式(即认知结构)去同化(即把新知识纳入原有的认知结构中),如获成功,便得到认识上的平衡,否则就进行异化,调整原有图式或创造新图式,直至取得新的平衡为止”[8]。
程序设计是一种新的知识结构,它与其他学科的结构,如数学知识结构、物理知识结构等,有很大的区别。唐·依·克努特的论述中提到“这是最难以掌握的概念”,为什么“最难以掌握”?就是因为这种知识结构与以往人们学习的知识结构有很大的不同。
因此当一个初学者学习程序设计时,在把这种新的知识结构纳入自己原有的认知体系中(同化)时,由于结构差别太大,就会遇到原有结构的“顽强抵抗”,必须创建新的认知结构。而在这种新的认知结构的创建过程中,如果原有的认知结构越牢固,创立就越困难。一般地说,年龄越大认知结构就越牢固,越不容易改变。这就造成新的结构建立成人比高中生困难,高中学生比初中学生困难的现象,而小学生头脑像一张白纸,最容易接受新的东西。
从上面的分析,可以得出这样一个结论:尽早地学习“程序设计”这种知识,就会减少进一步学习的障碍。当然这种“程序设计”知识结构对于不同年龄的学生,它的内容多少,它的复杂程度的高低应该是不同的,应该有层次、有区别的。
1994年,联合国教科文组织(UNESCO)委托国际信息处理学会(IFIP),编写了指导世界各国计算机课程设置的文件《中学信息学课程》。其中有一段话,对于我们每个从事计算机教育的人会很有启发。现摘录如下:
“这里所指的程序设计非技术性的程序设计,更确切地说应该是把‘你自己做的事情’转变成‘别人能做的事情’。这就要求能详尽地描述完成任务的过程,以便其他的人或其他的设备能准确地重复这一项工作。
这种完成任务的‘自动化’就被称作程序设计,有时也称作算法程序设计──信息学的一个重要特点。当使用复杂或先进的软件工具(如电子表格、数据库管理系统、操作系统,甚至文字处理系统)时,用算法的思想来思考或解决问题是必要的。
程序设计是帮助学生获得解决问题经验的一种快速、明确而适合的途径,教学的目标不是培养‘小型的程序员’,而是使得学生能用程序设计的方式进行思考。本着这个思想,在学习过程中只要掌握‘必须了解’的,至于程序语言中的独有的特点和假设就不是很重要了。教师必须强调解决问题的方法,程序设计只是实现这个目的的一种手段。”[9]
儿童心理学中有一个“关键年龄”的说法,即在儿童发展的过程中,某一种技能或能力在某一特定时期最易获得,最易形成,如果错过这个时期,效果就会差些。例如2-3岁是学习口头语言的关键年龄,4-5岁是开始学习书面言语的关键年龄等。[10]那么,儿童青少年学习“程序设计”的关键年龄是在哪个时期?这是值得心理学家和计算机教育专家研究的课题。
五、初步结论
在中小学计算机课程中究竟要不要安排“程序设计”的内容?我完全赞同《指导纲要》的提法:“中学计算机课程要以基础性知识和技能性操作为主,程序设计是更高层次的学习内容” [11]。在时间和学生的接受水平允许的情况下应该并尽可能早地在计算机课中安排一些程序设计内容,但内容和深度要根据不同年龄的学生认知特点做精心的安排。
我个人建议,在条件允许的情况下,小学高年级可以学一些LOGO语言的程序设计,其主要内容是“海龟绘图”,通过LOGO学习一些几何知识,而在程序设计上只起到“熏陶”的作用,即起一个潜移默化的作用。初中阶段可以安排一些介绍什么是程序、什么是程序设计的简单的内容,只要求学生能理解一些简单的程序就可以了,不必要求能编程。高中阶段可以较系统地学习一些程序设计知识,了解程序设计过程,能编简单的程序,但在算法设计上只要求了解就可以了。另一方面可以大力开展以算法设计为主的课外活动和选修课,给那些程序设计感兴趣的学生提供一个良好的发展环境。
|
|