徐明星 王瑀屏 邬晓钧 黄震春 姚海龙
文章编号:1672-5913(2015)11-0017-04
中图分类号:G642
摘要:提出以培养计算思维为主线、以激发学术志趣为核心、以引领计算人生为目标的指导思想,构建以学生为中心的多维度、多层次、系统连贯的计算机程序设计系列课程体系,介绍系列课程中各个教学环节的具体改革措施。
关键词:程序设计;计算思维;以学生为中心
1 背景 计算机程序设计是计算机专业和一些非计算机专业(如数学、数理基科班等院系与专业)的重要基础,其教学体系一般是由几门关系松散且相对独立的课程构成,如C语言程序设计、C++语言程序设计等。这些课程的教学通常以介绍某个特定程序设计语言(如C、C++)的语法知识为主。随着计算机科学与技术的发展,这样的课程组织与教学设计已经跟不上时代步伐,不能满足实际工作的需要。
作为一所研究型大学,清华大学一直以培养创新拔尖人才为己任。从2001年起,清华大学计算机科学与技术系(以下简称“计算机系”)吴文虎教授主持了系本科生课程程序设计基础的教学改革任务。经过几年的努力,课程被评为首批国家级精品课程,奠定了建设高水平计算机程序设计系列课程的良好基础。2003年秋,我们针对计算机系本科生开设了C++面向对象程序设计课程,当年学生评教即进入全校同类课程的前5%。2004-2009年,我们又在暑假小学期开设了C++程序设计实践课程,初步形成了一个以讲授程序设计为核心内容的系列课程雏形。如何通过改革和调整,将这些彼此关联的课程重新打造成一个更加紧密的有机课程体系;使之既能体现时代特色、跟上发展潮流,又能更好地服务于世界一流大学的建设需求,提高创新拔尖人才的培养水平,成为又一个摆在我们面前亟待解决的问题。
为此,我们认真学习和借鉴国内外的先进教学理念,深刻反思传统计算机程序设计教学的不足之处(如实践教学与理论教学脱节),着重研究、探讨和解决了以下几个问题。
(l)程序设计系列课程应如何定位才能跟上时代发展的步伐,站在科技发展的前沿?
(2)作为研究型大学的专业基础课程,应该采取什么样的教学模式、方法和手段,教授哪些内容,才能真正为学生的专业发展打好基础,引领和激发学生的学术志趣?
(3)面对不同专业发展要求、不同背景基础的学生,如何实现以学生为中心的个性化教学?
通过对这些问题的反复研讨和深入思考,我们明确了程序设计系列课程的建设思想——以培养计算思维为主线、以激发学术志趣为核心、以引领计算人生为目标。自2009年以来,通过课程改革与新课程设置,我们建成了程序设计系列课程体系,包括多门课程、多个课堂:大一秋季程序设计基础(48学时,两个课堂)、大一春季面向对象程序设计基础(32学时,两个课堂,其中一个是双语教学小课堂)、夏季小学期程序设计实践(32学时)等3门内容连贯的专业基础课,以及一门与ACM竞赛相关的全校任选课程序设计艺术和实践(48学时,全年开课)。
系列课程的教学内容包含基础算法设计与实现、基本数据结构的设计与应用、面向对象程序设计、设计模式、并行与异步程序设计的基本思路与方法、实践与提高等,使用的计算机语言为C/C++。系列课程以大班教学为主,课堂选课人数在150名左右,授课对象包括计算机专业学生和数学专业学生;为满足国际交流需要,作为主课堂的补充,面向对象程序设计基础课程还同时开设了双语教学的小班课堂;ACM竞赛选修课程每年培养60名左右的学生参与日常训练和竞赛。
在多年实际教学的研究与探索过程中,我们努力贯彻落实先进的教学思想和教育理念,在系列课程的各个教学环节都进行了相应的改革和实践,取得了具有先进性、前瞻性以及可复制性的教育教学成果,建设了一个完整的程序设计系列课程体系。该系列课程以国家级精品课程为基础不断延伸,把枯燥的编程技巧提升到程序设计艺术和科学方法论的层次,引导和激发学生对计算科学的兴趣和志向,配合实践训练课程形成了多维度、多层次、系统连贯的课程体系。该体系时间跨度大,内容覆盖广,受益学生多。
2 以计算思维培养为主线,科学合理地设置系列课程内容
计算思维是人类求解问题、设计系统、理解个体行为的一种思想和方法,也是近年来在计算机教育领域讨论的热点话题。随着计算机科学的发展,计算的方法与模型日益丰富和复杂,这极大地推动了数学、物理学、生物学等学科的发展。
程序设计系列课程以计算思维培养作为贯穿各门课程的主线,把教学的主要内容和精力用来拓展学生思维模式,提升学生对复杂事物进行高度抽象的认知水平和思维能力。在能力和素质的提升过程中形成和发展计算思维,感受计算机程序算法的科学性与设计实现的艺术性,提升学生的学习境界,为学生未来的专业发展打下坚实基础。
在知识传授的基础上,我们强调理论与实践相结合,解决实际问题。通过在系列课程的每一个环节中贯彻“理性思维结合理性实践”的教学理念,使学生脱离纸上谈兵的学习状态,着力引导学生进行自主探究式学习、合作学习等,让他们在解决实际问题的过程中体会和提升程序设计的思想和境界。
系列课程教学要注重前后关联衔接,以层层深入的知识体系为载体,逐步深化思想的交流,在潜移默化中引领学生的计算人生。
程序设计基础课程以如何用计算机解题来组织各章节内容,强调思维模式的更新与转换;面向对象程序设计基础注重如何分析思考变与不变的辩证关系,强调建立面向接口的思维模式;程序设计实践课程则通过如何表达复杂的同步与异步的时序关系,深化和完善计算思维,强调集成创新;程序设计艺术和实践课程通过算法设计与编程实践进一步巩固和提升计算思维能力,强调团队协作和算法创新。
系列课程的教学内容在组织编排上层层递进、前后呼应,始终遵循程序设计课程的教学规律和学生的认知规律。例如:第一学期课程重点是基础算法思维,旨在培养学生初步建立计算思维,使他们掌握基本问题的分析和求解方法;第二学期课程则强调抽象思维,要求学生掌握复杂问题的分析与程序实现的基本方法;实践课程以及ACM训练课程则开展有强度、有深度的上机编程训练,强调对思想、知识与技能的灵活运用,要求学生融会贯通。
3 多个环节和多种措施全面发力,激发学生的学术志趣
以任务驱动形式,从学生熟知的学习和生活经验中提炼问题,强调引导式教学,锻炼学生主动学习,培养他们探究未知的习惯,提升学习的境界。例如:对新知识介绍均从问题切入,在示例的分析讲解中进行启发式教学,设置课堂讨论环节进行深入互动,等等。
在课堂示例的讲解过程中,剖析具体问题的深刻内涵,阐述问题形式化与数学建模对问题求解的重要性,锻炼学生的科学思维能力;从多种角度、多个层次来分析复杂事物之间的关系,引导学生养成对比研究和辩证思考的认知习惯。
强调抽象的理论思考与实际的上机实践相结合,要求理性思维下的理性实践,使学生不惧程序错误、善用程序错误,进而增强程序调试能力,培养探究未知和追求真理的科学精神。例如,针对学生写程序时经常发生的错误,考虑到很多初学者会因此感到强烈的挫折感和学习“门槛”,教师在课堂演示过程中可以故意出现一些常见的打字错误或算法错误,如少敲一个分号、少写一个大括号、漏掉某个重要判断或预处理等,在出现编译错误或运行错误后故作惊慌,然后为学生示范如何根据提示信息进行分析,最终找到并修正错误。这种当堂的发生错误和分析解决的互动过程,使得同学们了解了程序设计过程中难免出现的各种错误,并认识到这些错误并不可怕,重要的是要注重积累经验并冷静分析。此外,我们还设置了常见错误分享的教学环节,要求学生把学习过程中遇到的错误以及解决过程与全体同学分享,使同学们懂得错误是一种宝贵的财富,鼓励他们不要仅停留在老师讲的正确写法上,而要更多地尝试其他写法,看看会发生什么,探究问题背后的原因。
课程以上机编程解题为主要考核形式,强化实践,反复训练学生理解和分析问题、建立模型、设计算法、上机编程、全面测试和理性调试,培养学生严谨务实的科学作风。
在线评测系统实现自动批改学生提交的作业,只记(录)成功,不计(较)失败。评测系统允许同学们在截止时间前多次提交,最终成绩按照获得最高分的一次提交来计算。这种机制不仅符合软件开发的实际情况,还能有效鼓励学生不畏失败和困难、越挫越勇,逐步养成追求卓越和完美的精神,为未来的学习研究工作打下基础。在历年的教学实践中,这个措施最受学生欢迎,甚至出现过为完成一道有一定难度的问题,反复提交20多次后终于获得该题满分的情形。此外,在线评测系统还能显示学生各自的学习进度(如作业完成情况在全年级中的排名),有效激发学生之间的良性竞争,引导学生开展自主学习、主动钻研和反复实践。
在课堂教学、课外阅读、课后作业中,我们有针对性地提供一些需要用后续课程的知识才能解答的“开放”问题,激发学生持续深入学习,逐步形成钻研问题的品质。例如,我们在讲完变量一章中故意设置“求从1到n的平方和”这样的问题,尽管用已知的数学公式和已有的编程知识能够完成,但它能够使同学们隐隐体会到后续章节会出现的“循环”概念;而在讲完函数一章后则提出“函数能否调用自己”的问题,引发同学思考,鼓励同学尝试,为后续章节的难点“递归”作好铺垫。
各课程根据不同侧重点精心设置小组大作业,要求各小组独立开展调研,组织讨论,协作完成大作业的程序设计与实现,最后安排课堂时间挑选优秀小组进行成果汇报,模拟学术交流过程,使学生体验研究工作的几个关键环节,培养学术精神。
通过小组大作业来培养团队协作能力,帮助大一学生尽快适应大学的学习和生活。选拔和组织有基础的学生,以3人为一队进行日常训练并参加ACM竞赛,引导学生定位团队角色,磨合团队协作模式,在充分有效沟通的基础上,分工合作,研究并解决问题。
4 以学生为主体进行个性化教学,实现因材施教
在本系列课程的学生中,既有没接触过程序设计的,也有中学期间就获得信息学大赛金牌的;既有计算机专业的,也有非计算机专业的。他们在计算思维方面的基础差异大且专业发展方向不同,因此在教学内容、教学方法和教学环节的设置上,我们准备了多种教学预案。
在开课前对选课学生进行计算机基础调查和专业背景调查,根据调查结果调整部分教学内容、教学环节和考核要求,使不同课堂之间既遵循共同的教学理念和思路,又各有特色,满足不同专业学生的专业发展需求。例如,数学专业的学生通常会在高年级时学习和使用Mathmatica语言,我们针对他们经常遇到的问题,讲解类似问题在C语言中如何解决,让他们认识到问题其实出在数学思路上。这样,一方面为他们将来的课程学习打下好的基础,照顾到他们专业发展的特殊性;另一方面又使他们加深了对计算思维的理解和认识。
选拔有基础、有意愿的同学担任课程小教员,分组辅导身边的同学。针对不同编程基础的同学设计不同层次的题目,为不同专业的同学设计不同的示例。例如,针对数学专业同学设计示例时尽量选用数学问题进行讲解,如用二元一次方程组的求解过程讲解分支结构与逻辑思维的关系,用存储素数表的应用需要来讲解文件操作等。在讲解思路上也侧重类比数学中的常用方法,如类比数学归纳法与递归的解题思路。在教学过程中,鼓励学生就某个感兴趣的问题深入钻研,并在课堂上展示交流。我们每年都组织课程成绩优异且学有余力的学生参加校际的程序设计竞赛,如“北京邮电大学校赛”“北京理工大学校赛”等。
开设双语课堂,课程以英语讲授为主,重点难点辅以中文解释,为留学生和外语基础好的学生提供更合适的学习环境;采用讨论式教学方式,组织学生进行课上报告,促进课堂内交流互动,分享编程经验与心得,彼此学习、共同提高;发挥英语教学优势,依据并切合学生实际编程能力,引入经典英文学术论文(部分论文Google引用次数达30 000次以上)的阅读与实现教学环节,激发学生的学术兴趣。
依托计算机系学生创新实验室组建清华大学ACM竞赛代表队,为有很好基础并希望继续提高算法水平的同学提供平台,提供与国内外高校程序设计高手竞技和交流的机会。
5 效果
以上教学改革措施在实践中取得了很好的效果,主要体现在:
(1)相关系列课程的教学效果和学生评教均很好。学生反映,系列课程的学习不仅使他们觉得具体专门的知识是非常有趣和实用的,还从中深刻领悟了做人做事的道理。
(2)清华大学ACM竞赛代表队的竞赛成绩近年来一直稳定在世界前列,学生在竞赛过程中切实感受到了追求卓越的学校传统,领悟到了计算的科学之美与算法的艺术之美。
(3)在国家精品资源共享课程项目的申报与建设过程中,本成果的应用对于申报立项成功也发挥了重要作用,保证了精品资源在理念与内容上的先进性和独特性。
(4)在成果建设过程中形成的《程序设计基础(第3版)》被评为国家“十二五”规划教材。
(5)经过本成果中系列课程的学习培养,学生提高了学习能力,为后续课程(如数据结构、Java语言编程等)的学习打下坚实基础。
(6)本系列课程大大加强了学生解决实际问题的设计与实现能力,一些同学参加国际大学生超级计算机竞赛、挑战杯项目等,均取得了优异成绩。
6 结语
要建成一个好的系列课程体系,必须“用心”,从科教兴国的战略高度,对教育对象负责,对建设世界一流大学的目标负责。教育最重要的是要唤醒学生的力量,引导学生主动学习,使他们树立终身学习的观念。对此,我们深感责任重大。课程建设只有起点,没有终点,未来我们会不懈努力,勇于探索,以取得更好成绩。