软件设计与体系结构从CDIO工程理念出发,围绕构思(Conceive)、设计(Design)、实现(Implement)、运作(Operate)四个方面展开阐述,以一种崭新的视角展现软件设计和体系结构的内容,尽可能做到覆盖面广和内容新颖,在保持经典内容的基础上,力求提供来自业界最新的内容和进展。构思(C)给出一个软件要做什么的总体思路;设计(D)给出一个软件怎么做的方法和手段;实现(I)给出一个软件实际做出来的实现技术和路线;运作(O)给出一个软件如何成功运作的模式和方法。CDIO各个部分相对独立但又互有联系,能够让读者以全面的、主动的和实用的方式学习和掌握相关内容,并着重强调工程实践训练和综合能力培养。软件设计与体系结构可作为计算机相关专业本科生和研究生的教材,同时也是软件工程领域专业人员的优秀参考读物。
第一篇 构思篇(Conceive)
第1章 软件环境
1.1 软件与软件分类
1.1.1 软件的特点
1.1.2 软件的分类
1.2 程序设计语言与开发环境
1.2.1 程序设计语言
1.2.2 开发环境
1.3 数据库环境
1.3.1 关系数据库
1.3.2 面向对象数据库
1.3.3 非结构化数据库
1.4 平台环境
1.4.1 集成平台
1.4.2 虚拟化平台
1.4.3 云平台
1.5 软件工程环境
1.5.1 软件过程模型
1.5.2 软件工程经济学
1.5.3 软件过程管理
1.5.4 软件维护及演化
1.6 习题与思考题
第2章 软件需求
2.1 软件需求与需求工程概述
2.1.1 需求的定义
2.1.2 需求工程概述
2.2 需求获取
2.2.1 引言
2.2.2 需求获取的实质
2.2.3 常用方法
2.3 需求建模与分析
2.3.1 面向对象建模
2.3.2 过程建模
2.3.3 数据建模
2.4 需求规约与验证
2.4.1 需求规约
2.4.2 需求验证
2.5 需求管理
2.6 习题与思考题
第3章 软件体系结构
3.1 “4+1”视图模型
3.1.1 逻辑视图
3.1.2 开发视图
3.1.3 进程视图
3.1.4 物理视图
3.1.5 场景
3.2 软件体系结构的定义
3.3 软件体系结构的核心模型
3.4 软件体系结构描述方法
3.5 软件体系结构描述语言(ADL)
3.6 软件体系结构设计原则
3.7 基于体系结构的软件开发过程
3.8 软件体系结构的风格
3.8.1 管道-过滤器风格
3.8.2 分层风格
3.8.3 客户/服务器风格
3.8.4 浏览器/服务器风格
3.8.5 事件驱动风格
3.9 体系结构模式
3.9.1 从混沌到结构
3.9.2 分布式系统
3.9.3 交互系统
3.9.4 适应性系统
3.10 习题与思考题
第二篇 设计篇(Design)
第4章 软件设计
4.1 设计目标及要素
4.2 设计原则
4.2.1 抽象化
4.2.2 模块化
4.2.3 信息隐藏
4.2.4 模块的功能独立性
4.2.5 降低模块间耦合度的方法
4.3 设计规约
4.4 设计方法
4.4.1 结构化设计方法
4.4.2 面向对象的设计
4.5 习题与思考题
第5章 统一建模语言UML
5.1 UML核心概念
5.1.1 元素
5.1.2 具名元素
5.1.3 命名空间
5.1.4 可打包元素
5.1.5 可重定义元素
5.1.6 分类器
5.1.7 特性
5.1.8 注解
5.1.9 关系
5.2 UML关键字与版型
5.2.1 关键字
5.2.2 版型
5.3 UML图示
5.3.1 类图
5.3.2 对象图
5.3.3 包图
5.3.4 组件图
5.3.5 合成结构图
5.3.6 部署图
5.3.7 用例图
5.3.8 活动图
5.3.9 状态机图
5.3.10 交互图
5.3.11 顺序图
5.3.12 通信图
5.3.13 计时图
5.4 习题与思考题
第6章 设计模式
6.1 模式思维方法
6.1.1 模式的概念
6.1.2 模式的重要性
6.1.3 软件设计模式的分类
6.1.4 模式描述模板
6.1.5 模式思维的步骤
6.2 设计模式概述
6.2.1 创建型模式
6.2.2 结构型模式
6.2.3 行为型模式
6.3 习题与思考题
第7章 软件复用
7.1 概述
7.1.1 概念
7.1.2 软件复用的发展
7.1.3 可复用的软件制品
7.1.4 软件复用的分类
7.1.5 软件复用的困难与建议
7.1.6 软件复用的宗旨
7.2 分析复用
7.2.1 分析过程复用
7.2.2 分析制品复用
7.3 设计复用
7.3.1 设计过程复用
7.3.2 基于构件的设计复用
7.4 代码复用
7.5 测试复用
7.5.1 面向复用的测试用例设计过程
7.5.2 复用测试用例描述要素
7.6 习题与思考题
第8章 软件界面设计
8.1 软件界面设计概述
8.1.1 软件界面分析
8.1.2 软件界面开发过程
8.1.3 软件界面设计基本原则
8.2 人机界面基础知识
8.2.1 认知心理学
8.2.2 软件人机工程学
8.2.3 艺术设计
8.3 界面的定量分析
8.3.1 GOMS击键层模型
8.3.2 界面效率的测量
8.3.3 Fitts律和Hick律
8.4 人本界面
8.4.1 认知和关注点
8.4.2 界面模式与单调性
8.4.3 统一性和元动作
8.4.4 易用性和帮助机制
8.5 移动设备界面设计
8.6 习题与思考题
第三篇 实现篇(Implement)
第9章 Web开发技术
9.1 Web开发概述
9.1.1 运作原理及概念
9.1.2 开发语言及技术概述
9.1.3 Web应用的特点
9.2 Web服务器
9.2.1 Microsoft IIS
9.2.2 Apache
9.2.3 Tomcat
9.2.4 J2EE服务器
9.2.5 Nginx
9.3 服务器端开发技术及框架
9.3.1 Java技术
9.3.2 .Net技术
9.3.3 PHP技术
9.3.4 Ruby技术
9.3.5 MVC框架
9.3.6 Spring框架
9.4 Web前端开发技术
9.4.1 HTML
9.4.2 CSS层叠样式表
9.4.3 JavaScript技术
9.4.4 AJAX技术
9.4.5 Silverlight技术
9.5 习题与思考题
第10章 数据库开发技术
10.1 SQL语言
10.2 数据库和表
10.2.1 创建及删除数据库
10.2.2 创建表
10.2.3 修改表
10.2.4 删除表
10.3 索引
10.3.1 创建索引
10.3.2 删除索引
10.4 查询
10.4.1 SELECT语句
10.4.2 多表查询
10.4.3 子查询
10.4.4 集合运算
10.4.5 聚集函数
10.5 数据维护
10.5.1 插入
10.5.2 更新
10.5.3 删除
10.6 视图
10.6.1 创建视图
10.6.2 删除视图
10.7 游标
10.7.1 声明游标
10.7.2 打开和关闭游标
10.7.3 删除游标
10.7.4 应用游标
10.8 存储过程
10.8.1 存储过程创建与修改
10.8.2 执行存储过程
10.8.3 删除存储过程
10.9 触发器
10.9.1 创建触发器
10.9.2 删除触发器
10.10 习题与思考题
第11章 软件成本估算技术
11.1 软件成本估算的步骤
11.1.1 建立目标
11.1.2 计划所需的数据与资源
11.1.3 准确说明软件需求
11.1.4 尽可能详细地做出估算
11.1.5 采用多个独立的方法与资源
11.1.6 比较与迭代估算
11.1.7 跟踪与变更
11.2 软件成本估算的方法
11.2.1 算法模型
11.2.2 专家判断
11.2.3 通过推理来进行估算
11.2.4 帕金森估算
11.2.5 价格策略估算
11.2.6 自顶向下估算
11.2.7 自底向上估算
11.2.8 各方法的总结比较
11.3 基本COCOMO模型软件成本估算
11.3.1 模型定义与假设
11.3.2 软件开发模式分类
11.3.3 组织型基本COCOMO模型
11.3.4 其他模式COCOMO模型
11.4 习题与思考题
第12章 软件架构技术
12.1 构件技术
12.1.1 软件构件技术基础
12.1.2 基于构件的软件工程
12.2 软件架构综述
12.2.1 企业架构
12.2.2 业务架构
12.2.3 应用架构
12.2.4 信息架构
12.3 中间件
12.3.1 中间件的目标及地位
12.3.2 中间件的基本类型
12.3.3 常见中间件技术介绍
12.4 习题与思考题
第13章 软件集成技术
13.1 软件合成与软件集成
13.2 软件集成模式
13.2.1 集成适配器模式
13.2.2 集成消息器模式
13.2.3 集成正面模式
13.2.4 集成媒介器模式
13.3 企业应用集成
13.3.1 EAI的产生和意义
13.3.2 企业应用系统的分类
13.3.3 企业应用集成的基本原则
13.4 数据集成
13.4.1 数据集成的基本概念
13.4.2 参考数据模型
13.4.3 数据集成的元数据管理
13.5 基于消息服务的集成框架
13.5.1 消息传输模型
13.5.2 消息代理任务
13.5.3 消息代理拓扑结构
13.5.4 消息代理产品的选择
13.5.5 使用J2EE的企业消息传递
13.6 过程集成
13.6.1 工作流和工作流管理系统
13.6.2 跨组织过程集成
13.7 习题与思考题
第14章 软件测试技术
14.1 软件测试概述
14.1.1 软件测试技术的发展
14.1.2 软件开发与软件测试
14.1.3 软件测试基本原理与原则
14.1.4 软件测试模型
14.1.5 测试心理学
14.1.6 测试覆盖
14.2 软件测试管理
14.2.1 质量改进模型PDCA
14.2.2 测试需求
14.2.3 测试计划
14.2.4 测试设计及测试用例
14.2.5 测试执行
14.2.6 测试记录与跟踪
14.2.7 回归测试
14.2.8 总结与报告
14.3 软件测试技术
14.3.1 黑盒测试与白盒测试
14.3.2 手工测试与自动化测试
14.3.3 单元测试
14.3.4 数据库性能检查
14.3.5 压力测试
14.3.6 安全性测试
14.3.7 安装测试
14.3.8 环境测试
14.4 测试工具
14.5 习题与思考题
第四篇 运作篇(Operate)
第15章 软件架构师角色与职责
15.1 软件架构师的定义
15.2 软件架构师的工作场景
15.3 软件架构师的角色
15.4 软件架构师与其他角色的关系及区别
15.4.1 软件架构师与产品经理的关系及区别
15.4.2 软件架构师与项目经理的关系及区别
15.4.3 软件架构师与系统分析员的关系及区别
15.5 软件架构师的职责
15.6 软件架构师的所应具备的能力
15.7 软件架构师的工作评价标准
15.8 习题与思考题
第16章 软件运作模式
16.1 软件企业的崛起
16.1.1 大型科研项目的研究是软件业的萌芽
16.1.2 独立软件产品的出现预示软件业开始步入正轨
16.1.3 企业解决方案让软件业开始兴盛
16.1.4 个人电脑及互联网的普及让软件业繁荣
16.2 传统的软件运作模式
16.3 基于Free的运作模式
16.3.1 自由软件
16.3.2 免费软件
16.3.3 共享软件
16.3.4 案例
16.4 基于开源的运作模式
16.4.1 开源软件
16.4.2 开源软件盈利模式
16.4.3 案例
16.5 基于服务的运作模式
16.5.1 软件企业职能转变
16.5.2 基础设施即服务(IaaS)
16.5.3 平台即服务(PaaS)
16.5.4 软件即服务(SaaS)
16.6 习题与思考题
第17章 案例分析
17.1 Google搜索引擎
17.1.1 营销模式
17.1.2 运作分析
17.2 Twitter
17.2.1 营销模式
17.2.2 运作分析
17.3 Facebook
17.3.1 营销模式
17.3.2 运作分析
17.4 淘宝
17.4.1 营销模式
17.4.2 运作分析
17.5 习题与思考题
参考文献
第1章 软件环境
11 软件与软件分类
软件(Software)是用户与硬件之间的接口界面,用户主要是通过软件与计算机进行交流。软件是计算机系统设计的重要依据。为了方便用户,为了使计算机系统具有较高的总体效用,在设计计算机系统时,必须全局考虑软件与硬件的结合,以及用户的要求和软件的要求。来自众多教材的关于软件的定义一般包含如下三方面内容:
(1)指令的集合(也称为计算机程序),通过执行这些指令可以满足预期的特征、功能和性能需求。
(2)数据结构,它使程序可以充分利用信息。
(3)描述程序功能需求以及程序如何操作和使用的文档。因而可以认为软件=程序+数据+文档
中华人民共和国国家标准软件工程术语GB/T11457―1995对软件的定义是:与计算机系统的操作有关的程序、规程、规则及任何与之有关的文档。对于计算机来说,硬件就如同是一个人的身躯,软件就如同一个人的思想和灵魂。
111 软件的特点软件作为一个产品或服务,与其他产品相比具有很大的区别,具体表现如下特点:
(1)软件是一种逻辑实体,不是具体的物理实体,它具有抽象性。软件的好坏与否,正确与否,必须通过测试、分析、思考、判断之后才知道。这一特性就给软件的设计、生产和管理带来了很多困难。
(2)软件产品的生产主要是研制,是知识的结晶,不像传统意义上的硬件制造有明显的制造过程,在软件的开发过程中没有明显的制造过程。
(3)软件具有“复杂性”,其开发和运行常受到计算机系统的限制,对计算机系统有着不同程度的依赖性。为了消除这种依赖性,引入了软件移植,并把可移植性当做衡量软件质量的因素之一。
(4)软件的生产职能由人采用人工方式来生产,还未完全摆脱手工开发方式,成本昂贵。所以为了加快软件技术的发展,就必须提出和采用新的软件开发方法。例如,可以采用软件复用技术或者使用有效的软件开发环境提高软件开发效率。
(5)在软件的运行和使用期间,没有硬件那样的机械磨损和老化问题,但存在退化问题,由于修改及需求的变化导致退化。硬件故障率曲线是一个U形曲线(即为浴盆曲线,在产品整个使用寿命期间,典型的故障率变化曲线,形似浴盆),说明硬件随着使用时间的增加,故障率也急剧上升)。
软件故障率曲线,没有U形曲线的右半部分说明软件不会随着使用时间的增加使得故障率增加,所以软件不存在磨损和老化