李胜华,李 念
(湖北大学 数学与统计学学院,湖北 武汉 430062)
信息与科学计算专业培养具有扎实的数学基础、较高数学素养和创造才能,具有较强的算法设计分析编程能力,能用所学的理论知识、方法和技能解决信息技术或科学工程计算中的实际问题[1],从事数学应用研究、信息技术、程序设计和软件开发的创新研究型、应用型、复合型优秀人才。在这种“厚基础、宽口径”的人才培养理念及当今IT 行业高素质人才持续紧缺的情况下,计算机程序设计素养、算法设计能力、计算机应用能力的培养尤为重要。
信息与科学计算专业的高级语言程序设计课程在大一年级开设,但由于在低年级开设了大量的数学专业基础知识,后续也没有开设直接应用程序设计的计算机类课程,导致学生课程学习时间投入不足,实际训练不足,相当一部分学生只是应付课程学分,计算机程序设计能力较弱。另一方面,信息与科学计算专业的学生由于对数学基础知识的重要性认识不够,导致学习兴趣不大,数学与计算机有效融合比较困难。近些年许多高校为提高程序设计能力对计算机程序设计类课程及数学课实践课的教学改革进行了广泛的研究。文献[2—3]针对计算机专业类提出教学改革:文献[2]构建计算机软件设计类课程群(14 门课),文献[3]提出程序设计基础、数据结构、算法设计与分析和组合数学等4 门课程整体优化的教学改革。文献[4—7]分别研究抽象代数、运筹学、密码学和离散数学的教学实践。
根据计算机能力的培养目标,计算机程序设计类课程在大学各专业的开设情况按计算机相关专业、信息类专业和其他专业可分3 类。表1 列出了湖北大学4 个专业开设程序设计类课程的情况,可以看出计算机类专业的程序设计类课程多且直接应用于较多的其他专业课程;信息类专业的计算机程序设计类课程除高级语言程序设计外,还有几门核心课程:离散数学、数据结构和算法设计与分析等;其他专业一般只开设一门高级语言程序设计课。
对比计算机类专业,信息与计算科学专业的数学基础课设置较多,表2 列出了湖北大学信息与计算科学和计算机科学与技术两个专业数学类课的设置情况。
信息与计算科学专业的计算机算法、程序设计能力的要求与计算机类专业类似,但高级语言程序设计入门课没有很多直接应用程序设计实践的相关课程,且低年级数学基础课程较重,课外没有过多时间参加项目实施,导致相当一部分同学存在计算机程序设计知识不系统,用计算机程序解决实际问题的能力训练不足等问题。另一方面,数学课的实践课目前主要是使用Excel、R语言、Lindo、Lingo、Matlab、Mathematica 等专用数学软件,直接用C 语言程序设计的很少,且课程间的实践方法联系少。
信息与计算科学专业基于程序设计能力、专用软件应用能力及软件开发能力,分别开设3 门对应的入门课——高级语言程序设计、数学软件与应用和面向对象程序设计,并和后续相关课程组建了对应的课程群。程序设计类课程群包括高级语言程序设计(C 语言)、初等数论、知识实习、离散数学、数据结构、抽象代数、算法设计与分析、课程设计、运筹学、计算机密码学等10 门课程。这10 门课程的设定考虑了知识的逻辑性、功能性及时间的连续性,它们按培养目标分为三大类:①与程序设计直接相关的课程,旨在循序渐进培养专业的计算机程序设计能力;②在课内可以进行程序设计实验的理论课程,旨在训练程序设计应用专业知识能力,增强对理论知识的理解;③在课外进行实践的课程,旨在培养综合专业应用能力。表3 列出了各学期开设的相关课程及对应目标类别。
表1 三类四专业计算机程序设计类课程开设情况
表2 两专业前4 学期数学基础类课程开设情况
表3 信息与计算科学专业程序设计类课程群
程序设计能力的培养分入门、简单应用、提高和高级应用4 个阶段。程序设计语法及应用的教学内容循序渐进地分布在课程群中,详细内容见表4。
在高级语言程序设计这门课,一方面要把前学期计算机基础课提到与程序设计相关的基本知识落实,另一方面要掌握C 程序设计的基本语法、程序设计思维及初步的算法设计。
表4 程序设计语法及应用教学内容分布
相关的计算机基本知识包括:计算机语言、数据内部表示及整数的进制转换等。
C 程序设计基础知识包括:C 语言程序的基本框架、基本数据类型、三大控制结构、数组、函数、用户自定义型等内容。
一些简单基本问题的算法设计:进制转换、顺序查找、折半查找、选择排序、冒泡排序、最大公因子等。
为了锻炼程序设计能力及后续课程的需要,高级语言程序设计课程之后开设了初等数论、知识实习两门课程。该两门课程中的实践和实习中要求学生能用C 语言解决已学数学理论中的基本问题,如:矩阵类、行列式类、整数类等的实现。矩阵类的相关操作有输入、输出、加运算、减运算、乘运算、是否对称、求鞍点等;行列式类的相关操作有输入、输出、求值等;整数类的相关算法有判断素数、质因数分解、不定方程及同余方程求解等。
对上述问题的实现一方面重点学习、理解、应用高级语言程序设计课程中提到的二维数组、二重指针、函数、多文件等语法内容;另一方面对后续课程数据结构的入门及计算机密码学的实践有很大的帮助。
离散数学研究离散变量的结构及相互间关系的数学学科,在计算机学科与技术有着广泛的应用,是提高程序设计质量的必备学习基础。教学内容主要有集合论、数理逻辑、图论、代数结构等部分。在集合论、数理逻辑可设计一些程序设计应用实验来提高学生的学习兴趣;图论和代数结构部分注重理论教学,提高学生抽象思维和严格的逻辑推理能力,为后续设计、开发工作打下坚实的基础。
数据结构是研究非数值问题中数据对象、关系及其操作的专业核心课程。它的教学内容是常见数据结构(线性、树、图)的抽象、实现,以及两类常用操作(查找、排序)的算法及分析。通过该课程的学习,学生可熟练掌握C 中函数、指针及结构类型的应用,还可使用C++的一些简单语句及标准类文件。对于非线性结构“图”“树”章节,有了离散数学课程的理论准备,重点应放在数据类型的表示及算法实现和分析上。
算法设计与分析主要介绍常用算法设计技术及算法分析方法。基本设计方法有递归与分治、动态规划、贪心法、回溯法、分支限界法等5 种;算法分析主要掌握时间复杂度、空间复杂度的理论分析方法及算法分析的实验方法等。算法实例一部分来源于经典基本问题,另一部分针对现实生活热点问题。有了前面数据结构中C++简单语法的渗透,此门课中的算法用C++实现,应用C++中的STL 及Algorithm 库。
抽象代数主要研究群、环、域等代数系统的结构。有了数据结构及程序设计语言的基础,对每种代数系统都可选择特例设计实现作业。例如,n元对称群Sn、模n剩余类环Zn、有限域Fq(q=pn,p为素数)等。设置这些作业极大提高了学生学习理论的兴趣,更重要的是锻炼程序设计应用能力,并且为后续的密码学实践搭建了平台。
运筹学是运用数学方法,对需要进行管理的问题统筹规划,做出决策的一门应用科学。它的教学内容中的动态规划、图论、搜索论等在前期课程离散数学、算法设计与分析中涉及,在此门课中这些内容一方面理论方法性更严密,另一方面应用性也更具体。本专业学生有了前面学习的基础,这些算法掌握相对容易,重点可放在实践性上,对实际问题的解决提供决策性的意见。
计算机密码学课程的理论性和实践性都很强。可设计古典加密算法、RSA 加密算法、AES加密算法等实验来锻炼学生程序设计中数据位的处理能力及接触初步的高性能编程。
上述3 门课的实践,信息与计算科学的学生可先用C 语言完成来帮助理解算法,然后自学专用软件快速应用算法解决实际问题。
课程设计是一门单独综合性实践课程,主要培养学生综合掌握并运用专业知识的能力,突出学生的探索性、创新性和完整性。学生分组指派导师指导,各自完成设计作业的定题、实现、总结分析及报告成文。
互联网+时代,混合式 (“线上”+“线下”)教学成为必然。清华学堂在线、中国大学慕课优质在线课程、网易公开课等平台重点高校优秀专业团队制作的相关精品课程都是很好的教学参考。成熟的在线评测系统是学生提高程序设计能力的训练场,例如:北京大学在线测试系统(POJ)、浙江大学的程序设计类实验辅助教学平台PTA 和在线测试系统(ZOJ)、杭州电子科技大学在线评测系统(HDOJ)等。课堂学时有限,老师在课余时间通过网络通信工具加强与学生沟通交流,及时答疑解惑。引入了网络资源,极大地拓展了学生的学习和交流空间,激励了学生的自主学习能力。
课程群的课程有联系,更有区别。在课程入门时需选择合适的案例用对比方法让学生快速了解该区别。由于是入门课,案例要通俗易懂,用类比和对比引导学生分析问题,最后概括总结。
算法和数据结构是程序设计两大重要方面,为了让学生快速清晰体会两者的区别及算法设计方法的重要性,设计“求Fibonacci 数列1,1,2,3,5,8,……中的第n项f(n)”案例。利用f(n)满足下面递归关系可设计下列3 种函数。
这3 个函数在C 程序设计中陆续都提到过,但当时强调的是对应语法知识点:fib1 主要体会循环体中的工作部分和修改部分,fib2 主要理解数组的使用,fib3 主要学会递归函数的使用。此次课集中这3 种函数重点是分析对比数据结构和算法:fib1 用3 个整型变量,算法技术属模拟法;fib2 用1 个整型数组(n 个整型变量),算法设计技术属动态规划法;fib3 不需要中间数据,算法设计技术属递归法。fib2 对比fib1,由于数组的利用,使得算法表达更清晰;fib2 对比fib3,本质上是算法设计的区别。为了对比算法效率,在main 函数中分别调用这3 个函数,并用clock()函数统计各自运行时间,看到的现象是fib2 与fib1 用时差别不大,fib3 用时较多;且随着n 的增大,这个差别越明显。可以得出结论,算法fib2 求解Fibonacci 问题较好。
通过这个简单例子,用对比方法既让学生快速了解该课程和前课程的区别与联系,又见识动态规划、递归法算法,体会算法选择的重要性。
相互作用教学法[8]充分利用学生之间、学生与教师之间及教师之间的信息交流。整个的学习过程是学生积极参与的,相互促进协同学习的。课堂上老师根据知识模块引导学生探究,对不同层次的学生设置对应参与环节,充分调动学生学习积极性,相互学习相互进步。对于高级应用作业,难度较大,学生精力时间有限,相互作用的教学方法会做到事半功倍。老师先公布选题系列,学生分小组定题,然后在老师指导下分工协作完成,最后小组汇报总结,学生参与评价分析。这样,每个组看似只做了一两个作业,但通过组间交流,课堂上10 个作业都掌握了,并且由于是公开报告演示成果,自己组的作业也会尽力做好,团队协调合作能力也得到了锻炼。老师间的交流有助于知识衔接处理且充分了解学生学习基础,以便后续教学。
课程成绩考核一般分为平时、期中和期末3 部分,平时有课堂表现、作业、考勤等方面组成。原来偏数学的课程考试形式就是笔试,实验只是为了提高兴趣,能验证完成即可,对成绩几乎不影响;偏计算机的课程实验成绩主要为实验报告+题库抽题测试,记平时成绩。建立课程群后,我们加大了实践的考核:原来偏数学的课程的实践要作实验报告并记入平时成绩;计算机类课程的实验单独开课,成绩由实验报告、项目演示和在线测试几部分构成。
实践的考核方式决定学生的学习方法,实践作业大多是开放性的,容易让学生应付,从而造成老师评价比较困难;过于依赖在线测试平台会造成学生大量重复刷题应付考试,但程序设计能力并没有提高,也扼杀了创新性。单独开课后,实验报告更规范并有选择地进行口头报告及演示,给学生更多展示机会并可以相互评价;平时练习借助在线测试平台,系统统计学生的行为作平时成绩依据;考试也是利用在线测试平台,但要增加知识点要求,评判方式是机器实时评判与老师评断相结合。机器实时评判是时间和结果上控制,老师评断主要看代码的质量及知识点的要求是否达到。这种测试方法比较准确反映学生的真实水平,便于改进教学。
老师应在实践课的考核方式上探索多元化,挖掘学生潜能,发挥学生能动性。高年级的实践作业大多是综合性的,为了鼓励学生合作、创新,我们设置多种考核方式,充分发挥学生的积极性。除了基本考核要求外,特色加分项有以下几类:项目大作业、在线竞赛、实验分析报告等。这些项目的设置让不同特点的学生充分发挥了自己的特长,真正做到学有所用。
组建程序设计类课程群,课程间的衔接教学研讨实施了近3 年,信息与计算科学专业学生在程序设计素养及能力有了显著提高,学生学习兴趣大增,发挥专业优势较明显。近两年本专业参加数学建模大赛人数都超过本班人数1/3,在全国大学生数学建模竞赛、美国大学生数学建模竞赛与交叉学科数学建模竞赛中有多名学生获奖;在校企实习基地本专业动手能力明显优于应用数学专业,学习新知识的能力很强;信息与计算科学专业的本科毕业生2017 至2019 三届就业率都达到了95%以上,且专业相关度较高。通过组建课程群,老师们打破了传统的系、教研室的束缚,围绕学生的综合能力培养进行相互学习合作,提高了人才培养质量。下一步,我们的主要任务将是探讨学生的专业、应用能力的科学评价。