汪小林 罗英伟 李文新 代亚非 许卓群
摘要:本文详细介绍了北京大学“计算概论”课程的教学体系建设及其改革情况,并阐述了该课程“立足基础、因材施教、强化实践”的教学理念和内涵。
关键词:计算概论;教学体系;程序设计;在线实践;在线考核
中图分类号:G642 文献标识码:B
“计算概论”课程是北京大学面向全校理科专业(理学、工学和医学)一年级学生开设的计算机基础教育特色课程,是北京大学信息科学技术学院开设的选课人数最多的主干基础课(每年有2000余人选修本课程)。针对本课程涉及的专业多、选课学生多的特点,经过十余年的建设,本课程已逐渐形成了“立足基础、因材施教、强化实践”的教学理念。
首先,我们按专业分两个层次建设课程,为“电子信息科学类”专业提供“计算概论A”课程,为其他理科专业提供“计算概论B”课程;不同的层次,课程内容深度会有所不同;不同的专业背景,在教学和实习内容设计上也会有不同的针对性。其次,根据学生的基础不同实现分班教学:对于“电子信息科学类”类专业,基础好、领悟力强的学生给予实验班教学,大部分学生在普通班学习,为基础较差的学生开设辅导班个别辅导;对其他理科专业,则分通选课(供各院系基础好的学生选修)、元培班(北大元培学院学生)和普通班(各院系其他学生)进行教学。
与此同时,我们设计和开发了程序设计在线评测系统POJ(http://acm.pku.edu.cn/JudgeOnline,http://poj.grids.cn)和编程网格系统PG(http://programming.grids.cn),强化学生的动手能力,并与大学生程序设计竞赛结合,培养学生的创新能力。
作为北京大学覆盖面最广的理科课程之一,我们以北大的网络教学平台为基础,以北京大学国家级计算机实验教学示范中心为依托,辅以多个具有不同专业特点的课程网站,构建了一个多层次开放的网络教学与实验环境(http://www.jpk.pku.edu.cn/pkujpk/icportal/),为学生提供了丰富的教学资源和教学辅导,整个课程的网络资源对每个学生都是开放的。
1课程定位:北京大学计算机基础教育的基础课程
随着计算机科学与技术的不断发展和普及,该课程已经日渐成为继语文和数学之后的第三大智力工具,所有学生都需要也应该学习计算机科学与技术的相关课程。早在1996年,许卓群教授就已经在北京大学主持开设面向全校理科学生的“计算概论”课程。经过十余年的建设,北京大学根据学生的基础不同、专业不同提供了不同层次和不同内容的计算机基础教育课程。对“电子信息类”专业的学生,北京大学设计了“程序设计与算法类”课程群,由“计算概论A”、“程序设计实习”、“数据结构与算法A”、“数据结构与算法实习”、“算法分析与设计”五门课组成。而对于其他理科专业学生,我们设计了“计算概论B”和“数据结构与算法B”课程。北京大学规定所有理科本科生必须修满两学期以上的计算机基础课程,并将该系列课程列为本科生主干基础课进行重点建设。
北京大学设计的有关课程群,为理科本科生提供了一个系统的、理论与实践相结合的计算机基础教育框架。其中,“计算概论”课程是这个框架中的基础,如图1所示。
北京大学设计的“计算概论”课程,是所有新入学本科一年级学生学习计算机科学与技术的第一门课程。它总括了计算机学科的知识体系,是计算机学科的入门基础。通过学习,学生不但可以掌握计算机的基本工作原理以及程序设计的基本方法,为学习后续课程创造条件;而且可以真正理解计算的本质,提高抽象思维和严格的逻辑推理能力,为将来参与创新性的研究和开发工作打下坚实的基础。
2课程内容体系:立足基础、因材施教、强化实践
2.1立足基础
如何在新入学的大学生中开展计算机基础教育,一直是高校课程设计中面临的一个问题。一般说来,计算机学科的入门基础包括计算引论(Introduction to Computing)和程序设计基础(Programming Foundation)两个部分。在高中阶段,很多学生已经接受过计算机基础教育,如软件、硬件、计算机网络、二进制、文字处理以及基本的操作系统和数据库操作等基础知识和基本的程序设计训练。当然,由于升学及其他方面的原因,不同学生的基础各不相同:有的学生对计算机的基础知识了解很少,有的学会了计算机的基本操作和应用,有的会写程序,有的则掌握了较好的编程技巧,但很少有学生能够真正理解计算的本质。考虑到这些情况,我校“计算概论”课程在内容上融合了计算的内涵和程序设计基础两个方面,让学生在理解计算本质的基础上掌握程序设计的原理和方法,进而提高解决实际问题的能力。同时,我们根据学生的不同层次设计不同的教学班级,满足学生的不同需求,争取让每个学生都能够在本课程中保持“新鲜”的学习,避免了“跟不上”、“嚼冷饭”、“进度慢”等现象。
在课程内容设计上,我们沿着计算机科学发展的主线,介绍从手工计算到机械计算再到现代计算机演变过程中起决定性作用的思想、技术、人物、事件,贯穿整个过程讲述二进制、数据的表示、数据通信、数据的存储与管理、存储程序原理、计算机硬件与体系结构、机器指令和汇编、高级语言、计算机系统软件与应用软件、计算机网络、信息安全等重要的基本概念是怎样构成“计算”的基本内涵的;同时,让学生及时了解当前计算机领域出现的新思想、新技术、新方法;最后系统讲解程序设计基础,使学生掌握程序设计的基本方法,在实践环节逐步提高程序设计的技巧,建立良好的编程习惯,写出规范的程序代码,为后续课程打好基础。
在教学过程中,除了让学生掌握编程语言的语法,理解程序的层次及结构,学会写计算机程序等基本功之外,我们更强调的是对学生问题抽象能力的培养,让学生学习如何把要解决的实际问题用数学的形式表示以及符号化的方法处理。我们也注重训练学生逻辑思维的能力,学习如何分析问题,确定解题思路。此外,本课程还介绍一些基本的、经典的算法知识,例如:递归、贪心算法和动态规划,开阔学生解题的思路。同时,程序的调试也是必不可少的学习内容。
计算机学科发展迅速,知识更新日新月异,直接反映时代的发展特征。为此,我们也在不断根据最新的技术发展对课程内容进行补充和调整,如:针对CPU的发展,我们补充介绍了“多核”的概念;在2007年物理学诺贝尔奖公布时,我们又在磁介质存储原理中补充了“巨磁阻效应(Giant Magneto-Resistive,GMR)”,解释为什么磁盘体积越来越小,而容量却越来越大;针对移动USB盘的普及,我们又深入介绍了闪存存储原理;在软件技术方面,我们把虚拟化、软件即是提供服务等新思想及时介绍给学生;在网络及应用方面,我们也把一些最新技术和应用介绍给学生,如IPv6、P2P、博客等。
2.2因材施教
作为一门面向全校理科新生的计算机基础教育课程,“计算概论”为全校两个层次的学生提供不同模块的教学课程,为“电子信息科学类”专业学生提供“计算概论A”课程,为其他理科专业学生提供“计算概论B”课程。不同层次的课程内容和深度会有所不同;同时,面向不同的专业背景,教学和实习内容设计上也会有不同的针对性。其次,根据学生的基础,实现分班教学:对于“电子信息科学类”类专业,基础好、领悟力强的学生给予实验班教学,大部分学生在普通班学习,为基础较差的学生开设辅导班个别辅导;对于其他理科专业,则分通选课(供各院系基础好的学生选修)、元培班(北大元培学院学生)和普通班(各院系其他学生)进行教学。在同一授课层次的授课内容中,采取基础训练(30%)、综合实践(40%)和创新培养(30%)相结合的培养模式。
本课程课时安排为5学时/周,共90学时(18周),包括课堂教授和上机。基本学时分配为课程讲授3学时/周,上机2学时/周。不同的教学班级,可以根据实际的需要适当调整课堂讲授和上机的学时分配。
2.3强化实践
作为计算机基础教育的第一门课程,我们尤其注重实验教学内容的改革和建设,强调学生真正动手编程训练。除了在课堂上讲解程序设计示例之外,我们还针对“计算概论A”和“计算概论B”的不同实践教学要求,建设了现代化的在线实验教学平台——程序设计在线评测系统POJ(http://acm.pku.edu.cn/JudgeOnline, http://poj.grids.cn,面向“计算概论A”的实验教学)和编程网格系统PG(http:// programming.grids.cn,面向“计算概论B”的实验教学),同时建设了一个能够适合各专业背景的、循序渐进的上机编程题库。利用POJ/PG系统,任课教师可以根据课程进度编排学生程序设计实习内容(包括作业、练习、竞赛等);学生可以通过网络在线提交程序设计的源代码,POJ/PG系统自动验证学生提交的程序并实时通知结果。除了用于教学之外,POJ/PG系统还面向社会开放,吸引了大量程序设计爱好者的参与和讨论,这种氛围是一般教学平台不具备的。此外,我们还会设计一些大型程序设计练习,要求学生以小组的形式,运用在本课程上学到的编程思想、方法和技巧,完成一个综合性的程序设计题目,提高解决实际问题的能力、合作意识和团队合作能力。多年的实践证明,这种在线程序设计验证以及团队协作的实习方式激发了学生的实习兴趣,提高了学生的学习积极性与主动性。
2.4教材建设与选择
早在1999年,许卓群教授和裘宗燕教授就已经为“计算概论”课程撰写了教材《计算概论——叩开通向信息世界的大门》,在此基础上,我们又在2005年出版了新的《计算概论》教材。为了更好地适应教学发展的需要,我们又在2005年版教材的基础上进行了修订,修订后的教材被遴选为教育部普通高等教育“十一五”国家级教材规划选题、中国新闻出版总署重点教材。
为了加强程序设计实习的教学,同时配合POJ/PG系统的使用,2007年由李文新、郭炜、余华山编写(清华大学出版社出版)了《程序设计导引及在线实践》,本教材在叙述中穿插了许多精心编制的思考题,特别适合教师进行启发式教学。同时,许多例题后都会总结POJ/PG系统上的学生在完成该题时容易犯的典型错误,让学生少走弯路。
目前,我们正在编写和“计算概论”理论教材相配套的实验教材《计算概论实践》。程序设计题解是本实验教材的重点内容,将与POJ/PG系统紧密结合,所有例题都来源于POJ/PG系统的题库,与题库的建设思想保持一致,以形成一个有机的教材体系。
裘宗燕教授也为本课程主编和编著了若干辅助教材,包括《从问题到程序——程序设计与C语言引论》(裘宗燕,北京大学出版社,1999)、《计算机基础教程(上、下册)》(裘宗燕主编,北京大学出版社,2000)、《C++语言基本程序设计》(裘宗燕,科学出版社,2003)等。
除了教材编写之外,我们也非常注重向学生推荐国内外其他经典的教材,如清华大学吴文虎教授的《程序设计基础(第2版)》(清华大学出版社)、Gary J.Bronson的《A First Book of ANSI C》(电子工业出版社,英文影印版)等。
3在线实践与在线考核
3.1在线实践
在计算机教学中,实验教学至关重要。为此,我们设计了在线程序设计实习与教学辅助支撑平台——程序设计在线评测系统POJ和编程网格系统PG。POJ系统是以题目为中心的训练系统,主要面向“电子信息类”专业的程序设计练习,同时也面向程序设计竞赛训练和竞赛。该系统提供的训练思维能力和编程技巧的题目形式多样,在全国程序设计竞赛和计算机专业学生中有很深的影响。PG系统是基于POJ系统进行设计和开发的,主要面向更广泛的非计算机专业的基础教学,以课程为中心组织管理题目资源,提供面向不同专业背景的、适合循序渐进学习的题库资源。POJ/PG系统目前共有2000多道题目,很多题目来自ACM/ICPC国际大学生程序设计竞赛,反映的就是工作和生活中的实际问题。
学生可以针对某个题目编写程序并提交,让POJ/PG系统自动判定程序的对错,在几秒之内就可知道对还是错,错在哪里。每个学生在POJ/PG系统上可以建立自己的账号并选课;教师可以在POJ/PG系统上开设课程,布置练习和作业,同时一眼就能看到布置的习题学生是否已经完成,这几乎将教师评判学生作业的工作量减少到零。POJ/PG系统对程序正确性的评判是极为严格的:学生提交的程序在POJ/PG系统服务器端编译、运行,根据POJ/PG系统给出的输入数据进行计算并输出结果,将得到的输出结果和标准答案进行对比,必须一个字节都不差,程序才能算通过,这对于培养严谨、周密的程序设计作风极为有效,而传统的人工评判是难以做到这一点的。通过POJ/PG系统,程序设计的实践性以一种特殊的方式提到了十分重要的地位,不论对计算机专业的学生,还是非计算机专业的学生,都非常适用。
POJ/PG系统都提供了适合教师和学生进行个性化辅导和学习的交流手段:学生之间可以就编程问题进行讨论;学生可以就每一道题目向老师请教;教师可以查看学生的源代码,并对其中出现的问题进行一对一的辅导;教师可以对学生的实习情况进行全面的统计和分析,掌握和了解学生的学习情况及实习效果。POJ/PG系统不仅可以帮助任课教师对一门课程的目的和实验教学进行编排,全面掌握学生的编程能力,并提供个别辅导和点拨;同时激发了学生的学习兴趣,锻炼和提高学生的编程能力,让学生接受教师的单独辅导,强化个人的训练成果。
POJ/PG系统可以减轻任课教师重复的工作量,使其将更多的精力投入到教学活动中;同时更好地帮助任课教师发现和抓住教学活动中的关键时段和关键因素,创造出相对于以往更加具有交互性、更因材施教的教学方式。
3.2在线考核
在考核方面,本课程更多地考察学生的实际动手能力。除了在线实践及上机作业外,期末考试也有很大一部分通过POJ/PG系统完成。这两部分实践考察占总成绩的60%以上(参见表1)。由于实践考核占总成绩的比例较大,因此学生都会主动地加强对自身动手能力的练习。
POJ/PG系统可以防止学生在实习和上机考试过程中的作弊行为,保证实践考核的效果。对于平时的练习和作业,系统可以通过对比学生提交源代码的相似性提示老师对可能抄袭的学生进行检查;在上机考试时,系统可以通过限制IP地址访问,将用户和IP地址进行绑定(即考试时一旦用户在一台机器上登录了系统,则不允许其他用户在此机器上登录,同时也不允许该用户在其他机器上登录)等方式来防止学生之间的抄袭行为。
3.3创新性培养
为了更好地开展创新性培养,除了设置“实验班”、“通选课”、“元培班”进行教学外,我们还经常在POJ/PG系统中部署“竞赛”练习,供成绩优秀的同学练习;同时,对这部分同学进行额外辅导,让他们组队参加学校组织的各种练习赛,鼓励他们为进一步参与到大学生程序设计竞赛中做准备。事实上,北京大学近年来参与大学生程序设计竞赛的成绩不断提高,其中还有一部分同学来自于其他院系。通过这种创新的培养方式,很多其他理科专业的学生增强了对计算机的兴趣,发现和挖掘了潜质,有的学生在本专业后续的研究工作中利用计算机技术,取得了很好的研究结果,有的学生更是在毕业后直接从事了与IT相关的工作。