面向计算思维能力培养的程序设计课程

2014-04-25 22:19李文生吴舜歆
计算机教育 2014年3期
关键词:计算思维程序设计教学改革

李文生 吴舜歆

摘要:针对传统程序设计课程教学存在的问题,提出将计算思维能力培养引入到程序设计课程中来,并从教学内容、教学方法、上机实践和考核方式等方面讨论程序设计课程的改革思路,培养学生计算思维能力和程序设计实践动手能力。

关键词:计算思维;程序设计;教学改革

0 引言

程序设计作为计算机类专业基础课,是很多后续专业课程学习的重要基础和铺垫,在计算机类专业培养方案中占据重要位置。

程序设计是将分析和解决问题的思维活动转化成计算机程序的过程。从这个角度讲,程序设计最能够体现语言级的问题求解思想方法,学生在学习程序设计课程中,可以通过问题分析、算法设计、程序实现来体验问题求解的思维训练过程。所以,对于计算机专业学生来说,学习程序设计课程的目的不应是单纯掌握某门程序设计语言的语法规范,甚至不是单纯学习一门程序设计技术,而是学习利用计算机分析和解决问题的基本过程和思维方法。

1 传统程序设计课程教学存在的问题

程序设计课程主要涵盖两大部分内容:一是程序设计语言知识,主要包括某种程序设计语言的语法机制、形式、功能和意义;二是程序设计思想和方法,主要包括数据和数据抽象,流程和流程控制,思考、设计、组织程序的过程、方法和技术等。

传统的程序设计课程将教学的重心主要放在第一部分,因而很容易陷入以程序设计语言为中心的误区,具体表现在以下几个方面:(1)教学内容过分关注程序设计语言的语法和语义细节,整个课程是以程序设计语言为纲来组织教学内容。由于程序设计语言具有大量繁杂语法知识点,教师只能采用灌输式教学模式,花费大量课时用于讲授琐碎的语法知识上,而不是花在程序设计思想和方法的传授上。(2)教学方法采用程序设计语言工具书的阐述方式,一般是先介绍一种语法结构的形式和意义,然后给出简单示例或示例程序,这些示例和示例程序的主要作用只是用于对语法结构使用方法的说明,学生并不能通过这些示例体会到问题分析、程序思维和构造的方法。整个课程也很少引入综合性的教学案例,让学生体会到针对要解决的问题,如何进行分析并逐渐将其精确化;如何针对问题的计算需求,设计解决问题的过程;如何将问题解决过程精确化,选择适当的程序结构实现它。(3)课程考核类似于某些计算机等级考试,偏重于考核程序设计语言的语法知识,有时甚至用一些生僻的语法知识折腾学生,而忽略对学生分析问题、程序设计和调试能力的考核。这直接导致学生只注重知识点记忆,而忽视程序设计能力培养。

2 程序设计教学改革中的计算思维能力培养

2.1 计算机思维的背景

计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它的本质是抽象和自动化。计算思维的核心是基于计算环境和约束的问题求解,即通过约简、嵌入、转化和仿真等方法,把一个看似困难的问题转化成一个我们知道怎样解决的问题的思维方法。

计算机学科的共同特征是基于特定计算环境和约束条件的问题求解,比如:计算机科学基础理论研究实际上是基于抽象机(如图灵机)的问题求解,计算机硬件体系的设计与研究则是一种指令级的问题求解,程序设计可以看成是基于语言级的问题求解活动。因此,可以认为,计算思维的本质特征是基于不同层次计算环境的问题求解。问题求解涉及3个部分内容:一是问题表示,即对象构造,建立计算环境所能理解的基本计算对象,进而为基于计算环境的问题求解提供可能;二是问题求解过程,即过程构造,通过约简、嵌入、转化、仿真、递归、并行、启发式推理、平衡与折中等计算思维方法设计问题的求解方法和过程;三是计算过程正确性与效率的验证,即验证构造,典型方法有预防、保护、冗余、容错、纠错等,其中还需要多维度(时间、空间、简洁、成本等)考量计算的效率。

既然程序设计是基于语言级的问题求解活动,那么程序设计课程也应当作为培养学生计算思维能力的重要手段,应当从教学内容、教学方法、上机实践和考核模式等诸多环节改革着手,培养学生的程序设计能力和计算思维能力。

2.2 程序设计教学内容改革

程序设计课程的目标是培养学生的程序设计能力和计算思维能力,而不是单纯地让学生掌握某种程序设计语言的语法规范,所以程序设计课程教学内容的组织应当以培养学生解决实际问题能力和计算思维能力为主线,而不是以语言语法知识点为主线,从而学生不会在一开始就接触到过多、过杂的语言语法规范细节,从而将主要精力集中到解决实际问题中来。下面以c语言程序设计为例给出一个可行的教学内容组织方式。

(1)C语言简介。简单介绍c语言的历史和c语言程序的基本概念,通过简单示例介绍c语言程序设计的基本流程。

(2)c语言程序设计的基本语法要素和程序流程控制。介绍数据和数据类型、运算和表达式、基本输入输出、典型的分支结构和循环结构等,讨论良好的程序设计风格和结构化程序设计基本方法。

(3)函数和算法。包括函数的声明和定义、函数调用与调用规范、程序的结构化与模块化、算法概念与特征、算法描述方法、算法设计与实现、递归算法、程序的测试与排错等。

(4)程序组织与软件开发方法。主要讨论函数库与接口概念、作用域与生命周期、程序的组织方法和开发方法等。

(5)c语言符合数据类型。主要介绍数组、字符串、结构体等,同时讨论基于字符串的相关函数和算法。

(6)指针。讨论指针和存储地址的关系、指针相关运算,同时讨论指针与其他语法要件(数组、字符串、结构体、函数)之间的关系。

(7)文件与数据存储。介绍文件的基本概念和基本操作,讨论文件的读写方法以及实际编程时的数据存储策略。

(8)程序抽象。通过学习数据抽象和算法抽象的基本方法与原则,掌握程序抽象的思考方法。

整个程序设计课程教学内容的安排是介绍最基本的程序设计语言知识之后,以程序抽象机制为主线逐步介绍程序设计方法,与程序抽象有关的必要的语法元素逐渐展开,并将计算思维能力培养的诸多要素融入到这条主线中。endprint

特别需要注意的是,函数绝不应该是学了各种基本编程机制之后的补充,而是培养学生抽象、分解等计算思维能力的重要载体和手段;合理的程序设计教学内容安排应当尽可能把函数这一部分提前,在之后学习过程中反复强调和应用,并与其他程序设计机制不断碰撞融合。

2.3 程序设计教学方法改革

在确定了程序设计课程教学内容后,接下来就是如何进行教学方法的改革。改革的方向应当是帮助学生降低学习门槛,逐步展现计算思维方法和程序设计过程,从而帮助学生培养分析问题与通过程序设计解决问题的能力。具体做法如下:

(1)适当淡化语法细节,在“以程序抽象为主线”的思想指导下,对程序设计语言本身进行适当裁剪,去除较为复杂、较难理解、使用很少、不太规范的部分。事实上,在实际编程学习过程中,如果采用良好的编程风格,学生只需要掌握最基本、最重要的语法机制和最常用、最不容易写错的编程范式(编程模式、习惯写法),就可以编写程序解决实际问题了。这样可以降低程序设计的学习门槛,让学生能尽早开始编程,从而以渐进的方式在实际编程中学习程序设计,通过逐步深入的方式慢慢掌握思考、设计、组织程序的方法和技术,降低学生学习过程中的枯燥感和挫折感,提高学生解决问题的愉悦感和成就感。

(2)将教学重心放在计算思维能力和程序设计能力的培养上,将分解、抽象、自动化、约简、转化、递归、迭代、启发式、折中等计算思维的主要特征融入到程序设计教学过程中,如通过顺序结构把复杂工作分解为一系列较简单的工作;通过分支结构,把整体处理分解为对一些互不相交、更为简单的分支处理;通过循环,把复杂问题的处理分解为一系列类似处理;通过函数机制实现功能模块的分解和抽象;采用抽象、分解来解决相对比较复杂的问题,通过约简、转化、递归、迭代来实现复杂问题的分而治之等。

(3)开发相对综合的教学案例,如万年历程序、ATM自动取款机程序等,这些案例由部分到整体,由简单到复杂,贯穿整个课程,帮助学生体会:如何从分析问题开始,通过分解、抽象、约简、迭代等计算思维方法,最终设计出一个问题的计算过程;如何用程序设计语言将所设计的计算过程转化成为一个程序;如何采用结构化程序设计思想方法,设计出具有良好的结构,使其易于修改和扩充;如何保证程序能合理妥当地处理不正确的输入,提高程序的容错性;如何合理地组成程序,以方便将代码作为更大程序的组成部分。

(4)引入基于问题的互动教学,精选反映计算思维思想的问题案例或者相关知识模块的引导性问题,通过课堂互动讨论等方式,讨论问题的分析、分解和精确化,找出问题解决的主要步骤,确定函数抽象,找出循环迭代、条件控制结构,最后进行程序实现。做完之后还应该分析讨论所设计程序的优点和缺点,考虑其他设计实现的可能性。

2.4 程序设计的上机实践环节改革

程序设计课程本身就是一门实践性很强的课程,程序设计能力和计算思维能力的培养不能仅靠课堂教学,更多需要依靠上机实践。上机除了强化学生的实践动手能力外,更重要的是培养他们积极思维,自己发现问题、解决问题的计算思维能力。基于这个原因,我们从以下几个方面进行程序设计上机实践环节改革。

(1)以计算思维核心方法为指导,建立分层次的实践教学案例。

首先是基础层,要求学生在掌握某种语法规范后,可以使用它们解决相关的简单实际问题,这一层次主要帮助学生跨越程序设计的门槛;第二个层次是拓展层,要求学生掌握基本的计算思维方法(抽象、分解等),掌握解决问题的典型策略或算法(如穷举、迭代、递归、分治、查找、排序等),然后加以变通并用它们解决类似的问题;第三是综合提高层,通过给出一些综合的上机实践题目,要求学生学会如何进行正确的思考,对一个相对复杂的问题进行问题分解和抽象描述,从而得到解决问题的方法和途径。

(2)搭建一个“程序设计在线训练和评测系统”,为程序设计课程上机教学服务。

该系统在设计时需要考虑如下因素:一是将实验实践教学案例转化成程序在线训练和评测系统相关题库的题目,这些题目涵盖基础层(基本的编程语言知识的理解和复现)、提高层(基本计算思维方法和典型算法的编程验证)、提高层(计算思维能力和编程技巧的综合运用)不同层次,逐步培养学生的计算思维能力和程序设计能力;二是对于系统的题目通过设计比较全面的测试用例,培养学生更加全面思考问题求解方法的习惯,并加深学生对容错、纠错、冗余等计算思维的相关特征的了解;三是通过对测试用例设定时间和空间的要求,让学生体会在设计正确程序的同时,还要考虑程序算法的优劣,进而设计高效的实现算法,不断提高程序设计的技巧。

抽象和分解是计算思维的两个最重要元素,也是程序设计的两个重要手段,所以有必要强调学生在做题过程中通过问题分解和函数(或类)抽象建立清晰的程序结构,并引导学生关注程序的结构、易读性和易修改性。但是传统的“程序设计在线训练和评测系统”采用黑盒测试,只是关心程序对于给定的测试用例能否得到预期的输出,并不关心程序实现的方法,这导致学生往往只写一个主函数,并没有根据实际问题进行问题分解并抽象为相关自定义函数(或类),无法锻炼学生抽象和分解的计算思维能力以及良好的程序设计风格。针对传统“程序设计在线训练和评测系统”的缺陷,我们开发一个全新的系统,能够全面支持函数、面向对象等内容的程序设计和测试,并通过强制学生通过问题分解,定义相关函数(或类),达到培养学生分解和抽象等计算思维能力和良好的程序设计风格的目标。

2.5 程序设计课程考核改革

摒弃传统课程考核方式,强调学习过程,强调实践动手能力。尽管完全放弃笔试可能会带来一些弊端,但可以大大降低笔试所占成绩的比例(如40%以下),加大平时上机解题、阶段性上机测试、大作业在课程考核评价的分量。

首先,学生可以通过“程序设计在线训练和评测系统”随时随地做题,然后提交自己的源代码。系统会实时地对学生的代码进行评测,并给出相应的评测结果:编译错、答案错、格式错、运行时出错、超时和接受。学生解题的数量可以比较好地反映其平时的学习过程和学习效果。尽管学生提交代码不被系统接受时可以对代码不断进行修改和重新提交,也可以查阅相关资料,但这恰恰是学生自主学习和通过错误学习的过程,值得鼓励。

其次,教师可以根据实际教学需要进行阶段性测试,通过在“程序设计在线训练和评测系统”里面布置测试题目,设定测试的截止提交时间。系统会对学生提交的代码进行实时评判,并对学生的测试情况进行统计分析,不需要人工干预。

最后,教师可以布置一个大作业,然后3—4人组成一个小组,利用程序设计课程学知识和技能,合作设计和开发一个具有用户界面、功能相对完整的应用程序,如万年历、ATM取款机程'序、简易字典程序等。大作业采用开放形式,允许以任何方式查找资料,甚至在网上和其他人讨论,但强调学生在大作业完成过程中的参与和投入。最后,小组成员需要参加最后的大作业答辩,在答辩中展示自己程序的设计思路和系统功能,并通过答辩防止学生简单抄袭。

3 结语

面向计算思维能力培养的程序设计课程教学改革对该门课程的教学内容、教学方法、上机实践和考核模式进行重新审视和定位,整个课程以培养学生的计算思维能力和解决实际问题能力为目标,同时在教学主线和实践环节中融入计算思维的相关要素。电子科技大学中山学院计算机学院近年来一直在探索面向计算思维能力培养的程序设计课程教学改革,取得了一定的成绩,学生的分析问题的能力和程序设计得到一定程度的提高,学生在ACM、软件设计大赛、嵌入式设计大赛、飞思卡尔智能车大赛等大赛中屡获佳绩,在后续专业课程的课程设计以及毕业设计环节涌现出的越来越多的优秀作品。

(编辑:郭田珍)endprint

猜你喜欢
计算思维程序设计教学改革
基于OBE的Java程序设计个性化教学研究
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
程序设计课程中计算思维和应用能力培养问题研究
民族高校C语言程序设计课程教学改革的研究
算法的案例教学探析
浅谈艺术专业学生计算思维能力的培养
基于人才培养的技工学校德育实效性研究
现代信息技术在高职数学教学改革中的应用研究