软件体系结构课程教学:抽象与实践的协调与统一
2009-08-21覃征邢剑宽
覃 征 邢剑宽
摘要:本文结合作者多年在软件体系结构的科研和教学经验,从抽象理论教学,专题研究和案例教学三方面探讨了教学方法和教学内容的改革。目的是软件体系结构抽象的理论知识和现实软件开发项目中的应用技能结合起来,努力培养具有大局观念的软件架构人才和管理人才。
关键词:软件体系结构;抽象与实践相结合;案例教学
软件体系结构是一门源自于软件工程实践的学科。经过20多年的发展,它已经成为大量复杂软件系统研发的核心。软件体系结构的主题是针对复杂软件系统的高层结构,组织单元之间的相互关系的描述,以及围绕这种描述开展的各项活动(如设计、评估、实现、管理、测试等)。其涵盖面极为广泛,抽象程度高,因此对于刚刚接触软件工程的学生来说难以理解和认同。鉴于其教学上的难度,在国外,此课程主要由卡耐基梅隆大学软件工程学院等在软件工程方面卓有造诣的少数几所高校主导;在国内,也只有包括清华大学在内的寥寥几所高校开设了此课程。
本文以在清华大学开设的“软件体系结构”课程为例,对如何针对软件体系结构的基本概念、原则和方法进行有效地教学作些探讨。课程着重培养学生对软件宏观层面的认识,理解现代软件的研发过程并不是简单的编码的堆砌,而是针对软件系统各个核心质量属性的考察和对软件组成单元相互协作方式的基于形式化的描述和推断。在对本课程多年的教学实践中,我们一直与世界上最新的软件工业的发展和软件体系结构研究成果保持同步,并不断尝试改进和完善教学方法,努力培养具有大局观的软件架构人才和管理人才。
一、以动机剖析为讲授核心
在软件体系结构课程的教授过程中遇到的首要问题是让学生理解软件体系结构是有什么用的。这个问题是由两方面原因造成的。
首先是生源的专业情况。2008年本课程学生的专业统计显示,计算机科学与技术专业占28%,软件工程专业占16%,其他学生来自自动化、信息管理、化学、建筑、汽车、通信、物理等专业。总体而言,大部分学生缺乏本课程需要的专业基础。并且没有参加过任何具有实用性的软件系统的研发工作。有的只是编写过一些课程作业的小程序或者样例网站的经验。多数学生很少有机会能接触到一个由数十人组成的团队在大型复杂软件系统研发过程中遇到种种挑战和困难,如操作系统、分布式文件系统、搜索引擎等。同时,本课程选课人数很多(2006年到2008年分别为134人、130人、158人),由有限的几名教学组成员根据每个学生的实际情况进行专门指导完全不可行。
另一方面的原因在于软件体系结构十分抽象,难以理解。软件体系结构的基本概念、原则和方法是对诸多不同领域软件系统共性特征的提取和升华,并不针对某一特定领域或特定系统。这些背景知识对于大部分从未参加过实际工作的学生来讲并不现实。
这两点原因结合在一起致使很多学生认为课程讲授的内容朦胧、高深而不切实际。例如在讲授软件体系结构风格与模式的时候,大部分学生根本没有见过这些风格和模式在诸多软件系统中的应用实例,从而很难接受风格和模式存在的必要意义。对部分学生来讲,代码更加接近现实;而对软件内部结构的分解、复用、组织单元的协作是否会留下隐患没有最起码的意识。
因此,本课程从绪论开始就努力让学生明白为什么软件体系结构是必要的,即“软件体系结构的动机”。我们从软件系统的质量要求讲起,明确软件系统的质量属性是可以描述的;软件体系结构描述的意义在于使得复杂软件系统在宏观层面上可以得到严谨,无歧义的描述。而围绕软件体系结构描述的各项活动(如评估,校验等)正是为了保证软件系统最终可以满足质量属性的要求,如图1所示。
在讲授中,我们将各种软件体系结构的概念,原则和方法均归结为对某种特定质量属性的满足的需要。尽管软件体系结构还有许多其他的作用,但是以此质量要求作为初步的动机进行讲授,可以让学生和教师找到一个良好的、可进行有效教学和讨论的基础。当学生可以理解一个抽象的概念或方法的本源之后,便不需要对概念本身进行死记硬背,而是在想到问题的时候便能认为某种应对方案是理所应当,自然而然的事情。这就达到了本课程的讲授目的。当然,这种教学方式也对学生提出了挑战,需要学生用研究性的方式进行主动学习。
二、以专题研究为讲授线索
不论抽象理论应用于实际,不做到实际化,具体化,还是不能避免学生们对软件体系结构虚无缥缈的感觉。对比编程开发课程可以让学生们直接编写程序;软件度量课程可以给出一组数据让学生们按照学到的度量方法计算,软件体系结构的实践要困难得多和复杂得多。因为软件体系结构涉及的范围很广,将每一方面都在课堂上讲授也不可能。即便如此,也会如流水账一般达不到课程讲授的目的。
考虑到我们的学生的自学能力和分析能力都很强,只要给出充分的引导就能进行有效地学习,我们利用文献管理软件EndNote Web和协作办公软件MicrosoftOneNote建立了软件体系结构学习资源库。在这个库中涵盖了自软件体系结构领域开创以来的大部分经典论文,书籍和评论等(目前包含的文章已经超过400篇)。其中还包含了近几年来本研究所的一些系统平台和研究成果。教学组对资源库划分了类别,每个类别针对软件体系结构的一类具体问题。例如,如何进行软件体系结构描述;如何对系统设计进行校验:如何评估:如何在特定领域建立软件体系结构框架;如何对软件体系结构进行复用等问题。围绕这些资源,我们给出了学习指导材料,指导学生根据自己感兴趣的问题自行到学习资源库中对相应类别的文献进行研读和分析,找到解决问题的方案。这也正是本课程期末考查的方式。
通过这样的学习方式,在课堂上的讲授可以将软件体系结构的各个子领域的动机和主要内容,以及各个领域之间的相互关系讲授清楚,再由学生以团队为单位根据自己的兴趣在学习资源库中找到具体的案例或者问题。同时,我们利用额外加分等手段鼓励部分有工作经验的学生以自己面临的实际问题为出发点,在学习过程中不断升华和完善问题的解决方案。
三、以案例讲解为讲授支撑
我们教学的主要目的之一是将软件体系结构基本概念、原则和方法如何在实际案例中应用的方法讲授给学生。在实践过程当中,实际情况千差万别,不可能照搬书本上的理论直接应用。因此教学组专门安排了案例教学部分,帮助学生理解软件体系结构在实际软件工程当中的应用。
在本课程的案例教学当中,我们将本课程案例分为两类。第一类是研究所内部项目的实际项目。这是教学组成员亲身经历的软件项目,对案例的细节、讨论过程和解决方案都有很深刻的体会。于是,在课堂的讲解当中就可以对问题的动机,处理过程,设计方案等做详细的讨论。这些案例来源于多个国家级、省部级项目中。
另一类属于处于世界前沿的工业级项目。课程组成员花费大量的时间来搜集和学习这些项目的资料,并很好地与软件体系结构理论结合起来。同时,我们每年还对案例进行更新。例如,2006年通过介绍OSGi框架以及使用OSGi框架的开发系统Eclipse的插件体系结构来讲解动态软件体系结构原理;2007年介绍Android设计来讲解移动嵌入式设备应用开发的特有需求和体系结构设计方法:2008年介绍以Google为代表的云计算底层系统MapReduce、GFS和BigTable来讲解大型复杂分布式系统的软件体系结构设计。通过这些案例,可以使学生将学到的知识尽快地和可以接触到的,并且是比较新的领域结合到一起,同时也认识到不管多复杂的系统,经过软件体系结构方法的分层和提炼,总是可以拆分成若干种简单的单元和视图,以便于开发者讨论、设计、决策和实现。
软件体系结构在现代软件行业中处于重要地位,然而其抽象性和复杂性使得传统的教学方法无法达到教学目的。为此,我们在教学过程中对教学方法进行了一定程度的革新和改进,以“动机一专题一案例”作为我们教学的主导思想,将抽象的理论和实际应用紧密地结合到一起,用以改进和提高我们的教学质量,期望真正培养出能够推动我国软件工程进步,引领大型复杂系统项目前进的高层次软件人才。