研究生课程软件体系结构的教学实践探讨

2017-11-06 07:27沈莹张林
计算机教育 2017年10期

沈莹 张林

摘 要:软件体系结构课程是软件工程知识领域的重要组成部分,衔接需求分析和概要设计两个阶段,教学内容要求紧密围绕该领域的最新研究成果展开,难度很大,不容易组织。文章从内容、课程实践项目、教学效果评估3方面对这门课程的建设方案进行全面阐述。

关键词:软件体系结构;质量属性驱动;软件架构设计;软件架构文档;软件架构评估

1 背 景

软件体系结构,又称软件架构,是软件工程领域一个非常重要的组成部分。人们目前一般认为软件开发过程包含需求分析、概要设计、详细设计、编码、测试、维护等几个阶段。在需求分析阶段,开发人员得到一组关于系统功能的用例;到了概要设计阶段,开发人员需要为每个用例确定对应的函数以及参数名称和个数。对于开发一个很小的系统来说,由于用例数量少,函数间的调用关系简单,从用例过渡到函数实现相对容易,但是目前新出现的软件规模越来越大(如Visual Studio 2017安装包就有3G,而MATLAB 2016 b有6G),功能越来越复杂,安全性/实时性要求越来越高。开发大型软件时,开发人员需要对系统进行合理的模块划分,设计子系统,确定软件各模块调用逻辑,避免出现代码冗余、代码膨胀、后期难以修改等致命的问题,这些内容则属于软件架构设计的范畴。软件架构设计是软件工程不可或缺的一部分,连接了需求分析和概要设计两个阶段,如图1所示。

虽然软件架构设计的地位非常重要,但是目前开设这门课程的高校却不多。为了满足软件工程专业的培养要求,同济大学软件学院于2014年开设了软件体系结构这门课程,旨在教授学生如何设计软件架构、编写架构文档、对软件架构进行评估等知识和方法。为了使学生对软件架构有一个完整的认识,教师可以卡内基·梅隆大学软件工程学院(software engineering institute, SEI)编写的教材[1]为基础,综合目前流行的软件架构模式和多方面资料,制订相应的学习内容[2];同时,每部分理论知识应对应有课程实践,学生能够通过完成作业和项目,最终掌握相应的知识点。

2 课程内容

2.1 软件质量属性

质量属性需求在设计软件架构过程中起决定性作用,因此本知识点旨在教授学生熟悉软件的质量属性以及每种质量属性的具体例子。在本知识点中,软件质量属性包含可用性(availability)、可修改性(modifiability)、安全性(security)、性能(performance)、可移植性(portability)、可扩展性(portability)、可测试性(testability)等方面。

学生学习使用场景的形式表示每种质量属性。可用性的概要场景和具体场景[1]如图2所示。一个场景包含6個部分:source of stimulus、stimulus、artifact、environment、response和response measure。采用场景表示法能够统一不同质量属性的表示方式,有利于理解项目需求,帮助架构师分析、设计合适的软件架构。

2.2 软件架构策略和模式

软件架构策略(tactics)是一些能保证系统达到所需质量属性要求的技术总称,如可用性的策略包括备份策略、时间戳策略、回滚策略、模块监控策略等。策略可以提高软件某一个属性方面的质量,软件架构模式则由一系列的策略组成,是在不同软件质量属性间作出的一种权衡(tradeoff)。之所以称为权衡,是因为软件质量属性之间存在着冲突,如采用备份策略增强系统势必影响到系统的性能(因为需要花时间完成备份间的同步)。常用的软件架构包括分层模式(layered pattern)、代理人模式(broker pattern)、MVC模式、管道过滤器模式(pipe-and-filter pattern)、P2P模式、CS架构等。文献[3]中又总结了另外3种架构模式:事件驱动架构(event-driven architecture)、微内核架构(microkernel architecture)和微服务架构(microservice architecture)。

软件架构策略和模式具有很强的经验性,简单地要求学生记住各种软件架构模式的特点是很难做到的。为了让学生深入理解各种策略和模式,可在课程内容中引入KWIC系统(该系统的详细说明见3.2节),以说明根据不同架构模式设计出的软件有什么样的特点,另外还可引入示波器软件,说明如何根据需求找出合适的架构模式并加以修改,直至最终设计出合适的软件架构。

2.3 质量属性驱动的软件架构设计

如何挑选和设计软件架构需要架构师的经验,但是从系统的质量属性出发设计软件架构是一个很好的实践方法。质量属性驱动法(ADD)根据用户的需求输出一系列的架构视图以及视图中每个模块的功能和相互作用关系。这些输出结果是软件架构的原型,根据这个原型能够很快得到最终的软件架构。ADD方法包括3个步骤:①找出要分析的对象模块;②分析该模块的需求,设计该模块的架构模式,分解模块并分配需求和功能,定义子模块的接口;③重复第2步直至模块无法分解。

2.4 软件架构文档编写

软件架构文档是用于记录软件架构的重要工具,一方面描述了软件架构师在设计系统架构时作出哪些重要决策,另一方面是一种对后期代码实现的约束。架构文档是会议讨论和信息传递的基础,一个清晰完整的架构文档对所有参与的人员都有重要意义。本知识点包括:①如何选择适合的结构作为架构文档的内容;②如何根据模板撰写架构文档。学生需要学习根据模板将合适的结构写入架构文档中。

2.5 软件架构评估

架构师设计好软件架构并且撰写架构文档后,项目参与人员需要对该架构进行评估以确认是否符合项目需求。软件开发前期的架构评估可以避免系统出现致命且难以修改的错误,提高软件开发的成功率。SEI提供了一种架构评估的方法,即体系结构权衡分析方法(architecture tradeoff analysis method,ATAM)。该方法包含9个步骤,如图3所示,基于软件架构文档和需求文档,参与ATAM讨论的人员通过提问的方式向架构师确认设计的软件架构能够满足所有功能需求和质量属性方面的需求。如果该架构不能满足某些重要的需求,那么架构师需要修改软件架构和文档直至满足要求为止。endprint

3 课程实践项目

3.1 ICDE系统的质量属性分析

为了使学生更好地理解不同质量属性的含义,教师可以通过一个具体的项目(ICDE系统)需求演示该软件需要具有哪些质量属性。ICDE系统是一个小型系统,用于记录客户端用户的所有操作,如浏览页面的网址、搜索的字符串等,这些信息将被ICDE系统保存在数据库里,供第三方工具分析使用,如图4所示。项目需求显示该系统要求记录用户每个操作的时间不超过0.1秒;另外,该系统要求能同时将150个用户的操作保存至数据库中。

课堂实践中,学生从性能、可扩展性、可修改性、安全性、可用性、集成性6方面具体分析ICDE系统的质量属性。基于场景表示法,学生需要根据需求为ICDE系统的每个质量属性找出一个具体场景,并明确指出Source of stimulus、Stimulus、Artifact、Environment、Response和Response measure分别是什么。

3.2 KWIC系统的实现

KWIC系统是一个关键字检索系统,包含两个基本功能:①将用户输入的字符串(一般为电影名称)进行移位操作并将移位后的字符串保存至数据库;②按照用户输入的关键字在数据库中查找相关电影。课堂上学生将分析4种架构模式下KWIC系统的实现方式,包括数据共享架构、管道过滤器架构、面向对象的抽象数据类型架构和事件驱动的隐式调用架构。每种架构都有各自的优缺点,通过表格对比,学生能够学习到以下几点:①架构设计跟需求有关,只有适合/不适合的架构,没有绝对好的架构;②软件架构模式包含多种策略,是在多个软件质量属性方面作出的折衷性决策集合。

学生在课堂上需要了解KWIC系统的需求,并对4种不同架构的特点进行分析。在课下实践中,学生需要下载4种架构下实现好的代码,根据每种架构特点对系统已有的功能进行修改,如给系统增加新的功能、改变数据类型等。通过该实践项目,学生可以亲身体会不同架构对可能发生的修改会产生怎样的影响。

除此之外,学生还要回答一系列问题,如修改系统功能时需要修改哪些模块?该架构是否支持这种修改?最后学生需要将答案整理成报告提交给教师。

3.3 利用ADD方法的软件架构设计

该实践项目首先让学生学习ADD方法如何运用在车库门控制系统的架构设计中。车库门控制系统允许用户通过开关按钮、遥控器和家庭信息系统3种方式控制车库门的开闭;另外家庭信息系统可以诊断车库门控制系统出现的问题;最后该系统能够在多种处理器上运行。可以提取出4个质量属性方面的需求:①检测到障碍物时,门需要在0.1s内停止;②车库门的开闭命令;③支持多种处理器;④多种操作界面。从质量属性出发,软件架构增加了虚拟机模块和时间调度模块机制,保证实现的系统满足以上需求。第一轮迭代结果[1]如图5所示。

继续迭代第2个步骤直至每个模块不能继续划分为止,这样就可以得到一个软件架构原型。通过车库门控制系统,学生可以掌握ADD方法的步骤,学会在实际项目开发中设计合适的软件架构。

在课下实践中,学生需要挑选一个项目进行需求分析,找出功能性需求、非功能性需求和约束,利用课堂上讲授的ADD方法设计出合适的软件架构。该实践项目一般需要学生结合实际经验,对做过的项目重新进行分析和设计,观察利用ADD方法设计出的架构与自己之前实现的架构有什么区别,从而体会两种架构分别有何优缺点。

3.4 ATAM的课堂实践

课堂教学中,一部分学生作为评估团成员提问,一名学生作为架构师对自己设计的架构进行讲解和回答问题。通过亲身实践ATAM的9个步骤,学生能够对整个评估过程有更深的理解。

4 教学效果评估

4.1 教学经验总结

在课堂教学中,学生对老师讲授的知识点会结合实际经验提出自己的问题,如传统的MVC架构如何演化到目前流行的MVP架构,两者的区别有哪些,分别适应于何种需求。此外,学生对一些策略的具体应用很感兴趣,如如何应用运行时注册(runtime registration)、动态查找(dynamic lookup)等策略提高软件的可修改性;学生对云服务和云计算的框架也非常感兴趣。多年授课经验表明,学生更喜欢基于开发经验理解软件架构的基本概念,而不是简单地背诵书上的知识点;在课堂上就所讲知识和教师进行实时交流,要求教师随时解释不懂的问题。总体来说,通过课堂教学,学生不仅了解了软件架构的基本概念和相关方法,还学会了设计软件架构和撰写架构文档以及如何进行架构评估。

在课程实践中,学生基于项目实例进一步理解软件架构相关知识和设计方法。在设计ICDE系统时,学生先在教师的带领下自己分析该系统包含哪些质量属性的需求,然后参考答案总结自己遗漏的地方,并且共同分析自己的结果和课件答案产生差别的原因。在学习KWIC系统时,学生感受到不同的软件架构最终生产出具有不同质量的软件。在课堂上,学生会对每种软件架构的设计过程提出问题,如如何根据需求对软件模块进行划分、每个模块的功能如何定义等。在学习利用ADD方法设计车库门控制系统时,学生对ADD方法的设计过程表现出很大兴趣。由于以前从未使用过类似的软件架构设计方法,因此学生会发现ADD方法设计出的软件架构和自己设计的架构有很大不同。学生针对ADD方法中的每一步对模块功能的细化提出很多问题,体现出积极思考的过程。在利用ATAM方法进行架构质量评估时,学生在课堂上展开了热烈讨论。作为架构师的学生对评估团成员的提问一一作答,有时会被问题问住,继而发现软件架构中存在的问题并加以改正。通过实践,学生更加熟悉了ATAM方法的整个流程。

最后,学生结合自己做过的项目,利用ADD方法进行架构设计,如有的学生设计了安全房屋系统的架构,有的学生为在线旅游网站设计了软件架构。对于每个项目,学生都认真考虑和仔细分析,充分将课堂上所学的知识转化到实践中。

4.2 教学中遇到的问题

软件体系结构这门课程包含的内容很多,从相关理论到实际应用,每一点都需要教师阅读大量材料并且积累丰富的开发经验。在课堂教学中,学生会从各个角度提问,有时甚至需要教师课下查阅资料才能回答学生的问题。教师在授课过程中也需要不断积累学生的问题,通过总结分类发现学生关注的焦点,针对这些问题作好充分准备,才能满足学生的求知欲望。

在课程实践项目中,ICDE系统和KWIC系统的需求有些过时,跟目前各種新型项目(如基于移动平台的项目开发、包含人工智能的项目开发等)的需求差别较大,导致学生通过课程实践获得的经验还需要花时间移植到目前流行的架构设计中,因此未来需要对课程实践项目进行改进,以满足当下的项目开发需求。

5 结 语

经过4年的教学实践,同济大学软件学院开设的软件体系结构这门课形成了完整的体系结构,既有知识点教学,又有课程实践,囊括了软件架构的基本知识。学生表示在课堂上既学到了软件架构的基础理论,又动手写代码解决问题,理解了每个知识点的实际应用。在以后的教学中,我们将继续关注当前流行的软件架构模式和发展趋势,及时更新课程内容,努力使学生接触最新的技术,让学生具有更强的能力和竞争力。

参考文献:

[1] Bass L, Clements Kazman R. Software architecture in practice[M]. 3rd ed. Upper Saddle River: Addison-Wesley, 2012: 1-2.

[2] Software Architecture(Spring 2017)[EB/OL]. [2017-05-07]. http://sse.tongji.edu.cn/yingshen/course/SA2017Spring/index.html.

[3] Richards M. Software architecture patterns[M]. Sebastopol: OReilly Media, 2015: 45-46.

(编辑:宋文婷)endprint