摘 要:本文研究了软件工程课程的教学特点和存在问题,提出了以IEEE最新发布的软件工程知识体系为基础的课程体系,注重贯穿软件开发整个过程的系统性认识和实践性应用,强调案例化教学和探索式学习,通过具体案例使学生真正理解软件工程的基本理论,设计适合学生特点的课程实验项目,建立规范的小组式开发环境,使学生在理解和实践的基础上掌握当前软件工程的方法、技术和工具。
关键词:软件工程;教学改革;课程体系;课程实践
1. 引言
软件工程是将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,其重点在于软件的分析与评价、规格说明、设计和演化,同时还涉及管理、质量、创新、标准、个人技能、团队协作和专业实践等[1]。通过软件工程课程的学习,学生能够了解和掌握软件工程的理论、技术和方法,具备作为软件工程师所需的专业能力。由于软件工程是一门综合性和实践性很强的课程,传统的教学模式在实践环节上存在很大不足,直接影响了课程的教育质量和教学效果,因此切实加强软件工程实验课程的创新与改革是至关重要的。
目前,国内高校对于该类课程的传统做法是以教师课堂授课为主,学生被动地听课,教学内容一般是重理论而轻实践。即使配备课程实验,学生也只是编写一些规定的文档,其开发方式和手段基本上与软件工程的要求脱节。很多学生在学习该课程时,感到内容抽象枯燥,常常是似懂非懂,甚至觉得本课程没什么实用价值,不太喜欢学。针对软件工程课程的内容特点,我们认真分析了以往课程教学存在的问题,认为导致课程教学效果不理想的主要原因如下:
(1)软件工程不是一门速成的科学,其本身的特点决定了它不是完全可以从书本和课堂上学会,理解和实践是非常重要的。学生不可能靠听讲软件工程的基本原理学会开发一个实际的软件,而是在实际的"动手做"和"真正练"中体会和掌握软件工程的思想许多教师本身缺少使用软件工程方法开发一个完整系统的经验,仅限于照本宣科地抽象介绍一些基本原理,不能将当前软件企业的实际案例融入在基本原理的讲解之中,与实际的软件工程实践有明显的差距。
(2)现有的软件工程教学内容一般重理论而轻实践,所谓课程实验是在一个缺少软件工程支持的开发环境下进行,缺少适合本科生教学使用的实验环境和资料,学生根本得不到真正的锻炼。
综合上述分析,我们深入研究了ACM和IEEE联合发布的CCSE2005[2]相关内容,大胆改革课程体系框架和教学内容,积极探索案例教学和实践教学模式,本文将着重介绍我们在软件工程课程教学中的经验和成果。
2. 研究学科发展和最新技术,构建先进的课程体系
随着软件工程学科的发展,新概念、新技术和新方法不断涌现,原有的教学内容已经不能适应学科发展和人才培养的要求。因此,我们深入分析了IEEE最新发布的软件工程知识体系[3],根据现有学时条件及软件工程系列课程的整体规划,结合基础知识、先进技术和工程实践等方面组织整个课程内容,使学生掌握软件工程的基础知识、先进方法和最新技术,具备较强的知识拓展能力,为后续结合专业方向继续深入学习打下坚实的基础。
实际软件开发案例小组协作式的课程实践 |
UML语言面向对象技术 |
迭代化开发 RUP、Rational Rose、CVS等 |
软件需求 |
软件设计 |
软件实现 |
软件测试 |
软件演化 |
软件过程 |
软件质量 |
软件配置管理 |
软件项目管理 |
IEEE《软件工程知识体系》 IEEE系列软件工程标准 IEEE与ACM《软件工程职业道德规范和实践要求》 |
图1 软件工程课程体系的层次结构
我们以IEEE最新发布的软件工程知识体系为基础,在基础、应用、实践三个层次上建立了软件工程的课程体系,如图1所示。
(1)基础部分:课程知识单元覆盖IEEE发布的软件工程知识体系(SWEBOK),包括软件需求、软件设计、软件实现、软件测试、软件演化、软件过程、软件质量、软件配置管理和软件项目管理等核心内容。
(2)应用部分:以当前流行的统一开发过程、面向对象技术和UML语言为核心,融入企业的最佳实践和实际案例,覆盖IEEE的系列软件工程标准以及RUP、Rational Rose、CVS、Junit等软件工程工具和环境,使学生掌握当前先进的软件工程方法与技术。
(3)实践部分:要求学生以开发团队的方式协作开发一个具有一定规模的软件系统,建立支持小组开发的软件开发支持环境,让学生从"可实践"软件工程的角度学习和运用软件工程的思想和现代技术解决软件开发问题。
3. 研究认知规律与学生心理,强调案例化教学和探索式学习
软件工程的理论和方法是从众多软件开发实践中总结出来的,但是对于缺乏软件开发实际经验的本科生来说,单纯地讲授理论知识往往使学生感到枯燥无味且难以理解。因此,我们收集和总结了一些软件开发案例,将这些案例贯穿于理论知识的讲解中,使学生真正理解这些理论知识,建立软件开发的系统化与工程化观念和质量意识。
(1)从分析历史上的经典案例入手,诸如ARIANE 5 火箭、爱国者导弹、网络病毒攻击等,深入剖析导致软件失败的根本原因,从而引出软件开发的工程化发展方向,即以软件工程的原理和方法为指导,严格遵循软件过程规范和步骤。通过这些实例的分析,学生们逐渐改变软件开发等于编写程序代码的错误观念,开始认识到软件工程的重要性,有利于培养工程化的意识和观念。
(2)软件过程是软件工程课程中的一个重要内容,但是对于开发经验有限的本科生来说,很难在头脑中将软件过程的抽象模型与实际开发联系起来,容易产生枯燥乏味的感觉。在教学过程中,我们从软件开发的实际案例中总结出5个不同的软件系统,结合这些系统的特点和开发策略,讲解瀑布模型、原型化方法、增量模型、形式化方法和基于组件的开发模型等,学生在思考、分析和讨论过程中更好地理解和体会软件过程的基本概念,有利于在实际开发中运用这些过程模型组织开发过程。
(3)在软件项目管理方面,我们总结一些企业的最佳实践案例,诸如微软公司和IBM公司等的人员组织与项目管理,使学生了解软件项目管理中人员、产品、过程和项目之间的关系,认识到项目管理在成本、人员、进度、质量、风险等方面活动的重要性,有利于学生在实际项目中开展团队协作和项目沟通活动。
(4)在软件工程技术方面,我们结合图书管理系统、学生选课系统、视频游戏软件等教学案例,论述需求工程、软件体系结构设计、用户界面设计、详细设计、软件测试和软件演化等内容,重点讨论基于用例的面向对象方法和组件技术。
在整个教学过程中,我们也十分注重鼓励和引导探索式学习,学生通过文献查阅以及与软件企业人员的接触交流,真正体会当前软件工程业界的真实案例和最佳实践。课堂讲解避免"一言谈"的死板方式,采取课堂互动讨论,营造活跃、宽松的课堂气氛,鼓励学生结合课程实践中的问题进行专题报告和软件演示。
在常规的课堂教学之外,我们辅之以网络课程和扩展资源,鼓励学生根据个人兴趣和需要进行自主式的学习。同时,充分利用网络教学平台,加强师生之间的交流和学生之间的协作,引导学生积极思考和参与讨论,教师由知识的灌输者成为学习的引导者,学生由被动地接受教育变成主动地探索知识。
4. 研究软件工程的实践特点,课程实验结合实际开发因素和参与乐趣
实践教学是本课程中一个重要的组成部分,它要求学生以开发团队(一个团队通常由3~5人组成)的方式开发一个具有一定规模的软件系统,侧重培养学生发现问题、独立分析问题和解决问题的能力以及团队合作精神,使学生初步体会到一个软件开发项目全过程。
课程实验项目的软件开发过程分成实验准备、分析设计、编程测试和软件交付等部分,具体要求如下:
(1)实验准备:在第一次实验课上,学生将得到一份简单的软件问题描述,其中简要地描述了所开发系统的整体功能要求。学生自愿组建开发团队,制定项目的开发计划。
(2)分析设计:整个开发团队分析实验项目给出的问题描述,完成软件需求规格说明。根据软件需求规格说明,设计软件系统的总体结构,助教将模块开发任务分配到每个团队,同一个模块将由3~5个团队进行竞争性开发。
(3)编程测试:每个团队实现分配给他们的模块,编写所有相关文档,测试和调试代码。在模块开发完成后,团队之间开始进行模块买卖交易,并将所购买的模块与自己开发的模块整合起来成为一个完整的系统。
(4)软件交付:每一个团队将各自集成的完整系统进行包装和销售,由教师、助教和其他团队进行认购。
课程的实验设计注重将小组协作、过程管理、成本因素与参与兴趣相结合,使学生在一个规范的和可控的过程中完成实验项目的开发,具体措施如下:
(1)实行每周例会制度,保证所有成员在规定的时间进行讨论交流,同时每周与助教见面。所有任务都是面向整个团队的,团队的所有成员都要接受同一个成绩。
(2)在需求分析、系统设计、模块开发、集成测试等关键阶段实行阶段评审机制,并将上述阶段产品置于配置管理的控制之下,严格控制项目开发进度,保证按时交付最终产品。
(3)在项目训练中融入成本与质量因素,为每一个开发小组分配一个银行帐户和一定数目的启动资金,开发小组需要进行模块交易和整个集成系统的销售。通过虚拟帐户和模块交易模式,引导学生关注团队协作、项目成本和软件质量,调动了学生的积极性。
5. 研究和建立适合小组式开发的软件工程环境
对于软件工程课程实践环节来说,仅仅提供一个软件开发项目是远远不够的,学生需要在一个符合软件工程要求的环境中开发软件,才能够真正掌握软件工程的思想和方法,因此营造一个适合软件工程课程实验项目的软件工程环境是软件工程实践教学取得良好效果的关键。
我们深入研究了软件工程的基本要素和小型软件项目开发的环境构成,逐步建设相关的软硬件环境,将常用的软件工程工具引入到课程实验项目中,使用配置管理工具将所产生的各种制品控制在有序管理之下,使用建模工具和测试工具进行软件的分析、设计和测试。结合课程实践环节的要求,我们编写了规范的实验指导书,包括开发过程模型、系列文档模板、软件编码规范、段评审标准等,使实验和实践环节规范有序,改变了学生以往突出个人技巧的杂乱过程。
在小组式的软件工程环境中,使学生真正体验到一种有序的、可控的、协作的软件开发过程,在分析问题、解决问题、协调冲突、消除矛盾的过程中享受软件开发成功的最终结果。
6. 结束语
根据本科生培养计划要求的"厚基础、宽口径"和加强实践教学的新特点,我们深入分析软件工程学科的当前发展趋势和现代软件工程人才的社会需求,积极探索和实践软件工程的课程教学,在教学内容方面,突出先进性、系统性和工程化;在教学方法方面,将课堂式讲授、互动式讨论和探索式学习结合在一起;在教学实践方面,围绕课程的主要教学内容,建立适合学生小组开发的软件工程支持环境。
经过近3年的实施和改进,本课程取得了良好的效果,2008年被评选为"国家精品课程",并成为"教育部-IBM精品课程"。在今后的课程建设中,我们将进一步完善课程体系和教学内容,不断丰富课程的典型应用案例,保持课程的前沿性和时代性,实现更加突出的教学效果。
参考文献:
[1] 孙家广,刘强等.中国软件工程学科教程.北京:清华大学出版社,2005
[2] IEEE-CS/ACM Joint Task Force on Computing Curricula, Software Engineering 2004 Volume, 2004, http://sites.computer.org/ccse/SE2004Volume.pdf
[3] IEEE-CS, Guide to the Software Engineering Body of Knowledge, 2004 Version, http://www.swebok.org