基于高质量开源软件的阅读维护培养软件工程能力

2018-07-21 06:11尹良泽毛新军
计算机教育 2018年7期
关键词:开源代码高质量

尹良泽,毛新军,尹 刚,王 涛,余 跃,卢 遥

(国防科技大学 计算机学院,湖南 长沙 410073)

0 引 言

软件工程系列课程的主要目标是提高学生对复杂软件系统和较大规模软件的开发素养和能力。传统的软件工程课程实践教学主要是软件项目实践,学生在已经学习大规模软件开发方法和技术的基础上,运用所学知识设计开发一个具有一定规模的真实软件。但由于学生没有接触过真实的优秀软件项目,个人认识还停留在几十上百行的小规模代码中,因此在实际项目开发中还是不知道该如何开发,软件工程方法的应用趋于形式。同时,软件工程方法的很多经验和技巧只有让学生见识优秀软件工程师所开发的优秀软件项目,才能让学生在理论学习阶段与软件工程理论和方法产生共鸣,并在项目实践阶段模仿优秀软件工程师的设计开发方法,提高学生开发较大规模高质量软件的能力。针对这种情况,亟须探讨软件工程课程新的教学模式,提高学生对软件工程方法的理解层次和深度,为提高学生大规模高质量软件开发能力打下基础。

1 通过开源软件阅读维护加强软件工程人才培养

1.1 开源软件概述

经过几十年的发展,开源软件对软件产业产生了巨大影响,开源软件也代表了软件工程领域一种先进的开发技术和模式。在该模式中,开发人员通过复用已有的开源软件和大众协同参与,可有效提高软件项目的开发效率和开发质量,并大幅降低开发成本。同时,基于开源软件开展软件工程教育也是软件工程能力培养的一种有效途径[1-4]。具体来所,开源软件具有三大优势:一是覆盖范围广,开源软件已经覆盖了几乎所有领域的基础软件和共性应用软件;二是代码质量高,2013年的Coverity扫描报告首次发现开源软件质量超过专有软件,开源软件缺陷密度0.59,专用软件0.72[3];三是拥有开源社区,开源社区是开源软件开发者沟通和交流的媒介,也是初学者学习优秀工程师开发经验并获取帮助的一个重要平台。

1.2 在软件工程课程实践教学中应用开源软件阅读

针对软件工程课程实践教学中学生缺乏大规模高质量软件开发经验的问题,一种解决思路是让学生阅读和维护具有一定规模的高质量开源软件,通过尽早接触优秀的高质量软件来增强学生工程意识。基于这种思想,设计提出了在软件工程课程实践教学中应用开源软件阅读的基本方案。如图1所示,整个课程分为3个阶段:开源软件阅读维护、软件工程理论教学和创意软件项目实践。

(1)开源软件阅读维护阶段。学生通过阅读维护具有一定规模的高质量开源软件,首先从感性上接触和认识较大规模高质量软件,并从中学习高质量软件的开发方法和原则。具体来说,该阶段要求学生通过开源软件的阅读提取出其需求和设计。由于还没有系统学习软件工程的理论和方法,学生可能会出现无从下手,或者描述不清晰、不规范等情况。这些也正是学生课程理论学习阶段需要解决的问题。有了这些体验,学生就会带着问题去深入学习软件工程方法和技术,从而使得课程理论教学不再是简单的概念背诵。

(2)软件工程理论教学阶段。将以被阅读的开源软件为案例,系统讲授需求、设计和测试的相关理论和方法。系统学习相关方法和技术后,要求学生重新修正自己提取出来的软件需求和设计,进一步理解软件工程方法和技术的精髓。

(3)创意软件项目实践阶段则要求学生采用前面两个阶段学到的需求描述、项目设计、软件开发等方法,正向设计开发一个具有一定规模的高质量的软件,进一步培养学生解决复杂问题和开发较大规模高质量软件的能力。

这3个阶段,第一个阶段通过阅读开源软件让学生认识大规模高质量代码,并初步开展软件需求描述和软件设计;第二个阶段通过知识讲授让学生系统掌握软件工程的相关方法和技术,并修正完善第一阶段的需求和设计;第三阶段则运用第一阶段的经验和第二阶段的方法技术正向设计开发一个软件项目。3个阶段由浅入深、相辅相成。通过这3个阶段,系统培养学生大规模高质量软件的开发能力和素养,从而实现课程实践教学目标。

图1 开源软件阅读维护在软件工程课程教学中的定位

2 开源软件阅读设计方案

2.1 开源软件阅读实践需要解决的若干问题

2.1.1 开源软件选择

作为软件工程课程实践教学阅读用的开源软件,需要具备如下几个特征。

特征一:面向实际应用。当前比较热门的开源软件往往都采用了最先进的方法和技术。由于学生在后期软件项目实践时通常都会参照和模仿被阅读的开源软件进行开发,面向实际应用的软件能让学生学习到最新软件开发方法和技术。

特征二:代码质量高。首先,该软件必须具有高质量的软件设计,包括软件体系结构、类设计等。其次,该软件必须具有非常规范的编码风格,让学生通过阅读高质量代码,意识到自己代码的缺陷,并养成良好的编码习惯。

特征三:代码规模适中。代码规模太小不足以让学生体会到软件工程的思想,但规模太大又会给学生造成一定的压力和负担。在阅读完该开源软件之后,学生应该能较好地驾驭该软件。通常来说被阅读开源软件的规模在10 000行代码左右比较合适。

特征四:开源社区活跃。当前软件开发的一种趋势是借助于互联网的优势和群体智慧的力量来进行软件开发。通过开源社区,学生可以学习到很多实际项目开发中非常重要的宝贵经验,以及基于开源社区和大众协同的群体化软件开发方法。

2.1.2 阅读引导与考核

选择合适的开源软件之后,接下来就需要引导学生有效地完成阅读,从而培养其开发较大规模高质量软件的能力。放羊式地将开源软件交给学生,将造成学生阅读比较盲目,缺乏目标和动力。因此,需要有效地引导学生一步一步地去深入阅读,并在整个过程中对学生的阅读效果进行监督和考评。具体来说,整个阅读过程需要做到如下几点。

有规划:将整个开源软件一股脑地扔给学生会让学生觉得无所适从,也无从下手。因此,整个阅读过程必须有规划、分步骤进行,循序渐进,并给每个阶段设定一个任务。学生只要按照老师的要求一步步来,高标准完成每个阶段的任务就可以对较大规模高质量软件有一定认识,并初步掌握一些设计开发高质量软件代码的方法和工具。

有监督:监督是督促和激励学生积极完成每个阶段任务的重要保证,缺乏监督将可能导致学生将代码阅读过程当成完成任务。在整个代码阅读过程中,可以每周公布各组代码阅读的统计数据和相关信息。让学生能够给自己的工作一个比较良好的定位,并督促自己按照高标准要求完成每个阶段的任务。

有考核:考核是每门课程的一项重要内容。同样,开源软件阅读也需要有考核,但不同于一般的知识学习,开源软件阅读更加注重阅读过程。因此,考什么、如何考,将是开源软件阅读中需要考虑的一项重要内容。该考核方式要求既能反映学生开源软件的阅读效果,又具有一定的量化考核方式。

有点评:及时对学生的工作进行点评,指出其工作中存在的问题和可能的解决方案,是提高学生能力的关键步骤。对开源软件阅读,需要在点评过程中引导学生细心去体会一定规模高质量软件的开发方法,并将代码阅读实践与课程理论知识相结合,充分利用好开源软件这个案例培养学生的各方面能力。

2.2 开源软件阅读维护框架

为引导学生一步步阅读开源软件,将开源软件阅读分为3个阶段:代码泛读、代码精读和代码维护,如图2所示。代码泛读的主要目标是让学生在较短的时间内快速掌握该软件的功能和概要设计,包括软件的体系架构、模块划分等。代码精读则是在学生已经基本掌握软件整体架构的基础上,进一步体会软件的详细设计、代码规范、实现方法和技巧等。代码维护是在学生已经掌握整个软件的整体架构,也对某一部分代码非常熟悉的前提下,要求学生在该开源软件的基础上新增新的功能,对代码进行测试,并且修改维护相应的功能。要求新添加代码的质量与原来的代码质量保持一致。代码维护阶段是对前两个阶段所学知识和方法的一次初步运用,也为后面软件项目实践中开发高质量软件打下基础。

代码泛读阶段的主要产出是软件功能描述和概要设计,以及概要设计时有何考虑,概要设计如何实现软件功能等。代码精读阶段的主要产出是软件详细设计和代码注释。详细设计中,要求学生给出该模块的类图和关键用例的顺序图;代码注释则包括类注释、成员函数注释、关键语句注释等。代码维护阶段的产出是新增功能代码和测试代码,要求学生将相应的功能描述和设计添加到前面形成的文档中,并对新增部分进行验证审查。为督促学生积极开展代码阅读工作,也为了总结自己学习到的知识,还要求学生每周都要撰写一篇技术博客,主要描述自己一周学习到的内容,例如关于协作开发、开源软件复用、需求描述和项目设计,以及自己遇到的问题和解决方案等。

整个代码阅读维护过程以2人为一个小组结对进行,同时要求学生参与开源社区。每个阶段结束之后都会对该阶段的成果进行考核点评,给出各小组各阶段的成绩,对存在的问题进行点评,并要求学生在点评之后进一步完善相关工作。整个过程中都会持续对学生的任务完成情况进行监督,包括跟踪大家的平台活跃情况、技术博客撰写情况、成果完成质量、新增代码质量和规模等。

图2 开源软件阅读维护框架

3 开源软件阅读的具体实践

3.1 开源软件选择

经过反复比较,最终选择Android APP “小米便签”作为学生阅读的开源软件。小米便签是小米公司开发的一款手机APP。Android编程是最近比较热门的一个话题,便签也是大家比较熟悉的一款软件,大部分学生对该软件都比较感兴趣。该软件包含大概10 000行代码,代码规模适中。由于是由小米专业开发团队精心为Android初学者所打造的一款软件,该软件不管从设计还是从代码的角度来说都具有较高质量。该软件托管在Github上,学生可以进入该软件的开发社区,与该软件的开发人员以及相应的学习人员进行交流。

3.2 实践效果

表1给出了学生经过小米便签的泛读、精读和维护3个阶段之后对开发较大规模软件的各项能力提升满意程度的评价。90分表示该项能力提升明显,非常满意;80分表示有较大提升,但还有不少提升空间;60分则表示该项能力提升不大。从表1中数据可以看出:

(1)经过小米便签的阅读,学生的大规模软件代码分析能力得到较大提升,代码编程风格发生质的变化,团队协同开发能力也取得很大的进步。经过泛读、精读和维护3个阶段,学生能以较快的速度掌握一定规模代码的功能和基本架构,然后对自己所关心的代码进行深入分析。学生另一个最大收获是代码编程风格,小米便签的代码风格规范统一,让学生意识到了自己代码的缺陷。同时,代码阅读维护过程中,学生第一次基于trustie和git进行项目管理和协同开发维护,掌握了基于团队的协同开发方法。

(2)软件设计能力、修改维护能力和开源软件复用能力都有较大提升。阅读过程中,学生花了较多时间去体会优秀的软件设计,学生开始对软件设计、修改维护和软件复用有了初步的认识。对于软件设计能力,由于缺乏系统的理论方法学习,还存在较大的提升空间;对于修改维护能力,由于学生以前没有接触过Android开发,修改维护起来比较费劲;对于开源软件复用,存在部分同学在集成开源软件时比较费劲。

(3)对于软件测试能力,整体来说学生提升不是很大。测试过程中,要求学生采用自动测试的方法对精读的代码以及自己新添加的代码进行测试。小米便签是Android代码,大部分代码都在与底层数据和上层界面进行交互。由于时间有限,学生对如何模拟Android的界面操作以及底层的数据还不是很熟悉。

表2给出了学生开源软件阅读的一些相关数据。学生每周花在小米便签阅读上的时间平均达到了10小时,最多的达到了20小时,表明大部分学生对小米便签的阅读都比较感兴趣。学生在代码维护阶段添加的代码量平均500行左右,复用开源软件代码量1 200行左右,达到了课程要求。学生在代码精读阶段添加注释量平均800行,代码注释比较规范标准,准确率也比较高。在整个小米便签阅读过程中,各小组的Git提交次数平均为142次,表明学生提交很活跃,也掌握了团队协同开发的基本方法。

整体来说,经过小米便签的阅读,学生对较大规模高质量软件有了一定的感性认识,代码分析能力、协同开发能力、代码编程风格都有了很大提升,同时对如何开展软件需求和设计也有了一定的认识和尝试,软件工程能力得到增强,为后期系统学习软件工程的方法和技术以及开展创意软件项目实践打下了良好的基础。

表1 学生对开源软件阅读效果的评价

表2 学生开源软件阅读相关数据

4 结 语

在软件工程课程实践教学中引入开源软件阅读,通过在理论方法学习之前先让学生接触具有一定规模的高质量开源软件,使得学生对大规模高质量软件及其开发先有一定的感性认识,从而提高软件工程方法技术学习和创意软件项目实践的质量。为有效引导学生开展开源软件代码阅读,将其分为代码泛读、代码精读、代码维护3个阶段,每个阶段都要求有不同的产出,并将过程监督、协作开发、参与开源社区、考核点评等贯穿代码阅读和维护全过程,以保证代码阅读的有效性。实践效果表明该方法可增强学生的工程意识,对系统培养学生解决复杂工程问题和开发较大规模的高质量软件系统的能力具有重要意义。

猜你喜欢
开源代码高质量
坚持以高质量发展统揽全局
高质量项目 高质量发展
牢牢把握高质量发展这个根本要求
五毛钱能买多少头牛
2019开源杰出贡献奖
“三部曲”促数学复习课高质量互动
创世代码
创世代码
创世代码
创世代码