赵 明,廖志芳,杨 柳,易 茜
(中南大学 计算机学院,湖南 长沙 410075)
软件工程是一门实践性极强的学科,因此在软件工程本科及研究生教学中,如何将教学与实践相结合增强学生的动手实践能力是软件工程教学一直强调的重点。案例教学作为将实践与理论相结合的启发式教学方法,其基本思想是教师根据教学目标、教学内容以及教学要求,通过列举一些当前企业或者科研工作中的具体案例,引导学生参与问题的思考、分析、讨论和表达等活动,这是一种培养学生认识问题、分析问题和解决问题等综合能力的行之有效的教学方法[1]。目前,案例教学法已经成为教学方法改革的重要内容之一,与之相对应的案例库建设也作为案例教学法的一个核心内容纳入了课程建设的范畴。国外各大学对案例库早有研究,哈佛大学所有的课程都采用案例教学,其商学院的学生两年中要学习400~600个案例[2]。国内高校在不同的课程教学上有一些案例教学,但不论是本科教学还是研究生教学,都尚未建立一套完整而规范的软件工程课程教学案例库。为了培养高质量的软件工程人才,急需建设一套完整的、综合的案例库,以推进软件工程的课程理论与实际相结合。
根据软件工程专硕研究生培养方案,从必修课(软件工程、分布式计算、软件设计模式、服务计算、云计算与大数据)和选修课程(软件度量与测试、数据挖掘、高级程序语言设计等)中选择3~5门核心课程进行案例库的建设,其中包括对高级程序语言、软件工程、软件度量与测试、软件设计模式以及数据挖掘等课程进行第一期案例库的建设。
根据教育部软件工程教指委要求,CCF将案例划分为项目类教学案例、知识点教学案例和评测型教学案例3种类型[3]:项目类教学案例一般用于综合实践课程教学,案例内容覆盖某个实践项目的全部流程或者部分主要阶段,系统地分析和探讨如何开展和实施软件工程的实践活动,内容可以是一个来源于企业或者开源社区的较为完整的项目,其具体内容可以是需求分析案例、测试案例、设计案例等;知识点教学案例是指辅助理论课程的某个或者某些知识点的教学,如Linux文件系统的讲解等,以实际需求、现实问题切入,形象地讲解和分析软件工程相关理论知识和技术,引导学生思考,启发学生思维;评测型教学案例一般用于测试或者验证学生对理论知识和实践能力的掌握情况,如实验题、案例型测试题等,可作为实践性课程题目或服务于课程测验、考试或者竞赛。
教学案例应该遵循以下原则。
1)典型性原则。
案例在工程领域中具有一定代表性,能够反映工程领域的理论知识和关键问题。
2)规范性原则。
项目案例库中的项目拥有软件开发过程的规范化设计文档模板,对学生进行规范化软件开发过程训练具有示范作用,能够提高学生的软件工程专业素质。
3)关联性原则。
案例内容应该紧密结合软件工程领域中的相关理论和方法,针对教学内容中的重点、难点以及教学要求,让学生在案例学习中有效理解知识点以及知识点之间的关联性,使学生建立一套完整且全面的逻辑思维方法。
4)实用性原则。
该项目案例库不仅可以让学生得到实际开发项目的真实体验,还可以使学生进一步熟悉软件项目的开发流程,掌握开发方法和文档管理技能。
5)启发性原则。
案例的选择和内容应该具有一定的创新性,能够代表工程领域的理论和实践前沿,能够给学生提供思考的空间,锻炼学生解决问题的能力。
教学案例的设计主要从案例名称与概述、案例教学目标、案例准备、案例教学要点、案例教学组织方式以及开放性问题几个方面进行考虑。
知识点案例以“软件度量与测试”课程中“McCabe圈复杂度的案例”进行说明。McCabe圈 复 杂 度(Cyclomatic complexity)是1976年Thomas J.McCabe[4]提出的用控制流图的圈数来测量程序复杂性的方法。控制流图是McCabe复杂度计算的基础,它是将软件的程序流程图转化为有向图,然后以图论的知识与方法来衡量程序控制结构的复杂性。下面详细说明案例设计内容。
1)案例概述。
本案例将McCabe圈复杂度应用于对软件的详细设计度量与程序代码度量中,利用案例指导学生基于控制流图计算圈复杂度和基于程序代码计算圈复杂度,同时帮助学生理解圈复杂度在软件开发周期中的重要意义。
通过该教学案例,一方面引导学生在进行程序设计与编码时,一定要特别注意条件语句与循环语句;另一方面,让学生理解圈复杂度的计算与控制对提高软件的整体质量、减少程序错误,对提高程序的可理解性、可维护性以及减少程序的测试与维护工作量具有重要的意义。
2)案例教学要点。
主要包含3点:①圈复杂度的作用;②圈复杂度的度量方法的优缺点;③圈复杂度度量结果的指导意义。
3)案例说明。
(1)McCabe圈复杂度计算方法有3种。
第一种是直接通过控制流图的区域数进行计算,其公式为
其中,R代表平面被控制流图划分成的区域数(圈数)。
圈复杂度等于强连通图中连成圈的最大个数。因为代表程序中“开始”与“结束”的“开始”节点与“结束”节点是不连通的,也就是控制流图一般不是强连通图,因此我们需要从“结束”节点连一根线到“开始”节点,这样形成一个强连通图后再来数图中的圈数。
第二种是通过控制流图中的节点与边数量进行计算,其公式为
其中,e为图中边数;n为图中节点数;p为图中不连通的部分,通常为1。
在图1控制流图中,e=6,n=9,p=1,V(G)=9-6+2×1=5。
图1 控制图示例
第三种是通过控制流图中判定节点的数量来计算,其公式为
这里,判定节点也就是代表程序流程图中菱形框,在程序语句中用判定语句来描述。
所以,这种方法我们还可以延伸到计算程序流程图中的菱形框数量,程序圈复杂度就等于程序流程图中菱形框数量加1,也可以延伸到计算程序语句中的判定语句数量,程序圈复杂度就等于程序中判定语句数量加1。
(2)实验案例说明。McCabe圈复杂度案例相关的实验,分为2个实验内容。第1个实验内容是基于控制流图的圈复杂度计算,主要针对圈复杂度度量方法中的第1种方法和第2种方法;第2个实验内容是基于程序代码的圈复杂度计算,主要针对圈复杂度度量方法中的第3种方法。
基于控制流图的圈复杂度计算。要求学生设计基于控制流图的圈复杂度的计算算法,利用软件开发周期详细设计阶段的程序流程图或者控制流图来计算圈复杂度,将程序流程图或者控制流图作为输入。学生可以先将图转化为XML,再设计算法来实现,也可以利用Java的AST(Abstract Syntax Tree)相关方法来实现。
基于程序代码的圈复杂度计算。要求学生设计基于程序代码的圈复杂度的计算算法,利用Complexity Evaluator工具对开源平台典型的开源项目进行圈复杂度计算,一方面横向进行圈复杂度的评估,可选择2个规模与功能相近的开源项目进行比较;另一方面纵向进行圈复杂度评估,选择1个开源项目的不同版本进行比较。通过圈复杂度的计算,学生可以进一步理解圈复杂度的意义。
项目案例以“数据挖掘”课程中“众包平台中工人质量分析”进行说明。众包( Crowdsourcing),是一种公开面向互联网大众的分布式的问题解决机制,在2006年由Jeff Howe首次提出,通过整合互联网或社交网络中未知的大众来完成计算机单独难以完成的任务[4]。众包的主要参与者包括任务请求人(requester)和任务完成人(worker),任务请求人进行任务发布,任务完成人进行任务的完成。为完成该案例,需要完成数据采集(以topcoder平台进行数据采集)、数据预处理(去除噪声数据以及无用数据)、数据分析以及结果展示等几部分内容,形成一个完整的众包分析项目。下面详细说明案例设计内容。
1)案例概述。
本案例将众包应用于对社交网络中用户属性与用户行为的分析中,通过使用社交网络中用户的脱敏数据,并采用不同的算法对用户的回答、评价进行汇聚分析,得出了用户群体对于社交网络中某一行为的情感趋势。随后,根据汇聚结果,采用划分聚类和K-Means聚类对用户进行群体划分,分析众包系统中人员的质量属性及社区行为特征,对社交网络中的行为分析、社区发现具有重要的指导意义。
通过案例教学,希望让学生对社交网络中标签聚合和用户质量分析、社区行为产生感性认识,真正意识到社交网络中众包分析能带来什么好处。
2)案例教学要点。
教学要点主要涉及社交网络中众包分析的作用,众包中结果汇聚的分析方法,以及众包环境中用户质量分析和社区发现的现实意义。
3)案例详细说明。
(1)工人(任务完成人)的概况分析。众包任务质量受到工人的能力和质量影响。工人的质量可以由工人的声誉和专业知识描述[5]。工人的声誉分数主要由社区成员对工人在系统中做出贡献建立。工人的专业知识表明了他完成特定任务的能力。专业知识主要有两个指标:凭证和经验。凭证是用来评估工人完成特定众包任务的能力的文件或证据,如学位证书或技能证书。经验是指工人在平台上完成任务所获得的知识和技能。声誉和专业知识是相互关联的:一个专业知识高的工人也会有很高的声誉。将它们区分是因为声誉在本质上更普遍。除了工人的专业知识反映了他们贡献的质量,还可以根据其他几个参数计算声誉,比如工人的及时性或者评估人员(evaluators)的质量。另外,声誉是一个公共的和社区范围的度量指标,但是专业知识是依赖于任务(task-dependent)的。例如,一个有着高声誉分数的Java专家可能不适合承担SQL相关的任务。
(2)工人的质量评估方法:①使用黄金标准数据(Golden standard data)评估工作者完成的质量,黄金标准数据是指拥有标准答案的一类数据,通过将工人提交的结果与标准答案的比较可以检测出那些欺骗类型的工人;②多数决策(Majority Decision,MD)方法[6],将任务分配给多个工人,大多数工人支持的任务结果被认为是正确结果;③控制组(Control Group,GC)方法[7],成立一个控制组,对已完成的工人进行重复检查,监督工人的任务完成情况;④声誉评估方法,在众包平台中通过工人的正确率对工人的等级进行划分,如果是恶意工人可以直接拉入黑名单。
(3)实验案例:①要求学生设计爬虫软件进行topcoder中工人数据的采集,通过数据预处理得出案例实验所必需的数据;②利用聚类分析方法对工人数据进行类别分析,对工人偏好特征进行分析;③设计算法对工人完成任务质量进行分析。案例流程如图2所示。
图2 工人质量分析流程
案例教学的实施主要集中在软件学院2017—2018级研究生相关课程的教学中。以“数据挖掘”课程为例,整个教学过程涉及4个案例,包括关联规则知识点案例、聚类分析知识点案例、决策树算法知识点案例以及众包工人质量项目案例,案例内容由浅到深,最后一个案例涵盖数据处理、关联性分析、聚类分析以及分类分析等多个知识点。通过将传统的课程授课方式转换为案例教学方式,在教学中构建具体问题场景并提出具体解决方法,加深学生对课程内容的理解,提高学生综合运用课程内容的能力。
通过调查和统计分析,软件学院软件工程2017—2018级研究生有80%以上的学生认为自己的学习效率得到了提升(见表1)。同时,我们对2017—2018级研究生学生调研了在实行案例教学方式后,学生的综合运用课程内容的能力是否得到提升(见表2),2017级206位学生中有183人认为自己的能力得到了提升,2018级68位学生中也有61人认为案例教学对自己的能力提升是有作用的,所以大部分的同学认为通过案例教学自己的能力得到了提升。因此本案例教学的实施的确证明了自身的可行性并在教学中取得了极好的效果,对学生加深课程理解和提高综合运用课程内容的能力有极大的促进作用。
表1 学生学习效率影响结果统计表
表2 综合能力提升调研表
针对目前国内软件工程课程教学中存在实践与理论部分脱节的问题,笔者提出软件工程核心课程案例库的建设方法以及案例教学的实践,通过选择典型课程、分析案例类型以及确定案例原则,以新工科教育思想为指导,根据软件工程发展的特点,结合国内外科研和教学成果,不断更新和完善教学内容,加强软件工程核心课程教学案例建设,并开展案例教学方法的研究与实践,提高学生应用软件工程相关知识解决实际问题的综合能力。实践结果表明,案例教学的方式对促进教学工作、提高教学质量、培养国际创新型人才具有重要意义。