姜群,杨小青,董世都
软件工程专业课程设置的“维数”
姜群,杨小青,董世都
目前高校有的软件工程专业设置课程涵盖软件工程学科的所有方面的详细内容,也有软工专业设置几门或一门软件工程专业课其余是一般计算机课程。无论哪种情况,开设课程必须明确与之相对应的具体的学生输出。主要依据学生输出提出了“维”的概念,课程设置便是在抽象“维”里分类和分析一系列课程。
软件工程;课程设置;维数
软件工程领域已变得非常复杂,综合了大量的知识技术、管理技能、以及人的素质等方面的因素,软件工程教学自然最直接地与这复杂程度相关。因此,不能以面向教师或单纯面向知识的方法设置课程。由于软件产品是最复杂的人造系统,其最基本的特征是复杂性、抽象性和适用性,这些问题需要通过软件工程教育的途经尽可能准确地反映出来。2004年,IEEE和ACM联合公布的软件工程知识体系(SWEBOK04)将其内容概括为10个知识域:软件需求分析、设计、编程实现、测试、维护、配置管理、工程管理、工程过程、工程工具与方法以及质量。这些知识领域涉及7个相关学科:计算机工程、项目管理、计算机科学、质量管理、管理、人机工程学、数学和系统工程[1]。但是,SWEBOK04及其教学指南只提出了软件工程的基本知识范围,却没有明确规定教学的详细程度。如何合理地取舍传授知识的寡众与深浅、合理地选择重点与非重点,软件工程的课程设置面临着诸多问题。如:(1)哪些知识域和相关学科可以考虑为一门单独的课程?(2)如果考虑多于一个知识域和学科,哪个知识域或学科是侧重点?(3)以上的哪些知识域和相关学科可设置为另外的特色课?(4)不同课程之间的协作和合作是否合理?(5)怎样的课程设置顺序是合理的?处理好这些问题,才能提高能力培养、知识传授的效率。
软件工程课程设置的策略和方法很多,主要有:(1)在一门课程中把软件工程的所有知识都让学生掌握。这种策略无论是教材、还是教学,都只能走马观花、蜻蜒点水,造成教与学的困惑。(2)基于主题的组织模式。这种课程设置更具有科学研究性。(3)基于系统的组织模式,这种设置系统性强但不利于强化基础知识。(4)在计算机科学与技术专业教学计划基础上加一些软件类课程和减少一些硬件课程,这种设置专业选修课没有形成系统化、模块化,方向的纵向性和广泛性得不到很好的体现。(5)基于几个专业特色方向组织课程,往往容易忽略全面综合考虑,从而造成课程系统性差,教学内容重复和遗漏并存。
造成以上课程设置中的问题,原因是多样的。有的照搬SWEBOK04及其教学指南,有的以传授知识为中心来考虑问题。我们认为,应以学生输出及能力培养的要求来设计课程和课程系列,一个课程系列并不是仅对某一种能力的培养起作用,而是在某一种能力的培养中起主要作用。课程系列之间也存在相互协调、相互支撑、相互促进的作用。我们从多年的软件工程教学实践和相关的理论研究中总结出软件工程课程设置应考虑的因素。
在课程设置(和教学)时,尽可能统筹考虑“维数”,并有目标地将其设置在适当的课程和课程系列里。
(一)学科侧重点:完全覆盖主题内容VS部分覆盖主题内容
软件工程课程设置关键决策是课程应包含软件生命周期的哪些部分,也就是业务过程、需求、设计、实现、测试、部署、维护和演化发展应分开处理还是包含在一门课程里?还有许多相关的活动和学科,如项目管理、质量管理、团队精神、计算机安全等对软件开发的成功也是很有必要的。一门课包含多个部分和相关学科,更能揭示软件生命周期的各部分和学科之间的内在联系,学生经历和学习内容较丰富。一门课侧重软件生命周期的一个部分和相关学科,学生可以获得更详细的该部分知识,在该部分中集中精力于几个方法和过程步骤有助于学生了解更深入的细节,可以提高教与学的效果。
(二)开发侧重点:最初的开发VS维护和演化
大多数现实生活中的软件项目不是完全地新开发一个系统,而是对现有系统的维护或演化。与新开发项目对比,演化项目着重于其它需求和技能,大量的工作是从多方面分析一个现存系统,而新开发一个系统则更需要创新能力。软件演化与新开发系统之间的界线是非常灵活的,依据要求的课程层次和目标而定,如维护和演化的基本知识通常是高级课程的特征。
(三)过程模型:单一深入VS概观很多
目前常用的过程模型有:Rational统一过程、XP(extreme programming)、微软解决方案框架以及瀑布模型的各种变形,它们中的一些有相似特征,而一些有完全不同的特征。讲授一个模型能使学生更深入地学习和实践该模型。然而,为各种软件企业培养人才,需要讲授多种模型。在一门课程里用几种模型能对每种模型最重要的特征有更好的概观,如果学生必须上多于一门软件工程课程,也许改变课程用的模型较容易,也能提供深入的知识和实践。
(四)可交付成果:过程VS产品
课程可交付的东西应该回答两个问题:学生完成了什么(侧重产品)以及学生怎样完成的(侧重过程)?侧重产品依据“硬”标准评定成绩,如象完整性、正确性和表达形式等标准来评价,比较客观。侧重过程决定于学生遵守被要求的过程,有时难于客观评价。
(五)组织:团队VS个人
个人作业可简单地评价每个学生的学习效果,布置很复杂的作业给单个学生是不可能完成的,因而个人作业一般不太复杂,学生更深层次的思维能力得不到提高。解决复杂问题要求团队合作,团队作业提高解决复杂问题的能力、相互交流、协作和矛盾冲突的处理能力。
(六)技术侧重点:一般VS特殊
使用特殊软件技术在很多情况下是依赖于开发商的,企业为提高自身的竞争力一般都使用了特殊软件,大量需要特殊软件方面的技术人才。让学生在特殊软件技术上深入,对学生毕业后就业有帮助。然而,由于有很多特殊软件技术可用,每一种技术都各有利弊,因而每个企业的特殊软件人才需求也不同,在本科阶段要教所有可用特殊软件知识是不可能的。采用通用技术有助侧重于一般技术观点如象面向对象原理的继承和多态性,而不是具体的技术问题如象java与C 的区别。然而,采用一般技术对学生提高专业技能帮助不大。
(七)工具:手工VS支持工具软件
目前软件工程相当依赖于适当的工具软件,工具增加多产性和有助于集中解决重要问题,而不必忙于怎样写文档或管理工件。但介绍较多工具会引起学生较多的学习投入,学生花费很多时间来熟习使用工具,而不是花时间来分析和解决问题。具体交付的作业从使用工具的角度来说是作好了,但缺乏有价值的内容。放弃使用工具,引导学生对作业问题的思考,如通过不使用建模工具,让学生用手在纸上作图。当然,软件工程教育应该满足企业的人才需求,起码应该让学生了解哪些工具适用于哪些不同的情况,以及它们的性能和功能。
(八)作业侧重点:单独作业VS项目
单独练习允许侧重在有所选择的问题上,每个练习都是有目的和有准备的,学生的学习被保持在合理的范围内,而且未完成一个练习可以不影响下一个练习。给学生提供一个系统项目,对整个课程而言,课程中的练习相互联系,每个练习侧重于系统或系统文档的不同部分,整个项目或项目的部分是最实际的软件工程教学方法,学生能够看到软件生命周期中工件之间的联系。然而在单独一门课里做完整的项目,练习与练习之间的联系较紧密,如果学生在开始时不能完成练习或不能保证完成练习的质量,随后阶段的练习也许无法进行或建立在低质量的工作基础上,这会减少学习经历和降低学生的学习效果。
(九)练习域:管理软件VS技术软件
软件几乎在每个技术及商业领域扮演着重要角色,如象嵌入式系统、时实系统、信息管理系统、企业资源计划、WEB服务等,有必要对每个领域用不同的途径探索软件工程:设计不同的结构,采用不同的开发环境,达到不同质量属性的不同方法(比如测试)是必要的。为了具体地讲授怎样做,软件工程课程的练习或项目应侧重于这些领域中的一个,或者以某种方法设计练习或项目,使学生知道怎样对许多领域运用方法的通用知识。
软件工程学科固有的复杂性使软件工程专业的课程设置也变得同样复杂,目前虽然存在多种课程设置的方法,但缺少一个抽象的框架可普遍应用于软件工程专业的课程设置。本文提出了这样的框架--课程设置的维数,这些维数不仅可用于软件工程课程设置,还可用以评价现有课程设置是否达到预期。由于维之间直接或间接的相互作用和影响,探索改变一个维对相关维的复杂课程序列的影响至关重要,这将是我们未来的研究课题。
G642.3:TP311.5
A
1673-1999(2010)16-0157-02
姜群(1959-),女,重庆人,双硕士,重庆理工大学(重庆400054)计算机科学与工程学院副教授,研究方向为进化计算、软件工程。
2010-06-06
国家人事部留学人员科技活动择优资助项目、商业智能应用软件研究与开发(项目编号:2009CR02)。