Effective软件架构 更快地构建更好的软件 ([美] 奥利弗·戈德曼(Oliver Goldman))(Z-Library)
Software
No Description
18
Views
0
Downloads
0.00
Total Donations
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
Page
1
(This page has no text content)
Page
2
(This page has no text content)
Page
3
架构师书库 更快地构建更好的软件 Effective Software Architecture Building Better Software Faster [美] 奥利弗·戈德曼(Oliver Goldman)著 费良宏 译 Effective 软件架构
Page
4
机械工业出版社(北京市百万庄大街 22 号 邮政编码 100037) 策划编辑:刘 锋 责任编辑:刘 锋 赵亮宇 责任校对:王文凭 杨 霞 景 飞 责任印制:张 博 北京铭成印刷有限公司印刷 2025年7月第 1版第 1次印刷 186mm×240mm·12印张·193 千字 标准书号:ISBN 978-7-111-78063-2 定价:69.00元 电话服务 网络服务 客服电话:010-88361066 机 工 官 网:www.cmpbook.com 010-88379833 机 工 官 博:weibo.com/cmp1952 010-68326294 金 书 网:www.golden-book.com 封底无防伪标均为盗版 机工教育服务网:www.cmpedu.com Authorized translation from the English language edition, entitled Effective Software Architecture: Building Better Software Faster, ISBN: 978-0138249328, by Oliver Goldman, published by Pearson Education, Inc., Copyright © 2024 Pearson Education, Inc. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc. Chinese simplified language edition published by China Machine Press, Copyright © 2025. Authorized for sale and distribution in the Chinese Mainland only (excluding Hong Kong SAR, Macao SAR and Taiwan). 本书中文简体字版由 Pearson Education(培生教育出版集团)授权机械工业出版社在中国大陆地 区(不包括香港、澳门特别行政区及台湾地区)独家出版发行。未经出版者书面许可,不得以任何方 式抄袭、复制或节录本书中的任何部分。 本书封底贴有 Pearson Education(培生教育出版集团)激光防伪标签,无标签者不得销售。 北京市版权局著作权合同登记 图字:01-2024-3836号。 图书在版编目(CIP)数据 Effective软件架构 : 更快地构建更好的软件 / (美) 奥利弗·戈德曼 (Oliver Goldman) 著 ; 费良宏译. 北京 : 机械工业出版社, 2025. 4. -- (架构师书库). ISBN 978-7-111-78063-2 Ⅰ. TP311.561 中国国家版本馆CIP数据核字第2025QT7973号
Page
5
谨以此书献给 Gloria,感谢她一直以来的爱与陪伴!
Page
6
本书赞誉 Praise 本书不仅仅是一本关于架构的书,它更像是一本“软件架构师养成指南”,指引你 如何胜任软件架构师这一角色。书中的内容涵盖了关于这个角色的方方面面:从影响 产品未来数年走向的决策,到为产品挑选一个好名字,等等。书中还将对一些传统观 点进行了反思,帮助读者跳出固有的思维模式。 ——Daniel Jackson 麻省理工学院计算机科学教授 尽管架构师具备了必要的领域内专业知识,也能够提出好的想法,但他们往往难 以在组织中发挥预期的影响力。本书针对这一问题,为架构师个人和架构团队提供了 深刻的见解和切实可行的建议,帮助他们在实际工作场景中取得成功。 ——Dan Foygel Adobe 首席架构师 本书深入探讨了大规模软件交付中的关键要素。书中阐述的思考、概念和方法不 仅适用于架构团队,也适用于我合作过的每一个人。作者不仅文笔流畅,而且见解独 到,所提供的观点在理论和实践中都极具实用价值。 ——Noah Edelstein Smartsheet 公司产品管理副总裁
Page
7
V 在我的职业生涯中,最令人沮丧的项目莫过于更新那些缺乏精心设计和文档记录 的系统架构。本书深入探讨了清晰地思考软件架构的重要性,并提供了相应的工具。 我衷心希望每个人都能对架构进行如此深刻的思考! ——Andrew Certain Amazon Web Services 杰出工程师
Page
8
译者序 The Translater’s Words 掩卷良久,我仍然被本书中围绕软件架构实践引起共鸣的文字所震撼。作者以一 种前所未有的方式,将复杂的软件架构概念变得通俗易懂,让每一位对软件充满好奇 的读者都能从中找到共鸣。本书不是一本枯燥的技术手册,而是“一场探索架构之美 的奇妙旅程”。 在错综复杂的软件开发实践中,架构是一条无形的线索,将各种组件、技术以及 思想结合在一起,形成一个和谐的整体。它是指导构建复杂的软件系统的蓝图,确保 它们不仅具有功能性,还具有可扩展性、弹性和可维护性。 作为一名资深的软件架构师,我深知架构设计对软件开发成功的重要性,也曾目 睹那些精心打造的架构具有的变革性的力量。它可以将项目从单纯的技术实践提升为 战略资产,推动企业向前发展。然而,架构之上往往笼罩着一层神秘的面纱,让许多 人望而却步。本书将带领读者拨开云雾,一窥架构设计的精髓。无论是企业的管理者、 经验丰富的架构师,还是刚踏入编程领域的初学者,都能从本书中受益匪浅。 本书将带你深入探索软件架构的方方面面: ❑ 核心原则与最佳实践。从基础概念出发,逐步深入,探讨软件架构的设计原 则、模式和最佳实践。 ❑ 协作与沟通。软件开发是一个团队协作的过程,本书强调架构师在团队中的重 要作用,以及如何与具备不同角色的成员高效沟通。 ❑ 技术趋势与挑战。面对快速变化的技术环境,如何设计出适应未来发展的架 构?本书将为你提供一些宝贵的建议。
Page
9
VII ❑ 案例分析。通过丰富的案例分析,你可以学到如何将理论知识应用到实际项目 中,解决各种复杂的设计问题。 这是一本既有深度,又有温度的书。作者用平实的语言、幽默的比喻,将枯燥的 理论变得生动有趣。无论你是想提升自己的技术水平,还是想更好地理解软件系统的 运行机制,这本书都能满足你的需要。 让我们一起加入这个旅程,揭开软件架构的复杂性,发现它塑造技术未来的力 量吧!
Page
10
前 言 Preface 坦率地说,当我从大学计算机科学专业毕业时,我对打造一款软件的科学原理只 具备一个外行人的粗浅理解。我学习过数据库、算法、编译器、图形学、CPU架构、 操作系统、并发性等知识,并且在某种程度上,我还拥有一个将这些技术联系起来的 框架。 由于我经常在课堂之外编写软件(主要是暑期工作),因此我深知将学术知识用于 实际产品开发面临多重挑战。选择和实现合适的算法通常只是其中相对容易的部分, 真正的困难之处在于如何处理庞大的代码库,如何创建实用的用户体验,如何进行质 量和性能测试,以及如何与团队成员协同开发同一个产品。 毕业后,我从事过一系列软件产品的开发工作。尽管大多数项目并未取得成功, 但我始终秉持着从经验中学习的态度。如果说“从失败中学习”这一老生常谈的观点 是正确的,那么在那段时间里,我确实收获颇丰。 在参与多个不同项目的过程中,我发现与大多数同行相比,自己往往对产品有更 系统性的理解,能够更清晰地认识到产品的内部组件及其相互之间的关系。尽管我 当时并未完全意识到,但这种洞察全局并进行推理的能力实属一种难得且相当有用的 技能。 软件架构的实践旨在全面理解软件系统的所有组件及其相互之间的关系。“架构” 一词并非软件行业独创,它实际上来源于建筑行业,并适用于各种类型的产品。例如 房屋、汽车、电视、火箭,都有各自的架构。如果我是一名火箭科学家,我可能更关 注火箭的各部分如何协同工作,而非特定阀门或喷嘴的设计。当然,这只是假设,毕
Page
11
IX 竟我现在从事的是软件领域的工作。 回顾我几十年的行业生涯,软件产品的复杂性发生了翻天覆地的变化。在我职业 生涯的初期,一个可行的软件产品指的就是能够盈利的产品,仅需要一张软盘的容量, 一次只能在一台计算机上运行,而且无法连接互联网。 如今,一个在“云端”运行的软件产品可能包含数百个相互协调的程序,这些程 序运行在多个地理位置分散的节点上,每天更新数次,并被期望能够永远不间断地运 行(尽管有时也会出现中断)。在较短的时间内,软件产品的本质已经发生了根本性的 变化。 软件架构的演进使其比以往任何时候都更加复杂,也更加重要。复杂性体现在需 要管理和追踪的组件和关系的数量激增。重要性则体现在如果无法有效管理这些关系, 系统的复杂性将不可避免地限制其可靠性和未来开发的速度,最终导致大多数产品的 终结。我个人也曾目睹过这种情况的发生。 软件架构的意义远不止于管理复杂性,但如果要评选架构作为一门学科最有价值 的成果,那么非它莫属。复杂性会对软件的功能造成全方位的损害:它会导致软件行 为难以预测,进而损害用户信任;它会导致缺陷,降低软件的可靠性;它会传播故障, 将不起眼的错误演变成大规模的故障;它还会阻碍人们对于软件的理解,最终导致任 何简化软件状态或结构的尝试都以失败告终。总而言之,复杂性是软件的大敌,而规 范的架构实践则是对抗它的最佳武器。 在我职业生涯的后期,我有幸带领团队负责多个大型复杂软件产品的架构设计。 这些产品均已问世十多年,并非全新的产品。我的工作内容与其他架构师别无二致, 首先要完成以下任务:了解系统当前的架构,评估其是否满足当前和预期的需求,并 提出和评估改进方案。我将在本书后面的章节中详细讨论如何完成这些工作。 虽然上述活动必不可少,但将它们与软件架构等同,就好比上过几节计算机课程 便声称自己会写软件。这仅是一个良好的开端,要真正使软件架构成为软件开发中不 可或缺且成功的部分,还有很长的路要走。而这也正是本书的意义所在:如何在软件 开发组织中进行架构实践。
Page
12
X 专注力 本书并非软件架构指南,不会阐述客户端 - 服务器、领域驱动设计、感知 - 计算 - 控制等架构风格,也不会探讨如何选择数据库技术、进行区域化部署或实施扩展性设 计。当然,这些都是重要的话题,已经有众多的书籍、博客和其他资源对此进行了详 细介绍,也有很多架构师精通这些领域。 但是,仅掌握归并排序算法的实现方法,并不足以编写出一个应用程序;同样,仅 熟悉某种特定架构,也远不足以创建出应用该架构的系统。归并排序算法或许可以由 一名工程师单独完成,而系统架构的设计则必然涉及更多人员的参与。 本书旨在阐释如何将软件架构技能和知识应用于更为庞大、复杂的产品开发流程 之中。本书没有局限于特定的架构风格,而是对软件架构进行了定义,明确了它在产 品开发团队众多专业领域中的定位和作用,并明确架构与和它关联的概念、流程、标 准等要素的多个接触点。 我们将深入探讨“变更”这一主题。识别、管理和设计系统的变更是架构实践的 核心。架构设计的过程有时如同一个“黑盒子”,对话从一端进入,一个完整的设计方 案从另一端产出。实际上,变更的过程是持续进行的,并且由一系列独立的步骤组成。 为使这些步骤清晰可见,并引导它们稳步向前,我们所能做的一切努力都将改善整个 过程。 工程设计就是在进行利弊的权衡,开发和演进系统的过程需要不断地做出设计决 策。每个决策都会打开一些路径,同时关闭另一些路径;或者,当我们发现沿一条路 径会走到死胡同时,就需要推翻先前的决策。如何做出这些决策本身就是一项关键的 技能。项目团队做出的正确决策越多,浪费在重新决策上的时间就越少。而且,越是 快速地做出正确决策,项目就越能更快速地推进。 在任何规模较大的项目中,管理和沟通都是至关重要的考量因素。我们需要明确哪 些决策已经敲定,哪些决策仍在讨论中。同时,我们还需要统一描述系统的词汇,并阐 明选择当前架构的原因。总而言之,工具、流程和沟通是项目顺利进行的关键所在。 最后,我们将探讨组织环境中的架构团队,包括将软件架构师定义为一个独立角
Page
13
XI 色。我们会考虑架构团队的组织结构的选择,以及架构师如何与组织内其他专业部门 互动。此外,还将探讨如何发现、培养和发展架构人才。 动机 软件系统的复杂程度与日俱增。我们早已习惯能够在各种设备上随时随地获取所 需信息和工具的产品,这些产品服务于全球数十亿用户,而创建和运营此类系统所面 临的挑战,已远非几十年前简单的独立软件产品所能比拟。 软件架构在构建和运行大规模系统中扮演着独特且至关重要的角色。尽管软件架 构只是众多协作学科中的一员,但它尤其需要具备“全局观”,即能够理解系统中所有 元素如何协同工作,以及如何随着时间的推移而演进系统结构。在过去 20多年中,架 构师在开发应对这些挑战的技术和方法方面取得了巨大的进步。一个组织在软件架构 方面做得越好,就越能按时交付高质量的软件。 尽管如此,大多数产品开发组织在软件架构方面的表现仍有许多提升空间。我曾 在接手一个全新的项目时对此深有体会。当时我负责领导一个经验丰富的架构师团队。 就个人能力而言,这些架构师都能够胜任软件设计工作。然而,他们并未有效地整合 自身的技能,从而为团队的目标做出更大的贡献。他们在文档记录、流程梳理和沟通 交流方面的投入明显不足。 因此,该架构团队表现不佳,难以确定工作的优先级,有时甚至将精力用在错误 的问题上。由于缺乏高效的决策流程,他们难以做出决策并贯彻执行。此外,他们在 记录工作方面缺乏一致性,导致工作成果有时会被忽略或需要重新获取。该项目复杂 且非常重要,需要投入大量的架构资源。然而,尽管该团队的成员拥有大量架构经验, 但他们的表现却令人大失所望。 当与新团队的成员交流时,我意识到他们能够察觉到问题的存在—知道团队正 处于困境—但无法确定问题的根源。就个人而言,他们都具备软件架构设计的能力; 但作为团队整体,却不知如何有效地实践软件架构。他们缺乏必要的组织结构,无法 将个人的努力凝聚成团队的合力,也无法将软件架构工作有效地融入更大的组织之中。 正是那段经历直接促成了本书的创作。这些架构师拥有数十年的工作经验,但如
Page
14
XII 果连他们都不了解如何开展有效的架构实践,那么很可能还有许多同行也处于同样 的困境。诚然,软件文献中并非完全忽略了架构团队的管理和运作,但对此也缺乏广 泛、深入的探讨。例如,Taylor、Medvidovic和 Dashofy于 2010年出版的 Software Architecture: Foundations, Theory, and Practice一书共有 675页,其中仅有 3%的篇幅涉 及“人员、角色和团队”。我个人收藏了大量软件架构相关的图书,而关于这一主题却 仅此一本。因此,我决定补上这一空白。 受众 本书面向软件架构师、架构师团队的管理者,以及他们在产品管理、用户体验、 项目管理等相关领域的同行。软件开发是一个需要多学科协作的领域,所有这些学科 都需要协同工作。本书将阐释软件架构作为一个学科的定义,以及它在软件开发中的 作用,并介绍架构师和架构团队的运作方式,希望能够使所有相关人员从中受益。 本书为架构师提供了与其自身的方法进行比较的指导。无论从业的年限如何,读 者都能从中发现新的见解。软件架构领域尚处于发展初期,缺乏被广泛接受的知识体 系以及一致或规范的实践方法。 本书也适用于所有与软件架构团队合作的人员。随着项目的扩展,团队成员的角 色会逐渐分化:产品经理专注于需求,测试团队负责创建测试计划,安全团队则致力 于开发威胁模型。每个角色都有其专业领域。然而,所有这些工作最终都必须整合在 一起,形成一个有机的整体,这就要求每个人都了解这些功能是如何相互配合的。换 言之,他们必须了解系统的架构。本书将帮助所有参与软件项目的相关人员理解软件 架构在实现目标方面所起的作用,并提供清晰易懂的关于架构的描述。 最后,本书尤其适合负责管理或创建架构团队的管理人员阅读。书中会详细阐释 软件架构的工作原理,帮助管理人员深入了解架构功能,从而判断现有架构是否满足 实际需求,并在招聘新成员时明确自己的目标。 成功 高效的软件架构功能能够帮助产品开发组织更快地构建优质软件。软件架构作为
Page
15
XIII 一门学科,致力于应对软件开发过程中最为棘手的挑战:组织各个系统,管理变更与 复杂性,以及设计兼具效率与可靠性的系统。拥有出色架构的软件系统不仅能够运行 良好,还能随着时间的推移保持优良的性能。反之,架构不佳的系统则往往会以令人 大跌眼镜的方式走向失败。 成功的软件架构实践还能够将这些能力与产品开发过程中更广泛的挑战相结合。 架构师具备了整合各方需求的得天独厚的优势,因此能够设计出一个具有凝聚力的整 体,而不是彼此割裂的独立部分的简单集合。同时,得益于这种对全局的掌控,他们 也能够清晰地向所有人阐释这些部分是如何构成一个有机体的。 要想出色地完成这项任务,需要的不仅是计算机科学的学位和相关架构风格的经 验,更重要的是需要具备以下能力:创建可预测且可重复的变更流程;快速有效地制 定决策;建立一个能够不断进步和提升的团队。 简而言之,软件架构对我们开发和交付适用软件的能力的影响与日俱增。我希望 本书能为广大读者及组织提供指导,以期开展更加高效的软件架构实践。
Page
16
致 谢 Acknowledgments 本书凝聚着我数十年来在学习和工作中积累的知识与经验。多年来,给予我影响 和启迪的人士不胜枚举,但其中有一些关键人物,我必须在此特别致谢。 我想先介绍一下我的家人—我的父母 Bernadine和 Terry,以及我的兄弟姐妹 Elizabeth、Leah和 Matthew。在我九岁那年,父母买了一台 Commodore 64计算机,我 的软件生涯也由此起步。我是在书香的熏陶下成长的,童年时我的家中充满了书籍, 家人都崇尚思考,也常常进行各种文字游戏。也许正是这样的成长环境,让我萌生了 这样的念头—希望有一天能够在书上看到自己的名字。现在,Commodore 64计算 机帮助我实现了这个愿望。 我衷心地感谢我的两位优秀的高中英语老师 Jeff Laing和 Rick Thalman,是他们 教会了我写作,并让我掌握了写作的方法。我将永远感激他们给予我悉心的指导和鼓 励。此外,我也要感谢 Tom Laeser,感谢他给予我在计算机实验室自由地学习和实践 的机会。 在大学期间,我有幸师从 Mendel Rosenblum先生,他不仅是我的导师,也是我的 操作系统课程的讲授者,而这些课程正是我的最爱。在暑假和大学毕业后的一段时间 里,我有幸为 George Zweig先生工作。George先生十分信任当时年轻气盛的我,将许 多重要的工作交予我负责。直至今日,回想起早年的那些经历,我仍感慨万千。 我职业生涯的大部分时间都是在 Adobe公司度过的,十分有幸与众多优秀的同事共 事。受篇幅所限,无法对所有人一一表达感谢,但仍要特别感谢Winston Hendrickson和 Abhay Parasnis两位领导,他们给予了我许多宝贵的机会,我也希望能不辜负他们的期
Page
17
XV 望。同时,我也要感谢 Boris Prüßmann、Dan Foygel、Leonard Rosenthol、Roey Horns 以及 Stan Switzer,他们与我共同合作了许多项目,并为本书中许多理念的开发和完善 提供了宝贵的灵感。 衷心感谢 Brett Adam、Dan Foygel、Kevin Stewart和 Roey Horns审阅本书的早期 草稿,并提供了宝贵的反馈意见。同时,我也要对 Manjula Anaskar、Haze Humbert、 Menka Mehta、Mary Roth、Jayaprakash P.以及 Pearson集团幕后的所有工作人员表示 感谢,感谢他们给予我这次机会,并在整个过程中给予我悉心指导。他们的帮助让我 实现了毕生的目标之一,我对此深怀感激。 我还要衷心感谢我的妻子 Gloria以及我们的四个儿子。本书是在我们共同营造的 温馨的家中完成的,幸运如此,我倍感欣慰。
Page
18
关于作者 About the author 奥利弗·戈德曼(Oliver Goldman)在 Autodesk公司领导 AEC软件架构的实践工 作。他在分布式实时交互、科学计算、金融系统、移动应用程序开发和云计算架构等 领域拥有 30多年的行业经验,曾在 Adobe等公司交付过众多的创新产品。他拥有斯坦 福大学计算机科学的两个学位,是 50多项美国软件专利的发明人,并曾为 Dr. Dobb’s Journal杂志撰稿。
Page
19
本书赞誉 译者序 前言 致谢 关于作者 第 1 章 软件架构 1.1 基础架构 ……………………………2 1.2 系统概述 ……………………………3 1.3 在组件中的体现 ……………………4 1.4 组件之间的关系 ……………………6 1.5 系统与环境的关系 …………………7 1.6 决定设计的原则 ……………………9 1.7 架构演进 ………………………… 11 1.8 总结 ……………………………… 13 第 2 章 架构的背景 2.1 概念 ……………………………… 15 2.2 可靠性 …………………………… 17 2.3 具有重要架构意义的需求 ……… 18 2.4 产品家族 ………………………… 20 2.4.1 一款产品,多平台发布 … 20 2.4.2 产品线 …………………… 22 2.4.3 产品套件 ………………… 23 2.4.4 跨平台的平台 …………… 24 2.5 平台建设 ………………………… 25 2.6 标准规范 ………………………… 27 2.7 总结 ……………………………… 29 第 3 章 变更 3.1 变更的阶段 ……………………… 31 3.2 变更的类型 ……………………… 32 3.3 产品驱动型变更 ………………… 33 3.4 技术驱动型变更 ………………… 35 3.5 简洁性 …………………………… 36 3.6 投资思维 ………………………… 39 3.7 增量交付 ………………………… 42 3.8 架构演进 ………………………… 44 3.9 总结 ……………………………… 47 Contents 目 录
Page
20
XVIII 第 4章 流程 4.1 编写系统文档 …………………… 49 4.2 奔向愿景 ………………………… 51 4.3 撰写变更提案 …………………… 52 4.4 维护待办事项列表 ……………… 54 4.5 考虑其他可行方案 ……………… 55 4.6 学会说不 ………………………… 58 4.7 紧急性与重要性 ………………… 59 4.8 重新编写系统文档 ……………… 59 4.9 总结 ……………………………… 60 第 5章 设计 5.1 如何加速架构设计 ……………… 64 5.2 设计如何驱动架构演进 ………… 66 5.3 分解 ……………………………… 67 5.4 组合 ……………………………… 69 5.5 组合与平台 ……………………… 70 5.6 循序渐进 ………………………… 71 5.7 并行处理 ………………………… 72 5.8 组织结构 ………………………… 73 5.9 在开放环境下工作 ……………… 74 5.10 放弃 ……………………………… 76 5.11 完成 ……………………………… 77 5.12 总结 ……………………………… 77 第 6章 决策 ……………………………… 79 6.1 更多的信息会有所帮助吗 ……… 80 6.2 决策期间发生了什么 …………… 81 6.3 有多少决策正在进行 …………… 82 6.4 不这样做的代价是什么 ………… 83 6.5 我能接受这个变更吗 …………… 84 6.6 犯错的代价是什么 ……………… 86 6.7 我能有多大把握 ………………… 87 6.8 这是我应该做的决策吗 ………… 88 6.9 决策是否符合要求 ……………… 89 6.10 应该将决策记录下来吗 ………… 90 6.11 总结 ……………………………… 91 第 7章 实践 ……………………………… 93 7.1 待办事项列表 …………………… 94 7.2 目录 ……………………………… 97 7.3 模板 ……………………………… 98 7.4 评审 ………………………………100 7.5 状态 ………………………………103 7.6 速度 ………………………………105 7.7 思考 ………………………………107 7.8 总结 ………………………………108 第 8章 沟通 …………………………… 110 8.1 心智模型 ………………………… 111 8.2 写作 ………………………………113 8.3 谈话 ………………………………115 8.4 信息架构 …………………………117 8.5 命名 ………………………………122 8.6 词典 ………………………………124 8.7 倾听 ………………………………126 8.8 总结 ………………………………128
The above is a preview of the first 20 pages. Register to read the complete e-book.
AI Reading Assistant
Whole-book reading guide from stratified index samples; jump to passages in the text
AI guide
【One-Line Pitch】
A practical field guide for software architects and their collaborators, this book demystifies architecture as a disciplined practice for managing complexity and driving change, showing how to build better software faster through principles, process, and people. Read it if you are an architect, an engineering manager, or anyone who works with architecture teams and wants a clear, actionable playbook for making architecture a strategic asset rather than a mystery.
【Book Arc】
- **Opening (~0%–13%)**: The book opens by framing software architecture as the management of complexity—the "invisible thread" that binds components, technologies, and ideas. It defines architecture as the organization of components and their relationships, guided by principles, and distinguishes it from design (a point-in-time state vs. the system's evolving fundamental structure). The author positions this work as filling a gap in literature, which largely ignores the "people, roles, and teams" aspect of architecture practice.
- **Early (~13%–25%)**: This stage establishes the core conceptual toolkit: the critical role of principles in constraining design space and ensuring consistency, and the importance of identifying a system's "concepts"—the shared mental models that all stakeholders must agree upon. It introduces the notion of "architecturally significant requirements" (a more accurate term than "non-functional requirements") and explores how to spot hidden assumptions, using examples like the "exactly one address per user" trap.
- **Early (~25%–33%)**: The focus shifts to the environment in which architecture operates. The book examines how products exist within families, product lines, and suites, requiring coordination of authentication, data access, UX behavior, and cross-application workflows. It also covers the crucial distinction between building on a platform versus building a platform yourself, arguing that any successful product will inevitably evolve into one—so architecture should treat the system as a set of building blocks from the start.
- **Middle (~33%–46%)**: This section tackles change and process. It introduces the concept of "feature trajectories" (expected rate and uncertainty of change) to guide architecture, and distinguishes between product-driven and technology-driven changes. The book advocates for incremental evolution over "revolutionary" rewrites, and details a formal change process: writing system documentation, crafting an architecture vision (about six pages, updated annually), and creating separate change proposals for each alternative concept—so that options are evaluated fairly and dead ends are avoided early.
- **Middle (~46%–54%)**: The design chapter covers the twin acts of decomposition and composition, emphasizing that they are two sides of the same coin. It discusses incremental delivery (avoiding abstract scope debates by checking after each increment), parallel processing (organizing work by people, best at higher levels of decomposition), and the value of open, early peer review to avoid path dependence on initial ideas. It also confronts the "cheap vs. expensive" trade-off, warning that promises to revisit low-quality work later are rarely kept.
- **Late (~54%–end)**: The book concludes with decision-making as a discipline. It introduces responsibility assignment matrices to clarify roles (approver, accountable, consulted, informed), and discusses the art of delegating decisions downward and escalating upward. The key insight is that moving decisions to the right level—whether to a service owner or to a senior leader—both frees up the architect's time and develops the team's judgment, ultimately leading to better decisions across the organization.
【Key Takeaways】
- **Complexity is the enemy, and architecture is the weapon** (Opening): Unmanaged complexity makes software unpredictable, unreliable, and hard to change. The primary value of architecture as a discipline is managing the proliferation of components and relationships—so architecture is not a luxury but a survival strategy.
- **Principles are intentional constraints that speed up decisions** (Early): Without explicit principles, teams default to implicit ones like "minimize scope" or "fastest time to market," which don't produce better products. Deliberately setting principles (e.g., UNIX's "small, single-purpose programs") guides all decisions in one direction, improving consistency and reducing time spent exploring dead-end options.
- **Concepts are the core of a system—and must be shared** (Early): Every system embodies concepts (like "mail" or "window"), and if stakeholders have different mental models, complexity and errors multiply. The goal is not to freeze concepts but to ensure all disciplines—engineering, UX, product—agree on them iteratively, since concepts are a key source of product differentiation.
- **Identify "architecturally significant" requirements by asking: how much rework if this changes?** (Early): Many so-called "non-functional" requirements (throughput, latency) are actually functional. A practical test: if a requirement changes and requires massive rework (like "one address per user" becoming "multiple addresses"), it is architecturally significant. Design for flexibility where change is likely, even at the cost of some initial complexity.
- **Assume your product will become a platform** (Early): Successful applications inevitably evolve toward platformization (e.g., a word processor adding macros, then plugins). If you treat the system's architecture as a set of building blocks from the start, you turn architecture into a product feature rather than an implementation detail—paying off whether or not you ever ship a plugin API.
- **Manage change incrementally; avoid revolutionary rewrites** (Middle): Big-bang rewrites double costs and rarely succeed. Instead, treat evolution as the system's natural state, use architecture reviews as a "pressure release valve" for new ideas, and invest heavily in each architecture upgrade so that the positive feedback loop lengthens the time until the next one is needed.
- **A formal change process saves money by killing bad ideas early** (Middle): Document the current system, write a vision (about six pages, updated yearly), and file each alternative concept as a separate change proposal. This forces honest evaluation of options and creates a clear record of what was considered and rejected—the most valuable contribution of an architecture team is avoiding costly dead ends.
- **Delegation is a decision-making tool, not just a management duty** (Late): Use a responsibility matrix to clarify who decides, and actively look for decisions to delegate to service or library owners. Delegating with context and guidance develops junior team members' judgment and frees senior architects for the few decisions only they can make—moving decisions to the right level improves the whole organization.
【Reading Tips】
- **Skim the opening chapters (0–25%) for the conceptual framework**: The definitions of architecture vs. design, principles, concepts, and "architecturally significant requirements" are the foundation. If you are an experienced architect, you can skim quickly, but do not skip the discussion of platforms and product suites—it reframes how you see your own system's evolution.
- **Deep-read the process chapters (33–46%) if you are starting or reforming an architecture practice**: The concrete advice on writing system documentation, creating a vision document, and structuring change proposals is immediately actionable. Pay special attention to the "separate proposal per alternative" rule—it is counterintuitive but prevents biased decision-making.
- **Watch for the recurring "cheap vs. expensive" trade-off discussion (Middle)**: This is a subtle but critical insight. The book argues that promising to "do it right later" is usually a lie, because future work will always compete for resources. If you choose the fast path, accept the consequences—or find a middle-cost option you can live with.
- **Use the decision-making chapter (Late) as a self-assessment tool**: The responsibility matrix and delegation guidance are best applied by mapping your own organization's decision flows. Ask yourself: which decisions am I holding that should be delegated
Passage locations
Page 8
动企业向前发展。然而,架构之上往往笼罩着一层神秘的面纱,让许多 人望而却步。本书将带领读者拨开云雾,一窥架构设计的精髓。无论是企业的管理者、 经验丰富的架构师,还是刚踏入编程领域的初学者,都能从本书中受益匪浅。 本书将带你深入探索软件架构的方方面面: ❑ 核心原则与最佳实践。从基础概念出发,逐步深入,探讨软件架构...
View in text
Excerpt 2
系所构成。系统的架构是指其组件及其关系的组织形式, 以及指导其设计和演进的原则。架构则描述了系统的当前状态和未来状态。 当一个系统缺乏有效的组织治理时,其决策往往会被外部因素左右。这些外部因 素通常包括管理上对上级领导的服从、对变更范围的最小化以及对快速交付的孜孜以 求。诚然,这些因素都非常重要,但它们也可能不利...
View in text
Excerpt 3
总而言之,循序渐进地实施变更才 是最佳的策略。 重大变更必须产生超额的回报,才能被视为一项成功的投资。然而,变更规模越 大,我们越倾向于低估其成本,高估其收益,最终导致评估结果失衡。 如果你曾参与过大型软件产品的开发,那么你很有可能经历过这样的对话。对话 通常始于一个小的变更建议,但随着设计的进行,所需的变更会像...
View in text
Excerpt 4
决,但如果未能将这些部分重新整合,就无法形成一个有效的系统。为了实现 设计目标,我们必须将各个部分组合成一个有机的整体。 从某种意义上说,这是一个显而易见的观察结果。在问题解决流程中的任何阶段, 如果分解后的部分无法重新组合以解决更大的问题,那么这种分解就是无效的。因此, 当我们分解一个问题时,实际上就是在预测各...
View in text
Recommended for You
{{#thumbnailUrl}}
{{/thumbnailUrl}}
{{^thumbnailUrl}}
{{/thumbnailUrl}}
Loading recommended books...
Failed to load, please try again later
Tip the Site
Scan the WeChat Pay or Alipay code to tip. No login required.
WeChat Pay
Alipay