从错误中成长:工程教育认证视角下程序设计能力培养
2021-03-24李环宇林晓霞徐燕妮李保银
李环宇,林晓霞,徐燕妮,李保银
(山东科技大学智能装备学院,泰安271000)
针对程序设计课学习效果欠佳的情况,分析学生在学习过程中遇到的细节处理能力差的情况。以工程教育认证为契机,提出反向利用错误程序,以学生为中心,让学生自主分析错误程序,分析错误发生的原因,总结编程规律,达到提高学生综合素质的要求。
工程教育认证;错误程序;设计细节;反向利用;素质提高
0 引言
《C程序设计》是中国高校理工科类各专业普遍开设的一门基础课。《中国高等院校计算机基础教育课程体系》在2006年、2008年以及2014年三次调整相关课程时,一直将其列为中国大学生计算机教育的基础课程[1],这也从侧面印证了该课程在中国大学计算机教育中不可或缺的基础性地位。
但是众所周知,C语言的程序十分繁琐,大多数学生是在大一刚入校的时候开始学习该课程,对程序设计的概念相当陌生,算法基础几乎为零,所以在理解有关语法、程序结构时会感觉吃力,容易产生抵触心理,主动去理解、探索程序设计的内在规律就更为困难,因此及时有针对性地解决程序设计教学中凸显出来问题一直是相关专家和任课教师重点关注的研究方向。
1 程序设计教学研究现状分析
很多专家学者对改进C语言的教法进行了积极有益的探讨和改进,例如:针对学生虽然记住了简单的语言知识,但却不知道总体如果布局下手编程的问题,柴群提出了“五步编程法”,指出了一个“编程路线图”,让学生在编程过程中有路可循[2];算法是程序的灵魂,离开了算法,编程就像没有明灯指引走夜路。安广勇老师提出了以“数学算法为基础的编程技巧”[3],深入剖析数学算法在C程序设计中的指导性作用;杨琴等人提出基于“互联网+”平台下载翻转课堂教学改革,目的是增强学生学习的主动性,提高课堂教学效率,使课堂教学更有针对性[4]。综合各种教改成果,这些改革的思路侧重于系统化的改革,对于程序设计教学过程中的细节涉及不多。
另外,近年来,随着新工业革命时代的到来,与之相对应的工程教育认证蓬勃发展。早在2013年,同济大学副校长陈以一教授就在教育部人文社会科学研究专项任务项目中指出了新工业革命对工程教育的影响,并且提出了在新工业革命背景下工程教育改革的新课题,例如专业整合、课程重构、学习模式变革等[5]。工程教育认证强调教学“以学生为中心,产出为导向,持续改进”的标准。以此为标准,许多教师也提出了自己的教学思考,例如蔡美琴老师提出在教学内容上需要重构,在学生“怎么学”上,要要充分发挥学生的自主性、能动性和创造性,提高学生的参与度[6]。凡此种种研究成果,本文不再赘述。
2 程序设计教学中问题分析
按照工程教育认证的标准,要使学生主动参与,提高整体素质,能够着手的地方很多。“细节决定成败”。本文拟从提高设计细节角度来谈谈设计综合能力的提高。
2.1 设计细节能力对学生是影响
设计中需要关注的细节很多,“转化”能力就是设计细节中容易被忽略,但却又是一种不可或缺的基础性能力。文献[7]以介绍“打擂台”法为“铺垫”,“转化”为选择法排序,降低了理解算法的难度。不过在实际的教学中,即便是学生对题目的算法、程序设计步骤都已经非常清楚了,在具体编程实现过程中,仍面临着“转化”的问题,“转化”能力较差,就会产生了一系列编程错误。这类错误无论是从教师角度看,还是从学生自身角度看,都好像是浅层次的问题。但是此类错误一而再,再而三的出现,就成了系统性问题,需要重点关注和解决。从这类问题实际产生的影响看:一是降低了学习效率,因为学生总是在低层次问题“徘徊”;二是打击了学生的自信心和学习的积极性,因为这种问题一般出现在学习的入门阶段,反复出现的此类问题,好像是掉入了“错误的海洋”,由此影响学生的学习热情。
2.2 设计细节能力较差现象的分析
教师在指导学生编程时,一般是先分析问题,得到一个具体的算法,然后用流程图、伪代码等算法语言把算法表达清楚。下一步,就是学生把前面得到流程图或伪代码等算法“转化”为符合C语言语法的程序了。但就在这个以“转化”阶段为代表的细节处理,在具体实现算法的这个环节就出现了各种各样的问题。以“转化”环节来说,细节处理出现的问题主要体现在以下几个方面:
(1)数学公式转化为合法C语言表达式的能力较差。
在编程过程中,有很多数学公式需要转化为C语言的表达式。例如编程中常用到的一元二次方程的两个根。学生基本了解要把求根公式分解为两部分:p=但在实现p或q的时候,编程就出现了“转化”错误。以实现p为例,学生常犯的错误经常是:
(2)对基本概念转化为具体语句的能力差
这类问题经常出现在选择结构和循环结构中。例如算法描述:“if a>b,将a和b交换”。实现语句为:if(a>b){t=a;a=b;b=t;},该语句实现了一个选择结构,其中使用了“复合语句”这个概念,但初学者往往把“花括号”忘记,导致程序可能出错。
(3)从算法语言到合法C语句的转化能力差
该类问题很多,例如闰年的表示问题,涉及到关系表达式和逻辑表达式的综合应用。素数问题,算法本身不复杂,但涉及到循环的正常结束与非正常结束的问题。在遇到这种上述算法时,学生们经常是算法明白了,但仍然是写不出正确的程序。
(4)对具体问题中已知条件转化为函数参数能力较差
函数的定义和调用是学习C程序设计中的难点。具体到函数参数的设置,学生更是屡屡出现问题。究其原因:是学生不了解参数的本质是解决一个问题的已知条件,不是在程序设计过程中用到过度变量;从表现形式上说,不清楚已知条件的表达方法,特别是涉及到数组和指针作为函数参数的时候。
凡此种种的“转化”过程出现的问题,其实是的细节处理能力薄弱的表现,实质是都是编程能力低下的具体体现。错误的细节处理必然产生错误的程序。因此细节处理能力差就是编程能力差。而基于工程教育认证模式下,尤其重视能力的培养。编程能力差,尤其与以目标为导向的工程教育认证原则相背离。
3 程序设计细节处理的方法探讨
3.1 程序设计细节处理能力提高的基本思路
上文提到的细节处理能力不足,主要的自主学习能力和实践能力不足所致。解决这个问题的传统方法是强调正面引导,强调正确的转化过程。当学生出现错误时,就告诉学生,你的程序错了,然后告诉他正确的应该是怎样的。而对学生编程过程中出现的错误案例(错误程序)反而重视不够,忘记了“教训”本身也会在学生成长过程中扮演重要的角色。
文献[8]就提出重视错误程序的观点,并引用了ACM计算机教育专家Robert M.Panoff博士在SIGCSE 2014大会所作的主题报告中提出一个鲜明观点:“Right Answer=Wrong Answer+Corrections”(正确答案=错误答案+更正)。因此重视错误程序,从中发现错误发生的规律可以从反向提高学生的编程能力。
交互式学习在20世纪70年代就已经提出,它强调以学生为主体,注重教育者与学习者之间的平等交流和自由互动[9],与工程教育认证的以学生为中心的思想是相同的。根据程序设计课程的教学和学习特点,在面对学生的错误程序的时候,通过交互式双向讨论的方式改正学生的错误,采用了以下的教学环节。
(1)收集学生的错误案例
教师应该在日常教学工作中,注重发现学生在编程过程中所犯的错误程序。为了能够使各种错误程序有代表性,应该对错误程序进行分类,使每一类错误程序都能代表某一个方向性问题,提高教学效率。
(2)对学生进行分组
根据学生的编程水平,对学生进行分组。每组人数不宜太多,以四到五为宜,让每个学生在这个小组中都有具体的任务。小组人员组成水平最好有层次之分,以层次较高的学生带动较差的学生。
(3)教师分配讨论任务
教师将不同类别的错误程序分配给不同的学生组。为了提高下面在课堂讨论时的效率,每个小组分配的题目尽量的不同,但是每个类型的错误程序都要有。分配讨论时机应与课堂正面教学相配合。
(4)学生按照分组讨论并记录总结
学生分组讨论可以在自习期间,也可以再自建微信群或QQ群中讨论。把讨论发现的程序中的错误记录下来,并分类保存形成文字内容。讨论时的内容既可以包含语法细节,也可以包括宏观算法思路。特别是算法思路,程序可能并没有语法错误,仅仅是逻辑错误,与预定的结果不符。这样的情况可以鼓励学生将各自的想法程序化,然后运行看结果,然后从结果倒推错误成因。
(5)教师引导启发
学生在讨论的过程中,教师应该适时的加入讨论,可以提高学生讨论的层次,并将讨论引入更宽的视角,点出所涉及问题的难点并对相关知识进行适当的拓展。
(6)课堂总结归纳,学生撰写本次差错报告
在整个教学环节中,课堂总结是交流讨论的收尾阶段。在这个阶段,教师在课堂上要对各个小组的讨论结果分别进行总结。教师应该站在更高的层次上,把各个小组的讨论结果背后的知识点进行串联。经过这个阶段,对相关知识点从正反两个方面进行强化。经过强化串联之后,学生应该能从宏观和微观两个方面对知识进行掌握,学会从局部到全局的学习方法。
3.2 程序设计细节处理能力提高的使用范例
本文采用的案例是笔者在教学过程中遇到的真实案例,错误程序片段以照片的形式原样呈现,如图1所示。原题目要求编程完成数学上的一个分段函数:
图1 错误程序段样例
将该错误程序提供给学生讨论。学生容易发现两个错误:首先,“y=5x”这个错误最容易被发现,很显然与“y=-5x”这个句子不一致,形成对比,当然从表达式的组成的定义也容易判断;其次,“x=0”这个错误的发现困难些,主要原因是数学概念对学生的影响太大了,学生对两种话语体系区别还体会不深。
如果教师不介入讨论,很多时候学生发现的错误就到此为止了。教师在这个时候的介入就可以拓展学
生的思路。例如可以向学生提出该程序整体的结构是什么?当笔者给学生提出这个问题的时候,部分学生误以为这是if语句的三分支结构呢!而没有意识到这是连续使用了两个选择结构的顺序结构,并且第一个选择双分支选择结构使用的还很不规范!
在课堂总结归纳阶段,可以首先总结学生们发现的错误,其次应重点介绍隐藏比较深的逻辑错误,编译阶段发现不了,但实际上算法是错误的程序段。另外不良的编程风格也应该及时给学生指出,例如图1中的第一个双分支选择结构,是一个不规范的用法。此外编程风格不好,例如本例中代码没有形成缩进。最后学生将本次差错的心得各自写成文字保存,方便以后查询,逐渐改正错误,形成良好的编程习惯。
上述过程不是一劳永逸的,应该在发现新问题时,反复执行。具体的讨论形式也应该与时俱进,不断巩固发展,这也是工程教育认证本身所要求的。
4 结语
本文分析了学生在编程细节处理方面出现的问题。基于工程教育认证的编程能力的培养,需要正面的引导和教育,也离不开对错误的反向思考。因为在学习编程的过程中,避免不了犯各种各样的错误。要对每一种错误进行分析,分析错误发生的原因以及避免错误发生的方法。放弃对错误的研究,意味着失去进步的一个途径。通过让学生自己对典型编程错误分析和总结,可以起到事半功倍的效果,加深学生对编程的理解,提高学生编程的能力。