内容简介
本书阐述了在构建软件系统时不可或缺的技术与非技术原则和方法,并详尽展示了如何运用这些原则和方法有效管理项目中的不确定性,从而构建稳固的决策框架。同时,它深刻探讨了领导力与软件架构设计洞察力之间的微妙联系,细致阐述了用户体验设计、宏观架构规划及服务架构部署等关键领域的核心理念与实用技术。通过引用莱特兄弟与凯利·约翰逊等杰出技术领导者的生动案例,来帮助读者理解制订强大决策的重要性。对于软件行业的技术领导者和软件架构决策者来说,本书是一本优秀的参考书。
目录
译者序
序
前言
第1章 软件系统、设计和架构 1
1.1 软件架构简介 1
1.2 软件系统设计 3
1.3 五个问题 5
1.3.1 问题1:何时是最佳的发布时机 5
1.3.2 问题2:团队的技能水平如何 5
1.3.3 问题3:系统的性能敏感度如何 6
1.3.4 问题4:何时可以重写系统 7
1.3.5 问题5:有哪些难点 8
1.4 七项原则:总体概念 9
1.4.1 原则1:一切从用户的旅程出发 9
1.4.2 原则2:使用迭代薄切片策略 10
1.4.3 原则3:在每次迭代中,以最小的投入获得最大的价值,以支持更多用户 12
1.4.4 原则4:做出决策并承担风险 14
1.4.5 原则5:深入设计难以改变的事物,但要慢慢地实施 15
1.4.6 原则6:尽早并行处理棘手的难题,消除未知因素,并从实证中学习 16
1.4.7 原则7:理解软件架构中内聚性和灵活性之间的权衡 17
1.5 为在线书店进行设计 19
1.6 为云计算进行设计 22
1.7 总结 24
第2章 系统性能的思维模型 26
2.1 计算机系统 28
2.2 性能模型 28
2.2.1 模型1:从用户模式切换到内核模式的成本 29
2.2.2 模型2:操作层级 29
2.2.3 模型3:上下文切换开销 30
2.2.4 模型4:阿姆达尔定律 31
2.2.5 模型5:通用可扩展性定律 32
2.2.6 模型6:延迟和利用率的权衡 33
2.2.7 模型7:以最大有效利用率模型设计吞吐量 33
2.2.8 模型8:添加延迟限制 34
2.3 优化技术 37
2.3.1 CPU优化技术 38
2.3.2 I/O优化技术 39
2.3.3 内存优化技术 41
2.3.4 延迟优化技术 42
2.4 对性能的直观感受 43
2.5 领导力的考量 43
2.6 总结 44
第3章 用户体验 46
3.1 架构师所需的用户体验概念 46
3.1.1 原则1:了解用户 47
3.1.2 原则2:必要功能 48
3.1.3 原则3:好产品不需要说明书,其用途不言自明 48
3.1.4 原则4:从信息交换的角度思考 49
3.1.5 原则5:保持简单 49
3.1.6 原则6:在实施前设计用户体验 50
3.2 配置的用户体验设计 50
3.3 API的用户体验设计 52
3.4 扩展性的用户体验设计 54
3.5 领导力的考量 55
3.6 总结 56
第4章 宏观架构:简介 57
4.1 宏观架构的历史 58
4.2 现代架构 61
4.3 宏观架构下的构建模块 62
4.4 领导力的考量 65
4.5 总结 67
第5章 宏观架构:协调 68
5.1 方法1:从客户端驱动流程 68
5.2 方法2:使用另一个服务 69
5.3 方法3:使用集中式中间件 70
5.4 方法4:实施编排 71
5.5 领导力的考量 72
5.6 总结 72
第6章 宏观架构:保持状态的一致性 74
6.1 使用事务 74
6.2 超越事务 75
6.2.1 方法1:重新定义问题以减少保证要求 77
6.2.2 方法2:使用补偿 78
6.3 最佳实践 80
6.4 领导力的考量 81
6.5 总结 83
第7章 宏观架构:安全问题 85
7.1 用户管理 86
7.2 交互安全 89
7.2.1 认证技术 90
7.2.2 授权技术 92
7.2.3 应用程序的常见安全交互场景 94
7.3 存储、GDPR和其他法规 98
7.4 安全策略和建议 100
7.4.1 性能和延迟 101
7.4.2 零信任方法 102
7.4.3 运行用户提供的代码时要小心 103
7.4.4 区块链 103
7.4.5 其他话题 103
7.5 领导力的考量 104
7.6 总结 106
第8章 宏观架构:处理高可用性和扩展 107
8.1 加入高可用性 107
8.1.1 复制 107
8.1.2 快速恢复 110
8.2 理解可扩展性 112
8.3 现代架构的扩展:基本解决方案 113
8.4 扩展:领域中的工具 114
8.4.1 扩展策略1:无共享 116
8.4.2 扩展策略2:分布 116
8.4.3 扩展策略3:缓存 116
8.4.4 扩展策略4:异步处理 116
8.5 构建可扩展的系统 117
8.5.1 方法1:连续消除瓶颈 117
8.5.2 方法2:无共享设计 119
8.6 领导力的考量 121
8.7 总结 122
第9章 宏观架构:微服务的注意事项 123
9.1 决策
前言/序言
开发软件系统的目标往往是构建符合质量标准的系统,并在长期或预定时间内获得最高的投资回报率(ROI)。同时,这也是软件架构的目标。软件架构本质上是在构建软件系统的设计蓝图。
如果在产品上增加投入能够带来更多的收益,那么这将被视为具有良好的投资回报率。在这里,投资回报率不仅仅是指经济效益。相反,粗劣的软件架构设计则会导致后期频繁的修改,最终耗费更多的成本。优秀的软件架构设计能够平衡成本与收益,并最大化投资回报率。
软件架构设计涉及诸多方面,比如找到恰当的抽象概念、决定包含哪些功能、确定每项功能的深度、设定服务质量(QOS)参数、确定灵活性程度,以及时间安排和用户体验等。
判断力的作用
软件架构师会学习抽象概念、架构风格和模式,并研究它们的优缺点、在特定情况下的适用性,以及如何在了解潜在陷阱、失败案例和用例的基础上组合它们。然而,大多数的设计错误都是由于缺乏判断力而不是缺乏知识造成的。在这里,判断力指的是经过深思熟虑后做出决策或得出合理结论的能力,以优化最重要的结果。
我在20多年的软件架构设计中,发现了以下常见错误:
过多纳入用户旅程所需的功能。
设计过于灵活或过于一致,从而影响未来的变化。
限制功能深度,从而严重影响用户体验(UX)。
为最终用户解决无关紧要的问题。
对用户旅程和体验关注不足。
错过交付时间。
之所以会犯下这些错误,主要是因为我们不了解未来的趋势,不了解使用系统的用户,也不了解系统是如何运作的。这说明了判断力的必要性,也使我们面临的不仅仅是技术方面的挑战,更是领导力方面的挑战。
这里是领导力是指管理不确定性、将混乱变为有序、为更美好的未来提供希望,并朝着这个未来前进。拿破仑·波拿巴曾说过,领导者是希望的传递者。也就是说,领导者并不总是知道未来会发生什么,也并不是全知全能的。领导者应该有一个关于未来的愿景;他们应该以一种最小化风险的方式管理不确定性。领导者应该将他们的愿景和实施方案传达给他人,并带领众人实现愿景。
让我们从软件架构师的角度重申一下此观点。也就是说软件架构师并不是无所不知的,也不是总知道系统应该具备哪些功能以及将被如何使用。他们应该有一个愿景以及整体解决方案。领导者应该将他们的愿景和实施方案传达给团队,并指导团队构建软件系统,然后运行这个系统。
我并不认为知识对于架构师来说不重要。知识的确重要,但是判断力起着关键性的作用。但遗憾的是,知识是普遍的,判断力却很稀缺。
我读过很多软件架构方面的好书和文章,仅举几例:鲍勃·马丁(Bob Martin)的著作、格雷戈·霍普(Gregor Hohpe)的著作以及马丁·福勒(Martin Fowler)的博客。然而,他们的作品主要关注的是知识,较少涉及判断力方面的话题。
我还读过很多关于领导力的好书:本·霍洛维茨(Ben Horowitz)的The Hard Things About Hard Things、埃里克·施密特(Eric Schmidt)等人的Trillion Dollar Coach、斯坦利·麦克里斯特尔(Stanley McChrystal)的Team of Teams: New Rules of Engagement for a Complex World、理查德·鲁梅尔特(Richard Rumelt)的Good Strategy, Bad Strategy,以及乔科·威林克(Jocko Willink)等人的其他著作。这些作品讨论了判断力,但只是停留在一般层面上,而不涉及技术层面。显然,在优秀的领导力和优秀的软件架构判断力之间存在着不小的认知鸿沟。
内容导读
本书讨论了领导力和软件架构判断力之间的差距,重点阐述了何为软件领导力,以及我们在构建软件系统时如何将其发挥至极致。如前所述,许多在软件架构上犯的错误都源于知识与判断力之间的差距。
本书不是关于如何管理团队的书,也不是关于工程管理或人力资源管理(HR)以及如何组建团队的书,更不是关于企业战略的书。此外,本书也不涉及如何创造愿景。
可以说,本书是一本关于技术领导力的书,也可以说本书是一本关于技术判断力的书。本书解释了高级架构师必须深入理解的原则和概念,并讨论了技术领导者或架构师如何利用这些原则来管理不确定性。
例如,本书的一个论点是:深思熟虑,慢慢实施。另一个论点是,领导者必须确定事务的界限,承担起不确定性的责任,而不是将责任转嫁给同事。本书讨论的问题和原则可以帮助我们管理不确定性,并提供了一种有效的决策框架。
如果你不是负责人,那还需要读本书吗?我认为是需要的。人们总是会跟随那些提出并处理不确定性问题并取得进展的人。优秀的架构师在被授予“负责人”的头衔之前的许多年就已经开始扮演这个角色了。知识越渊博,成为领导者的机会就越大。主动出击,帮助你的领导一起完成任务,你就会发现你得到的机会越来越多,声誉和头衔也将随之而来。
如果你认为有人比你更适合扮演