论文:试论计算学科抽象第一的基本教育原理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

试论计算学科抽象第一的基本教育原理
蒋宗礼
北京工业大学计算机学院
摘要:数据的计算机表示和程序的非物理特性决定了计算机学科的基本教育原理是抽象第一。

加强基础原理的教育,通过建立与课程体系有机结合的实验教学体系促进学生对基本原理的掌握,并强化对学生实践能力的培养;同时借助于抽象表示,进一步强化学生问题求解的系统观念,培养他们的系统能力。

基本原理的教育和本科教育的基础性相吻合,它同时决定了本科教育必须是面向未来的,绝对不能是产品教育。

所以,要力戒浮躁,在强调基础的同时,将优秀的产品作为实例、作为实验支撑环境的一部分,并通过安排适当的讲座、选修课、第二课堂的科技活动去实现对一些新技术的跟踪,加上基本原理的教育,以应对学科的飞速发展。

关键字:本科教育;计算机;抽象第一;系统求解;实践教学
大约从20世纪80年代开始,随着我国现代化建设的提速,计算机、通信、自动控制等处于高技术领域关键地位的学科专业成为多年来广大学生争相报考的热门专业,这些专业吸纳了超乎寻常比例的优秀学子。

计算机学科专业的规模的成倍增长,更是吸引了大批优秀的学生。

大批优秀人才的进入,一方面,推动了我国计算机学科/专业的快速发展,同时也大大推进了我国计算机学科/专业教育的发展。

一个学科/专业将一代人中的超乎寻常的大比例优秀学子吸引过来之后,无形之中,其教育除了担负有本学科/专业发展所需要的人才的培养任务之外,较其它学科/专业来说,它还需要更多地考虑到为民族和国家发展负责的重任,因此,计算机学科专业需要一种更大气的学科教育。

这给我国的计算机教育界提出了较大的挑战。

为了更好地承担起历史赋予我们的使命,我们必须深入地研究学科和学科所需要的教育,通过对教育中的一些关键问题的讨论,我们的工作会变得更为有效。

1.计算学科的基本教育原理是抽象第一
计算机学科的人都有这样的体会,当我们第一次学习用一种(高级程序设计)语言编写第一个程序时,我们会感到莫大的困难,当一个老师教学生学写第一个程序时,也感到困难重重。

而且这种困难要比我们去做一个基本的物理、化学实验,去学习安装一个收音机要大得多。

其原因是程序的非物理特性,这使得计算机的初学者很难建立起计算机系统的有效模型,而且在这个模型没有建立起来之前,进行程序设计是很困难的。

这里的程序包括微程序在内的硬件系统的一些执行过程。

这种现象在其它学科是不存在的。

例如,轮子、火箭是看得见、摸得到的,其发动机的运转、动力的传递也是清晰的。

直观性给了人们获取感性认识的基础,这是符合人类认识的第一阶段的基本要求的。

而计算机系统的运行却是看不见的,由于很难获得感性认识,所以理性认识就很难建立起来。

我们有这样的经验,要想构造一个计算机(软件、硬件)系统,这个系统首先需要在设计者的头脑中运行起来。

而且系统的复杂性还在于要求我们让这个系统在不同的抽象级别上运行,同时还需要让它的子系统分别运行。

由于这些运行是在头脑中进行的,所以,高度的抽象思维和严密的逻辑思维是本学科特别强调的思维能力。

作者将它们合在一起称为计算机思维能力,或者计算思维能力。

由于计算机处理问题之前,我们需要首先对问题(实际系统)进行抽象和描述,这些抽象和描述呈现出来的是一系列的符号,而且问题的变换(系统的状态的变化)规则等也是用符号表现出来的,所以,本学科的基本描述手段是“形式化”,其基本思维方式是“抽象”和“逻辑”。

从而使得“抽象第一”成为本学科教育的最基本的原理。

这正好与程序的非物理特性吻合。

因此,问题的抽象,模型化是学生必须跨过的一关。

许多教师都反映学生初学程序设计是对高级语言中“变量”这一概念很难理解,实际上
也是抽象和模型化的困难。

形式化既是学科的基本描述手段,又是导致本学科将“抽象”和“逻辑”作为其基本思维方式方法的根本原因,同时它又是进行“抽象”和“逻辑”思维的基础。

鉴于“抽象”和“逻辑”思维与本学科的紧密关联和在教育指导思想上的特殊意义,作者将它们合在一起,称为“计算思维”,也就是适应计算机处理问题的思维方式方法,所以,也可以叫做“计算机思维”。

2.重视基本原理的教育
“抽象第一”的基本教育原理首先要求重视基本原理的教育,并通过这些基本原理的教育,努力构建计算(机)模型,是十分重要的。

这里首先讨论基本原理的内容。

学科形态刻画出来的计算学科理、工兼有的特征,表现出它的科学性和工程性。

面对科学性,我们要强调学科基本原理的教育。

基本原理主要包含两个方面,第一部分是适当的知识体系。

它们由本学科最基本的知识组成。

这些知识体系目前已经有了比较全面科学的描述。

最典型的是ACM/IEEE给出的CC2001的CS、CE、SE、IS、IT的描述(目前它正在演化成CC2004)。

另外,我国的计算机教育工作者根据我国计算机科学与技术专业教育的现状及其学科发展的要求,在《中国计算机科学与技术学科教程》(简称为CCC2002)中,刻画出计算机科学与技术专业(简记为CST)的知识结构及其核心课程设计。

特别值得注意的是,除了知识领域、知识单元、知识点外,我们必须根据自己的培养目标定位,去研究和调整核心知识点,特别是关注和调整这些核心知识点的核心小时数,研究这些知识的那种形态的内容是自己精力的聚焦对象。

我们可以将知识领域、知识单元、知识点看成知识体系的一种比较模糊的描述。

在CC2004中,ACM/IEEE的教育专家们通过增加新的纬度,设计出了图1所示的知识要求的二维表示形式,并按照这种形式描述了CS、CE、SE、IS、IT等学科的知识要求。

如图2~6所示。

图1 CC2004提出的新的知识要求描述框架
图2 CC2004提出的CS知识要求描述框架图3 CC2004提出的CE知识要求描述框架
图4 CC2004提出的SE知识要求描述框架图5 CC2004提出的IT知识要求描述框架
图6 CC2004提出的IS知识要求描述框架
不知道设计者是有意识还是无意识,本人认为,这种图能够较好地引导我们更好地将3个学科形态的指导性放进来。

知识单元的核心小时数则是一种量化表示,这种表示如果再能够与3个学科形态结合起来,面对不同类型的人才(暂且分为研究型、工程型、应用性)的培养需求,给出不同形态的内容描述,这样就可以比较容易地和人才的能力培养的需求结合起来,构建出一套更完善的体系,这将给各类计算机人才的培养提供更具体的参考。

当然,涉及到能力问题,还需要进一步地将作者提出的计算机思维、算法设计与分析、程序设计与实现、计算机系统的认知、分析设计和应用等4种基本学科能力进行细分。

第二部分是学科方法论。

对学生来讲,主要是本学科的的基本方法、处理问题的基本思路、审视问题的基本视角等。

此外,还有学科形态与过程,它们用来引导教者面向学生的培养类型,而强调知识的某些形态的内容;引导学生根据自己的特点和期望去更多地关注什么形态的内容,或者更关注哪一个过程。

显然,被选定的知识应该是传授这些方法的最佳载体。

这里讲“最佳知识载体”,是希望通过作者近几年提出的研究型教学,使知识、方法能够与研究思路、创新思维更好地结合起来,通过课堂上精化后的知识发现过程和知识的创造性应用过程的再现,来使得原本呈“静态”的知识和方法活起来,以期达到使学生感受“大师们的创新风采”、“体验大师们的创新思维”,从而激发学生的创新激情和欲望,培养它们的创新能力。

其实,这种使知识、技术和方法“活起来”的做法才是包括本科教育在内的所有非培训型教育的真谛。

面对工程性,在理论教学中也应该有很好的体现。

特别是一些典型的系统结构、系统的构建方法、实现的基本过程、途径、优化方法等都是非常重要的。

工程性的另一个要求是要更多地重视实践教学环节的设计、组织和实施。

3.注重实践教学、构建有效的实践教学体系
抽象第一的基本原理并不排斥实践教学,相反,它要求更恰当的、有课程体系有机结合的系列的实践教学。

所以,我们说理论和实践的紧密结合作为计算机学科教学的重要特征之一的原因之一。

形式化后的非直观性,给本专业的教育带来了很大的困难,一方面,我们要着力培养学生适应形式化描述和这一前提下的问题处理能力,另一方面,我们需要努力寻找一种途径,让学生能较好地感受计算机系统及其运行。

这就是实践。

通过适当的实践,让学生去“感觉”、去“体会”系统及系统的运行,促进计算系统模型的快速形成。

使学生更好地获得对抽象对象及其处理方法的理解,并最终给出一些问题的求解。

另一方面,与其它学科/专业的实践教学类似,通过实践,可以更好地培养学生的实际工作能力,特别是实际系统的设计与实现能力。

对于那些以应用系统的设计开发为主要特色的学生的培养来说,这一点更为重要。

按照计算学科方法论的观点,对一个学生来说,它首先学习学科的一些基本的理论,然后用这些理论去指导自己的实践,在实践中,它要先对待处理的问题(实际系统)进行抽象,然后再根据理论进行设计,从而获得相应的处理系统。

对有更高要求的人,它们又可以从设计中得到新的理论,进而指导新的实践。

这样构成一个完整的认识回路,推动学科不断地向前发展。

对本学科来说,实践不仅可以促进学生对抽象东西的理解,培养它们的形式化处理能力,而且还能够培养出重要的实践能力。

实践在计算学科教育中的重要性要求我们建立起更合理有效的“实践教学体系”。

这个体系应该和课程体系有机地紧密结合,甚至应该是整个课程体系的一个不可分割的部分。

但是,必须强调,当它们被单独抽出来时,应该能够成为一个完备的实践教学体系。

首先,按照计算机学科学生能力培养的需要,我们可以在教学计划中构造出多个系列的课程。

例如,基础理论系列、程序设计与算法系列、系统软件系列、电路与电子技术系列、计算机系统系列、应用系统开发系列等。

与之相配合,还应该建立起实践系列,这些实践可以包括课程基本实验、系列课程设计、科研实习、毕业设计等。

通常课程基本实验根据课程的需求设计成课内的、课外的、或者独立的。

系列课程设计原则上应该在除了最后一学期外的其它所有学期内都有安排。

例如,程序设计、电路、电子学、数据结构与算法、数据库、编译、操作系统、计算机原理、计算机接口、计算机体系结构、嵌入式系统、计算机网络、人机交互……等等,这些都是综合设计性的。

另外,对实践教学而言,以下几方面是需要注意的。

首先,实践系列的安排也应该本着从简单到复杂,从验证到综合、到设计,逐渐实现能力培养的要求。

要在循序渐进的基础上,尽可能保证实践教学的不断线。

其次,实践教学要与课程教学有机地结合起来,互相配合,相互支撑。

第三,不能为了实践而实践。

有的人不顾实际情况,也不顾学科的特点,一味地要求学生参加到企、事业单位的实际实践中,仅以极少数学生的“收获”为“亮点”和“教绩”,教条地强调教育与生产实践相结合,为生产实践服务,造成大批学生的实践流于形式,甚至使部分学生养成“混”、“应付”的不良习惯。

4.重视学生系统能力的培养
计算机学科发展到今天,早已经从一些单一的具体问题的求解发展到对一类问题的求解,也就是寻求一类问题的系统求解。

正是由于这个原因,现代的高等教育更渴望能够培养出学生的系统能力。

包括系统地眼光、系统的观念、系统的结构、部分与整体、不同级别的抽象、……、等等。

对分析和构建各种计算机系统的人来说,更是非常重要的,从一定的意义上讲,其重要性甚至可以与CS、CE等学科人才的程序设计能力相当。

然而,这种系统能力的培养,又是非常困难的。

为此需要讨论不同的计算。

区分起见,我们不妨称完成单一的具体问题的求解的计算为“实例计算”,称完成一类问题系统求解的计算为“类计算”。

当然,在“类计算”中,应该有一大部分高层次的计算是“模型计算”。

所以,第二个方面的问题就是本专业的学生将要完成的计算应该是“类计算”,这是区分于其它专业的学生的重要方面之一。

目前,各个专业的学生都在学习使用计算机进行问题求解,而且被认为在相关专业的问题的处理上,它们更具有专业的优势。

那么,计算机专业的学生的优势何在?除了将我们的
主要精力放在基本的计算机(应用)系统的开发外,另一个重要方面应该是实现“类计算”。

从而使得相应的系统的适应面更宽,更具有完备性和一致性。

可以简单地称之为计算的层次问题。

因此,使学生摆脱“实例计算”的思维限制,培养学生的“类计算”能力是我们的着力点之一。

就计算机学科的学生的培养来说,通常都是从“实例计算”开始,逐渐推进到“类计算”,实现学生“计算”理念的跨越。

需要特别注意的是,在这个过程中,要有意识地引导学生将“实例计算”提升到“类计算”,而且“实例计算”是为最终实现“类计算”做准备的,是走向“类计算”的开始。

例如,在最开始时,我们以一元二次方程的求解为例,向初学者讲解程序设计。

首先可以考虑方程x2+3x+2=0 (式1)
的求解。

最简单的是直接给出相应的求根公式,这样相应的计算过程为:
x1=
(-3+sqrt(3*3-4*1*2))/(2*1)=-1
(-3-sqrt(3*3-4*1*2))/(2*1)=-2
x2=
这是典型的“实例计算”。

只能求解式1所给的方程,为了能求解其它的一元二次方程,我们给出一元二次方程的一般式子,
ax2+bx+c=0 (式2)
这个时候,我们就要考虑a、b、c取不同值的情况,并设计出对不同情况的处理。

这样可以得到如下过程。

⑴ 计算确定根情况的判别式:d=b*b-4*a*c;
⑵如果d>0,则计算式2的两个不同的实数根;
如果d=0,则计算式2的两个相同的实数根;
如果d<0,则计算式2的根的实部和虚部。

这基本上实现了从“实例计算”到“类计算”的跨越的关键步骤。

通过细化,得到如下过程,
⑴计算确定根情况的判别式:d=b*b-4*a*c
⑵如果d>0,则计算式2的两个不同的实数根:
e=sqrt(d);
x1= (-b+e)/(2*a);
x2= (-b-e)/(2*a);
如果d=0,则计算式2的两个相同的实数根:
x1= x2= -b/(2*a);
如果d<0,则计算式2的根的实部和虚部。

r=
-b/(2*a);
sqrt(-d)/(2*a)
i=
最后补充数据的输入输出(算法的关键点之一),得如下过程。

(0) 输入方程的系数a、b、c;
⑴计算确定根情况的判别式:d=b*b-4*a*c
⑵如果d>0,则记录方程有两个不同的实数根,并计算这两个不同的实数根:
e=sqrt(d);
x1= (-b+e)/(2*a);
x2= (-b-e)/(2*a);
如果d=0,则记录方程有两个相同的实数根,并计算这两个相同的实数根:
x1= x2= -b/(2*a);
如果d<0,则记录方程没有实数根,并计算根的实部和虚部。

-b/(2*a);
r=
sqrt(-d)/(2*a)
i=
⑶输出相应的结果
从这里开始,就使学生认识到,作为计算机专业的人,我们要力争去完成什么样的计算。

这也有利于避免学生日后“编写”一些漏洞百出的“代码”。

通过一段时间的努力,就能够培养出学生良好的计算机问题求解能力。

显然,学生如果不能完成这一跨越,我们的教育就是失败的。

笔者经历过这样一个一件事,在编译课程的实验中,希望学生能够构造一个分析器,其分析器能够将几种典型的语句构成的程序翻译成等价的三地址码,为了使学生能够更好地完成设计和实现,给了一个形如
while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z
的测试实例和相应的输出结果。

结束时发现,一部分学生提交的实验系统仅能处理一个语句,有的甚至只能处理与示例类似的语句,在验收的时候,一看老师给出其它的或者含有错误的语句时,这些学生还认为老师所给的测试数据超出了要求的范围。

这实际上反映出教和学的不到位。

实际上,随着学生将“计算”的层面从“实例计算”提升到“类计算”,它们的系统求解问题的观念将被树立起来,而这种观念的树立,将有力地促进系统观念的建立,这样一来,不仅有利于系统地观察和审视问题,更有利于构造真正意义上的系统,并使系统更好地体现自己的一致性(Consistency)、完备性(Completeness)、健壮性(Robustness)、稳定性(Stability)、开放性(Openness)等一系列特征。

5.本科教育不能是产品教育
通常来讲,本科生教育区别于职业教育,其目的更多地是放在“长远”上,所以,本科教育应该强调坚实的专业基础。

基本概念、基本方法、基本技术等“三基”是理工科的重要内容,它关乎到学生未来的发展。

邓小平同志曾经指出,教育要面向现代化,面向世界,面向未来。

这个“未来”既有未来社会,又有未来的发展。

经验告诉我们,“坚实”、“宽广”的基础是面向未来的关键,这也正是教育能够以不变应万变基础。

本科教育的这种基础性,使得人们更多地关注一个人在本科阶段所受的教育。

本科教育的基础性,使得人们充分地认识到“本科教育不能是产品教育”。

对于飞速发展的计算机学科来说,其对教育中的基础性要求更为强烈。

目前国内最优秀的计算机科学家中,有一大批是来源于数学和电子学相关的专业,虽然与计算机学科本身的来源有关,但也进一步说明了“基础”在一个人的发展过程中的重要性。

实际上,自从1991年ACM/IEEE CS发布计算机学科的课程体系以来,学科实际上有了很大的发展,一批新技术得到推广应用,我们现在用的各类系统(产品)与那个时候的系统几乎完全不同。

但是,计算机学科的课程体系中的核心课程、关键的核心知识单元并没有很大的变化。

它们包括程序设计、数据结构与算法、操作系统、编译、计算机体系结构、软件工程、通信与网络等。

教育的重点是计算机应用软件和硬件工具的开发技术等,而不是应用本身。

其主要原因是这些课程和知识单元包括了设计与构造计算机系统的基本原理、自动处理数据和信息的算法过程。

除了这些基本内容外,新的技术也被吸收了进来。

综合起来就是:在重视基础的同时,考虑对新技术的覆盖,而且是先基础、后技术。

所以,著名计算机科学家Wirth在回答如何成长成一个像它那样的科学家时说,第一要学好基础知识和理论,第二一定要真正学懂。

另外一个问题是“今天和明天谁为重”的问题。

这个看似简单易答的问题,在比较容易浮躁和比较浮躁的情况下,实际上是一个非常重要的、值得我们深思的问题。

虽然我们都说“明天”为重,但实际执行起来却并不是那么容易。

且不说我们目前大多数学校在安排教学实验重点受制于多年欠账的师资队伍,单就市场经济初步形成时出现的不成熟的人才市场的所给的部分错误导向来说,也给在“今天”和“明天”的选择上造成障碍。

从近些年的教育我们不难看出这一点。

我们必须面向未来,将学科的一些基本原理、基本方法和基本技术传授给学生,培养学生的基本学科能力,避免产品教育。

避免对本科生执行产品教育,是指不能让产品限定课程的内容,不能让产品培训替代基本原理的教育,更不能围绕一些产品去制订教学计划和设定实际的培养目标。

CC2001甚至告诫我们不能以“操作
系统”这种层面上的系统去组织课程和教学计划。

但是,为了更好地紧跟学科的发展,并使毕业生还能较好地满足用人单位的当前需要,我们应该将优秀的产品作为实例、作为实验支撑环境的一部分,还可以通过安排适当的讲座、选修课、第二课堂的科技活动,实现对一些新技术的跟踪,加上基本原理的教育,以应对学科的飞速发展。

按照现代教育观念的要求,在教学中必须努力体现能力培养和素质的提高。

所以我们设计的教学环节,一定要有明确的目的性,绝不可以人云亦云。

特别要注意到,对不同类型人才有着不同培养要求,它们需要不同的培养计划。

而这种不同应该是在基础内容相同的前提下的不同,基本学科理论与实践,系统的观念和抽象思维、逻辑思维能力是重要的支撑点。

不同点将体现出各校特色的不同和各类人才要求的不同。

总之,重视基础、加强实践、按照能力培养的需要构建系列课程以组成课程体系是基本、最有效的原则。

参考文献
[1] 蒋宗礼 张晓霞.“意识 理性与创新能力的培养”. 北京工业大学学报.社科版. 2003年. 第3期. P93-96.
[2] Tony Greening. 21世纪计算机教育. 麦中凡等译.北京. 高等教育出版社.2001年3月
[3] 中国计算机科学与技术学科教程2002研究组. 中国计算机科学与技术学科教程2002. 北京. 清华大学出版社. 2003年3月(第二次印刷)
[4] Joint Task Force for Computing Curricula 2004. Computing Curricula 2004 Overview Report. June 1,2004.
[5] 赵致琢. 高等学校计算科学(专业)教育. 北京. 科学出版社. 1996年9月
[6] 蒋宗礼. “计算机科学与技术学科硕士研究生培养研究”. 计算机教育. 2004年. 第2.3期. P72-77
[7] 蒋宗礼. “面向未来培养计算机人才”. 中国计算机学会教育专业委员会2001年年会论文集. 西安交通大学出版社. 2001年10月. 长沙
[8] 蒋宗礼. 学科·能力·培养. 全国高校计算机教育研究会成立15周年纪念会暨2004年学术年会大会报告. 2004年8月19日. 呼和浩特。

相关文档
最新文档