刘志鹏 段卫华
摘要:“软件工程”课程由于缺乏合适的教学案例等原因,授课效果往往不尽如人意。学生对软件开发规律、经验缺乏实践认识,缺乏兴趣。分析当前国际国内解决该课程授课困境所采用的方法,设计了开源软件的实际案例、重构现有代码和设计性实验三个环节,提高了学生的学习兴趣、动手能力和分析、设计能力,取得了较好的授课效果。
关键词:软件工程;教学改革;开源软件
中图分类号:G642.0 文献标识码:A 文章编号:1007-0079(2014)33-0089-02
“软件工程”是计算机专业和软件工程专业重要的基础课程之一。[1]20世纪60年代,为了应对“软件危机”,软件工程作为一门学科迅速发展。随着软件工程方法、工具的不断完善,软件产业已经成为信息时代最大的产业。据预测,软件工程专业将成为独立学科,其地位与计算机科学专业相同。然而,由于软件工程概念繁多,学生实践经验匮乏,大多数高校“软件工程”课程的教学工作均在一学期内完成,导致学生对“软件工程”课程内容缺乏兴趣,教学效果不佳。为了在有限的学时中得到更好的教学效果,笔者从“软件工程”课程教学的实际情况入手,尝试了一系列的探索和研究。
一、“軟件工程”教学内容目前存在的问题
目前,“软件工程”课程教学最主要的问题是缺乏适合教学的软件案例。本校“软件工程”课程使用国外著名的《软件工程:实践者的研究方法(第七版)》作为教材。[2]教学实践过程中的教学瓶颈是教学内容概念繁多,本科阶段的学生缺乏大型项目的开发经验,难以形成理性认识,课堂内容只能以概念介绍为主。该教材采用SafeHome作为教学实例,实例基于当前十分热门的智能安保系统,但教学过程中存在如下问题:
一是实践性内容分散。教材以场景对话的方式,展现了SafeHome项目在开发过程中遇到的各种问题。场景对话分散在各个章节之中,如果在每章授课过程中针对SafeHome项目开展讲解和讨论,会造成学生对该案例内容理解的碎片化。如果集中讲授SafeHome项目的内容,往往涉及到的知识面较宽,必须要到学期快结束时才能引入。此时教学过程中已堆砌了大量概念,学生对实例研究早已失去兴趣。
二是缺乏示例代码。该实例虽然内容先进,但教材终究以介绍基本概念为主,并未提供SafeHome示例相关的源代码。很多学生认为教学示例空洞,没有具体编程实例佐证教学。
三是内容过于专业。SafeHome项目很多概念和知识,学生仅有所耳闻,没有实际的编程操作经验,如传感器。传感器的很多特性,本科同学没有深入的认识,难以理解传感器模块的功能设计,如传感器数据有效性判定等,给教学工作造成了很大的困难。
市场上国外其他配有实例的“软件工程”教材,往往实例的代码量均在3000行以内。这种数量级的代码,已经足以应付软件测试、代码重构等工作。但是对于软件体系架构等概念讲解而言,其涉及的内容和知识点略显单薄。国内教材采用的案例系统往往是图书管理系统或电梯管理系统等。这些软件案例已经有十分成熟的产品,且同类教材内容重复、老旧、陈词滥调。同样难以引起学生的广泛兴趣爱好。
其他学校“软件工程”课程的教学开展有如下2种方法:第一,不再设置“软件工程”导论课程,将其中涉及到的概念分散设置到“软件需求”“人机交互”等具体课程中。这种教学改革涉及到大量专业课程的重新设置和调整,工作量十分巨大。第二,教师自己开发教学案例。这些教学案例往往与实际的软件开发项目相结合,将本专业学生所需要掌握的知识融入其中。这涉及到项目案例的编写工作。该项工作执行难度较大,开发周期较长,案例本身往往需要几个教师协作完成。随着教学工作的不断开展,项目案例必须要不断修改,适应新形势的发展。虽然这种方法对本专业学生培养最为有利,但案例构建工作大大增加了教师的授课负担。
二、“软件工程”课程的教学改革
针对以上的分析,主要从以下几个方面进行“软件工程”教学的探索和改革:
1.补充案例教学
首先,从开源软件代码库或从著名的开源软件项目中查找适合学生阅读的程序代码。著名的开源代码库网站包括SourceForge、Google Code、Bounty Source、Tigris.org及berlios.de等。项目必须涵盖面向过程程序设计技术和面向对象程序设计技术。其中,涵盖面向过程程序设计技术的项目最好采用C语言开发,而涵盖面向对象程序设计技术的项目最好采用Java语言开发。虽然很多优秀开源软件采用Python、Perl或Ruby这类编程语言实现,但是从学生已经学习的编程知识角度出发,尽量不要增加学生学习编程语言的额外负担。经过仔细的甄别,笔者选出三个教学案例:一是Linux虚拟文件系统VFS。该文件系统的设计很好地体现了软件工程中面向对象设计的开闭原则及其他很多设计方法。文件系统是操作系统中较为重要、且用户最容易理解的模块之一。[3]二是SQLite嵌入式数据库,运行时只占用很低的系统资源。目前在很多嵌入式产品,例如安卓系统中使用。[4]三是rsync,是类UNIX系统下的数据镜像备份工具。[5]
其次,教师通过阅读、分析源代码和相关文档,从整体上把握开源软件实例的体系结构。并结合课堂教学,从不同角度出发,给学生分配代码阅读任务。因为部分教学案例,如SQLite等,涉及到多方面的学科知识,如数据库、编译原理等,需要指导学生有针对性地阅读其中某一部分源代码。在此期间,要牢记以能够帮助理解软件工程理论知识为主要目的。否则,学生容易陷入海量代码阅读和具体的学科知识学习中,忽略了阅读代码的根本目的。
第三,通过课堂讲解和课后阅读两种方式相结合,结合具体的评分机制,鼓励学生阅读源代码,布置合理的代码阅读作业,鼓励学生使用软件工程方法阅读、管理源代码,做到既促进学生通过阅读源代码加深理论知识的理解,又能够学以致用。了解软件的开发过程和开发方法,又不至于占用过多的时间影响其他课程的学习。
第四,在阅读源代码的基础上,了解各个软件不同版本间的功能更新、完善和改进。以rsync为例,其源代码从0.1版本一直到当前最新的3.1.1版本和补丁包,按照时间顺序进行整理、总结。通过该过程的实践,帮助学生理解完善软件的过程以及软件版本控制的概念及方法。这是学生通过努力可以做到的,是必须完成的学习任务。另外,鼓励学生在现有源代码阅读基础上,对当前软件项目提出需求改进、项目设计、软件体系架构和功能扩充等提出自己的修改意见。在时间允许的范围内,鼓励学生实现自己的想法。从该过程中体会到软件设计的一些基本要求,如可扩充性、高内聚低耦合等概念。训练学生提出优秀需求的思维能力。同时与项目发展现状相结合,对软件需求进行取舍,并按照优先级进行排序。培养学生的设计模式观念,以及重构代码的能力,但这并不是必须要完成的学习任务。因为经过国外同行实践教学表明,大多数同学难以对软件提出新的改进。其中原因包括学生缺乏行业实践经验,另一方面,对该软件的理解难以超越设计者。
2.重构现有项目
目前,很多高校采取“项目驱动、从头做起”的方法,让学生动手实践项目。这些项目课题往往由教师指定,学生查找资料,从头做起,设计实现。在实践中,笔者鼓励学生重构现有项目。这些现有项目的来源主要包括:学生在先修实践类课程中累积的作业;来自于因特网上学生感兴趣、并自己深入学习过的开源项目。这样做的好处是:第一,学生对需要重构的项目有足够的了解,不会因为知识储备不足,需要重新学习技术知识等原因而停滞不前;第二,照顾能力差异和知识结构差异,避免教师指定课题的一刀切做法,保证每个学生都能动手。第三,由于学习时间有限,从现有项目做起,可以多思考、多规划,而非仅仅为了完成代码量,忽略了在软件开发过程中理解和运用软件工程知识的初衷。
在重构项目的过程中,使用subversion集中管理学生的软件开发版本。教师查看subversion的日志信息了解学生的项目进度及活跃度等。采用敏捷开发方法,使用“结对编程,小组间相互提需求,相互测试”等具体策略,鼓励组内和组间交流。提出优秀的需求,帮助其他同学改进软件,与开发自己的软件同等重要。最后的提交报告包括:源代码变更及对应的功能描述;subversion构建证据;代码变更的UML图形表示;代码变更的测试信息;团队成员的详细学习日志等。报告中不但要说明已经完成的功能点,还需要说明可以从哪些方面进一步完善该软件。组内的每位同学必须详细列出在组内的贡献,以及对其他小组的贡献。学生可以得到多个方面的锻炼,提升自己的综合素质。可以同时锻炼需求分析、编码、测试等多个方面的综合能力。
3.提升设计眼界
软件设计是比代码阅读和项目重构更为高级的活动。其中包含项目立项目标和动机、价值判断、选择确定、可行性研究与效益分析等活动。其中涉及到需求分析、系统设计、软件设计等方方面面的活动。软件设计能力的培养,不能以最终实现的软件系统作为评判标准。笔者不要求学生实现该系统,最大程度地激发学生的创造性,目的是提升软件设计的眼界。软件设计考验前瞻性和先进性,最好给出多种设计方案,且该过程也需要反复迭代,逐步求精。以SafeHome为例,学生以前的设计大多采用PC机和SQL Server作为服务器和数据库。通过教师启发和学生自主查阅资料,在设计中出现了云计算服务器和VoCore嵌入式芯片设计。虽然学生不一定清楚技术细节,但是从软件设计角度而言,具备一定的先进性。
“软件工程”课程平时分评分标准有三部分组成:一是完成课堂提及的教学案例的代码阅读任务。该项任务占平时成绩的30%。二是完善和重构现有项目。该项任务占平时成绩的40%。三是完成一份优秀、具备多种可选方案的软件设计。该项任务占平时成绩的30%。
三、实践环节教学效果
1.课堂教学效果
通过课堂讲授案例、重构代码和软件设计等三个不同层次的学习锻炼,大多数学生能端正学习态度,充分认识到软件工程理论知识来源于软件生产实践,并对软件实践有重大指导意义。通过制订合理的实践任务,每个学生都能动手编写程序。通过动手实践,加深了对软件工程相关知识点的理解。
2.教学效果反馈
本次共有87名学生参加“软件工程”课程的学习,每个学生需要独立完成3份实验报告。结果统计表明,阅读代码的积极性、代码编写的规范性和软件设计的先进性等均有很大程度的提升。未完成实践任务的同学主要集中在重构现有项目部分。很多原始项目由于缺乏合理的软件架构,很多学生采取重新设计和编写的方案,耽误了很多时间。
总之,“软件工程”作为计算机专业和软件工程专业重要的基础课程,介绍了大规模软件开发的重要经验,应用范围非常广泛。本文分析了“软件工程”教学中目前存在的一些问题,积极探索和尝试新的教学方式,在一定程度上调动了学生的积极性,但对于课程体系的建设等后续问题,仍然需要开展进一步的研究。
参考文献:
[1]Pierre Bourque,等.SWEBOK v3.0 [DB/OL].http://www.computer.org/
portal/web/swebok/v3guide.
[2]普雷斯曼.软件工程:实践者的研究方法[M].第7版.北京:機械工业出版社,2011.
[3]博韦.深入理解LINUX内核[M].北京:中国电力出版社,2008.
[4]SQLite源代码[DB/OL].http://www.sqlite.org/2014/sqlite-amalgama
tion-3080500.zip
[5]rsync源代码[DB/OL].http://rsync.samba.org/ftp/rsync/src/
[6]D. Carrington, S. K. Kim. Teaching software design with open source software[A]. Frontiers in Education[C].Berlin:Springer,2003.
(责任编辑:王意琴)