1、清华大学出版社,1,第1章 软件工程和软件设计,清华大学出版社,2,内容提要,1.1 软件 1.1.1 软件的本质 1.1.2 软件神话 6 1.2 软件工程 1.2.1 软件工程 1.2.2 软件过程和软件工程实践 1.2.3 网络环境带来的影响 1.3 软件设计 1.3.1 软件工程中的设计 1.3.2 设计过程和设计质量 1.3.3 软件设计原则 1.4 软件体系结构 1.4.1 什么是软件体系结构 1.4.2 软件体系结构的内容 1.4.3 设计阶段的软件体系结构 1.5 小结,清华大学出版社,3,1.1 软件,1.1.1 软件的本质 计算机软件,是由专业人员开发并长期维护的软件产品。
2、 软件科学成为了今天商业、科学、工程必需的技术,促进了新科技的创新和发展 但是,无论国外、国内,软件危机的达摩克利斯之剑,一直高悬在软件从业者头顶,至今挥之不去。,软件与信息转换,软件不是有形的物理产品,而是人类 思维的产物,软件不是被制造出来,而 是思考出来的。,清华大学出版社,5,软件的特性,软件是设计开发的,而不是传统意义上生产制造的 软件不会磨损! 随着基于构件的构造模式发展,大多数软件需要根据实际的顾客需求定制,硬件和软件的失效曲线,软件,不会受引起硬件磨损 的环境问题的影响。,清华大学出版社,7,计算机软件分类,系统软件 应用软件 嵌入式软件 科学和工程计算软件 产品线软件 人工智
3、能软件 网络化软件,计算机软件分为七个大类,软件工程师正面临着持续挑战。,清华大学出版社,8,新的挑战,开放计算 网络资源 开源软件,所有这些新的挑战,毫无疑问,将对商务人员、软件工程师、最终用户产生无法预测的结果。,软件的演变和认识过程,清华大学出版社,10,程序设计语言的发展有三个层面,以标准C语言簇为典型代表的面向过程的软件设计方法 以JAVA语言簇为典型代表的面向对象的软件设计方法 以XML语言为典型代表的面向构件的软件设计方法,人月神话,人月神话的内容,源于 作者布鲁克斯在IBM公司 SYSTEM/360家族(最长寿 的计算机体系结构之一) 和OS/360中的项目管理经验。,清华大学
4、出版社,12,1.2 软件工程,1.2.1 软件工程 美国电气与电子工程师协会(IEEE)给出的: 软件工程是:(1)将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件。(2)在(1)中所述方法的研究。,软件工程层次图,包括软件工程在内的任何工程方法,必须构建在质量的基础之上。 质量关注点(quality focus) 过程(process) 方法(method) 工具(tool),软件工程是一种层次化的技术!,软件工程与计算机科学的差别,清华大学出版社,15,1.2.2 软件过程和软件工程实践,一个通用的软件工程过程框架,通常包含5个活动: 沟通:在技术工
5、作开始之前,和客户的沟通、协作极其重要 目的是理解利益相关者的项目目标,并收集需求,以定义软件特性、功能。 策划:软件项目好比是一个复杂的旅程,策划活动,就是创建一个使任何复杂的旅程都变得简单的地图,以指导团队的项目旅程,该地图称为软件。 建模:无论是庭园设计家、桥梁建造者、航空工程师、木匠还是建筑师,每天的工作都离不开模型。 他们会画一张草图,来辅助理解整个项目大的构想,包括体系结构、不同的构件如何结合,以及其它特征。 构建:包括手写的、自动生成的编码和测试,以发现编码中的错误。 部署:软件以全部、部分增量的形式交付给用户,用户对其进行评测,并给出反馈意见。,清华大学出版社,16,7条简单的
6、原则,存在价值:软件系统因能给用户提供价值,而具有存在价值。所有的决定,都应基于该思想。 保持简洁:软件设计并不是随意的过程,软件设计中需要考虑很多因素。所有的设计,都应该尽可能简洁, 保持愿景:清晰的愿景,是软件项目成功的基础。没有愿景,项目将会有多种设计思想而永远不能结束。如果缺乏一致性, 关注使用者:有产业实力的软件系统,不是在真空中开发、使用的。通常,软件系统必定是由开发者以外的人员使用、维护和编制文档,等等,这就必须要让别人理解你的系统。因此,在需求说明、设计和实现过程时 面向未来:生命期持久的系统,具有更高的价值。在现在的计算环境中,需求规格说明随时会变 计划复用:复用既省时又省力
7、。软件系统开发过程中,高水平的复用,是一个很难实现的目标。面向对象技术会给代码和设计复用带来好处 认真思考:这最后一条规则,可能最容易忽略。行动之前,清晰定位、完整思考,通常能产生更好的结果。仔细思考,可以提高做好事情的可能性,10个重要的软件工程思想,清华大学出版社,18,1.2.3 网络环境带来的影响,美国南加州大学的巴里贝姆(Barry Boehm)教授,总结了国际上软件工程的发展历程: 20世纪50年代的类似硬件工程 60年代的软件手工生产、70年代的形式化方法和瀑布模型 80年代的软件生产率和可扩展性 90年代的软件并发和顺序进程 21世纪初的软件敏捷性和价值,清华大学出版社,19,
8、软件工程在40年发展历程中关注域转向需求,40年来,软件工程的发展都是以系统为中心的,基于图灵计算模式,图灵计算时代,计算机软件是与计算机系统操作有关的程序、规程、规则及如何与之有关的数据结构和文档,即: 软件=程序+数据结构+文档 随着一个划时代的转变,人们开始推崇“软件即服务”的思想。 那么,计算机软件是与满足需求的信息及与之有关的服务工具,即: 软件=满足需求的信息+服务工具 Google的成功,就是一个现实的例子。,传统的与互联网时代的软件工程观比较,清华大学出版社,21,1.3 软件设计,朗曼字典里,对“设计”的解释包括: 描述某个事物如何被制造出来的图样或模式。 形成上述图样或模式
9、的艺术。 对人造产品中组成部分的一种安排,将对产品在实践中的可用性具有影响。 人的头脑中的一种规则,等等。 由上述定义可见,设计是一种“图样、模式或规划”,其目标,就是要描述一个产品如何被制造出来。 因此,软件设计可以被看作是“对软件将如何开发出来的一种描述”。如果把设计当作一个动词,那么软件设计就是“得到这种描述的活动或过程”。,清华大学出版社,22,1.3.1 软件工程中的设计,分析模型 数据/类设计 体系结构设计 接口设计 构件级设计,对软件需求进行分析和建模开始后,软件设计是建模活动的最后一个软件工程活动,接着便要进入构造阶段,并生成代码和测试。,清华大学出版社,23,1.3.2 设计
10、过程和设计质量,在整个设计过程中,要使用一系列正式技术评审或设计走查,来评估设计演化的质量。标准如下: 设计必须实现所有分析模型中的明确需求,而且满足客户期望的所有隐性需求。 对于生成代码的人、进行测试的人、维护软件的人,设计必须是可读的、可理解的指南。 设计必须提供软件的全貌,并从实现的角度说明数据域、功能域、行为域。,清华大学出版社,24,1.3.3 软件设计原则,抽象 体系结构 模式 模块化 信息隐蔽 功能独立 求精 重构 设计类,模块化和软件成本,模块化时,位置需要保持在M附近,来避免过少、过多的模块化。 至于如何知道M的附近位置?如何将软件划分成模块? 则需要理解后面的设计概念。,清
11、华大学出版社,26,1.4 软件体系结构,1.4.1 什么是软件体系结构 牛津字典中,“体系结构”一词定义为: 建筑的艺术或科学,特别是在考虑美感和实用因素的情况下,设计人类使用的大型建筑物所需的技巧和实际。 建筑风格,建筑物,组织机构、结构的一种样式、规矩或风格。 卡内基梅隆大学的软件工程研究所在网站上公开征集软件体系结构的定义,至今已有百余种。其中,较有影响力的定义包括: 软件系统的结构,包含软件元素、软件元素外部可见的属性以及这些软件元素之间的关系; 软件系统的基本组织,包含构件、构件之间、构件与环境之间的关系,以及相关的设计与演化原则等。,狗窝、房子和高楼,开发一个具有 一定规模和复杂
12、 性的软件系统 和编写一个简单 的程序,是不 一样的,借用设 计模式的作者 G. Booch的比喻, 其中的区别如 同建造一座大 厦和搭建一个 狗窝的差别。,房子的建模,建筑师准备建筑最初的草图,展示外观和内部布局,与客户讨论这些草图,直至所有相关方都达成一致意见,认为展示的就是想要的。,建筑师的角色和沟通依据,建筑师也充当建造者和客户之间的协调人!,体系结构的需要:温切斯特神秘屋,这个大厦没有制作过建筑蓝图 !,软件体系结构的发展史,2001年到2012年间的重要方法、语言、论文、数据和会议,清华大学出版社,32,软件生命周期中软件体系结构的研究与应用,整个软件生命周期中,各阶段软件体系结构
13、的研究热点,清华大学出版社,33,1.4.2 软件体系结构的内容,下面将当前软件体系结构分为4个研究领域: (1)通过提供一种新的体系结构描述语言(Architectural Description Language,ADL)解决体系结构描述问题。 这种语言的目标,是给实践者提供设计体系结构更好的方法,以便设计人员相互交流,并可以使用支持体系结构描述语言的工具来分析案例。 (2)体系结构领域知识的总结性研究。 这一领域关心的,是工程师通过软件实践,总结各种体系结构原则和模式的分类和阐释。 (3)针对特定领域的框架的研究。 这类研究产生了针对一类特殊软件的体系结构框架,比如,航空电子控制系统、移
14、动机器人、用户界面。这类研究一旦成功,这样的框架便可以被毫不费力实例化来生产这一领域新的产品。 (4)软件体系结构形式化支持的研究。 随着新的符号的产生,以及人们对体系结构设计实践的理解逐步深入,需要用一种严格的形式化方法刻画软件体系结构及其相关性质。,清华大学出版社,34,创建软件体系结构,典型的利益相关人及其关注点包括: 投资人:想知道项目是否能够在给定的资源和进度约束下完成。 架构师、开发人员、测试人员:首先考虑的是,最初的构建和以后的维护与演进。 项目经理:需要组织团队,制定迭代计划。 市场人员:想通过品质特点实现与竞争者的差异化。 用户:包括最终用户、系统管理员,以及安装、部署、准备
15、、配置人员。 技术支持人员:关注帮助平台电话呼入的数目和复杂性。,清华大学出版社,35,创建软件体系结构,具体系统,会有其它关键的关注点。 功能性:产品向用户提供哪些功能? 可变性:软件可能需要哪些改变?哪些改变不太可能发生,不需要特别容易进行这些改变? 性能:产品达到怎样的性能? 容量:多少用户并发使用该系统?该系统为用户保存多少数据? 生态系统:在部署的生态环境中,该系统与其他系统进行哪些交互? 模块化:如何将编写软件的任务分解为工作指派(模块),特别是这些模块可以独立地开发,并能够准确、容易地满足彼此的需要? 可构建性:如何将软件构建为一组组件,并能够独立实现和验证这些组件?哪些组件应该
16、复用其它产品,哪些应该从外部供应商处获得? 产品化:如果产品以几种变体的形式存在,如何开发一个产品线,并利用这些变体的共性?产品线中的产品以怎样的步骤开发?在创建一条软件产品线时,要进行哪些投资? 安全性:产品是否需要用户认证,或者必须限制对数据的访问?数据的安全性如何得到保证?如何抵挡“拒绝服务”攻击或其他攻击?,清华大学出版社,36,1.4.3 设计阶段的软件体系结构,根据在设计过程中,对FR和NFR考虑的阶段不同,可以将软件体系结构设计方法分为3类: FR驱动的软件体系结构设计,根据FR得到初步的体系结构设计模型,然后,通过一定的手段,精化设计结果以逐步达到NFR的目标,典型的方法,包括
17、评估与转化、自顶向下组装)等。 NFR驱动的软件体系结构设计 将NFR作为首要考虑因素,将NFR直接映射成为体系结构的建模元素,典型的,包括属性驱动的设计ADD等。 集成FR和NFR的方法,将FR和NFR视为同等重要的设计输入,在体系结构设计过程中,同时兼顾FR和NFR,并将其转化成相应体系结构的建模元素 这类方法,往往与面向Aspect的方法相结合,典型的,包括Use Case和目标驱动、形式化设计分析框架FDAF、Aspect构件等。,体系结构的复用,圣索菲亚大教堂,是拜占庭建筑之美的代表。1100年后,Christopher Wren使用了同样的设计,来建造圣保罗大教堂的穹顶,并成为伦敦
18、的地标性建筑。,系统的构架结构,清华大学出版社,39,1.5 小结,软件设计、软件体系结构与软件工程密切相关,它们是软件工程和软件开发过程的重要组成部分。 首先对软件工程进行介绍,包括软件的本质、软件危机的出现、软件神话,然后对层次化的软件工程以及网络环境带来的影响进行了描述。 由此,可以看到软件设计在软件生存周期和各种软件开发过程模型中所处的位置。 然后,对设计过程、设计质量、软件设计原则进行了介绍 对软件设计有一个全面的理解。 最后,介绍了软件体系结构的概念、软件体系结构的内容和设计阶段的软件体系结构。 软件体系结构设计作为软件设计过程中的活动之一 能在较为抽象的级别上描述整个软件系统的结构,成为大规模、复杂软件系统设计中必不可少的步骤。,