蔡美玲,张 锦,张丽霞
(湖南师范大学 信息科学与工程学院,湖南 长沙 410081)
近年来,计算机科学技术迅猛发展,推动信息化社会迈向了智能时代。在新的时代背景下,云计算、大数据和机器学习等新技术迅速兴起和广泛普及,特别是“互联网+”和人工智能战略的提出,对于全面具备学习能力、应用能力、创新能力和工程能力的高素质软件工程人才的需求将更为迫切,这对计算机类本科专业知识体系的构建和人才培养都提出了越来越高的要求[1]。然而,高校现有的机制却难以培养出适应变化如此迅猛的外界环境的人才[2]。为此,诸多学者和机构在此方面做了大量研究工作。其中,经过长期实践检验的工程教育专业认证是解决软件工程教育问题的有效途径之一[3-6]。
工程教育专业认证以培养目标和毕业要求为导向,从理论素养、实践能力和个人素养等各个方面对工程专业毕业生都提出了新的要求,同时也对教育工作者进行课程改革提出了新要求:课程建设和改革要紧密联系人才培养目标,课程教学目标要支持培养目标和毕业要求的达成。
工程教育理念要求课程教学以能力培养为目标。工程教育认证对工程类专业毕业生从工程知识、问题分析、设计/开发解决方案、研究、使用现代工具、工程与社会、环境和可持续发展、职业规范、个人和团队、沟通、项目管理、终身学习等不同的方面提出了12条毕业要求。这12条毕业要求对毕业生的知识、能力和素养都提出了具体要求,其中,知识是基础,能力是关键,素养是保障。
另一方面,课程教学也应以能力培养为目标。美国高校在基于发展21世纪能力的课程设计与教学方法研究中提出,教学要“超越书本知识,培养能力和素养”。教学改革的关键之一便是能力的培养。新时代背景下,计算机科学技术发展迅速,很多专业课程涉及的知识和内容更新换代的频率越来越高,很多知识技能来不及也无法通过课程教学一一传授,学生工作后很快就会面临新知识,需要掌握新技能。因此,大学阶段的教育,除了传授专业知识,更重要的是教会学生掌握如何学习的本领,培养学生应用新知识新技术解决专业问题的能力,这样才能使得学生毕业之后无论遇到什么专业问题都能从容应对,立于不败之地,这对有志于从事软件工程类行业的毕业生至关重要。
1)教学内容多。
传统上,程序设计基础基于特定的程序设计语言,例如C语言,为学生介绍程序设计的基本概念和思想(如结构化程序设计)。但由于C语言本身语法复杂且严格,知识量大面广,理解和记忆都不太容易,再想要深刻理解结构化程序设计思想的精髓并灵活运用更不容易;加之,国内外许多教材都有明显的重语法特色,这些原因导致教学时容易陷入“重语法与知识、轻思维与能力”的教学模式,在某些教师看来,把各种概念、各种语法讲解清楚,学生能根据实验指导书完成指定的任务就算达成了教学目标,至于思维与能力的培养和训练全凭学生的自我意识,并不是教学的主要目标。
2)课程实践性强。
程序设计具有很强的工程实践性,实验环节在程序设计类课程中占有举足轻重的地位。经过多年的实践与积累,C语言程序设计的实验已相当丰富,但内容却早已固化,缺乏新意,很多实验局限于对单一知识点的验证,缺乏工程实践的系统性,学生遇到需要灵活运用多个知识点的设计型实验、综合型实验时就不知从何开始。另一方面,随着计算机软件的快速发展和广泛普及,许多学生早就见过用过不少软件,他们已经不满足于简单的Console模式的程序运行模式,尤其软件工程专业的学生更期望早日得到系统化的软件开发训练。C语言程序设计的实践内容能够也应支持系统化的工程能力的训练与培养。
基于C语言程序设计课程的特点,课程在教学实施中自然出现了很多问题,教学效果差强人意,集中体现出能力培养的不足,具体体现在以下几个方面。
(1)学习能力有限。大学新生受限于中学建立的学习模式和环境,习惯了所学的知识来源于教材、课堂和教师,在解决问题时能利用的知识和技能局限于已学过的内容,遇到困难时首先想到的是找参考答案,或是向老师和同学求助,缺少主动学习新知识解决问题的意识和能力。
(2)实践能力不足。例如,不会独立地对问题进行抽象,并应用所学的知识加以解决,不能理论联系实际解决实际问题。经常有学生反映说对教材、对实验参考书中的例题都能理解,但对于需要自主完成的拓展题却不知道如何下手,不懂得规划程序结构、分解问题,甚至对程序设计一片空白。
(3)创新能力缺乏。C语言需要学习的内容繁多复杂,学生苦于消化理解现成的知识和内容,很少质疑教师讲授的内容,更别说提出新见解。在进行实验、完成作业时局限于固定的方法和模式,不能突破原有思维,尝试新思路新方法;没有独立思考、深入钻研问题的习惯,遇到难题时,不能提出合理的解决方案。
(4)工程意识薄弱。体现在命名不规范、代码风格不好、缺少注释、不能合理规划和设计函数、程序可读性差;对开发环境比较陌生,除了少数几个功能,不会灵活设置和使用开发工具提供的其他功能;不能通过编译结果看懂提示,出现运行错误时不会通过调试跟踪程序执行的流程,不能根据变量的值找到错误的原因及纠正错误;在进行课程设计编制大规模程序时不能对系统进行设计和规划,不能对代码文件进行有效规划和组织,不能通过文字、流程图、结构图等形式表达设计和实现意图,表达能力欠缺。
能力培养的忽视对后续课程教学产生了负面影响。学生即使记住了语法知识但并不牢固,不能熟练地将学过的知识应用到新的课程。例如,后续专业课教师反馈:数据结构以该课程为先导课,指针和结构体是其教学内容的前提和基础,但很多学生并不能熟练地基于指针和结构体进行程序设计实践,严重影响了课程实践环节的教学效果。还有的老师反映学生动手编写程序的能力弱,缺乏克服困难攻克难题的能力和意识;更有导师抱怨学生不会查阅资料不能发现问题,学习缺少主动性,或者给定了选题却茫然不知如何下手。
能力的培养对于学生的成长成才至关重要。对以能力培养为目标的课程教学而言,计算机程序设计类课程具有天生的优势。主要原因是因为程序设计本身具有很强的工程实践性,各种能力的培养效果都可以通过程序设计实践进行检验。焦聚能力培养的程序设计基础课程教学改革以能力培养为目标,将课程教学质量的提高转换为学习能力、实践能力、创新能力和工程能力的培养,具体要求见表1。
程序设计基础是我校软件工程专业的第一门专业基础课,其教学质量和教学效果对后续专业课的学习影响深远。自该专业启动“以专业认证理念推进专业建设”的综合教改以来,课程组就确立了以能力培养为目标的课程教学改革思路和目标,强化自学能力、应用能力、创新能力和工程能力等能力的培养,希望以课程教学改革支持专业综合教改,为最终培养适应新时代新技术发展需要,具有扎实基础、较强的创新能力、具备自我提升能力的面向应用的高素质软件工程人才打好坚实的基础。为此,课程组进行了积极探索。
实验教学是程序设计类课程教学的重要环节,对于培养学生动手实践能力至关重要。针对学生“有能力完成实验,但兴趣不足”“要解决的实际问题与理论知识的学习存在较大的差异,不能理论联系实际解决问题”等突出问题,从“模块化”“层次化”“应用型”3个方面重新对实验项目进行科学化设计。“模块化”的实验设置强调对某一理论知识和概念模块的集中训练,“层次化”的实验项目用于满足不同能力层次学生的学习需求,而“应用型”是指实验内容侧重实际问题,要求理论联系实际解决问题。
首先增加实验项目的总量。程序设计的实践性很强,大量的编程训练必不可少。因此,针对某一知识和理论运用设置专题实验模块,强化编程能力的训练。其次,丰富实验项目的层次性。为同一模块设置难易程度、复杂程度递进的实验项目,并借助网上公开的实训平台[7]进行游戏通关式训练。一般的学生强调必须掌握基本的知识和技能,进行部分闯关,而学有余力的学生则可根据自身兴趣和实际水平继续闯关,直至完成该实训模块的所有实验项目的通关。实际教学中我们设置了17个模块的实训,每个实训设计了3~6个实验。此外,在内容编排上注意选取具有实际意义的题目,激发学生的编程兴趣,例如,在学习选择结构时设计了“身高预测”“体型判断”等实验项目;学习循环结构时设计了穷举与递推法专题,解决“最佳存款方案”“篮球弹跳”等问题;还有“二分法求根”“数据拟合”“计时器模拟”等题目。通过将需要检验的理论知识蕴含于实验题设,引导学生理论联系实际,对问题进行分析、抽象、建模、编程,培养学生利用计算机程序解决问题的实践运用能力。
对于软件工程专业的学生来说,从低年级开始就逐步灌输软件工程化思想,可以为后续的软件工程相关课程的学习提前做好准备。
表1 程序设计基础课程中的能力培养目标
C语言是一种理想的结构化语言,在教学过程中穿插软件工程开发相关内容。例如,介绍输入输出时强调用户视角的功能实现;开始编写程序时介绍代码风格,培养良好的编程习惯,介绍程序的可读性、软件可维护性等工程化思想;针对程序排错介绍软件开发工具的使用、程序调试的方法与技巧;在讲授函数时介绍库函数、第三方库,以及模块化的软件开发方法,介绍代码重用、代码托管、代码文件组织等概念;在检验程序运行结果时引入软件测试的内容,介绍一些简单的测试方法,例如边界值法、路径覆盖法等,避免学生测试的随意性,培养学生严谨、清晰的程序设计风格和良好的编程习惯。
此外,教学内容在实践环节引入完整的项目开发案例作为课程设计案例,例如学生成绩信息管理系统、通讯录管理系统等,这类系统开发项目覆盖界面交互、程序控制结构、函数、数组、指针、结构体、文件存储等重点内容,综合性较强,也具有一定的可扩展性。考虑到学生没有任何项目开发基础,在实施课程设计项目教学的过程中,引入相对容易理解的瀑布模型,可由教师指导并协助学生完成项目需求分析、数据模型设计、系统功能规划、函数规划、函数设计与实现、系统调试与功能测试、项目汇报与课程设计报告撰写。通过完整的课程设计项目开发,让学生提前接触软件开发过程,理解结构化和模块化的程序设计思想,掌握软件开发的基本流程,使之具备基本的软件开发能力。
在传统的课堂教学基础上,利用网络智能课堂与综合实训平台[7]构筑网络课堂,开展线上线下混合式教学。实训平台集网络教学管理和编程题在线评测于一体,为知识传授与编程实践提供自主学习的平台与环境。
网络教学管理模块包含资源共享、作业布置与提交、试题自测与评价、提问与交流讨论等功能。程序设计课程内容多、教学课时少、学习周期短,借助实训平台,可将概念性、基础的学习内容发布到网络课堂供学生自学,重难点内容供学生进行预习,扩展性的学习任务供学生选学。课堂教学则以重难点点拨、案例分析、疑惑解答为主。为了检测自学、预习的效果,通过网络平台布置配套练习题给学生自测,并将自测的成绩计入平时成绩;同时,在课中适时进行课堂提问、随堂测试,抽查学生的学习情况,以督促学生坚持预习、及时复习,培养良好的学习习惯。
实训平台的在线评测模块实现了编程题的实时、自动化评测,为学生提供了自主做、自主学的实验环境和机制。围绕课堂教学内容,课程的所有实验按知识模块以实训的形式提前部署在平台上,每个实训包含3~6个编程题,学生以类似游戏闯关的形式在线完成这组编程练习。根据题目的难易、复杂程度,任务说明中还会给出相关的具体知识点或链接、解题思路甚至参考答案。这种实训模式非常利于学生开展程序设计实践的自学。学生在线提交实验程序后可以立刻得到程序是否通过测试的提示信息,进而反复修改程序,多次提交,一直到最后程序通过测试。当实在不能通过测试时,可以阅读提示,查阅资料,及至查看参考答案,以获取解决问题的方法和知识。这种实验模式使得学生即使在课外没有教师指导的情况下也能自主进行实验,学生在实验代码的一次次提交和改错中体会到攻克难关、解决问题的成就感和乐趣,激发钻研新知识、新技能的劲头,培养了自主学习的能力和意识。
传统课堂教学以教师系统讲授为主,保证了学习活动的循序渐进,有利于学生获得系统化的知识、技能和技巧,学习较有目的性和针对性,缺点是削弱了学生的中心主体地位,不利于调动学习主动性和创造性。为此,结合传统的课堂教学,我们探索了案例教学结合问题引导的教学方法。首先教师精心选取和设计教学案例,将知识、方法和技能融入教学案例。案例的设计要兼顾典型性与趣味性,包含一定的计算思维。例如,学习字符输入时的输入缓冲区问题;还比如,学习级联if与嵌套if结构时以百分制成绩转换为等级制成绩作为案例,在考虑分数分布情况时提出程序执行效率问题,由此引导学生研究if语句的执行效率问题;再比如,从一元二次方程根的判别式求法拓展到任意次方程根的二分法、牛顿法;针对结构体数组排序时需要重排数组元素导致的效率等问题,引导学生基于结构体数组元素地址的指针数组进行索引排序,及至外部排序,以及其他排序算法;等等。教学过程中教师以具体、生动的案例作为学习和研究对象,用事先设计的问题进行引导和启示,让学生带着问题去思考和探究,在探究的过程中学习新知识,掌握新技能,发现新问题,探索新领域,潜移默化地培养计算思维能力,培养创新意识。
从2018级该门课程的实验情况来看,全班64人,有17位(26.6%)同学完成了全部实训的所有实验,其中有5个实训包含了选做题和难题;有32位(50%)同学的实验总评成绩在95分以上。在程序设计实验的期末上机考试中,教师给出未曾练习过的3道综合性的实际问题,要求学生在90分钟内独立地上机调试运行完毕,有31位(48.4%)同学在规定的时间内成功通过了所有题目的测试,获得满分。实验模块的成绩体现了相当一部分学生具备了良好的学习能力和实践应用能力。
从课程设计完成情况来看,全班64人,有32位(50%)同学除完成基本要求,还扩展了系统的功能。此外,有些同学对系统功能重新进行了规划,有的同学对界面布局以及交互性重新进行了设计或改进,还有的同学对排序模块进行了优化,等等。从提交的课程设计报告和提交的代码来看,有44人(68.8%)较好地完成了课程设计报告的撰写,结构完整合理,层次清晰,提交的代码格式规范,可读性较好。课程设计模块的完成情况体现了相当一部分学生具备了良好的学习能力、实践能力,具有了一定的创新意识和工程能力。
此外,我们对学生通过一个学期的学习后能力培养的情况进行了自评调查(回收问卷数量52份),结果统计如表2所示。统计结果显示大部分同学对该课程感兴趣,课程学习的收获较大;在能力自评方面,不少学生对自己的程序设计与应用能力表示了认可;会主动或在需要的时候查阅学习资料,遇到问题时会主动寻求解决方法,表现出了较强的学习意识;认为自己对软件开发有一定的认识,编写的程序比较规范;但创新意识和创新能力的培养还有待加强。
表2 能力培养情况的自评统计
工程教育认证背景下,在课程教学中强化能力的培养是课程改革的必然趋势。程序设计基础课程的教学内容具有点多面广、实践性强等特点,非常适合以能力培养为目标开展教学。为此,我们从工程教育要求达成的毕业要求出发,分析课程教学中能力培养不足导致的问题,提出能力培养的教学改革思路,在课程教学中加强学习能力、实践能力、创新能力和工程能力的培养,从优化实验项目设置、在教学内容中增加包含软件工程思想的内容、改革教学方式和手段、改进教学方法等方面探索了能力培养的途径,通过能力的培养提高了教学质量,为学生后续课程的学习奠定了坚实的基础。未来,在该门课程的教学中,还要继续探索更多的途径,贯彻工程教育的理念,进一步落实以能力培养为目的的教学目标。