《软件架构理论与实践》
架构师书库
软件架构理论与实践
李必信 廖力 王璐璐 孔祥龙 周颖 编著
前 言
软件架构(Software Architecture,SA)设计是成熟软件开发过程中的一个重要环节,它不仅是连接用户需求和进一步设计、实现的桥梁,也是软件开发早期阶段质量保证的关键步骤。无数例子告诉我们,那些忽视SA设计质量的企业最终的教训总是惨痛的。SA是软件系统的一种整体的高层次结构表示,是系统的骨架和根基,决定了软件系统的健壮性和生命周期长短。“根基不稳,大厦将倾”这句话在软件系统中同样适用。
近几年,在与大型企业的合作过程中笔者更加感觉到SA的重要性,大量的试验已经证明SA不仅与软件产品的质量属性(如安全性、可靠性、可维护性等)有关,还与软件产品的寿命有关。一个设计不够完善的SA存在脆弱性问题,容易招致恶意攻击,严重时会带来安全风险;一个设计不够完善的SA也有可能存在难以维护和扩展的问题,导致升级困难,影响软件产品的寿命,等等。
如你所知,在物理世界中,房屋、桥梁、汽车的架构等都是决定它们质量好坏和生命周期长短的重要因素之一;同样,在软件世界中,SA也是决定软件质量好坏和软件生命周期长短的重要因素之一。好的SA会使得软件自身的性能、可靠性、安全性、可维护性等质量指标能够很好地满足用户的需求,不好的SA会导致所有这些指标或部分指标达不到用户要求。可见,“SA设计非常重要!那么,如何在实践中设计和实现一个好的SA,如何评价某个SA的好与不好,以及如何控制SA的设计和演化过程,以便获得质量更高的SA?这些都是软件利益相关者日常关注的问题。
本书全面介绍了SA,从SA发展的历史、现在到可能的未来,从SA的基础理论方法到技术手段,从SA的设计开发实践到质量保障实践,从静态SA到动态SA再到运行态SA等,涵盖了SA涉及的几乎所有必要的知识点。本书包括三篇:基础理论篇(上篇)包含6章内容,详细介绍了SA的基础理论方法和技术手段;工程实践篇(中篇)包含10章内容,详细介绍了SA的开发实践和质量保障实践;未来主题篇(下篇)包含7章内容,详细介绍了SA的新研究主题、新业界关注点以及SA未来发展趋势等。
本书的读者对象如下:
作为高等学校软件工程、计算机科学技术、网络空间安全等相关学科的入门级教科书,面向高年级本科生和研究生;
作为SA研究人员的参考书,本书讨论的SA度量、仿真、验证、评估等各种质量保障技术,以及解耦、技术债、演化、重构等各种软件架构主题,为相关研究人员提供了很好的启迪和行动指南;
作为软件架构师及其他工程技术人员的工具书,本书针对SA进行全方位介绍,涵盖了与SA相关的几乎所有知识点,为系统地学习和熟练掌握SA提供了所需的各方面知识。
由于本书的定位是软件架构入门级教材,我们将为广大教师和学生提供丰富的教学和学习资源(可从华章网站www.hzbook.com获取),包括课件、思考题解答、案例库、训练题库,以及部分在线的软件架构监控、仿真、度量、验证和重构等原型工具。
参与本书撰写的人员主要是来自东南大学软件工程研究所、计算机科学与工程学院的教师,包括李必信博士、廖力博士、王璐璐博士、周颖博士、孔祥龙博士等,其中李必信博士负责规划全书内容和结构,并参与所有章节的撰写,其他几位老师分别参与部分章节的撰写以及全书的校订和完善工作。软件工程研究所的部分博士后、博士生和硕士生参与了文字校对和画图等工作,他们是李宗花、董瑞志、刘辉辉、王桐、熊壬浩、王丽、宋启威、韩伟娜、李慧丹、谢仁松、杨安奇、杜鹏程、尹强、宋震天、汪小飞、苏晓威、段鹏飞、王家慧、汤立辉、杜成杰、程昕云、张理想、张春光、廖飞龙、许周等。
在本书写作过程中,还得到了来自武汉大学的应时教授和梁鹏教授、大连理工大学的江贺教授、南京大学的郑滔教授、华为公司的吴文胜先生的指导和帮助,在此对他们的辛苦劳动表示衷心的感谢。
限于水平,作者对软件架构的理解和语言表达难免存在不当之处,在此敬请读者批评指正。
李必信
说明:
1)建议课堂教学全部在多媒体机房内完成,实现“讲-练”结合。
2)建议教学分为核心知识技能模块(前16章的内容)和技能提高模块(第17~23章的内容),不同学校可以根据各自的教学要求和计划学时数对教学内容进行取舍。
3)建议本科生的教学内容是第1~16章必修,第17~23章选修;研究生的教学内容是第1~23章全部必修。
目录
前言
教学建议
1.3.2 概念体系和核心技术形成阶段(1991—2000) …… 6
1.3.3 理论体系完善与发展阶段(1996年至今) …… 7
第4章 软件架构的风格与模式 …… 59
4.1 软件架构风格的定义 …… 59
4.2 软件架构风格的分类 …… 60
4.3 典型的软件架构风格 …… 60
4.3.1 管道-过滤器风格 …… 60
4.3.2 主程序/子程序风格 …… 62
4.3.3 面向对象风格 …… 64
4.3.4 层次化风格 …… 65
4.3.5 事件驱动风格 …… 67
4.3.6 解释器风格 …… 69
4.3.7 基于规则的系统风格 …… 71
4.3.8 仓库风格 …… 73
4.3.9 黑板系统风格 …… 75
4.3.10 C2风格 …… 77
4.3.11 客户机/服务器风格 …… 79
4.3.12 浏览器/服务器风格 …… 83
4.3.13 平台/插件风格 …… 85
4.3.14 面向Agent风格 …… 87
4.3.15 面向方面架构风格 …… 91
4.3.16 面向服务架构风格 …… 93
4.3.17 正交架构风格 …… 95
4.3.18 异构风格 …… 97
4.3.19 基于层次消息总线的架构风格 …… 99
4.3.20 模型-视图-控制器风格 …… 101
4.4 软件架构模式 …… 103
4.5 本章小结 …… 103
思考题 …… 104
参考文献 …… 104
第5章 软件架构描述语言 …… 107
5.1 引言 …… 107
5.2 ADL的核心设计元素 …… 107
5.2.1 组件 …… 108
5.2.2 连接件 …… 108
5.2.3 架构配置 …… 109
5.3 几种典型的ADL …… 109
5.3.1 Aesop …… 109
5.3.2 C2 SADL …… 110
5.3.3 UniCon …… 114
5.3.4 Wright …… 116
5.3.5 XYZ/ADL …… 117
5.3.6 ACME …… 118
5.3.7 XBA …… 118
5.3.8 ABC/ADL …… 120
5.3.9 MetaH …… 121
5.3.10 Rapide …… 121
5.3.11 Darwin …… 122
5.3.12 xADL 2.0 …… 122
5.4 本章小结 …… 123
思考题 …… 123
参考文献 …… 123
第6章 软件架构与敏捷开发 …… 125
6.1 软件开发的发展简史 …… 125
6.2 敏捷开发 …… 127
6.2.1 敏捷开发的基本理念 …… 127
6.2.2 敏捷开发实践 …… 128
6.3 敏捷开发过程中的软件架构设计 …… 130
6.3.1 需求分析 …… 130
6.3.2 初始设计 …… 130
6.3.3 迭代过程 …… 130
6.3.4 敏捷的设计思想 …… 131
6.4 两类常见的敏捷软件架构设计方法 …… 132
6.4.1 敏捷开发初始阶段设计 …… 133
6.4.2 敏捷开发迭代过程中的设计 …… 134
6.5 本章小结 …… 136
思考题 …… 137
参考文献 …… 137
中篇 工程实践篇
第7章 架构驱动的软件开发 …… 140
7.1 架构驱动的软件开发简介 …… 140
7.2 架构需求获取 …… 140
7.3 架构设计、文档化和评估 …… 144
7.3.1 架构设计、文档化和评估是一个迭代过程 …… 144
7.3.2 什么是架构的结构 …… 147
7.3.3 从架构需求出发的评估 …… 148
7.3.4 寻找ATAM中的“权衡点”和“敏感点” …… 149
7.4 架构的实现与维护 …… 151
7.4.1 架构的实现 …… 151
7.4.2 架构的维护 …… 152
7.5 本章小结 …… 152
思考题 …… 152
参考文献 …… 153
第8章 软件架构设计和实现 …… 154
8.1 从需求分析到架构设计 …… 154
8.1.1 软件架构对需求的影响 …… 155
8.1.2 基于软件需求的软件架构设计 …… 156
8.1.3 需求与架构的协同演化 …… 163
8.2 从软件架构到详细设计 …… 163
8.2.1 详细设计对软件架构的影响 …… 164
8.2.2 从软件架构映射到详细设计 …… 166
8.2.3 软件架构视图 …… 168
8.3 软件架构设计原则 …… 169
8.3.1 架构设计的一些基本原则 …… 169
8.3.2 架构设计的关键原则 …… 170
8.4 软件架构设计面临的主要威胁及对策 …… 171
8.4.1 被忽略的重要非功能需求 …… 171
8.4.2 频繁变化的需求 …… 172
8.4.3 考虑不全面的架构设计 …… 172
8.4.4 不及时的架构验证 …… 173
8.4.5 较高的创造性架构比重 …… 173
8.4.6 架构的低可执行性 …… 174
8.5 本章小结 …… 174
思考题 …… 174
参考文献 …… 174
第9章 软件架构的演化和维护 …… 178
9.1 软件架构演化和软件架构定义的关系 …… 179
9.1.1 对象演化 …… 179
9.1.2 消息演化 …… 180
9.1.3 复合片段演化 …… 184
9.1.4 约束演化 …… 186
9.2 软件架构演化方式的分类 …… 186
9.2.1 软件架构静态演化 …… 187
9.2.2 软件架构动态演化 …… 190
9.3 软件架构演化原则 …… 197
9.4 软件架构维护 …… 201
9.4.1 软件架构知识管理 …… 201
9.4.2 软件架构修改管理 …… 202
9.4.3 软件架构版本管理 …… 202
9.5 本章小结 …… 202
思考题 …… 203
参考文献 …… 203
第10章 软件架构恢复 …… 207
10.1 引言 …… 207
10.1.1 软件架构的恢复过程 …… 208
10.1.2 架构信息提取 …… 208
10.1.3 架构恢复技术 …… 209
10.2 架构信息提取 …… 212
10.2.1 相关定义 …… 212
10.2.2 从源代码提取架构信息 …… 212
10.2.3 从编译构建过程提取架构信息 …… 215
10.2.4 从目录层次提取架构信息 …… 217
10.2.5 基于架构文档的架构信息提取 …… 219
10.3 基于多规则聚类的架构恢复 …… 220
10.3.1 聚类理论基础 …… 220
10.3.2 架构恢复流程 …… 222
10.3.3 具体恢复技术 …… 223
10.4 本章小结 …… 232
思考题 …… 233
参考文献 …… 233
第11章 软件架构质量 …… 237
11.1 引言 …… 237
11.2 软件架构与质量属性 …… 239
11.3 软件架构质量指标 …… 240
11.3.1 内部质量指标 …… 240
11.3.2 外部质量指标 …… 243
11.4 软件架构质量保障和评估方法 …… 245
11.4.1 评估准备 …… 246
11.4.2 利益相关者 …… 247
11.4.3 参与者 …… 248
11.4.4 评估时机 …… 249
11.4.5 评估技术 …… 250
11.4.6 软件架构评估的收益与成本 …… 253
11.5 本章小结 …… 254
思考题 …… 254
参考文献 …… 254
第12章 软件架构仿真 …… 256
12.1 软件仿真的概念 …… 256
12.1.1 连续型仿真 …… 256
12.1.2 离散型仿真 …… 257
12.1.3 混合型仿真 …… 257
12.2 软件架构仿真流程 …… 258
12.3 UML软件架构仿真 …… 259
12.3.1 基于UML类图和顺序图的软件架构仿真 …… 259
12.3.2 基于UML用例图和活动图的软件架构仿真 …… 259
12.3.3 从带有注释的UML图产生OPNET仿真模型 …… 260
12.4 非UML软件架构仿真 …… 261
12.4.1 SASIM仿真:用于系统功能分析 …… 261
12.4.2 面向对象数据库的架构仿真 …… 263
12.5 软件架构仿真实践 …… 264
12.5.1 软件架构描述文档 …… 264
12.5.2 SSD和SD转化为事件执行图 …… 266
12.5.3 局部仿真和整体仿真 …… 269
12.5.4 仿真结果的分析 …… 275
12.6 本章小结 …… 276
思考题 …… 276
参考文献 …… 277
第13章 软件架构度量和评估 …… 279
13.1 引言 …… 279
13.1.1 单版本的软件架构度量和评估 …… 280
13.1.2 多版本的软件架构度量和评估 …… 281
13.2 典型的软件架构度量和评估方法 …… 283
13.2.1 SAEM方法 …… 283
13.2.2 SAABNet方法 …… 283
13.2.3 SACMM方法 …… 285
13.2.4 SASAM方法 …… 287
13.2.5 ALRRA方法 …… 288
13.2.6 AHP方法 …… 290
13.2.7 COSMIC+UML方法 …… 291
13.2.8 基于Shannon信息论的方法 …… 292
13.3 软件架构度量和评估过程 …… 293
13.3.1 质量属性选择 …… 293
13.3.2 软件架构可维护性度量及评估 …… 294
13.3.3 软件架构可靠性度量及评估 …… 297
13.4 软件架构演化度量和评估实践 …… 302
13.4.1 演化过程已知的软件架构演化评估 …… 302
13.4.2 演化过程未知的软件架构演化评估 …… 305
13.4.3 实例分析 …… 305
13.5 本章小结 …… 313
思考题 …… 313
参考文献 …… 313
第14章 软件架构形式化验证 …… 317
14.1 引言 …… 317
14.2 形式化验证 …… 317
14.2.1 形式语义 …… 318
14.2.2 规约语言 …… 318
14.2.3 求精分析 …… 319
14.2.4 验证方法 …… 320
14.2.5 形式化验证方法的优缺点 …… 320
14.3 软件架构验证 …… 322
14.3.1 静态软件架构验证 …… 322
14.3.2 动态软件架构验证 …… 323
14.3.3 运行态软件架构验证 …… 323
14.4 基于SPIN的静态软件架构验证实践 …… 324
14.4.1 SPIN简介 …… 324
14.4.2 基于SPIN的验证过程 …… 325
14.4.3 架构模型 …… 326
14.4.4 验证模型 …… 332
14.4.5 验证结果 …… 334
14.5 架构演化验证案例分析——以MVC为例 …… 335
14.5.1 演化案例 …… 335
14.5.2 场景1演化评估 …… 337
14.5.3 场景2演化评估 …… 341
14.6 本章小结 …… 344
思考题 …… 345
参考文献 …… 345
第15章 软件架构分析与测试 …… 347
15.1 引言 …… 347
15.2 软件架构分析方法 …… 347
15.2.1 SAAM …… 348
15.2.2 SAAMCS …… 350
15.2.3 ESAAMI …… 351
15.2.4 SAAMER …… 352
15.2.5 ATAM …… 352
15.2.6 QAW …… 356
15.2.7 OATAM …… 358
15.2.8 ARID …… 358
15.2.9 SBAR …… 361
15.2.10 ALPSM …… 362
15.2.11 SNA …… 362
15.2.12 ALMA …… 363
15.2.13 PSAEM …… 364
15.2.14 ASAAM …… 365
15.2.15 PASA …… 365
15.2.16 SALUTA …… 367
15.2.17 HoPLAA …… 368
15.2.18 CBAM …… 370
15.2.19 CPASA …… 370
15.3 软件架构测试 …… 371
15.4 本章小结 …… 371
思考题 …… 372
参考文献 …… 372
第16章 软件架构重构 …… 375
16.1 引言 …… 375
16.2 软件重构现状 …… 376
16.2.1 软件重构概念 …… 376
16.2.2 重构点识别和定位方法 …… 376
16.2.3 重构实施技术 …… 379
16.2.4 现状分析 …… 380
16.3 基于度量的软件架构重构 …… 381
16.3.1 软件架构度量评估 …… 382
16.3.2 产生重构需求 …… 385
16.3.3 分析重构需求 …… 385
16.3.4 建议重构操作 …… 387
16.3.5 实施重构操作 …… 389
16.4 面向模式的软件架构重构 …… 392
16.4.1 模式选择 …… 392
16.4.2 重构点定位 …… 393
16.4.3 重构实施 …… 394
16.5 本章小结 …… 397
思考题 …… 398
参考文献 …… 398
下篇 未来主题篇
第17章 软件架构的腐蚀和对策 …… 402
17.1 引言 …… 402
17.2 软件架构腐蚀的含义 …… 403
17.3 软件架构腐蚀的预防控制策略 …… 403
17.3.1 腐蚀最小化方法 …… 403
17.3.2 腐蚀预防方法 …… 406
17.3.3 腐蚀修补方法 …… 407
17.4 软件架构实践中面临的主要威胁及其对策 …… 408
17.4.1 主要威胁 …… 408
17.4.2 有效对策 …… 409
17.5 本章小结 …… 409
思考题 …… 409
参考文献 …… 409
第18章 软件架构解耦 …… 412
18.1 引言 …… 412
18.2 分层架构及其解耦 …… 413
18.2.1 模式描述 …… 413
18.2.2 架构解耦 …… 413
18.2.3 实例分析 …… 414
18.3 微内核架构及其解耦 …… 414
18.3.1 模式描述与解耦 …… 415
18.3.2 实例分析 …… 415
18.4 微服务架构及其解耦 …… 416
18.4.1 模式描述与解耦 …… 416
18.4.2 设计原则 …… 417
18.4.3 实例分析 …… 417
18.5 黑板架构风格及其解耦 …… 418
18.6 干净架构及其解耦 …… 419
18.6.1 模式描述 …… 419
18.6.2 架构解耦 …… 421
18.7 管道-过滤器风格及其解耦 …… 421
18.7.1 模式描述与解耦 …… 421
18.7.2 实例分析 …… 422
18.8 基于元模型的架构及其解耦 …… 422
18.9 REST架构风格及其解耦 …… 422
18.10 本章小结 …… 424
思考题 …… 424
参考文献 …… 424
第19章 软件架构技术债 …… 426
19.1 引言 …… 426
19.2 技术债简介 …… 426
19.2.1 技术债的定义 …… 426
19.2.2 技术债的分类 …… 427
19.2.3 技术债的产生 …… 428
19.3 设计债 …… 429
19.3.1 设计债的定义 …… 429
19.3.2 设计债的识别方法 …… 429
19.3.3 架构技术债 …… 430
19.4 代码债 …… 432
19.5 测试债 …… 432
19.6 文档债 …… 433
19.7 技术债的处理 …… 433
19.7.1 发现技术债 …… 433
19.7.2 管理技术债 …… 433
19.7.3 偿还技术债 …… 435
19.8 本章小结 …… 435
思考题 …… 435
参考文献 …… 436
第20章 软件架构坏味道 …… 438
20.1 引言 …… 438
20.2 典型的代码坏味道 …… 439
20.2.1 应用级坏味道 …… 439
20.2.2 类级坏味道 …… 440
20.2.3 方法级坏味道 …… 441
20.3 典型的设计坏味道 …… 442
20.3.1 架构坏味道 …… 442
20.3.2 架构坏味道的检测 …… 447
20.4 本章小结 …… 450
思考题 …… 451
参考文献 …… 451
第21章 软件架构脆弱性 …… 453
21.1 引言 …… 453
21.2 什么是软件脆弱性 …… 453
21.2.1 软件脆弱性定义 …… 453
21.2.2 软件脆弱性的特点和产生的原因 …… 454
21.2.3 软件脆弱性的生命周期 …… 455
21.3 典型的软件架构脆弱性 …… 455
21.3.1 分层架构 …… 456
21.3.2 C/S架构 …… 457
21.3.3 B/S架构 …… 457
21.3.4 事件驱动架构 …… 458
21.3.5 MVC架构 …… 460
21.3.6 微内核架构 …… 461
21.3.7 管道-过滤器架构 …… 461
21.3.8 黑板模式架构 …… 462
21.3.9 微服务架构 …… 462
21.3.10 基于空间的架构 …… 463
21.3.11 PAC架构 …… 464
21.4 本章小结 …… 465
思考题 …… 466
参考文献 …… 466
第22章 软件架构模式识别 …… 468
22.1 引言 …… 468
22.2 模式识别方法现状 …… 468
22.2.1 设计模式识别现状 …… 468
22.2.2 架构模式识别现状 …… 469
22.3 两种典型的架构模式识别方法 …… 470
22.3.1 IDAPO方法 …… 470
22.3.2 基于DSL的架构模式识别方法 …… 472
22.4 基于本体的架构模式识别方法 …… 473
22.4.1 可行性分析 …… 473
22.4.2 识别过程 …… 474
22.4.3 典型步骤 …… 475
22.5 本章小结 …… 481
思考题 …… 481
参考文献 …… 481
第23章 结束语 …… 484
23.1 软件架构是早期阶段质量保障的基础 …… 484
23.2 软件架构的作用 …… 485
23.2.1 好的架构设计能够满足系统的多种品质 …… 485
23.2.2 架构设计能够使利益相关者达成一致的目标 …… 485
23.2.3 架构设计能够支持计划编制过程 …… 485
23.2.4 架构设计能够有效地管理复杂性 …… 486
23.2.5 架构设计为重用奠定了基础 …… 486
23.2.6 架构设计能够降低维护费用 …… 487
23.2.7 架构设计能够支持冲突分析 …… 487
23.2.8 架构设计的其他作用 …… 487
23.3 软件架构发展趋势 …… 487
思考题 …… 489
参考文献 …… 489
- 点赞
- 收藏
- 关注作者
评论(0)