隋 新
河南科技大学 河南洛阳 471003
高校普遍认为,软件工程学是研究将计算机科学理论和技术以及工程管理原则和方法进行综合,在用户需求、生产预算和开发进度约束下进行软件产品开发、部署和维护工程的一个学科。由此可以看出,软件工程学对综合性和实践性要求很高。但是,笔者通过对相关教学改革论文研究分析后发现,现有高校中软件工程课程由于指导思想僵化落后、认识不足、经验缺乏等原因,仍存在如下一些问题:(1)重理论而轻实践,软件工程方面的教材着重介绍多种软件开发模式、管理技术等抽象过程,学生无法真正领会理解。所授理论与实际应用的脱节则进一步影响了学生对软件工程的掌握。(2)重个人开发而轻团队协作。高校学生软件开发能力参差不齐,在进行团队分组时往往由少数能力较强的学生担任项目负责人,容易形成该学生对项目全权负责而其他学生袖手旁观、放弃参与的情况,团队设置形同虚设。(3)团队协作层次不够深入,团队成员之间的沟通仅仅停留在口头交流过程中,对于软件设计、开发维护等方面的意见无法渗入到软件研发的实际过程中。
上述问题的出现,导致团队协作机制的欠缺,开发进度缓慢,版本更迭错误,成员开发冲突等问题不断涌现,甚至逐渐恶化成为影响项目进展的主要矛盾,软件质量与课程实践的效果均大打折扣。解决上述问题行之有效的办法是引入版本控制、团队协作等相关技术。
版本控制(Revision Control)是一种在软件工程中使用的软件文档、源代码同步控制技术,用于多人同时参与开发的过程,确保不同成员的开发能够协调统一。在国外,已经有多所大学尝试将版本控制技术引入软件工程教学中,例如:加拿大Ontario大学计算机科学系的Karen L.Reid等人利用版本控制管理学生作业,美国Montana大学计算机科学与技术系的Louis Glassy在教学中应用版本控制工具后发现该工具可以有效地控制学生作业的进度,印度Rose-Hulman技术学院计算机科学与软件工程系的Curtis Clifton等人使用版本控制工具改善课程管理,等等。
在实际使用中,版本控制工具会按照递增顺序自动给提交至版本仓库中的软件代码修订编号(如最初加入的版本号指定为1),软件开发人员可以将当前工作目录回溯到版本仓库中的任何一个状态。为达到存储效率和空间利用率的平衡,版本控制软件大部分采用里程碑节点结合差分编码方式进行存储,即只将版本仓库中的某几个大版本记录完整版本,作为里程碑节点,而同时记录每个版本存储文件与前一版本之间的差异部分,以更方便地对比不同版本之间的差异。
现在常用的版本控制软件按照版本仓库存储方式的不同可以划分为集中式和分布式两种:集中式版本控制系统由中央服务器控制版本库维护与控制,每个成员只在本地目录中保存一个工作副本,需要升级、查看或获取其他版本的数据时需同中央服务器通讯。集中式版本控制系统的代表是CVS(Concurrent Version System)和SVN(Subversion)。分布式版本控制系统没有中央仓库,每个成员都在本地维护自己的版本库,向版本库中提交代码时无需连接远程服务器,团队成员之间通过推送或拉取动作使版本库的数据同步。分布式版本控制系统的代表是Mercurial和Git。
集中式版本控制系统因具有客户端软件支持度高、学习曲线平滑、授权控制方便等优点,尤其适合于高校环境下的小团队使用。笔者首先简要介绍SVN的技术特点,以便进一步探索高校环境下利用该技术的软件开发团队协作模式。
SVN是一款可以从互联网上免费下载的开源软件。SVN项目由Open Source Development with CVS的作者Karl Gogel开发,他与Jim Blandy改进了CVS的工作模式使其功能更为强大。
SVN借鉴了数据库事务管理的概念管理用户向版本仓库提交代码的过程—即代码提交过程要么完整提交,要么失败并回滚,整个过程为原子式提交—保证了每个成员查看项目仓库时总是看到相同且完整的代码版本。Subversion采用C/S分层结构设计,可以使用SvnServer+Apache的方式实现基于路径的安全网络访问,用户借助SVN方便灵活的授权方式能够在广域网上有效管理对软件仓库的访问与更改。
随着S V N 技术的不断推广与深入应用,支持该技术的第三方工具愈发成熟完备。例如:TortoiseSVN是SVN在Windows系统下最常用的开源客户端,功能强大、界面友好且随SVN同步更新。各IDE环境中都有成熟的SVN插件,如Eclipse中的Subeclipse和Visual Studio中的AnkhSVN等都实现了与IDE的无缝结合,提供了许多基于IDE环境的新功能,使程序员能够在开发中更便利地使用SVN技术进行团队沟通与版本控制。
图1给出了适用于高校团队SVN的交互模式图。以由3个成员组成的团队为例,首先由管理员(成员1)负责建立中央版本仓库(Repository)存储开发技术文档与软件代码,在接下来的开发过程中则由组内3个成员通过互联网或局域网访问软件仓库,并借助“检出”(Checkout)、“更新”(Update)、“提交”(Commit)等操作实现组内各成员之间软件开发进度的协调与统一。
图1 高校团队基于SVN的交互模式
2.2.1 版本仓库的建立与工程项目导入
以Windows环境为例,管理员可以使用SVN自带的命令行工具建立软件仓库,并向该仓库中导入名为SvnTest软件项目的初始版本,建立和导入的代码如下:
svnadmin create d:svnreposSvnTest
svn import c:SvnTest f ile:///d:/svnrepos/SvnTest
上述命令会首先在d:svnreposSvnTest位置“建立”(Create)名为SvnTest的软件库,接下来会将位于c:SvnTest的软件项目初始“导入”(Import)该软件库中。这里file:///d:/svnrepos/SvnTest为版本库的本地URL路径,如使用网络访问方式则类似http://hostname/path形式。初始导入后版本仓库中的代码处于初始版本状态,版本号为1。
2.2.2 初始检出
在建立并导入程序初始版本后,小组内各成员(包括导入了初始版本的管理员)需要在本地目录进行代码的初始“检出”,此时将生成软件在本地的工作副本(Working Copy),每位成员都将在本地工作副本进行代码开发、修改等工作。初始检出操作的命令行操作为:
svn checkout file:///d:/svnrepos/SvnTest d:my ProjectsSvnDemo
上述命令行会将版本库中SvnTest工程导入到本地的d:my ProjectsSvnDemo中,生成相应的工作副本。
2.2.3 软件修改的提交与更新
当小组成员检出代码并独立对工程文件进行了增加、删除和修改之后,需要将本地代码的变化“提交”至中央软件仓库,所执行的提交命令为:
svn commit d:my ProjectsSvnDemo
在未发生冲突的情况下,该命令将SvnDemo中本地工作副本的变化提交至软件仓库。其他成员在使用更新后的文件时注意到这一变化并自动更改其本地工作副本,进而确保不同成员工作副本的一致性:
svn update e:my programsSvnTest
上述两个命令中特意使用了不同的路径(d:my ProjectsSvnDemo与e:my programsSvnTest)以显示不同成员在保存本地工作副本时路径的不同。
2.2.4 冲突的发现与解决
当不同小组成员对同一文件的同一部分代码进行了不同修改时,成员在提交代码时会出现本地文件副本与代码库不一致的情况,即出现了“代码冲突”(Conflict):假定成员2先提交了对某段代码的更改,软件仓库中的代码与成员2的工作副本一致;但当成员3要求提交同一部分代码时,SVN会告知成员3因检测到冲突而无法提交,此时则需要这两名成员在线下进行协商,最终以某一成员的代码为准修正软件仓库。
在实际工作中,SVN组织建议每位小组成员在进行日常开发时尽量遵循“更新—修改—冲突与解决—提交”的循环工作流程,以便能够尽早发现成员之间的冲突,并保证各成员本地工作副本与软件仓库的协调统一。另外,SVN中除上述操作外还包括了权限分配、“比较”(Diff)、“回滚”(Revert)、“分支”(Branch)、“合并”(Merge)等操作,限于篇幅所限这里不再赘述。
本文从软件工程的课程实践出发,要求学生自行分组完成大学本科生课程管理系统的开发。在给出了该软件的项目初始需求后,要求各组学生按照组内成员的特长分工,独立完成对项目的详细需求分析、整体软件架构设计、用户交互界面设计、功能模块细分及开发等各个阶段的工作,并将技术文档管理、软件Bug追踪等要求贯彻开发的全部过程。在开始项目之前,专门设置两个学时向学生讲授版本控制及SVN技术,并要求各组学生必须以其在学院公共服务器上建立的版本仓库为基础才能进行软件开发。这样,在课程实践结束后,授课教师除检查所提交软件代码和技术文档外,能够追溯软件仓库中的版本迭代、日志记录等情况,作为评定学生课程作业优劣的重要标准。
经过一个学期的实验发现,使用SVN技术后,学生在项目调研、成员分工合作方面有了较大的提升,软件开发进度与质量都得到了很好的保障:因使用版本跟踪、时间戳比对等办法可以追溯软件开发的全过程及各成员的分工情况,能够更为深入和全面地了解各组的实际开发过程,及早发现学生在编写、协作方面遇到的问题,甚至能够避免学生间代码抄袭等现象。
笔者将版本控制与团队协作技术引入软件工程课程实践环节中,初步探讨了结合SVN技术的高校团队协作模式,并用课程实践验证了该模式的有效性,计划在今后的教学中进一步研究使用该技术的协作模式与评价方法。需要指出的是,软件开发是当今技术发展最快速的领域之一,新技术、新模式不断涌现,高校教师有责任紧跟形势,将当前最成熟、有效的技术传授给学生,使其能够快速达到社会对于软件开发人员的需求,为我国软件业的发展贡献一份力量。
[1]易文龙,华晶,何火娇.SVN版本控制在软件工程专业实训的应用[J].农业网络信息,2010(9):39-41.
[2]杨健,陈春玲,宗平.版本控制工具软件Subversion在课程设计中的应用[J].计算机教育,2008(4):117-121.
[3]李志杰.版本控制技术在团队协同开发中的应用研究[J].现代商贸工业,2012(14):168-169.
[4]佟巍.版本控制系统在软件项目管理上的应用[J].信息系统工程,2012(11):54-55.
[5]宋坤,周智海,史静涛.软件质量控制方法研究[J].海洋技术,2012(1):119-122.