论文部分内容阅读
摘 要:复杂软件能力培养是计算机科学与技术专业和软件工程专业的一项核心任务,特别是在工程教育认证背景下,更加凸显了其重要性。软件能力内涵丰富,涉及需求、设计、实现、测试和维护等多维度能力。依托作者团队所负责的本科生“面向对象设计与构造”课程,对复杂软件能力的内涵进行了梳理,并提出了一种大小周期相结合的实践教学方法,其中大周期强调实践作业间的迭代,小周期强调一次作业中的过程控制。最后,通过实际教学所收集的数据,对该教学方法的应用效果进行了初步分析。本文所研究的方法适用于软件开发类课程,同样也对工程实践类课程具有参考价值。
关键词:软件能力;能力培养;实践教学方法;能力度量;软件开发
一、复杂软件能力内涵
随着计算技术在人类社会中应用深度和广度的持续扩大,软件的重要性日益凸显,围绕软件开发方法与技术的教育也逐渐成为大学计算机相关院系的重点关注内容。软件开发类课程是计算机科学与技术专业以及软件工程等相关专业本科生教学体系中的重要组成部分。计算机相关学科本质上具有很强的工程性要求,以解决实际工程中的问题作为重要目标[1]。近年来,随着工程教育及其认证的推广[2],传统面向知识点的软件开发类课程教学设计已经不能满足要求,必须面向能力培养目标开展实践式教学,从而适应软件产业快速发展对新人才的需求。
软件能力是关于如何在规定时间内、按照一定的规范开发出满足相关要求的软件的能力。相关要求主要包括软件需求、设计与实现的要求、运行平台要求、开發语言和质量要求等。本文所讨论的则是一种更高形态的软件能力,称之为复杂软件能力,即使用工程化方法,开发具有一定复杂度的高质量软件系统的能力。为什么要强调工程化方法、复杂度和高质量?其主要原因来自于软件已经越来越多地应用于国计民生关键领域,一旦出现质量问题,将引起严重甚至灾难性后果。工程化方法强调培养学生综合分析软件功能和性能相关约束的能力,从而能够综合考虑相应约束给出设计方案和实现代码,并能使用测试和推理分析等手段进行综合验证和优化。工程问题的复杂度在一定程度上决定了工程化方法实施的难度和必要性。越是复杂的工程问题,就越需要使用规范的工程化方法。从教学角度来看,工程问题复杂度强调软件开发的要求来自于有一定规模的真实系统背景,而且有明确的质量和进度要求。质量决定了一个软件的生命力和价值。如果一个软件的质量不能满足,轻则导致无法满足用户的要求,重则导致计算机系统甚至更大范围的系统运行失效,进而可能导致安全问题。因此,如何在开发过程中通过技术手段来表明或论证所开发软件满足相应的质量要求也是一种重要的能力,对于培养学生的质量意识和质量控制能力具有重要意义。
本文以复杂软件能力培养为目标,基于其内涵分析,提出通过大小周期的实践来实现复杂软件能力的培养,并通过实践教学过程中的数据收集和跟踪分析,来度量学生的能力形成状况。
二、问题定义
复杂软件能力的核心是应用工程化方法来解决带有实际工程背景的问题。软件开发类课程的核心目标是培养针对给定要求开发相应软件的能力,其主要手段是通过具有一定工程背景的实践训练。开发要求一般包括软件需求、设计要求、质量要求、时间要求等,而开发涉及开发模式的选择、开发过程的控制等。本文所关注的软件开发类课程的课程实践与目标能力之间的关系如图1所示。
课程须达成的目标能力可由目标能力的达成度进行度量,以课程知识点与课程实践训练为实现途径。由于学生不可避免地存在个体差异,在课程实践训练的设计中还需要考虑学生基础能力掌握情况以及课程所在学期的相关课程设置情况。
我们强调如何面向复杂软件能力这个目标来设计实践教学方法,包括实践训练内容及实践过程控制。实践训练内容通过覆盖课程知识点来达成训练目标,实践过程是完成实践训练内容的具体活动流程。将软件开发类课程实践过程f定义如下。
输入:Input={能力目标、课程大纲};
输出:Output={与课程大纲同步的作业训练设计、作业控制活动流程};
约束条件:Constraints={满足课程大纲与能力目标的支撑关系}。
工程教育专业认证强调能力的形成性培
养[3],即要求通过过程(即系列化的任务训练)来逐步让学生掌握所教授的方法和技术,从而形成相应的能力。从课程大纲以及课程大纲中总结提炼课程知识点,形成知识点集合K={k1,…,ki,…,kn}(1≤i≤n)。对于每个知识点,可由过程定义得到相应的课程实践活动序列f={f1,…,fi,…,fn}(1≤i≤n)。依据前文中对于软件能力的内涵分析,课程实践活动fi中设定的任务必须满足工程教育对于能力培养的要求[4]。首先,实践训练需要有明确的功能要求。其次,从能力培养角度看,要给学生树立工程质量观,不满足质量要求的软件不能作为交付物移交给工程客户[5]。因而在课程实践中要求提交的代码满足软件的质量特性,如响应时间、鲁棒性等,并且在实践完成过程中强调设计原则、设计方法应用。另外,规定时限是所有工程项目的基本要求,即必须在规定时间内完成工程项目。培养学生在规定时间内的工程设计与实施能力是工程类专业的一个核心目标。因而在课程实践过程中需要提出时限性要求。
本文研究依托的“面向对象设计与构造”课程是北京航空航天大学计算机学院的本科生学位核心课程,包括32理论学时和16实验学时,每年上课学生人数不少于250人,安排在二年级春季学期,课程在北京航空航天大学计算机学院面向复杂软件能力的体系化课程中扮演着承上启下的作用(如图2所示)。
根据课程的特点,从2014年课程开始在实践环节引入作业的大小周期二维设计,对课程整个实践训练过程进行控制。心理学的研究结果表明,由于知识具有结构性特点,人的学习活动一般以知识点为单位来组织[6]。课程作业的大周期设计按照课程知识点模块来实施,以周为单位布置作业任务。围绕每周课程讲授的知识点和之前学习的知识点,进行增量迭代式训练。这种大周期的设计方式符合人的认知和学习规律。针对每一次作业任务则实施小周期微观控制,以细粒度的作业活动为单位进行过程控制,使得作业训练以受控方式来获得预期的能力达成度。 三、作业大周期设计与控制
课程实践的作业大周期设计与控制强调通过增量迭代来强化学生的能力形成效果。基本方法是将课程实践分为4个周期(如图3所示),包括进阶周期、深化周期、精炼周期和贯彻周期。每个周期包括4个教学周,其中前三周为理论课加相应的3次开发测试类训练,最后一周为阶段总结课和相应的总结分析作业。
进阶周期的作业设计目标是针对面向对象核心概念和基本设计要求开展训练,在案例设计上突出对象与类特征,并进一步突出类的职责分配与协同,引入层次化抽象,使用繼承或接口来优化设计。
在深化周期作业设计中,目标是围绕对象运行机制、线程对象交互机制、线程安全等知识点,通过运动量均衡的多电梯调度案例的多次迭代,训练学生的设计思维从单线程程序向多线程程序转变,从而掌握线程安全的设计方法。
在精炼周期作业设计中,目标是围绕规格化设计方法,从方法规格设计、类规格设计以及设计原则及检查方面进行训练。本周期的训练以模拟出租车叫车系统为案例进行迭代开发,培养大规模并发多线程的设计方法和测试方法。
贯彻周期作业设计的目标是面向高质量要求的综合验证方法及技术训练,要求学生针对前期开发的程序基础上使用Junit框架开展基于规格的自动化测试,并能够基于类和方法来逻辑推理程序的正确性,并使用UML表示设计并分析验证。
每个周期的最后一次作业都要求学生撰写总结分析博客,梳理自己在该周期的作业训练中的完成情况和心得体会。大周期的作业设计采用体育比赛中的赛季积分制来考核学生实践训练成绩,针对在作业大周期中的得分(包括加分和扣分)累加结果进行排序,最终按照排序相对位置来确定最终的课程成绩。
此外,在每个大周期内,课程设计了与开发测试作业同步的实验训练(4学时/周期)。作业任务强调针对给定需求的设计、实现和测试,实验则针对开发测试中所需的关键技术能力进行训练,分别设计了面向对象程序的调试实验(4学时)、针对多线程的观察与调试(4学时)、规格设计和代码实现的交叉补全(4学时)、自动化测试与模型化设计(4学时)。
四、作业小周期设计与控制
软件能力强调学生能够使用技术性手段来说明所开发的软件满足质量要求,包括软件测试、评审、模型检查和形式化验证等。按照本文的软件能力定义,学生不仅需要在规定时间内提交实现了相应要求的软件代码,还要能够主动通过软件测试等手段来分析说明其所提交的软件代码满足质量要求。本文所介绍的面向对象课程采用竞争性学习方法[7-10],围绕软件能力来设计和配置竞争性任务,针对每一次竞争性任务实施小周期控制。作业小周期设计的理念是对作业过程进行微观控制,包括deadline控制、抄袭控制、有效性控制、测试控制等,从而在细节层次上训练学生的软件能力。从课程运行的实际效果来看,紧张有序的小周期控制是确保能力形成效果的有效保障。
如图4所示,每一个教学周理论课授课完毕后,教师发布作业,并根据任务的难度和工作量设定作业完成时限要求。学生在规定时间内提交作业,过期将不能再提交。在作业提交之后,课程作业平台系统自动代码进行相似度检测,根据输入的抄袭控制参数(即能够容忍的相似度最大参数)来发现作业抄袭。针对软件能力中的开发能力和测试能力要求,在小周期设计中特别注重训练测试能力,要求每个同学都参与测试中,为此会给每个提交了有效作业的同学分配测试任务。测试任务智能分配的重点是平衡性控制,即确保测试双方同学具有相近的能力。软件开发类课程可以采用两种类型的测试——双盲互测和透明公测,前者采用竞争性方法,让同学们在所分配的代码中去发现尽可能多的缺陷;后者则使用事先设计好的公共测试用例集来检查作业代码对要求的整体满足情况。所谓双盲,即任何一个同学都不知道自己测试的是哪位同学提交的程序,同样也不知道自己的程序在被谁测试。每个同学都要在规定时间内完成测试并提交测试所发现的缺陷,这样每个同学会收到两个记录,自己程序被发现的bug(扣分依据)和自己发现了别人程序的bug(加分依据)。误报bug是软件开发与测试中的正常现象,需要开发者与测试者进行沟通协调。每个同学收到被发现的bug记录后,需检查确认bug报告的有效性,如果有误则可以发起申诉。要求测试者和开发者在系统中围绕bug报告的有效性进行交互协商,并根据协商结果来调整测试的计分。
在测试任务智能分配环节,强调测试者和开发者具有相近的软件能力。为了达到这种平衡性控制效果,需要收集一个学生的学习行为数据,并度量学生的开发能力和测试能力。主要依据包括通过的公共测试用例情况、互测中被报告的bug情况、互测中发现别人程序bug的情况、所提交程序的设计质量等。在此基础上,可以使用诸如K-means等聚类算法对开发能力及测试能力进行聚类分析[11-12],从而获得较为科学的分组。
五、教学实践效果分析
面向对象设计与构造课程作为典型的软件开发类课程,运行4年来取得了良好的教学效果。学生们在课程开始之前大部分对面向对象概念和方法都不太了解,通过一个学期的训练,超过85%的同学能够在一周内完成规模在2 000行以内的高质量程序设计实现,且能够基于规格来论证程序实现满足相应的规格设计。
以2017学年度为例,图5给出的是作业完成效果的整体情况。图5(a)显示,整体的提交和有效情况都维持在较高的水平,第5次作业(即深化周期的第一次作业,开始引入多线程)的难度有较大的提高,导致有不少同学未能完成,但之后逐渐得到改善。经过了严格的相似性检查,抄袭人数得到了有效控制。图5(b)显示,随着作业难度增加和功能增多,完成作业的程序规模持续增大,到第11次作业接近3 000行,但是公共测试通过率一直保持在比较稳定的水准。互测一直在高强度水准下推进,这对于确保代码的质量发挥着不可替代的作用。
图6给出的是学生在公共测试阶段的整体用例通过情况。图6(a)显示,整体的公共测试通过率在前四次呈现下降趋势,从第六次作业开始随着作业训练次数的增加,逐渐增加。其主要原因是前几次难度逐步提升,但是相当一部分同学在编程语言、开发测试以及对课程规则都尚在学习和熟悉过程中。经过一个多月的训练,能力得到了稳定提升,公共测试的通过率也稳定提升。由图6(b)可知,公共测试用例通过率超过95%的人数占该次作业有效提交总人数的比重,最高是64.7%,最低是28.7%,平均达到49.8%,这表明一般同学都取得了非常优秀的作业完成效果。不过同时也要看到,每次作业都有一部分完成效果很不好(0—50%)的同学,虽然人数很少。从第五次作业开始,通过率超过95%的人数占比逐步提升,说明训练设计达到了预期的目标。 为了更好地刻画学生能力的变化,分析作业的大小周期设计以及以面向能力的训练方法带来的实际效果,本文在实际收集的学习行为数据基础上对开发能力做了统计分析。根据每次作业的成绩对学生进行分档,规则见下表。
由互评阶段扣分情况分布图(图7)可以看出,随着作业推进,低分段学生(第三档和第四档)的数量呈下降趋势,而高分段的同学在进行第二个作业大周期之后,即第一次多線程作业后,数量也逐渐升高。由此看来,经过第一个作业大周期的作业训练,学生们的开发能力不断提升和进步。基于双盲互测数据和公共测试数据得到了一致的结论。
六、总结与展望
实践训练是软件开发类课程中的核心教学环节,如何有效围绕能力培养目标设计其实践教学一直是一个关键问题和难题。在设计实践内容和控制措施时,必须要考虑多种因素,如能力内涵,能力与授课知识点的关联,训练过程的微观控制等。本文提出了一种围绕能力培养目标的实践设计方法,其核心是大小周期相结合的实践设计和实践过程控制。本文结合作者所承担的面向对象设计与构造课程介绍了方法实践和效果分析,系统性地梳理和介绍了复杂软件能力的内涵和支撑的课程群,进一步介绍如何从实践内容、实践控制和评价等多个维度来开展课程设计,以及应用大小周期相结合的实践教学方法所获得的训练体系。通过实际教学所收集的数据,对该教学方法的应用效果进行了初步分析。结果表明作者所提出的大小周期相结合的实践教学方法取得了显著的教学效果,而且能够在能力培养目标上开展细粒度分析。这些分析研究对于其他学校的软件开发类课程的设计和优化具有参考价值。
未来,我们拟在其他相关课程中实践和应用大小周期相结合的实践训练方法,同时正在细粒度的学习效果分析,特别是能力形成效果分析方面开展进一步研究。
参考文献:
[1] 蒋宗礼. 工程专业认证引导高校工程教育改革之路[J]. 工业和信息化教育,2014(1): 1-5.
[2] 工程教育专业认证标准(试行)[Z]. 2011.
[3] 王昕红. 美国工程教育专业认证研究[M]. 西安:西安交通大学出版社,2011.
[4] 袁慧,于兆勤,秦哲. 新形势下培养提高工科学生工程实践能力的认识与实践[J]. 高教探索,2007(2): 61-63.
[5] 许学磊. 软件工程管理的现状和创新策略[J]. 微计算机信息,2012(5): 50.
[6] 隋光远. 知识点认知规律的实验研究[J]. 心理科学,2003,26(2): 308-311.
[7] Mendiburo M, Williams L, Segedy J, et al. An Investigation of the Effect of Competition on the Way Students Engage in Game-Based Deliberate Practice[C]. 2013.
[8] Hwang G J, Chang S C. Effects of a peer competition‐based mobile learning approach on students' affective domain exhibition in social studies courses[J]. British Journal of Educational Technology. 2016, 47(6): 1217-1231.
[9] Cantador I, Conde J M. EFFECTS OF COMPETITION IN EDUCATION: A CASE STUDY IN AN E-LEARNING ENVIRONMENT[J]. 2010.
[10] Dimenichi B C, Tricomi E. The power of competition: Effects of social motivation on attention, sustained physical effort, and learning[J]. Frontiers in Psychology, 2015, 6: 1282.
[11] Ratnapala I P, Ragel R G, Deegalla S. Students behavioural analysis in an online learning environment using data mining[J]. 2014.
[12] Patel K M A, Thakral P. The best clustering algorithms in data mining[C]. 2016.
[责任编辑:余大品]
关键词:软件能力;能力培养;实践教学方法;能力度量;软件开发
一、复杂软件能力内涵
随着计算技术在人类社会中应用深度和广度的持续扩大,软件的重要性日益凸显,围绕软件开发方法与技术的教育也逐渐成为大学计算机相关院系的重点关注内容。软件开发类课程是计算机科学与技术专业以及软件工程等相关专业本科生教学体系中的重要组成部分。计算机相关学科本质上具有很强的工程性要求,以解决实际工程中的问题作为重要目标[1]。近年来,随着工程教育及其认证的推广[2],传统面向知识点的软件开发类课程教学设计已经不能满足要求,必须面向能力培养目标开展实践式教学,从而适应软件产业快速发展对新人才的需求。
软件能力是关于如何在规定时间内、按照一定的规范开发出满足相关要求的软件的能力。相关要求主要包括软件需求、设计与实现的要求、运行平台要求、开發语言和质量要求等。本文所讨论的则是一种更高形态的软件能力,称之为复杂软件能力,即使用工程化方法,开发具有一定复杂度的高质量软件系统的能力。为什么要强调工程化方法、复杂度和高质量?其主要原因来自于软件已经越来越多地应用于国计民生关键领域,一旦出现质量问题,将引起严重甚至灾难性后果。工程化方法强调培养学生综合分析软件功能和性能相关约束的能力,从而能够综合考虑相应约束给出设计方案和实现代码,并能使用测试和推理分析等手段进行综合验证和优化。工程问题的复杂度在一定程度上决定了工程化方法实施的难度和必要性。越是复杂的工程问题,就越需要使用规范的工程化方法。从教学角度来看,工程问题复杂度强调软件开发的要求来自于有一定规模的真实系统背景,而且有明确的质量和进度要求。质量决定了一个软件的生命力和价值。如果一个软件的质量不能满足,轻则导致无法满足用户的要求,重则导致计算机系统甚至更大范围的系统运行失效,进而可能导致安全问题。因此,如何在开发过程中通过技术手段来表明或论证所开发软件满足相应的质量要求也是一种重要的能力,对于培养学生的质量意识和质量控制能力具有重要意义。
本文以复杂软件能力培养为目标,基于其内涵分析,提出通过大小周期的实践来实现复杂软件能力的培养,并通过实践教学过程中的数据收集和跟踪分析,来度量学生的能力形成状况。
二、问题定义
复杂软件能力的核心是应用工程化方法来解决带有实际工程背景的问题。软件开发类课程的核心目标是培养针对给定要求开发相应软件的能力,其主要手段是通过具有一定工程背景的实践训练。开发要求一般包括软件需求、设计要求、质量要求、时间要求等,而开发涉及开发模式的选择、开发过程的控制等。本文所关注的软件开发类课程的课程实践与目标能力之间的关系如图1所示。
课程须达成的目标能力可由目标能力的达成度进行度量,以课程知识点与课程实践训练为实现途径。由于学生不可避免地存在个体差异,在课程实践训练的设计中还需要考虑学生基础能力掌握情况以及课程所在学期的相关课程设置情况。
我们强调如何面向复杂软件能力这个目标来设计实践教学方法,包括实践训练内容及实践过程控制。实践训练内容通过覆盖课程知识点来达成训练目标,实践过程是完成实践训练内容的具体活动流程。将软件开发类课程实践过程f定义如下。
输入:Input={能力目标、课程大纲};
输出:Output={与课程大纲同步的作业训练设计、作业控制活动流程};
约束条件:Constraints={满足课程大纲与能力目标的支撑关系}。
工程教育专业认证强调能力的形成性培
养[3],即要求通过过程(即系列化的任务训练)来逐步让学生掌握所教授的方法和技术,从而形成相应的能力。从课程大纲以及课程大纲中总结提炼课程知识点,形成知识点集合K={k1,…,ki,…,kn}(1≤i≤n)。对于每个知识点,可由过程定义得到相应的课程实践活动序列f={f1,…,fi,…,fn}(1≤i≤n)。依据前文中对于软件能力的内涵分析,课程实践活动fi中设定的任务必须满足工程教育对于能力培养的要求[4]。首先,实践训练需要有明确的功能要求。其次,从能力培养角度看,要给学生树立工程质量观,不满足质量要求的软件不能作为交付物移交给工程客户[5]。因而在课程实践中要求提交的代码满足软件的质量特性,如响应时间、鲁棒性等,并且在实践完成过程中强调设计原则、设计方法应用。另外,规定时限是所有工程项目的基本要求,即必须在规定时间内完成工程项目。培养学生在规定时间内的工程设计与实施能力是工程类专业的一个核心目标。因而在课程实践过程中需要提出时限性要求。
本文研究依托的“面向对象设计与构造”课程是北京航空航天大学计算机学院的本科生学位核心课程,包括32理论学时和16实验学时,每年上课学生人数不少于250人,安排在二年级春季学期,课程在北京航空航天大学计算机学院面向复杂软件能力的体系化课程中扮演着承上启下的作用(如图2所示)。
根据课程的特点,从2014年课程开始在实践环节引入作业的大小周期二维设计,对课程整个实践训练过程进行控制。心理学的研究结果表明,由于知识具有结构性特点,人的学习活动一般以知识点为单位来组织[6]。课程作业的大周期设计按照课程知识点模块来实施,以周为单位布置作业任务。围绕每周课程讲授的知识点和之前学习的知识点,进行增量迭代式训练。这种大周期的设计方式符合人的认知和学习规律。针对每一次作业任务则实施小周期微观控制,以细粒度的作业活动为单位进行过程控制,使得作业训练以受控方式来获得预期的能力达成度。 三、作业大周期设计与控制
课程实践的作业大周期设计与控制强调通过增量迭代来强化学生的能力形成效果。基本方法是将课程实践分为4个周期(如图3所示),包括进阶周期、深化周期、精炼周期和贯彻周期。每个周期包括4个教学周,其中前三周为理论课加相应的3次开发测试类训练,最后一周为阶段总结课和相应的总结分析作业。
进阶周期的作业设计目标是针对面向对象核心概念和基本设计要求开展训练,在案例设计上突出对象与类特征,并进一步突出类的职责分配与协同,引入层次化抽象,使用繼承或接口来优化设计。
在深化周期作业设计中,目标是围绕对象运行机制、线程对象交互机制、线程安全等知识点,通过运动量均衡的多电梯调度案例的多次迭代,训练学生的设计思维从单线程程序向多线程程序转变,从而掌握线程安全的设计方法。
在精炼周期作业设计中,目标是围绕规格化设计方法,从方法规格设计、类规格设计以及设计原则及检查方面进行训练。本周期的训练以模拟出租车叫车系统为案例进行迭代开发,培养大规模并发多线程的设计方法和测试方法。
贯彻周期作业设计的目标是面向高质量要求的综合验证方法及技术训练,要求学生针对前期开发的程序基础上使用Junit框架开展基于规格的自动化测试,并能够基于类和方法来逻辑推理程序的正确性,并使用UML表示设计并分析验证。
每个周期的最后一次作业都要求学生撰写总结分析博客,梳理自己在该周期的作业训练中的完成情况和心得体会。大周期的作业设计采用体育比赛中的赛季积分制来考核学生实践训练成绩,针对在作业大周期中的得分(包括加分和扣分)累加结果进行排序,最终按照排序相对位置来确定最终的课程成绩。
此外,在每个大周期内,课程设计了与开发测试作业同步的实验训练(4学时/周期)。作业任务强调针对给定需求的设计、实现和测试,实验则针对开发测试中所需的关键技术能力进行训练,分别设计了面向对象程序的调试实验(4学时)、针对多线程的观察与调试(4学时)、规格设计和代码实现的交叉补全(4学时)、自动化测试与模型化设计(4学时)。
四、作业小周期设计与控制
软件能力强调学生能够使用技术性手段来说明所开发的软件满足质量要求,包括软件测试、评审、模型检查和形式化验证等。按照本文的软件能力定义,学生不仅需要在规定时间内提交实现了相应要求的软件代码,还要能够主动通过软件测试等手段来分析说明其所提交的软件代码满足质量要求。本文所介绍的面向对象课程采用竞争性学习方法[7-10],围绕软件能力来设计和配置竞争性任务,针对每一次竞争性任务实施小周期控制。作业小周期设计的理念是对作业过程进行微观控制,包括deadline控制、抄袭控制、有效性控制、测试控制等,从而在细节层次上训练学生的软件能力。从课程运行的实际效果来看,紧张有序的小周期控制是确保能力形成效果的有效保障。
如图4所示,每一个教学周理论课授课完毕后,教师发布作业,并根据任务的难度和工作量设定作业完成时限要求。学生在规定时间内提交作业,过期将不能再提交。在作业提交之后,课程作业平台系统自动代码进行相似度检测,根据输入的抄袭控制参数(即能够容忍的相似度最大参数)来发现作业抄袭。针对软件能力中的开发能力和测试能力要求,在小周期设计中特别注重训练测试能力,要求每个同学都参与测试中,为此会给每个提交了有效作业的同学分配测试任务。测试任务智能分配的重点是平衡性控制,即确保测试双方同学具有相近的能力。软件开发类课程可以采用两种类型的测试——双盲互测和透明公测,前者采用竞争性方法,让同学们在所分配的代码中去发现尽可能多的缺陷;后者则使用事先设计好的公共测试用例集来检查作业代码对要求的整体满足情况。所谓双盲,即任何一个同学都不知道自己测试的是哪位同学提交的程序,同样也不知道自己的程序在被谁测试。每个同学都要在规定时间内完成测试并提交测试所发现的缺陷,这样每个同学会收到两个记录,自己程序被发现的bug(扣分依据)和自己发现了别人程序的bug(加分依据)。误报bug是软件开发与测试中的正常现象,需要开发者与测试者进行沟通协调。每个同学收到被发现的bug记录后,需检查确认bug报告的有效性,如果有误则可以发起申诉。要求测试者和开发者在系统中围绕bug报告的有效性进行交互协商,并根据协商结果来调整测试的计分。
在测试任务智能分配环节,强调测试者和开发者具有相近的软件能力。为了达到这种平衡性控制效果,需要收集一个学生的学习行为数据,并度量学生的开发能力和测试能力。主要依据包括通过的公共测试用例情况、互测中被报告的bug情况、互测中发现别人程序bug的情况、所提交程序的设计质量等。在此基础上,可以使用诸如K-means等聚类算法对开发能力及测试能力进行聚类分析[11-12],从而获得较为科学的分组。
五、教学实践效果分析
面向对象设计与构造课程作为典型的软件开发类课程,运行4年来取得了良好的教学效果。学生们在课程开始之前大部分对面向对象概念和方法都不太了解,通过一个学期的训练,超过85%的同学能够在一周内完成规模在2 000行以内的高质量程序设计实现,且能够基于规格来论证程序实现满足相应的规格设计。
以2017学年度为例,图5给出的是作业完成效果的整体情况。图5(a)显示,整体的提交和有效情况都维持在较高的水平,第5次作业(即深化周期的第一次作业,开始引入多线程)的难度有较大的提高,导致有不少同学未能完成,但之后逐渐得到改善。经过了严格的相似性检查,抄袭人数得到了有效控制。图5(b)显示,随着作业难度增加和功能增多,完成作业的程序规模持续增大,到第11次作业接近3 000行,但是公共测试通过率一直保持在比较稳定的水准。互测一直在高强度水准下推进,这对于确保代码的质量发挥着不可替代的作用。
图6给出的是学生在公共测试阶段的整体用例通过情况。图6(a)显示,整体的公共测试通过率在前四次呈现下降趋势,从第六次作业开始随着作业训练次数的增加,逐渐增加。其主要原因是前几次难度逐步提升,但是相当一部分同学在编程语言、开发测试以及对课程规则都尚在学习和熟悉过程中。经过一个多月的训练,能力得到了稳定提升,公共测试的通过率也稳定提升。由图6(b)可知,公共测试用例通过率超过95%的人数占该次作业有效提交总人数的比重,最高是64.7%,最低是28.7%,平均达到49.8%,这表明一般同学都取得了非常优秀的作业完成效果。不过同时也要看到,每次作业都有一部分完成效果很不好(0—50%)的同学,虽然人数很少。从第五次作业开始,通过率超过95%的人数占比逐步提升,说明训练设计达到了预期的目标。 为了更好地刻画学生能力的变化,分析作业的大小周期设计以及以面向能力的训练方法带来的实际效果,本文在实际收集的学习行为数据基础上对开发能力做了统计分析。根据每次作业的成绩对学生进行分档,规则见下表。
由互评阶段扣分情况分布图(图7)可以看出,随着作业推进,低分段学生(第三档和第四档)的数量呈下降趋势,而高分段的同学在进行第二个作业大周期之后,即第一次多線程作业后,数量也逐渐升高。由此看来,经过第一个作业大周期的作业训练,学生们的开发能力不断提升和进步。基于双盲互测数据和公共测试数据得到了一致的结论。
六、总结与展望
实践训练是软件开发类课程中的核心教学环节,如何有效围绕能力培养目标设计其实践教学一直是一个关键问题和难题。在设计实践内容和控制措施时,必须要考虑多种因素,如能力内涵,能力与授课知识点的关联,训练过程的微观控制等。本文提出了一种围绕能力培养目标的实践设计方法,其核心是大小周期相结合的实践设计和实践过程控制。本文结合作者所承担的面向对象设计与构造课程介绍了方法实践和效果分析,系统性地梳理和介绍了复杂软件能力的内涵和支撑的课程群,进一步介绍如何从实践内容、实践控制和评价等多个维度来开展课程设计,以及应用大小周期相结合的实践教学方法所获得的训练体系。通过实际教学所收集的数据,对该教学方法的应用效果进行了初步分析。结果表明作者所提出的大小周期相结合的实践教学方法取得了显著的教学效果,而且能够在能力培养目标上开展细粒度分析。这些分析研究对于其他学校的软件开发类课程的设计和优化具有参考价值。
未来,我们拟在其他相关课程中实践和应用大小周期相结合的实践训练方法,同时正在细粒度的学习效果分析,特别是能力形成效果分析方面开展进一步研究。
参考文献:
[1] 蒋宗礼. 工程专业认证引导高校工程教育改革之路[J]. 工业和信息化教育,2014(1): 1-5.
[2] 工程教育专业认证标准(试行)[Z]. 2011.
[3] 王昕红. 美国工程教育专业认证研究[M]. 西安:西安交通大学出版社,2011.
[4] 袁慧,于兆勤,秦哲. 新形势下培养提高工科学生工程实践能力的认识与实践[J]. 高教探索,2007(2): 61-63.
[5] 许学磊. 软件工程管理的现状和创新策略[J]. 微计算机信息,2012(5): 50.
[6] 隋光远. 知识点认知规律的实验研究[J]. 心理科学,2003,26(2): 308-311.
[7] Mendiburo M, Williams L, Segedy J, et al. An Investigation of the Effect of Competition on the Way Students Engage in Game-Based Deliberate Practice[C]. 2013.
[8] Hwang G J, Chang S C. Effects of a peer competition‐based mobile learning approach on students' affective domain exhibition in social studies courses[J]. British Journal of Educational Technology. 2016, 47(6): 1217-1231.
[9] Cantador I, Conde J M. EFFECTS OF COMPETITION IN EDUCATION: A CASE STUDY IN AN E-LEARNING ENVIRONMENT[J]. 2010.
[10] Dimenichi B C, Tricomi E. The power of competition: Effects of social motivation on attention, sustained physical effort, and learning[J]. Frontiers in Psychology, 2015, 6: 1282.
[11] Ratnapala I P, Ragel R G, Deegalla S. Students behavioural analysis in an online learning environment using data mining[J]. 2014.
[12] Patel K M A, Thakral P. The best clustering algorithms in data mining[C]. 2016.
[责任编辑:余大品]