摘要:本文以建构主义理论为基础,针对非计算机专业程序设计基础教学中存在的问题,探讨了如何设计以建构主义的学习理论为指导的程序设计教学模式和教学方法。并对建构主义教学模式下的程序设计教学,提出了若干应注意的问题。
关键词:建构主义理论 教学模式 教学方法
中图分类号:G642文献标识码:B
文章编号:1672-5913(2007)14-0051-04
为培养大学生的信息素养,非计算机专业大都开设了程序设计基础课程。学习计算机语言并进行编程训练,是学生深入理解计算机的一个突破口,是熟悉计算机思维的一个重要途径。但如何让这些非计算机专业的学生掌握程序设计的基本概念和基本方法,并能用一种程序设计语言编写计算机程序,难度很大。首先,他们主观上会认为,将来他们不会从事编写程序的工作,学习编程对他们没用;其次,计算机技术的概念比较抽象,不易掌握;其三,学习程序设计过程中,不光需要掌握所学的程序设计语言的语言规则,还要学会程序设计的思维方法,而前者全是一些严格的规定,后者却要求灵活运用,学生在初学编程时,如果长时间调试不通一个程序时会气馁,会产生一定的厌学情绪,此情绪对后面内容的学习会形成阻碍,以至影响整个课程的学习。
为了让非计算机专业的学生充分认识到程序设计课程的重要性,对程序设计产生兴趣,需要任课教师的不断探索、改进教学方法,改变“以教师为中心”的传统教学模式,使学生从被动学习变为主动学习,为学生自主学习提供丰富的学习资源,从而取得较好的学习成效。这正是现代教学理论——建构主义学习理论所倡导的。
本文首先介绍了建构主义的核心内容;然后,探讨了在非计算机专业程序设计教学中运用建构主义学习理论和教学方法,结合教学改革实践,对程序设计教学模式;最后,对于如何切实提高程序设计课的教学效果,提出了若干应注意的问题。
1建构主义理论概述
建构主义理论的核心内容是:以学生为中心,强调学生对知识的主动探索,主动发现和对所学知识意义的主动建构。
建构主义教学理论认为,知识主要不是通过教师传授得到,而是学习者在一定的情景及社会文化背景下,借助他人(包括教师和学习伙伴)的帮助,利用必要的学习资源,通过意义建构的方式而获得的;学习是学习者主动建构内部心理表征的过程,它不仅包括结构性的知识,而且包括大量的非结构性的经验背景;学生是信息加工的主体,是意义的主动建构者,而不是外部刺激的被动接受者和被灌输的对象;教师是意义建构的帮助者、促进者,而不是知识的传播者和灌输者;“情境”、“协作”、“会话”、和“意义建构”是学习环境的四大要素。
与建构主义学习理论以及建构主义学习环境相适应的教学模式概括为:“以学生为中心,在整个教学过程中由教师起组织者、指导者、帮助者和促进者的作用,利用情境、协作、会话等学习环境要素充分发挥学生的主动性、积极性和首创精神,最终达到使学生有效地实现对当前所学知识的意义建构的目的。在这种模式中,学生是知识意义的主动建构者;教师是教学过程的组织者、指导者、意义建构的帮助者、促进者;教材所提供的知识不再是教师传授的内容,而是学生主动建构意义的对象;媒体也不再是帮助教师传授知识的手段、方法,而是用来创设情境、进行协作学习和会话交流,即作为学生主动学习、协作式探索的认知工具。
在建构主义的教学模式下,比较成熟的教学方法主要有支架式教学,抛锚式教学,随机进入教学等。
2建构主义学习环境下程序设计基础教学设计
非计算机专业的程序设计课,是一门公共必修课,一般来说是学生在大学所学的第一门计算机编程课,目前大多讲述C语言程序设计。该门课的特点是:语言规则枯燥、难记;数组、函数、指针等概念比较抽象,不易理解;需掌握的常用算法较多;程序设计的思维方法较难掌握;编写的程序需要上机检验、调试。
在建构主义学习环境下,非计算机专业的程序设计基础教学设计内容如下:
(1) 教学目标分析
C语言程序设计课程的教学目标:掌握C语言程序的基本结构、C语言程序的基本数据类型和数组、结构、指针数据类型,掌握运算符、表达式、输入/输出处理、流程控制语句、函数定义和函数调用语句。通过以上各主题的学习,培养程序设计思维方法和技巧。
每个主题的教学目标是与该主题相关的基本概念、基本原理、基本方法与技巧。
(2) 情景创设
情景创设是指创设与当前学习主题相关的、尽可能真实的情景。程序设计课程的一个显著特点是每学习到一个主题,都可以在计算机上直接编写程序、调试程序、运行程序、查看运行结果,从上机编程的操作上来讲,学生体验到的是真实情景。另一方面,对于C语言程序中所涉及的概念、算法的学习,要为学生创设资源丰富的学习环境,其中应包括实例案例、相关学习资料,使得学习者可以根据自己的学习需要、学习兴趣去主动发现、主动探索要掌握的知识。
(3) 信息资源设计
确定学习本课程的每个主题所需的信息资源的种类以及每种资源在主题学习过程中所起的作用。经过分析综合,为本课程设计了具有不同作用的信息资源:教材和课件;校园网课程教学网站上的学习指导、常见问题解答,以及学习参考资料、参考习题和解答,用于学生的阅读或查阅学习内容;课程教学网站上的自测练习系统、作业系统、答疑系统用于学生自测、自我反馈。
(4) 自主学习设计
在教学过程中,充分发挥学生的主动性,使学生主动探究问题;为学生设计不同的情景去应用他所学的知识,帮助学生实现知识的“外化”;并让学生能根据自身行动的反馈信息,来形成对客观事物的认识和解决实际问题的方案,从而实现自我反馈。总之,自主学习设计中要充分考虑体现以学生为中心的三个要素:发挥学生的首创精神、知识外化和实现自我反馈。
(5) 协作学习环境设计
在本课程教学中,由教师精心设计问题,引导学生开展小组讨论、协商,并对学生的表现进行恰当的评价,从而进一步完善和深化对主题的意义建构。
(6) 学习效果评价设计
包括小组对个人的评价和学生个人的自我评价。为了帮助学生在完成一个主题的学习后,进行自我评价,在C语言程序设计教学网站设计了“自测练习系统”,自测练习的内容精心挑选,使之能有效地测试学生对基本概念、基本原理、基本编程方法的理解和掌握。
(7) 强化练习设计
根据评价的结果,为每个学生设计出一套强化练习方案:指出其知识薄弱点,并设计有针对性的学习材料和练习题。以便通过强化练习纠正原有的错误理解或片面认识,最终达到符合要求的意义建构。
3建构主义指导下的程序设计教学方法
建构主义学习理论强调学习者是认知主体,是意义的主动建构者;同时又不能忽视教师的主导作用,认为教师是意义建构的帮助者、指导者、促进者[2]。
因此,在教学过程中应采取既要发挥学生的主体作用,又要发挥教师的主导作用。在教师的指导下,学生进行主动的思考与探索;教师的主要任务是激发学生的学习兴趣,帮助学生形成学习动机,创设符合教学内容需要的多种情景,提示新旧知识之间的联系,帮助学生进行知识的迁移,组织协作学习,把学生的学习引向深入,监控学生的学习活动,并适时给与引导和帮助。
在建构主义教学模式下,笔者对c语言程序设计教学采用了支架式、抛锚式、随机进入式教学。实践表明,这些教学方法的运用,大大激发了学生的学习兴趣,使学生在教师为其创设的情境中,并在教师的引导下,一步步主动完成知识的意义建构。
(1) 支架式教学
学生独立解决问题时的发展水平与在教师指导下解决问题时的潜在发展水平之间的差异称为“最邻近发展区”。围绕所学习的主题,按照“最邻近发展区”的要求,建立概念框架,然后,引导学生进入一定的问题情景,让学生独立探索,并通过小组协商,最终完成对所学知识的意义建构。
数据排序算法(如选择排序)的讲解,采用了支架式教学方法。
利用数组将待排序的一组数(假设有N个)存储起来。再设计一个双重循环结构,内层实现一趟内、在一定范围内、值最小的元素的查找,并将该元素与排序后应所在位置上的元素互换;外层实现趟数的控制,这就可实现选择排序。
在教师适时地引导下,学生先根据最小数算法写出在数组全部元素的范围内找出最小值的程序代码(这是排序的第一趟),然后沿着概念框架逐步攀升:为实现元素互换,还需要记住最小值的位置。探索后面每趟排序的实现方法,通过讨论、协商,学生发现每趟排序的实现代码中相同的部分、不同的部分(可以适当地给出提示)。如果每趟排序的代码都相同,可以直接将这部分代码作为控制趟数的外层循环的循环体。为将每趟排序的代码中不同的部分也转化为相同的代码,需要将代码中的常量变为包含变量的统一的表达式。引导学生自己写出实现这个两重循环的最后的代码,达到对选择排序算法的深入理解,最终完成了对选择排序算法的意义建构。
(2) 抛锚式教学
抛锚式教学也称“基于问题的教学”。实际情境中的真实事件或真实问题的确定称为“抛锚”。这些问题要能引出与所学主题密切相关的基本概念、基本原理,能激发学生的学习动机,激起他们探索、学习的兴趣。在解决问题的过程中逐步训练学生的抽象思维能力和逻辑思维能力。
“函数”是C语言程序设计的重点和难点,学生普遍反映函数抽象、难学。为此,在教学过程中采用“抛锚式教学”,让学生在真实的问题情境中体会模块化程序设计的思想,学会用“函数”来解决规模较大、复杂的问题。
教师在讲解函数的概念之前,提出如下实际问题:用弦截法计算出函数f(x)=x5- 4x2+1的根。弦截法求方程根的过程:假定求根区间为[x1,x2],则当f(x1)与f(x2)异号时,以点(x1,f(x1)) 、(x2,f(x2))为端点的弦与x轴的交点由公式x=x1f(x2)-x2f(x1)/( f(x2)-f(x1))计算出来,然后根据f(x)是正是负,将求根区间缩小为[x1,x]或[ x,x2],并继续求新的弦与x轴的交点x,当f(x)足够小时,认为该x就是方程的根。
分析上述问题,发现解决它需要完成多个独立的计算过程:①计算数学函数f(x)、f(x1)、f(x2)的值的过程②用公式x=x1f(x2)-x2f(x1)/( f(x2)-f(x1))计算弦与x轴的交点的过程 ③缩小求根区间后不断计算与x轴的交点,直至f(x)小于某个值,则x就是方程的根。
如果将x、f(x)的求值过程的程序代码封装起来,使之成为程序中的一个独立实体,并通过一个名字来命名,当程序中需要这段计算时,可以通过一种简洁的形式要求执行这段计算过程,则程序中会避免大量重复代码,变得更简洁、更清晰。进一步指出:封装求值过程的代码就是函数定义,在需要执行被封装的代码的地方使用函数调用。此时,由问题出发,为学生引入了C语言函数定义、函数调用的概念,然后,以f(x)为例,向学生展示C语言函数定义的格式;以x的求解过程为例,向学生展示C语言函数调用的格式与参数传递机制。
然后,进一步向学生讲解C语言主函数main与用户自定义函数的关系——主函数由操作系统调用,而主函数调用自定义函数,自定义函数之间可以互相调用。每一个函数看做一个程序模块,让学生自己分析、协商:弦截法求根的程序有几个模块组成,这些模块之间的调用关系如何?并引导学生画出程序的模块图。
进一步分析函数的定义,指出只要知道了函数定义的首部信息,在主调函数中就可以写出函数调用,这样就引出了函数原型的概念。最后,在多媒体计算机上给出完整的程序代码,并演示程序的运行过程和运行结果。
完成上述方程求根问题的程序后,教师提出问题:如果把函数f的形参去掉,将函数体中的变量x换成一个数,函数f的每次调用结果怎样?从而引出无参函数的概念。
整个教学过程围绕建构主义情境、协作、会话和意义建构这几个认知环节自然展开,学生通过对真实问题的感受、体验,以及所学知识的意义建构,深刻理解了函数的概念、原理,以及自顶向下模块化程序设计的思想。
(3) 随机进入式教学
随意通过不同途径、不同方式进入同样教学内容的学习,从而使学生获得对同一事物或同一问题的多方面的认识与理解。
循环程序设计是程序设计教学的难点之一。循环结构比较复杂,用循环语句实现时牵涉的问题比较多,因此,本部分内容的教学设计采用随机进入式教学法。
首先为学生创设能从不同侧面、不同角度表现循环程序设计的多种情境以便供学生在自主探索过程中随意进入其中任一种情境去学习。
在循环算法中,迭代与穷举是两类具有代表性的基本算法。迭代和穷举算法各有其特点,二者恰好体现了循环程序设计的不同侧面。因此,在教学设计中,为学生创设从迭代和穷举两类循环算法进入循环程序设计的学习情境,在“迭代”情境下,可设计“人口增长问题、fibonacci数列、一元方程的迭代解法”等任务;在“穷举”情境下,可设计“找水仙花数、判断素数、找最大数”等任务。在导学时先向学生明确迭代和穷举的含义:迭代是一个不断用新值取代变量的旧值,或用旧值递推得出变量的新值的过程。穷举是对问题的所有可能状态逐一测试,直到找到解或将全部可能状态都测试完为止。
这两种循环算法都涉及到的循环程序设计的共性问题:如何发现算法中的重复性动作,循环中涉及哪些变量,循环变量初值的如何确定?什么情况下循环应该继续或中止?选用哪个循环语句来实现循环结构?循环结构的中途退出与重复周期的中途结束(素数判断)的处理,等等。无论学生选择哪一个情境去学习,都能从达到发现问题→解决问题→意义建构的目的。在自主学习过程中,学生的系统思维能力得到发展。
4建构主义教学模式下的程序设计教学中应注意的问题
(1) 综合运用多种教学方法。每一种教学方法有其局限性,如抛锚式教学以问题为中心,使用不当,会影响学生系统的掌握知识。在实际教学中,不一定采用某种单一的教学方法,针对具体教学任务,可以将两种以上的方法结合在一起,灵活运用。
(2) 不要片面强调学生的中心地位,而忽视了教师的主导作用。
(3) 程序设计课程的一个重要任务是培养和训练学生的程序设计系统化思维能力。因此,在引导学生分析问题、解决问题的过程中,要把培养和训练学生的程序设计系统化思维能力放在首位。
(4) 加强学习资源的建设。开发基于Web网络学习课件,建设程序设计常见问题库、自测练习题库。
参考文献
1. 何克抗. 建构主义革新传统教学的理论基础[J]. 电化教育研究,1997,(3).
2.陈琦,张建伟. 建构主义与教学改革[J]. 教育研究与实验,1998,(3):46-50.
3.张基温. 从语法体系走向问题体系—程序设计课程教学改革探索[J]. 计算机教育,2004,(7):68-69.
4.裘宗燕. 从问题到程序[M]. 北京:机械工业出版社, 2005.
投稿日期:2007-6-7
作者联系方式:北京海淀区清河小营东路12号北京机械工业学院计算中心
邮编:100085
E-mail: liumeiyan2003@tom.com
电话:13366768285,82426944(办)