楼轶超
摘 要: 针对C语言实践教学中存在的问题,提出在C语言课程设计的教学中采用项目驱动的分组教学模式。融合软件工程思想,从项目设计、分组划分、模块化思想应用、编程思想训练、测试、考核方式等多个方面改革实践教学环节,因材施教,使得学生在解决实际问题的过程中,通过分工协作,提高自主学习能力,培养起团队合作精神,从而提高教学效果和教育质量。
关键词: C语言课程设计; 项目驱动; 分组教学; 模块化思想; 协作
中图分类号:G642 文献标志码:A 文章编号:1006-8228(2013)08-65-03
0 引言
当今社会,随着信息技术的高速发展,各种程序设计语言蓬勃发展,如C、C++、JAVA、C#等。在这些语言中,C语言是各高等院校的计算机及相关专业的一门核心基础课程,它的学习效果会极大程度影响学生后续相关课程,如数据结构、操作系统、算法分析以及其他高级语言的学习。
作为一种实践性很强的程序设计语言,C语言课程的教学一般采用理论教学结合上机实践的模式,理论教学以讲授语法和基本算法为主,上机实践则主要练习简单程序的编写,通常以验证性实验为主,以掌握、巩固基础的语法为目的。从教学效果来看,学生虽然掌握了不少语法知识,但在面对实际问题时,往往不能灵活应用。为了进一步拓展学生的实践编程能力,我们学院继两个学期的C语言教学后开设了“C语言课程设计”课程,该课程以设计性和综合性实验为主,重点培养和锻炼学生独立分析问题,解决实际问题能力。根据这一教学目标,我们结合日常教学,针对实践教学中存在的不足,开展项目驱动的分组教学方法,使学生形成自主和协作型的学习模式。
1 教学现状
C语言是一种面向过程的结构化程序设计语言,具有数据类型较多、表达式丰富、语法结构复杂、语法规则繁多等特点,其授课对象往往又是第一次接触程序设计语言的低年级学生,这些都给学生学习和教师教学带来了难度。通过对学生进行教学效果调查,发现在“理论+实验”的教学模式中,由于课时限制等各种因素,实际教学常存在着如下问题。
⑴ 实验训练以知识点训练为主,与实际应用存在脱节。
在理论课后的上机练习,通常是针对特定语法设计,形式上采用练习书上的例子、验证某个语法或者实现一些简单的相关算法,验证性实验占了多数。这种训练模式虽然能够加深学生对各种语法细节的认识,但同时导致的问题是,学生容易孤立地去看待各章节的语法,割裂了各知识之间的联系,在编程时以模仿改写书上的程序为主,欠缺工程型知识,处于被动灌输的学习状态,常常会觉得语法知识点繁琐、内容枯燥,很难调动积极性,当面对实际工程问题时,程序规模一大,就束手无策,无法有机地综合应用所学知识去解决问题。
⑵ 没有形成系统化的分析过程。
由于教学和教材均侧重于对语法进行讲授和剖析,未强调分析及测试的重要性,也没有将软件工程的思想融合在实践教学中,因此,长久以来,学生养成一接触题目就马上开始编写代码的习惯,并且,运行时往往仅按照预先设定的正确的输入数据,去验证自己的所编的程序是否正确。
⑶ 忽略算法逻辑思维能力的培养。
从学习效果来看,学生常存在着两种误区,一种是将参与和获得计算机等级考试证书作为学习目的,这就导致他们习惯于程序填空题形式的编程方式,独立编程能力欠缺;一种是对C语言中的指针、递归问题存在畏难情绪,又认为就业时可以选择其他语言工具如Java来避免这些难点,没有认识到指针和递归的真正价值在于学习它们过程中得到的思维深度[1],忽略了推理能力、抽象思考能力方面的培养。
⑷ 实践操作能力不强。
学生的实验操作能力不强主要表现在对程序运行中一些常见编译问题无法很快做出反应,不会依据提示信息去判断发生错误的原因,对一些运行问题更是束手无策,通常一有问题产生,就转向寻找配套的实验指导书中所提供的正确答案,或者依赖教师指出问题所在,帮忙改正错误。
2 项目驱动的分组教学方法的具体实施
建构主义学习理论认为,个体的认知发展与学习过程密切相关,知识获取是以学习者为中心,利用“情境”、“协作”、“会话”等学习要素,通过意义建构的方式而获得。针对C语言课程设计这一门实践性非常强的课程,我们采用项目驱动的分组教学方法,在建构主义学习理论基础上进行教学设计,以学生为中心,融合软件工程思想,以培养学生的程序设计能力、创新能力、逻辑思维能力和协作精神为主线,通过项目任务引导他们主动学习,去深入理解软件设计思想,并加深对重要知识点的理解。为了将课内实践和课外自学有机结合起来,我们将15个学时的上机实践分为5次,集中安排在5天内,每次上机后留充足时间,要求学生去查阅资料,提升获取信息、解读信息的能力。整个教学过程中,需要在多个教学环节注意改革和创新。
2.1 项目设计
项目的提出是能否调动学生学习积极性的关键。目前随着信息化建设的深入,软件在各个行业都获得了广泛应用,其实际应用领域非常广泛。课程设计应该提供一个良好的学习“情境”,要结合教学目标,来模拟演练实际软件开发过程。项目的设计需要遵循以下几点:①选择学生比较熟悉的领域,贴近学生生活和学习方面的应用,避免选择需要较强专业背景、业务逻辑复杂的应用,例如可以选择学生选课、书籍管理、宿舍管理等,而尽量不要去选择企业人事管理之类的应用。这样可以方便学生理解或完整需求,激发他们用程序去解决现实生活问题的兴趣。②功能上要有层次性,可划分为一般性要求和可拓展性要求,一般性要求指出必须实现的功能,可拓展性要求则指出可以扩展的功能,引导学生去探索和想象,可以方便开展梯队型教学。③从项目的编码实现考虑,要能涵盖C语言中的结构体或联合体等复杂数据类型,体现函数和指针这条主线,以促进学生去综合运用和深入理解这些重要的知识点。
2.2 分组划分
一个软件的开发仅依靠个人力量往往是无法实现的。软件生命周期的各个阶段需要软件小组开发人员协作完成[2],因此,在课程设计教学中,我们采用分组教学模式来培养学生的团队合作意识和团队精神,来充分体现合作与竞争、分层教学与因材施教[3],并且还可以通过帮带方式和组内讨论消化掉一部分问题。分组是否合理、有效,直接影响协作模式能否取得良好的教学效果。在C语言课程设计实践中,我们按照任务量安排人数,学生分为以3-5人一组,按照组内搭配合理,组件平衡原则分配,在分组时充分考虑到学生的个体能力差异,使学生能在交流合作过程中取长补短。分组观点认为组内成员之间的合作关系可以有“头脑风暴”式、模拟课题式、同伴互助式、角色扮演式和组合式[4]。这里,我们可以结合软件开发的分工特点,将角色扮演应用到课程设计的分组中,由小组组长担当开发经理角色,其他人员针对其特长分别担当需求分析师、架构设计师、开发人员、测试人员等角色,根据开发阶段的不同,各成员可以扮演不同类型的角色。
2.3 培养学生用模块化思想对实际问题进行分析和设计
结构化方法强调以模块为中心,采用模块化、自顶向下、逐步求精设计过程。项目驱动的教学要培养学生用模块化思想思考复杂问题,即将程序划分成独立命名且可独立访问的模块,最后装配集成模块完成指定的功能。指导过程中,不仅需要纠正学生一接触题目马上编码的习惯,而且需要纠正学生在main方法中编写所有代码的习惯,这种方式会使得整个函数变得庞杂,代码冗余大,不利于分工协作,也给阅读和维护带来很大的困难。当学生在程序分解主函数和若干个其他函数时,发现常存在着随意分解、随心所欲定义函数的现象,针对这一情况,教师可以先以一个项目为例,如成绩管理系统,演示模块的分解过程,说明内聚性和耦合性要求[5]。在实际项目应用时,要求学生按功能分解,模块内的函数做到功能尽量单一,留出接口供其他模块调用,一个模块对应一个文件,便于分工协作。各小组在完成按模块划分的软件体系结构图后,才被允许进入下一个详细设计编码阶段。
2.4 强化编程思想的训练,加深对重要知识点的理解
算法是程序设计的灵魂,教学中需要成功训练好学生的头脑,使他们变得足够熟练、敏捷和灵活,需要训练学生在多个抽象层次上同时思考问题[1]。因此,实践过程中,要求学生熟练应用程序流程图或伪代码等工具设计算法,在组内展开讨论,比较不同算法实现方案的优劣,以及如何在完成程序的功能基础上,改善程序结构,优化算法,进一步提高运行效率和空间利用率。
对C语言而言,训练学生的编程思想,离不开指针、函数参数传递这些重要概念,是否真正理解这些概念也与能否成为一个优秀程序员直接相关。在学生编码时,可帮助他们建立内存模型,通过跟踪每条语句的执行情况,感受不同数据类型在内存中所占用的空间,直观地观察内存布局变化、变量的生命周期、变量状态的变化等,去深入理解这些概念尤其是指针的本质。
程序设计的另一目的是要培养学生的操作能力,其中很重要的一点就是提高调试能力。调试的方便与否与程序书写风格密切相关,学生通常不注意代码的规范化,出现没有层次缩进,标记符随意命名、词不达意,也没有必要的注释等现象,这些给查错和阅读带来了很大的不便,不利于分组模式下的协作开发和维护,因此,实践教学时应该培养学生注意良好程序风格。此外,教学时还需纠正部分学生写代码一写到底的习惯,让学生认识到程序的编写是一个调试-修改-调试的反复迭代过程,要在多次错误或失败中获取调试经验。在学生出现错误时,要引导学生根据错误和警告信息,分析辨别是语法错误还是逻辑错误,并鼓励学生使用调试工具,应用断点跟踪和对分查找等调试方法,去主动地发现和解决问题。
测试在软件开发中占重要地位,软件测试的工作量往往占软件开发总工作量的40%以上。从学生实践情况调查来看,测试往往是初学C语言的学生特别容易忽略的,普遍出现一些诸如不重视人机交互界面设计,没有输入提示或出错提示信息,仅使用在预定范围内、满足预定格式要求的正确数据进行测试等问题。项目驱动的教学尤其应该注重培养学生的测试意识,指导学生学会设计简单的有效测试用例和无效测试用例,并开展组内测试和组间测试,以提高测试效率和质量。
2.5 考核方式改革
对不容易理解的常量、变量和语句有注释\&5%\&函数、变量取名较规范易懂\&5%\&函数功能是否满足功能内聚\&15%\&调试手段\&会单步运行到任何一个语句,查看变量值\&5%\&会断点调试\&5%\&总结报告\&用流程图或伪代码描述一个函数的算法\&10%\&有小组分工情况说明和各自的经验总结\&5%\&语言简练,条理清楚,图表规范,附程序清单\&10%\&]
分组形式的课程设计需采用弹性考核机制,个人考核、组内考核和教师考核有机结合方式。课程设计考核成绩=个人自我评价(15%)+组内评价(35%)+教师评价(50%)。自我评价是促进学生反思的一种有效手段,组内评价可以观察学生组内交流协调时有没有突出表现,而为避免少数学生抄袭实验报告,教师评价采用答辩形式,考核学生的实际操作能力、对数据结构设计和算法的理解程度,以及功能和算法上的应用亮点。考核的具体内容和评分标准可以多元化,比如对一个用链表实现图书信息管理系统的项目,可以按表1来指定具体考核标准。
3 结束语
本学院的C语言课程设计教学实践表明,通过项目驱动的分组教学法的实施,能充分调动学生的学习积极性,学生的编程逻辑性和实践能力都得到了明显提高。在模仿实际开发环境过程中,学生对项目开展的整个流程和各环节的具体要求程有了切实了解,积累了一定的项目开发经验,培养起了团队协作能力。为了能更好地提高学生实践能力,为他们将来从事软件开发工作奠定扎实基础,我们还需要在今后的实践教学中继续开拓和探索,以期达到更好的实践效果。
参考文献:
[1] Spolsky J. More Joel on Software: Further Thoughts on Diverse and Occasionally Related Matters that Will Prove of Interest to Software Developers, Designers, and Managers, and to Those Who, Whether by Good Fortune Or Ill Luck, Work with Them in Some Capacity[M].Apress,2008.
[2] Brooks, Jr. Frederick P., "The Mythical Man-Month", The: Essays on Software Engineering[M]. Anniversary Edition, 2/E, Addison Wesley,1995.
[3] 时贵英,刘华蓥,李瑞芳.分组协作教学模式在程序设计课程中的应用[J].长江大学学报自然科学版:理工卷,2010.3:704-705
[4] 赵琦.分组教学的形式及指导方法.http://www.edu.cn/20010827/208389.shtml.
[5] Lawrence P S, Pfleeger S L, Atlee J M. Software engineering:theory and practice[M].Pearson Education India,2006.