首页 > 其他分享 >《架构师修炼之道》读书摘录

《架构师修炼之道》读书摘录

时间:2022-11-20 16:56:05浏览次数:58  
标签:架构 系统 模式 修炼 设计 组件 架构师 团队 摘录

学点架构师思维和技能总是有益的。

架构是关于软件系统的一系列重大设计决策的有机整体,实现期望的质量属性和业务目标。

架构的实质是站在系统全局视角思考和构建软件,解决问题。

《架构师修炼之道》清晰简明地阐述了架构师的职责、思维、技能和工具箱。全书内容更侧重沟通维度的技能,适合作为手册,放在桌边边读边学边练边用,一个小技能一个小技能地落实。

image

职责与影响力

软件架构师做什么

从系统全局出发,指导开发团队一起实现系统的短中长期业务目标,推进项目成功。

  1. 挖掘和确定关键架构需求。需要与主要利益相关方、最终用户深入交谈。
  2. 从工程角度定义问题。关注软件的上下文语境,定义质量属性。
  3. 分解系统,分配职责。确定构成软件的主要模块(子系统)及模块(子系统)之间的关联。
  4. 确定系统关键质量属性。需要在质量属性之间权衡取舍。
  5. 关注核心功能实现。确定系统所面临的核心技术难题,并推进确定对应的技术决策和方案。
  6. 展示和评估系统的关键决策。通过各种视图、图表从多个视角展示软件的全景图和主要组成部分。
  7. 管理技术债务。
  8. 提升团队成员的设计技能。

针对每个项目提问

  • 利益相关方是谁,主要业务目标是什么?
  • 整体解决方案是什么?
  • 涉及哪些技术?
  • 最大风险是什么?如何克服?
  • 有机会重做,如何改进?

架构对软件开发的作用

  1. 将大问题分解为容易处理的小问题。
  2. 为协同工作提供总体指导和方向。
  3. 为讨论复杂设计提供基本词汇。
  4. 重点解决系统质量属性。
  5. 兼顾考虑成本、约束、进度、风险、交付。
  6. 避免犯重大错误。
  7. 让软件更加灵活。

架构不做什么:有所为有所不为

  • 不做过于细节的具体决策,除非细节与系统关键质量属性相关。
  • 不涉及非核心功能的实现,除非影响系统核心功能。
  • 不关注功能需求的实现,但关注关键架构需求。

架构目标与衡量

从“质量-效率-成本”铁三角维度来说,架构的目标就是站在系统整体看待和解决问题,提升研发效率和关键质量,降低长期维护成本。

可阅:架构设计开篇:架构设计的目标与衡量

架构思维

基本思维

  • 系统全局:始终坚持站在系统和全局的视角看待和解决问题。
  • 以人为本:理解利益方需求,关心最终用户,考虑程序员、测试人员、项目经理、运维等。
  • 推迟决策:不到成熟一刻,不着急做出最终决策;低优先级的事情,推迟决策。
  • 善于借鉴:研究和借鉴已有的设计成果和设计模式。
  • 化虚为实:让想法具体化形象化,将架构展现出来。
  • 极简主义: 只关注高优先级的质量属性,提升这些质量属性同时降低风险。

实践方法

  • 理解问题 => 清晰描述问题 => 探索想法 => 展示想法 => 评估可行性和适用性
  • TDC循环:思考、动手、检查。

专业知识

架构师拥有架构模式与质量属性映射的丰富知识。架构师知道如何在质量属性之间取舍权衡,选择合适的架构模式。

技术架构模式

  • 分层模式:应用通常分为多层(控制层、服务层、领域层、数据层、基础设施层),是常见的技术架构模式。
  • 端口适配模式:系统通过各种端口适配器将输入转换为系统能够处理的输入,或者将系统输出转换为外部能够接收的输出。通常也称为接口模式,用于子系统交互或消息适配。
  • 插件模式:系统支持加载不同的插件来完善自身功能。微内核是一种插件模式,其自身只包含最核心的模块,其它模块通过插件机制动态加载进来。
  • 管道过滤器模式:由一系列过滤器通过管道连接,构成一个处理流水线。linux 管道就是典范。
  • SOA:应用分解为多个分布式的服务组件,通过 RPC 和标准服务对象格式来通信。
  • 微服务模式:应用分解为多个分布式的微服务组件,通过 RPC 或消息队列来通信。
  • AKF立方体:从功能职责、数据、服务实例三个维度来分解架构职责。
  • PC 模式:生产者消费者模式,亦称发布-订阅模式。任何组件都可以发布和监听事件,或者发送消息和订阅消息。当事件发布时,监听者获得通知并进行处理;当消息发送后,订阅者将获得消息进行处理。通常用于解耦多个生产者和消费者。
  • 共享数据模式:多个应用通过共享数据库来访问数据。实际微服务架构模式中,数据库通常只能被所属的微服务访问,而不能被其它微服务访问。
  • 大泥球模式:构建一个聚合大应用,通常是为了尽快交付一次性使用系统,不考虑长远维护。

各个架构模式的详细讲解及所能达成的质量属性,可参阅: 《软件架构基础(影印版)》

团队架构模式

  • 专业协作模式:由不同的专业团队组成和协作,每个专业团队负责自己所负责技术领域的服务、工具、支持等。互联网企业里最常见的团队架构模式。比如开发、测试、产品、、DBA、运维团队等。
  • 开源贡献模式:从质量和完整性角度审核其它人提交的组件和更改。
  • 能力中心模式:CoC团队,为架构提供模式、技术、最佳用例、开发支持工具、培训等。

架构技能

确定关键架构需求(ASR)

显著影响架构设计的需求。主要有:约束、质量属性、影响大的功能需求。此外,需要考虑团队和组织架构的影响、法律政策相关的影响。

用约束限制设计选择

约束有业务约束、技术约束和法律政策文化上的约束等。约束确定后不能讨价还价,因此接受约束要慎重。适当约束可以简化问题,过度约束会增加设计难度。

定义质量属性

质量属性是架构需求中最主要要满足的需求,用来指导技术、结构、模式以及评估设计决策合理性。用场景描述质量属性,定义量化目标。

影响大的功能需求分类

比如入侵检测系统,规则管理、检测流程、告警列表与详情、响应阻断就是影响非常大的功能需求,需要着重考虑。

考虑团队和组织架构的影响

现代企业里,一般会分为前端团队、客户团队、服务团队、大数据团队、DBA(如果有的话)、测试团队、产品团队、运维团队。某一领域比较专业化的话,还会细分,比如存储模块团队、网络模块团队等。每个团队在内部又会根据具体业务来划分成不同的小组。比如 A 小组负责容器业务,B 小组负责主机业务等。做架构设计往往涉及到多个团队的协作,因此需要考虑架构实施如何分配到多个团队里。

建立架构模型

架构模式优点

  • 构建设计词汇
  • 关注重要细节
  • 推演质量属性
  • 展示架构构思

建立架构模式的方法

  • 设计元模型
  • 分离新概念
  • 选择合适架构模式
  • 保持一致性
  • 好的命名

架构转为代码

  • 统一使用架构词汇
  • 组织代码突出架构
  • 贯彻元素关系:模块结构、组件连接器结构、分配结构
  • 添加代码注释
  • 用代码生成模型

拿新入侵检测系统为例:

  • 构建设计词汇、设计原模型的基础实践就是名词解释。比如新入侵检测系统中,定义了如下几个关键名词:元素、告警、事件、规则、评分、检测方式。整个系统围绕这几个名词展开,不乱增概念,不一词多义,也不多词一义混用。
  • 何为分离新概念呢? 比如告警和事件难以描述一次入侵行为的全貌。因为一次入侵行为往往表现为(但并不完全映射成)一系列关联的告警序列和元素关联关系。当告警和事件也不足以抽象一次入侵行为时,就需要新的概念来填补其中的空白。
  • 选择合适的架构模式。通常是客户端经过一系列检测后上报数据给服务端,服务端进行检测(若有必要的话)、告警构建、存储、过白名单、发送大数据等流程。由于服务端很多检测流程都是通用的,因此可以采用组件编排的方式来构建服务端流程,保证服务端流程的可复用性和可扩展性。组件编排,比较类似于管道和过滤器模式。而在系统中还存在着各种事件及变更处理,则适合于采用订阅推送模式。
  • 组织代码突出架构,好的命名。比如采用组件编排的方式,那么就有 components 的包结构,将所有检测相关组件都放在这个包下。采用策略模式,则有 XXXStrategy 命名;采用装饰器模式,则有 XXXDecorator 命名;构建器,则有 XXXBuilder 命名。
  • 推演质量属性。这个非常关键。因为质量属性是架构设计的重点目标。参考 《服务端代码质量概要属性》,结合该系统的核心功能需求,来推演质量属性。

探索设计

够用的设计

  1. 将解决方案看成实验;
  2. 简化问题;
  3. 快速迭代学习;
  4. 同时考虑问题和解决方案。

设计策略

  • 决定做多少前期设计。 1000w 大系统 37% ,1w 小系统 5%
  • 风险作为导航。风险: 条件-影响-范围。
  • 主动选择架构、根据系统监控被动设计。
  • 制订设计计划:结束设计的条件、必要的设计成果、时间节点、重大风险、概念架构设计。

沟通与交谈

  1. 利益相关方关系图。
  2. 记录业务目标: 主体-业务目标-背景。
  3. 换位思考。

探索方案

【书中有实操指南,需要团队集体创作,还没怎么实践】

  • 分而治之
  • 概念图
  • 组件-功能-协作者卡片
  • 架构演变记录
  • 白板涂鸦
  • 循环设计
  • 事件风暴
  • 团队海报

展示设计

展示总体设计

  • 用不同的视图展示展现架构:开发架构、业务架构、部署架构、数据架构等。
  • 元素功能视图、粗略视图、精细视图、质量属性视图、映射视图、自定义视图
  • 绘制出色的图表:使用图例、突出模式、简洁一致、描述性文字

展示总体设计常用的图

  • 系统全景图。采用分层视图,展示系统的基础组件层、业务底座层、核心业务能力层、系统模块与依赖模块层、具体产品层。
  • 系统模块图。展示了构成系统的各个模块及模块之间的关联关系。比如数据依赖(信息、配置等)、控制依赖(开关下发等)、服务依赖(文件服务、引擎检测等)等。
  • 数据流图。 展示一个核心功能里,数据如何从源端流转到各个模块或组件,最终抵达目的端。
  • 系统部署图。展示了构成系统的各个组件的服务器部署、通信端口及连接方式(别人画的)。这里的组件通常指微服务、存储组件与中间件。
  • C4 图。主要是练习了 C4 图的绘制。包括:系统与用户上下文交互、技术选型图、开发导航图、组件图、某个组件的具体内部图。

重在实践!限于内部技术方案敏感性,这里不公开了。网络上有很多优秀开源系统的架构图,可以仔细揣摩研究哈。

展示设计决策的常用方法

  • 架构主旨:用一页文档将系统的所有架构决策精华全部囊括在内。相当于系统架构首页。
  • 架构决策记录(ADR):用多页文档或卡片记录关于系统的一系列主要决策及背景、依据、状态等。
  • 精选阅读列表:用一个表格展示关于系统的一系列重要技术问题及方案文档。
  • 系统模块交互图:见上述系统模块图。
  • 制作原型:在构建一个中大型系统之前,先做一个原型,验证基本想法是可行的。比如在大规模迁移老的入侵检测能力到公司新技术架构上之前,先做一个原型,验证一个主要功能是可以迁移并成功运行的。
  • 时序图: 开发常用,用于技术方案文档中。
  • 系统隐喻: 用一个易懂的故事或寓言来讲解系统的架构设计及影响。需要会讲故事。主要是讲给非技术人员听的。
  • 未采纳的决策:记录未采纳的决策及缘由,避免后续维护的人做重复无用功。

评估设计

评估设计方案的常用方法

  • 架构简报
  • 决策矩阵
  • 场景走查
  • 测量和监控
  • 问题、评论、关注事项
  • 风险风暴
  • 合理性检查
  • 代码审查

架构师与团队

提升团队架构技能

  • 提倡架构思维
  • 传授技能、辅助决策
  • 创建实践机会(结对设计、搭建支架、引入架构导轨、交流会)
  • 设计授权
  • 共同设计架构

设计授权的七个层次

  • 告知。自己做设计决策,告诉团队结果。
  • 贯彻。自己做设计决策,说明设计依据缘由。
  • 咨询。 咨询团队意见,自己做设计决策。
  • 商定。 与团队合作,达成共识。平等话语权。
  • 建议。 通过观点、见解影响团队,由团队成员做设计决策。
  • 审查。 由团队做决策,并由他们解释为什么这么做。
  • 委托。 委托团队成员做决策,并由他负全责。作为辅助,帮助收集信息。

标签:架构,系统,模式,修炼,设计,组件,架构师,团队,摘录
From: https://www.cnblogs.com/lovesqcc/p/16908874.html

相关文章

  • 程序员修炼之道——从小工到专家读后感4
    这里的正交其实就是咱们熟悉的解耦。在这里你估计会想到标题为啥是正交,不是解耦。我忘了告诉大家本书的作者同时也是一位木匠和音乐家。估计能在木匠和音乐领域找到答案。......
  • 《程序员修炼之道:从小工到大家》读后感(七)
    收官之前很高兴本学期能够读到这样生动有趣的一本好书,在这里,我学到了一名合格的程序员应当注意到的问题,包括能力、社会交流等方面,不应在这个大学里面只是学习到了能力,还要......
  • 09.架构师有必要深入下JMM(1)
           ......
  • 《程序员修炼之道:从小工到专家》——读后感3
    此次读后感写于读完《程序员修炼之道:从小工到专家》的第二章的第二节一、注重实效的途径:2.正交性:1)定义:简单说就是完全互不影响  2)非正交系统:     这提......
  • 程序员转型架构师,推荐你读这几本书
    从CRUD的程序员,到系统的架构师,进阶推荐读这几本书。架构师书单分为两部分,第一部分是关于系统架构的方法论,包括领域驱动设计,微服务,整洁架构,第二部分介绍各大互联网大公司是如......
  • 设计的一些常识--摘录其他网站
    1、API与SPI分离,API面向使用者,SPI面向扩展者2、服务域、实体域、会话域分离实体域框架或组件,总会有核心领域模型,比如Spring的bean,Dubbo的service等,核心领域模型及其......
  • 《剑来》语句摘录(七)
    第935章 想人的时候喝酒,想事的时候喝茶。第949章 姜尚真懒洋洋道:“帮人夜中打灯笼,帮人雨中撑伞,到头来只被嫌弃灯......
  • 程序员的修炼之道:从小工到专家读后感
    第四章观看总结第1节按合约设计1、注重实效的程序员会不信任自己,所以他们针对自己的错误行为进行防卫性编码。2、按合约设计(DesignByContract,简写DBC)是BertrandMey......
  • 程序员的修炼之道:从小工到专家读后感
    第六章当你编码时31靠巧合编程软件开发者,每天就像工作在雷区,有成百的陷阱等着抓住我们。多余的或不必要的代码可能这次能够正常运行,但换个环境可能就会崩溃,另外会使代码......
  • 程序员的修炼之道:从小工到专家 读书笔记五
    第五章 弯曲或折断解耦与得墨忒(tei)耳法则1、把你的代码组织成最小单位(模块),并限制他们之间的交互。如果随后必须替换某个模块,其他模块仍能够继续工作。2、应使耦合减至......