- 推荐序一:架构师真正要学会的事情
- 推荐序二
- 译者序 2.0
- 序
- 关于本书
- Part Ⅰ 什么是软件架构
- 第 1 章 什么是架构
- 第 2 章 架构的种类
- 第 3 章 软件架构是什么
- 第 4 章 敏捷软件架构是什么
- 第 5 章 架构对上设计
- 第 6 章 软件架构重要吗
- 第 7 章 问题
- Part Ⅱ 软件架构的角色
- 第 8 章 软件架构的角色
- 第 9 章 软件架构师应该编码吗
- 第 10 章 软件架构师应该是建造大师
- 第 11 章 从开发者到架构师
- 第 12 章 拓展 T
- 第 13 章 软技能
- 第 14 章 软件架构不是接力运动
- 第 15 章 软件架构要引入控制吗
- 第 16 章 小心鸿沟
- 第 17 章 未来的软件架构师在哪里
- 第 18 章 每个人都是架构师,除非他们有其他身份
- 第 19 章 软件架构咨询师
- 第 20 章 问题
- Part Ⅲ 设计软件
- 第 21 章 架构驱动力
- 第 22 章 质量属性(非功能需求)
- 第 23 章 处理非功能需求
- 第 24 章 约束
- 第 25 章 原则
- 第 26 章 技术不是实现细节
- 第 27 章 更多分层等于更高复杂度
- 第 28 章 协同设计是一把双刃剑
- 第 29 章 软件架构是对话的平台
- 第 30 章 SharePoint 项目也需要软件架构
- 第 31 章 问题
- Part Ⅳ 可视化软件
- 第 32 章 沟通障碍
- 第 33 章 对草图的需要
- 第 34 章 无效的草图
- 第 35 章 C4:语境、容器、组件和类
- 第 36 章 语境图
- 第 37 章 容器图
- 第 38 章 组件图
- 第 39 章 是否包含技术选择
- 第 40 章 你会那样编码吗
- 第 41 章 软件架构和编码
- 第 42 章 你不需要 UML 工具
- 第 43 章 有效的草图
- 第 44 章 C4 的常见问题
- 第 45 章 问题
- Part Ⅴ 为软件生成文档
- 第 46 章 代码不会讲述完整的故事
- 第 47 章 软件文档即指南
- 第 48 章 语境
- 第 49 章 功能性概览
- 第 50 章 质量属性
- 第 51 章 约束
- 第 52 章 原则
- 第 53 章 软件架构
- 第 54 章 外部接口
- 第 55 章 代码
- 第 56 章 数据
- 第 57 章 基础设施架构
- 第 58 章 部署
- 第 59 章 运营和支持
- 第 60 章 决策日志
- 第 61 章 问题
- Part Ⅵ 开发生命周期中的软件架构
- 第 62 章 敏捷和架构的冲突:神话还是现实
- 第 63 章 量化风险
- 第 64 章 风险风暴
- 第 65 章 恰如其分的预先设计
- 第 66 章 初识软件架构
- 第 67 章 问题
- Part Ⅶ 金融风险系统
- 第 68 章 金融风险系统
- Part Ⅷ 附录:技术部落 的软件指南
第 26 章 技术不是实现细节
我举办的培训班经常要求学员分成小组设计一个简单的金融风险系统。当问起为什么他们的图表不包含任何技术决策,我会听到下面这些常见的回答。
“[风险系统]解决方案很简单,可以用任何技术构建。”
“我们不想强迫开发者使用一种解决方案。”
“那是实现细节。”
“我们遵循‘最后责任时刻’原则。”
我坚信,架构图应该包括技术的选择,但这里有另外一个问题,为什么人们不乐意做技术决策。说“它可以用任何技术构建”并不意味着应该如此。原因如下。
你有复杂的非功能需求吗
确实,大多数软件系统都可以用几乎任何技术构建,Java、.NET、Ruby、Python、PHP,等等。看看大多数软件系统的数据存储需求,也会发现几乎所有的关系型数据库都能完成任务。大多数软件系统在非功能特性方面的要求都不高,因此任何主流技术都差不多能满足。
但是,如果你有复杂的非功能需求,比如高性能或可伸缩性,那会怎样?事情很可能开始变得棘手,你必须搞清楚你的技术(和架构)选择是否会管用。如果你不考虑非功能需求,你的软件系统就可能无法满足目标。
你有约束吗
对于构建软件可采用的技术和的可选的技能(人),很多组织都有约束。有些甚至断定软件应该购买或定制,而非自己构建。约束能(且会)影响你能给出的软件架构。可以用各种手段挑战约束,但不能忽视,否则就会有交付一个无法与组织已有的IT环境集成的软件系统的风险。
你有一致性吗
想象你在构建一个把数据存储到关系型数据库的软件系统。在实现功能时,开发者个人如何从数据库检索数据和向其存入数据重要吗?我见过一个Java系统,同一个代码库中采用了多个数据访问技术/框架;还见过一个SharePoint系统,各个组件的配置方式不尽相同。有时候,发生这种事情是因为代码库随着时间演变,方法也在变化,但通常只是开发团队每个人完全自由选择自己最熟悉的任何技术/框架/方法带来的副作用。
人们经常问我“选择哪个日志框架是否真的很重要”,如果你想让开发团队里每个人都使用同一个日志框架,那么是很重要。有些人乐意允许开发团队里任何人下载和使用任何他们想要的开源库。另一些则意识到如果不加以检查,就会导致问题。我不是说要扼杀创新,但你的代码库真的应该只有一个日志、依赖注入或对象关系映射框架。
缺乏一致性的方法会导致代码库难以理解、维护和增强。增加单独可移动部件的数量也会让部署、运营和支持变得复杂。
推迟与解耦
有必要简单谈谈推迟技术决策和等到“最后责任时刻”才做出决策。让我们想象一下,你在设计一个没有任何特别繁重的非功能需求或约束的软件系统。你选择什么技术重要吗?一个好的架构难道不应该容许你日后改变主意吗?
举个例子,很多人会说,你用哪个关系型数据库真的不重要,特别是如果你用一个对象关系映射层将代码与特定的数据库实现解耦,比如Hibernate、Entity Framework或者ActiveRecord。如果你没有任何重要的非功能需求或约束,并且确实认为所有的关系型数据库都是相等的,那么你用哪一个可能不重要。是的,你可以在代码中解耦数据库,推迟技术决策。但是别忘了,当数据库的选择不再是重要决策,ORM的选择就是了。你可以通过引入另一个抽象层,在代码中解耦ORM,但这里又做了一个软件系统结构的重要决策。
解耦是很好的方法,原因很多,而且它使技术决策得以推迟。当然,这并不意味着你应该推迟决策,特别是由于非功能需求和约束的存在相关的原因。
每个决策都是权衡
这又回到一个事实,任何技术都有其优缺点,作为可交换的商品,并不一定有不同的选项。对于通常被看作是商业化的技术,关系型数据库和Web应用程序框架是两个典型的例子。很多云服务提供商也是如此,即使他们有各自关于部署、监测、管理、成本、持续磁盘访问等方面的权衡。
一天结束时,不论是否与性能、可伸缩性、可维护性、找到有合适经验的人的能力等方面相关,你做出的每一个技术决策都有权衡。理解技术选择也能协助高层次的预测和计划,如果你需要明白是否能用给定的有限预算实现目标,这就很有用。
如果你不明白选择X技术而非Y的权衡,那就不应该做决策。设计软件系统的人要懂技术,这很重要。这就是为什么软件架构师应该是建造大师。
技术不只是一个“实现细节”,你做出的技术决策跟你分解、安排和设计软件系统的方式同等重要。推迟技术决策,后果自负。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论