目录
软件过程和工程实践
软件过程(Software Process)
是工作产品构建时所执行的一系列活动、动作、任务的集合。
活动主要实现宽泛的目标(如与利益相关者进行沟通),与应用领域、项目大小、结果复杂性、实施软件工程的重要程度,没有直接关系。
动作(如体系结构设计)包含了主要工作产品(如体系结构设计模型)生产过程中的一系列任务。如:需求分析、设计与建模、系统测试等。
任务,则关注小而明确的目标,能够产生实际产品。如:需求收集、收集整理等
软件过程的目标:
通常是及时、高质量地交付软件,以满足软件项目资助方和最终用户的需求。
通用的软件工程过程框架(5个活动)
软件工程的实践如何融入该过程框架?
10个重要软件工程思想:
**7条简单的原则(程序员都应遵守的原则) 重点
软件工程关注域
软件工程关注域转向需求
原因:网络对软件的影响
软件工程始终没有一个确切的指向,从面向过程、面向对象,到面向构件、面向领域,科学家们对软件工程的关注域,总是与时俱进
网络对软件的影响:现代软件生态环境
现代软件的“生态环境”:是网络为广大用户提供一个均等的、虚拟的、丰富的计算机应用平台、信息服务平台、软件资源下载平台、软件维护平台,无论是软件开发商,还是系统用户,越来越把软件视作网络环境中的软件。
对于网络环境下工作的用户,端机上的资源量(计算资源、存储资源、软件资源、信息资源,等等)和网络上的资源量相比,都变得微不足道。
软件的开发、应用,越来越面向日益丰富的网络资源,软件正从面向图灵计算模式转向面向网络计算模式。
这是一个划时代的转变,人们开始推崇“软件即服务”的思想,定义:
网络对软件的影响:传统vs互联网时代的软件工程
软件设计
设计是一种“图样、模式或规划”,其目标,就是要描述一个产品如何被制造出来。
软件设计可以被看作是“对软件将如何开发出来的一种描述”
在编码前,先对软件结构进行良好的设计,已成为软件开发中非常重要的环节。
随着软件工程思想的出现,以及结构化软件开发、面向对象软件开发、基于构件的软件开发等方法的发展,软件设计越来越受到重视,并形成各种系统化的设计过程和技术。
软件从分析到设计
对软件需求进行分析和建模后,软件设计是建模活动的最后一个软件工程活动,分析模型到设计模型的转换为:
设计过程和设计质量
设计是一个迭代过程,需要将需求转化成软件的“蓝图”
质量指导原则
质量属性:体现软件的设计目标
软件设计的基本原则
(1)抽象方法:抽象(Abstraction)是人类处理复杂问题的基本方法之一
过程抽象:指具有明确和有限功能的指令序列。过程抽象的命名,暗示了功能,但是隐藏了具体细节。如过程“开”门,就隐含了一长串的过程性步骤,如走到门前、伸手抓住门上把手、转把手并拉门、离开打开的门,等等。
数据抽象:是描述数据对象的冠名数据集合。在过程抽象“开”的情形下,可以定义一个叫“门”的数据抽象。同任何数据对象一样,门的数据抽象,将包含一组描述门的属性,如门的类型、转动方向、开门机构、重量、尺寸。
(2)体系结构 :体系结构(Architecture)是程序构件(模块)的结构或组织。如逻辑架构、物理架构、技术架构、组件设计、接口设计、集成设计、可靠性|可为维护性等。
更多情况下,构件可被推广,用于代表主要的系统元素及交互。
软件设计的目标之一,是导出系统的体系结构透视图,透视图作为框架,将指导更详细的设计活动。
一系列的体系结构模式,使得软件工程师能够复用设计级的概念。
(3)设计模式
(4)模块划分 :模块化(Modularity)是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程,有多种属性分别反映其内部特性。
模块化是一种处理复杂系统分解为更好的可管理模块的方式。模块化用来分割,组织、打包软件。每个模块完成一个特定的子功能,然后,所有模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
“分而治之(Divide and Conquer)”策略,将一个复杂问题分解成可以管理的若干块,能够更好地解决问题。
模块化和软件成本
(5)信息隐蔽 :信息隐蔽(Information Hiding)原则表明,模块具备的特征,是对其它所有模块都隐蔽自己的设计策略。
隐蔽,意味着定义一系列独立的模块,可以得到有效的模块化,独立模块相互之间只交流实现软件功能所必须的那些信息。
抽象有助于定义构成软件的过程(或信息)实体。隐蔽定义并加强了,模块内的过程细节和模块所使用的任何局部数据结构的访问约束。
(6)功能独立
(7)逐步求精
(8)重构软件
(9)类的设计
软件体系结构
软件体系结构(定义)
CMU(卡内基梅隆大学)的软件工程研究所在网站上公开征集软件体系结构的定义,至今已有百余种。其中,较有影响力的定义包括:
软件系统的结构,包含软件元素、软件元素外部可见的属性,以及这些软件元素之间的关系;
软件系统的基本组织,包含构件、构件之间、构件与环境之间的关系,以及相关的设计与进化原则等。
设计体系结构的关键人:架构师
软件体系结构发展历程
(1)早期阶段(1940年代-1960年代):这个阶段主要关注大规模计算机系统的设计和开发,如ENIAC、EDVAC等。这些计算机系统通常采用硬连线方式实现。
(2)软件危机阶段(1960年代-1970年代):为了解决软件危机,人们开始采用结构化的方法和模块化的设计思想,如结构化编程和模块化设计。
(3)面向对象阶段(1980年代-1990年代):面向对象的编程方法引入了类、对象和继承等概念,使得软件设计更加模块化和可复用。常见的面向对象软件体系结构模式有MVC(Model-View-Controller)和分层架构。
(4)组件化阶段(1990年代-2000年代):组件化的思想出现后,软件系统可以通过组件和接口的方式进行组装。常见的组件化软件体系结构包括客户端/服务器架构和面向服务的架构(SOA)。
(5)分布式阶段(1990年代-2000年代):随着互联网的发展,分布式计算变得日益重要。分布式软件体系结构允许将系统的各个部分分布在不同的计算机上,并通过网络进行通信和协作。
(6)服务化阶段(2000年代至今):服务化是将软件系统划分为一系列相互协作的服务,每个服务对外提供标准化的接口。常见的服务化架构是微服务架构,它将系统划分为小型、独立的服务单元。
软件体系结构的内容(3个方面)
内容1:4个研究领域
通过提供一种新的体系结构描述语言(Architectural Description Language,ADL)解决体系结构描述问题。
体系结构领域知识的总结性研究。这一领域关心的,是工程师通过软件实践,总结各种体系结构原则和模式的分类和阐释。
针对特定领域的框架的研究。这类研究产生了针对一类特殊软件的体系结构框架,比如,航空电子控制系统、移动机器人、用户界面。
软件体系结构形式化支持的研究。随着新的符号的产生,以及人们对体系结构设计实践的理解逐步深入,需要用一种严格的形式化方法刻画软件体系结构及其相关性质。
内容2:设计模式和应用框架
内容3:创建软件体系结构的关注点
设计阶段的体系结构
体系结构设计方法
软件体系结构的设计方法,指通过一系列的设计活动,获得满足系统功能性需求(Functional Requirement,FR),并且符合一定非功能性需求(Non-Functional Requirement,NFR)约束的软件体系结构模型。
软件体系结构设计方法分为3类