0%

《程序员必读之软件架构》读后感

1. 概况

书名:《程序员必读之软件架构》
时间:20250704~20250731

这本纸质书放在家里时间挺长,之前看着目录比较简单,一直没有去翻阅。
近来看完其它书,偶然翻阅,别有一番风味:行文比较简单。
印象深刻的两部分内容是『画图』和『文档』。
特别是文档,有一个很好的类比:旅游指南/攻略 VS 软件指南。

  • 随说:软件指南 VS 旅游指南

一句话概况:架构代表了重大决策,衡量重要性的则是改变的成本。
文章最后有更多架构相关书籍的读后感链接。

1.1 什么是架构?

名词解释:将产品分解为一系列组件、模块和交互。
动词解释:理解你需要构建什么、设定愿景以便进行构建和做出恰当的设计决策。

  • 本质:结构 + 愿景
  • 现象:需求驱动架构

1.2 架构的好处

1.2.1 没有架构会怎么样?

如果没有人思考软件架构,最终结果往往看起来像一团乱码。
副作用包括软件系统难以维护、难以改变、难以扩展、难以部署、太慢、不安全、脆弱、不稳定等等。

1.2.2 架构的好处

  • 让团队有清晰的愿景和路线图;
  • 技术领导力和更好地协调;
  • 更好地回答重要决策、非功能需求、限制和其他问题;
  • 识别和减轻风险的框架;
  • 方法和标准的一致性(结果之一:结构良好的代码库);
  • 对不同的听众,用不同的抽象来交流解决方案;

2. 摘抄

这本书主要覆盖的内容:

  • 软件架构的本质;
  • 为什么软件架构角色应当包含编码、指导、合作;
  • 开始编码前真正需要思考的事情;
  • 如何用简单的草图让你的软件架构可视化;
  • 为软件生成文档的轻量方法
  • 为什么敏捷和架构并不冲突;
  • “恰如其分”的预先设计是什么意思;
  • 如何通过风险风暴来识别风险;

关于架构的5件事

  1. 软件架构不是大型预先设计
  2. 每个软件团队都需要考虑软件架构
  3. 软件架构的角色关乎编码、指导和合作;
  4. 无需使用 UML;
  5. 好的软件架构是支持敏捷开发的;

想在这个行业里有所作为,就需要克制对新鲜玩意都迷恋,开始问一些问题。

很多架构师远离细节的主要原因之一是他们没有时间。

如果你了解如何编程,往往会忍不住对开发者如何编写代码提出建议。
不过,如果你没有参与项目的编程,开发者多半会无视你的编码经验。

软件架构师面临的问题

  1. 和其它可选技术相比,合适吗?
  2. 该系统的设计和构建,还有哪些选择?
  3. 是否应该采用一种通用的架构模式?
  4. 我们是否明白所做决策的利弊?
  5. 我们照顾到了品质属性的需求吗?
  6. 我们如何证明这种架构行之有效?

最优秀的软件设计师都有软件开发背景,
但并不意味着他们是团队中最好的程序员,
但他们能够在底层细节和大局之间切换。

结对编程有好处,那为什么不结对架构?

支撑软件架构角色的技术知识需要深度与广度并存的知识组合。

每个人都有自己的想法和计划,你在处理时得让他们不反感,并主动地去追求你需要的结果。好的影响力也要求好的倾听和探索能力。

辅导是对人进行学习方面的指引,
而非告诉他们怎么做一件事。

每个组织都少不了政治,我们离得越远越好。
但你至少应该明白周围发生了什么,
这样才能做出更可靠的决策。

责任感:你不能因为失败就责备软件开发团队中的其它人,有责任感对你而言很重要。

授权:在适当的时候授权,但记住,授权的可不是责任。

保持积极,构建正能量回路。
你的热情带动了团队,他们的热情也带动了你

软技能有时候比过硬的技术更重要,
交付产品的团队才是愉快的,
让团队保持积极是你的责任,
你的角色在整个团队中不应该低估。

软件架构要引入控制吗?
可以的,类似操纵杆,不是非黑即白,较自由
先从部分控制开始,倾听反馈,再微调。

我们正在失去技术导师
在我们的行业里许多开发者为了在企业晋升机制中有所发展,被迫转向非技术的管理岗位。
讽刺的是,被迫离开技术岗位的往往是最优秀和最资深的技术人员,而软件团队中则失去了最有价值的技术领导、架构师和导师。

很多团队连一个对“大局”之类的东西有经验的人都没有,一团乱麻的代码库、不明确的设计、很慢的系统,类似这些都是证明。

任何时候,在高层次上理解需求、约束和原则都至关重要。因为这是设计选型所需的基本知识。

软件架构谈论的是重要的设计决策,其重要性以变动的成本来衡量。
随说:ETC 原则 来自《程序员修炼之道:通向务实的最高境界》

用层来组织代码库使得软件整体结构更易于观察,但不容易改变特性或用户故事,你需要深入多个层(包、命名空间等)探究。
随说:组件更容易改变,聚合的。

因为架构和代码之间相互的映射往往非常少,我们要通过组件封装(闭环/类似微服务)对齐软件架构和代码,放弃使用层或特性。

只有 10%~20% 的听众在日常工作中经常使用 UML。
其实我们很多时候一张白纸、白板或者便利贴就够了,特别是一组人想通过协作来完成设计。
(三四个人挤在笔记本屏幕前有点奇怪,不能是投影?)其实最后还是要迁移到电脑系统上。

画图最好要加上图例,不是所有人都懂 UML。

软件架构流程就是为软件项目引入结构和愿景

  1. 从对个抽象层次看到并理解方案
  2. 理解大局,谁使用系统,IT环境依赖
  3. 逻辑容器和高层次技术选择(web服务器、DB)
  4. 有哪些主要组件,如何使用他们来满足用户故事、用例、功能,等等。
  5. 体现组件职责是什么、组件的归属
  6. 理解图表表示法、约定、颜色编码
  7. 图表之间的可追踪性
  8. 业务领域是什么,高层次视角看
  9. 理解实现策略(框架、类库、API)

代码不会讲完整的故事,我们需要文档辅助。
比如技术选型,一些决策过程,业务背景等

代码库 vs 旅游景点必看指南
随说:妙啊

旅游指南有实用信息:货币 电力 移民 法律…
源代码里面也应该包括实用信息:哪里找到源码、如何构建、如何部署、团队遵循的原则等等。

项目应该有文档去讲述产品如何工作、如何演化。

每个系统都应该有一份软件指南。
告知产品如何工作、演化的信息。
方面人们熟悉系统、优化系统。

软件指南包含:
语境
功能性概览
质量属性
约束
原则
软件架构
外部接口
代码
数据
基础设施架构
部署
运营和支持
决策日志

所有的决策都是依据特定的语境做出的,
通常都有取舍。

项目级文档 vs 产品级文档

思考软件架构的过程其实是确定范围,
在范围之内可以用任何一种 xDD 来实现。

架构代表了重大决策,衡量重要性的则是改变的成本。

3. 架构微博

  • 《架构之道》
  • 《架构师的12项修炼》
  • 《软件架构:架构模式、特征及实践指南》
  • 《微服务架构设计模式》
  • 《凤凰架构》
  • 《架构之美》
  • 《架构修炼之道》
  • 《高可用可伸缩微服务架构》
  • 《高可用架构》
  • 《可伸缩服务架构:框架与中间件》
  • 《可伸缩架构》
  • 《大型网站技术架构》
  • 《架构真经》