新書推薦:

《
星鱼
》
售價:HK$
407

《
跟着TED学科学:物理
》
售價:HK$
255

《
希特勒与第三帝国(全二册)(第三帝国通史写作的里程碑!7年魔鬼养成期+6年帝国崩塌录=13年人类至暗
》
售價:HK$
959

《
没有民主的政治(1815—1914):英国政府的观念与关注
》
售價:HK$
551

《
甲骨文丛书·古代东亚的车舆社会史
》
售價:HK$
913

《
大西洋现实主义:帝国与国际政治思想的德美交汇
》
售價:HK$
407

《
四海车书总会同:元代文人游历与行旅诗研究(国家社科基金后期资助项目)
》
售價:HK$
653

《
接触 2025全新升级版
》
售價:HK$
347
|
| 編輯推薦: |
|
软件架构是否遥不可及?本书将彻底打破这一认知。它创新地从开发者日常接触的微观代码层面入手,循序渐进,系统讲解编程范式、设计原则与模式,而后将视野拓展至逻辑架构与宏观应用系统,涵盖了从单体到微服务的演进路径。《软件架构从微观到宏观》理论与实践紧密结合,旨在为每一位开发者提供清晰、可行的架构设计指南。无论您是初入职场的新人还是经验丰富的专业人士,都能从中获得宝贵经验,为构建高质量、可扩展的系统打下坚实基础,是您职业进阶路上的读物。
|
| 內容簡介: |
|
软件架构在软件开发中无处不在,从微观到宏观层面,架构都在发挥着重要作用。因此,对于软件开发人员,包括刚刚入门的新手,掌握软件架构设计是一项技能。软件架构设计不仅要关注整体和顶层的宏观设计,还应重视支撑架构落地的微观设计。只有这样,软件架构设计才能真正起到指导开发的作用。《软件架构从微观到宏观》的重点正是从微观到宏观的软件架构设计及其落地实践。《软件架构从微观到宏观》共28章,分为4个部分:第1部分(第1~6章)介绍软件架构的基本概念、软件架构设计所包含的内容以及架构设计需要遵循的一般原则;第2部分(第7~14章)聚焦于架构设计的微观层面,包括常用的编程范式、多任务与异步编程、设计模式、业务模型、组件以及协同工作模式等;第3部分(第15~21章)介绍常用的软件架构模式,包括插件式架构、管道-过滤器架构、分层架构、微服务架构和事件驱动架构等;第4部分(第22~28章)重点在于实践,通过示例形式进一步介绍软件架构设计和落地的具体实现。
|
| 關於作者: |
|
甄镭同济大学学士,北京科技大学硕士。1996年开始从事企业信息系统开发和建设工作,涉及石化、政务、汽车制造、机械制造、电力、房地产等诸多领域,参与过多项重大项目。在PLOP会议等发表过多篇论文。著有《信息系统升级与整合:策略·方法·技巧》《.Net与设计模式》《领域驱动设计.Net实践》等。
|
| 目錄:
|
第1部分 软件架构概述
第1章 软件架构是什么 2
1.1 难以定义的软件架构 2
1.1.1 针对软件架构定义的不同观点 2
1.1.2 不同视角的软件架构 3
1.1.3 不同层次的软件架构 4
1.1.4 不同开发阶段的软件架构 4
1.1.5 不断发展变化的软件架构理论 5
1.2 软件架构的范围 5
1.2.1 使用鸭子理论划定软件架构范围 6
1.2.2 软件架构描述了软件的结构 6
1.2.3 软件架构的关键技术和支撑技术 8
1.2.4 软件架构决定了软件的质量属性 9
1.3 软件架构的作用 9
1.3.1 体现软件开发的早期设计决策 10
1.3.2 用于沟通与交流 10
1.3.3 软件质量属性的 10
1.3.4 软件工程管理的抓手 10
1.4 软件架构和软件架构模式(风格) 10
1.5 软件架构和软件框架 11
1.6 本章小结 12
第2章 软件结构 13
2.1 软件的结构 13
2.1.1 开发边界、运行边界和部署边界 13
2.1.2 架构的三种结构 15
2.1.3 软件结构和软件边界的变化 15
2.1.4 软件的范围和规模与软件架构 16
2.2 软件结构的描述方法 16
2.2.1 架构蓝图 16
2.2.2 “构件”和“连接器” 17
2.2.3 图形化建模语言 18
2.3 软件架构模式与软件架构风格 20
2.4 示例1—Docker的软件架构分析 20
2.4.1 Docker的作用 20
2.4.2 Docker的顶层架构 21
2.4.3 顶层架构的展开 22
2.4.4 组件架构 23
2.4.5 Docker架构分析总结 26
2.5 示例2——设计时结构与运行时结构的关系 27
2.6 本章小结 30
第3章 关键技术、支撑技术与技术路线 31
3.1 关键技术 31
3.1.1 什么是关键技术 31
3.1.2 关键技术的确定与识别 33
3.1.3 关键技术的验证 33
3.2 支撑技术 33
3.2.1 软件架构落地需要特定的软件技术作为支撑 33
3.2.2 软件技术对软件架构设计的刚性约束 34
3.2.3 软件架构设计与软件技术选择 34
3.3 技术路线 35
3.3.1 什么是技术路线 35
3.3.2 确定技术路线时需要考虑的因素 36
3.3.3 技术路线与架构设计落地 36
3.4 关键技术和支撑技术的区别和联系 37
3.5 示例1——Docker的关键技术 37
3.5.1 Docker关键技术概述 37
3.5.2 关键技术在架构中的位置 38
3.5.3 是否可以替换关键技术之外的部分 39
3.6 示例2——图形展示软件:关键技术与支撑技术的区别 39
3.7 本章小结 40
第4章 质量属性 41
4.1 什么是软件的质量属性 41
4.2 软件质量属性的内容 42
4.2.1 可用性 43
4.2.2 性能 43
4.2.3 安全性 44
4.2.4 可部署性 44
4.2.5 易用性 44
4.2.6 可修改性 45
4.2.7 可集成性 46
4.2.8 可测试性 46
4.2.9 能源效率 47
4.3 软件架构设计与质量属性 47
4.3.1 从宏观和微观两个层面解决质量属性问题 47
4.3.2 可修改性是满足质量属性需求的重要抓手 48
4.3.3 使用针对质量属性需求的通用解决方案 49
4.3.4 使用针对特定质量属性的成熟方案 50
4.3.5 关注与架构没有直接关联的质量属性 52
4.4 本章小结 53
第5章 软件架构设计的原则 54
5.1 设计原则概述 54
5.2 基本技术原理 54
5.2.1 抽象 55
5.2.2 封装 56
5.2.3 信息隐藏 57
5.2.4 模块化 60
5.2.5 职责分离 60
5.2.6 耦合和内聚 60
5.2.7 策略和实现分离 61
5.2.8 接口和实现分离 61
5.2.9 分而治之 62
5.3 SOLID原则 62
5.3.1 单一职责原则 62
5.3.2 开闭原则 64
5.3.3 里氏替换原则 64
5.3.4 接口隔离原则 66
5.3.5 依赖反转原则 67
5.4 接口设计原则 67
5.4.1 无状态原则 67
5.4.2 明确性与一致性原则 68
5.5 组件开发原则 68
5.5.1 复用/发布等同原则 69
5.5.2 共同闭包原则 69
5.5.3 共同复用原则 69
5.6 本章小结 69
第6章 如何完成软件架构设计 70
6.1 架构设计的前期工作 70
6.1.1 确定软件的商业目标 70
6.1.2 确定软件的业务目标 72
6.1.3 划分软件的业务范围 73
6.1.4 确定软件的开发和使用环境 74
6.1.5 确定软件开发的组织结构 75
6.2 遵守软件开发的一般规律 75
6.2.1 遵守设计原理与原则 75
6.2.2 在开发过程中进行迭代 75
6.2.3 根据实际情况使用正向过程与逆向过程 76
6.3 设计可以落地的软件架构 77
6.3.1 明确概念设计与概要设计的区别 77
6.3.2 避免“空中楼阁”式的架构设计 78
6.3.3 架构设计需要提供微观设计规范 79
6.4 架构设计中的框架 79
6.4.1 是否使用重量级框架 80
6.4.2 降低业务模型与框架的耦合度 80
6.4.3 减少软件架构对框架的依赖 81
6.5 软件架构设计的交付物 82
6.5.1 软件架构说明 82
6.5.2 关键技术解决方案和技术路线说明 83
6.5.3 确保重要质量属性的解决方案 83
6.5.4 必要的代码 83
6.6 架构设计中的非技术因素 85
6.6.1 利益攸关者的目标不一致 85
6.6.2 局部利益和整体利益不一致 85
6.6.3 项目的长期目标与短期目标不一致 85
6.6.4 预算与进度陷阱 86
6.7 本章小结 86
第2部分 微观层面的架构设计
第7章 微观层面的架构设计概述 88
7.1 软件架构设计为什么要深入微观层面 88
7.1.1 关键技术需要在微观层面实现 88
7.1.2 支撑技术需要在微观层面实现 89
7.1.3 满足质量属性的机制在微观层面的实现 90
7.1.4 底层架构是顶层架构的实现基础 90
7.1.5 业务模型存在于微观层面 90
7.2 与微观层面架构设计相关的技术 91
7.2.1 编程范式 91
7.2.2 设计模式 91
7.2.3 多任务与异步编程 91
7.2.4 业务模型 92
7.2.5 质量属性相关机制 92
7.2.6 组件与组件封装 92
7.2.7 协作模式 92
7.2.8 完成软件架构的代码骨架 92
7.3 Log4j漏洞的架构分析 93
7.3.1 Log4j漏洞 93
7.3.2 架构分析 93
7.3.3 需要重视的微观架构设计 96
7.3.4 从架构设计角度看如何避免Log4j漏洞 96
7.4 本章小结 97
第8章 编程范式 98
8.1 编程范式概述 98
8.2 结构化编程与结构化设计 99
8.2.1 基本概念 99
8.2.2 结构化编程的技术难点——如何实现模块间解耦 100
8.2.3 结构化编程和结构化设计的不足 102
8.3 面向对象编程与面向对象设计 102
8.3.1 面向对象的特点 103
8.3.2 面向对象的基本概念 103
8.3.3 面向对象设计的使用场景 108
8.3.4 面向对象编程的难点 108
8.4 函数式编程 109
8.4.1 基本概念 109
8.4.2 常见模式 110
8.4.3 函数式编程设计使用场景 114
8.4.4 函数式编程的难点 115
8.5 编程范式与软件架构 115
8.6 本章小结 116
第9章 设计模式 117
9.1 设计模式概述 117
9.1.1 模式与设计模式 117
9.1.2 与设计模式相关的常见问题 118
9.1.3 设计模式在软件架构设计中的作用 119
9.2 软件架构设计中常用的设计模式 119
9.2.1 模板方法模式 119
9.2.2 策略模式 120
9.2.3 适配器模式 121
9.2.4 桥接模式 122
9.2.5 代理模式 124
9.2.6 中介者模式 125
9.2.7 观察者模式 126
9.2.8 命令模式 126
9.2.9 组合模式 127
9.2.10 外观模式 128
9.3 依赖注入模式 128
9.3.1 依赖反转原则 129
9.3.2 控制反转与依赖注入 130
9.3.3 依赖注入框架 130
9.4 设计模式的函数编程实现方式 133
9.4.1 模板方法 134
9.4.2 策略模式 135
9.4.3 适配器模式 136
9.4.4 桥接模式 136
9.4.5 代理模式 137
9.4.6 命令模式 138
9.4.7 外观模式 139
9.4.8 依赖注入 140
9.5 示例——适配器模式与桥接模式的组合模式 141
9.5.1 适配器与桥接的区别和联系 141
9.5.2 适配器与桥接联合工作 142
9.5.3 示例总结 144
9.6 本章小结 144
第10章 多任务与异步编程 145
10.1 多任务的实现方式 145
10.2 异步编程 146
10.2.1 异步编程的难点 146
10.2.2 采用Promise模式简化异步编程 147
10.2.3 不同编程语言的异步实现 148
10.3 并行的实现方式 150
10.3.1 Node.js 150
10.3.2 .NET(C#) 151
10.3.3 Python 152
10.3.4 Java 152
10.4 同时使用并发与并行——模拟大仲马烹饪 154
10.5 工作模式总结 156
10.5.1 语义上的串行模式 156
10.5.2 使用异步编程的并发模式 157
10.5.3 并行模式 157
10.6 进一步研究函数式编程 157
10.6.1 高阶函数 157
10.6.2 闭包 158
10.7 多任务、异步编程与软件架构设计 159
10.8 本章小结 159
第11章 业务模型 160
11.1 业务逻辑的存在形式 160
11.2 数学模型 161
11.2.1 计算模型 161
11.2.2 状态机 162
11.2.3 决策表 164
11.2.4 数学模型在架构中的位置 165
11.3 数据模型 165
11.3.1 事务脚本 166
11.3.2 表模块 168
11.3.3 活动记录 170
11.3.4 数据模型在架构中的位置 170
11.4 领域模型 171
11.4.1 领域模型的定义和特点 171
11.4.2 领域模型的主要概念 171
11.4.3 领域模型与存储库模式 173
11.4.4 领域模型在架构中的位置 173
11.5 领域特定语言 173
11.5.1 DSL的定义和特点 174
11.5.2 DSL示例 174
11.5.3 DSL在架构中的位置 177
11.6 业务模型与软件架构的关系 177
11.6.1 业务模型在架构中的位置 177
11.6.2 关注业务模型对软件架构的影响 178
11.6.3 防止业务逻辑碎片化 179
11.7 本章小结 180
第12章 质量属性相关的机制 181
12.1 通用机制 181
12.1.1 日志 181
12.1.2 监控 182
12.1.3 缓存 183
12.1.4 冗余设计 185
12.2 可修改性 187
12.2.1 接口和实现分离 187
12.2.2 延迟绑定 188
12.3 可用性 189
12.3.1 心跳 189
12.3.2 时间戳 190
12.4 性能 191
12.4.1 限流 191
12.4.2 设置超时控制 192
12.4.3 请求排队 193
12.4.4 数据库分表 194
12.5 安全性
|
| 內容試閱:
|
软件是由代码组成的。在编写优质行代码之前,首先需要确定代码的组成结构:代码由哪几部分组成,这些组成部分之间的关系如何,等等。只有在明确这些内容之后,才能进行分工协作,开始软件开发工作。这个过程就是软件架构设计,由架构师负责,其结果便是软件架构。
软件架构设计先于代码开发,其工作成果通常是图形化的模型,如架构图。这些视觉工具使得架构设计能够在一定程度上独立于具体的代码实现,从而更专注于高层次的结构和设计决策。然而,架构师必须确保所有这些纸面上的设计能够落地为可执行的代码。这就要求架构师能够提供从高层设计到实现代码的解决方案,这个过程即是从宏观架构到微观架构再到代码的逐级实现过程。只有当架构师对从微观到宏观的架构关系有深入了解时,才能有信心所设计的宏观架构可以落地为代码实现。
在实际项目中,需要避免架构设计与代码实现的脱节。软件架构具有多重作用,包括售前沟通、与用户交流等,但其最重要的作用是为开发工作提供指导。现实中,我们常常在各种演示文稿、宣传材料和形式化的设计文档中看到华而不实的架构示意图。这些示意图往往更多地服务于售前营销目的,而非实际的开发工作。还有一种常见的情况是,在某些项目中,架构设计被完全从开发流程中剥离出来,试图在开发之前就设计出一套优质的架构来指导后续的开发工作。这种做法往往导致设计出的架构过于理想化,缺乏实际可行性,如同空中楼阁,最终只能成为纸上谈兵的架构设计。
软件架构设计需要从宏观到微观,再从微观到宏观进行反复迭代,与代码设计相辅相成。架构设计为代码设计提供了宏观的指导和约束,而代码设计则是架构设计的具体实现和验证。与架构设计落地相关的代码是支撑架构实现的关键代码。虽然这部分代码只占总体代码量的一小部分,但它对整体架构的落地起着关键作用。架构师需要识别并完成关键代码,这部分工作属于架构设计的微观部分。
因此,软件架构设计既要重视面向整体和顶层的宏观设计,也要重视支撑架构落地的微观设计。只有这样,软件架构设计工作才能真正起到指导开发的作用。本书关注的就是软件架构的设计与落地。
本书共28章,分为4个部分:第1部分(第1~6章)介绍软件架构的基本概念、软件架构设计所包含的内容以及架构设计需要遵循的一般原则;第2部分(第7~14章)介绍架构设计的微观部分,包括常用的编程范式、多任务与异步编程、设计模式、业务模型、组件、协同工作模式等;第3部分(第15~21章)介绍常用的软件架构模式,包括插件式架构、管道-过滤器架构、分层架构、微服务架构和事件驱动架构等;第4部分(第22~28章)重点在实践,通过示例形式进一步介绍软件架构设计和落地的具体实现。
本书配套源码可通过微信扫描下方的二维码进行下载。如果在下载过程中遇到问题,请发送电子邮件至booksaga@126.com,邮件主题请注明“软件架构从微观到宏观”。
限于笔者的水平,书中难免存在疏漏之处,敬请各位读者批评指正。
最后,感谢各位读者选择本书,希望本书能对读者的学习有所助益。
笔 者
2025年7月
|
|