【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

讨论:烦人的细节

  • 2011-11-29
  • 本文字数:2104 字

    阅读完需:约 7 分钟

Bob 大叔和 Simon Brown 关于描述系统架构时基础架构(infrastructure)所起的作用展开了讨论。

在之前标题为 《尖叫的架构(Screaming Architecture)》的文章中,Robert Martin(也就是 Bob 大叔)阐述了这样的观点:软件产品的架构应该让所有人都很容易了解产品所要达到的目的,并且系统的架构应该反应系统的用例而不是它使用的框架:

架构不是(或者说不应该是)关于框架的内容。架构不应该由框架 _ 支持 _。框架是我们要使用的工具,而不是要符合的架构。如果你的架构基于框架,那么它就 _ 无法 _ 基于你的用例。

此外,好的架构应该让我们可以推迟那些不确定的,与框架、数据库、web 服务器等等相关的决定,Bob 大叔如是说:

好的架构让我们直到项目的 _ 后期 _ 才需要决定使用 Rails,或是 Spring,或是 Hibernate,或是 Tomcat,或是 MySql 等等。好的架构也让我们能够轻松地改变这些决定。好的架构强调的是用例,并把它与周边的关注点解耦。

Bob 大叔还谈到了互联网,想知道那是否也应该被认为是边缘关注点,并做出结论,网络也是一种“交付机制”:

网络是一种交付机制,你的应用程序架构应该这么来对待它。你的应用程序是否通过网络交付是一种 _ 细节问题 _,系统结构不应该取决于此。实际上,你的应用程序是否通过网络交付是你应该 _ 推迟 _ 考虑的事情。你的系统架构应该尽可能地与如何交付无关。你应该可以把它作为控制台应用程序、web 应用程序、富客户端应用程序、甚至是 web 服务应用程序来交付,而不需要让基本的架构过度复杂或者对其做出变更。

Bob 大叔文章的结论是:你的架构应该告诉读者与系统相关的内容,而不是你在系统中所使用的框架。

Simon Brown 是一位软件架构师,他对 Bob 大叔关于“交付机制”的观点发表了评论,称之为“烦人的细节”。他同意Bob 大叔所说的系统架构不应该是它所使用的框架,但是他还说到,他希望“看到软件架构能够落地,那就需要包括所选择的实现技术。” 关于推迟决定采用何种基础架构,Brown 说到:“如果我们需要做出某些关键的技术决定,那么肯定就需要完成,是吧?”,然后他问道:“如果我没有,或者不能推迟做出决定,那就一定意味着我拥有很差的架构吗? 我们难道不应该把推迟作为一种有意识的决定,而不是一种规则吗?”

Bob 大叔在从架构角度考虑的时候只关注系统的核心领域知识,而 Brown 的方法则与之不同,他认为“交付机制”当前是很大的一块工作,应该整合到总体架构之中,如下图所示:

Brown 的结论是:

对我来说,架构不仅仅是包含在“应用程序”中的内容。结构很重要,但是还有很多重要的内容,像非功能性需求、实际的交付机制(技术、框架、工具、API 等等)、基础架构服务(例如:记录日志、异常处理、配置等等)、集成服务(内部和外部的)、满足所有环境的限制(例如:运维和支持)等等。对我来说,所有这一切都与架构相关。

讨论并没有就此结束。Bob 大叔在另一篇博文《整洁的架构(Clean Architecture)》中对 Brown 的观点作出响应,他说,不管用户界面和数据库部分有多大,系统的架构都不应该面向这些“较大的元素”,并且“其他部分应该与之解耦”。他继续解释说,将核心领域知识与交付机制解耦非常重要,并说他不会特意地延迟和停止作出与框架相关的决定,但是架构师应该总是可以保持这两部分清晰地分离,即便这两项工作同时进行:

我曾经做出的更尖锐的关于架构的评论是,好的架构让你可以延迟做出一些重要的决定,像用户界面、框架、数据库等等。但有些人指出,客户不希望延迟用户界面方面的工作。DBA 也不希望延迟数据库方面的工作。在每次迭代完成的时候,他们都希望看到整个系统可以正常工作,包括用户界面、数据库和框架。他们不希望一次迭代只处理业务规则问题。事实上,好的敏捷实践特别要求对整体架构做“长而薄”的切分。

当然,我完全同意这一点。然而,“长而薄”的内容不需要同时进行。好的架构 _ 让你 _ 可以延迟做出重要的决定,它并不会 _ 强迫 _ 你延迟这些工作。然而,如果你 _ 可以 _ 延迟,那么就意味着你拥有更大的灵活性。例如,你可以在前面的几个 sprint 中创建临时的简单用户界面,然后再用更完备的用户界面来替换。

Bob 大叔做出结论说:“先处理这些烦人的小细节也没什么问题,只要你能够将业务规则与它们 _ 解耦 _。”

Brown 在对《整洁的架构》一文的回复中做出响应:他同意 Bob 大叔关于解耦的观点,但是在处理基础架构方面提出了不同的观点:“交付机制并非是可以延迟到‘世界末日’的烦人细节”,尽管 Bob 大叔坚持该工作是细节问题。Brown 的结论是:

  1. 将应用程序的代码和技术解耦很不错,而且是我们应该尽力做到的。这样得到的代码更易于做单元测试、易于替代、易于维护、易于修改等等。
  2. 软件架构是与全局相关的,而应用程序的代码只是全局中的一部分。
  3. 如果你仍然把“交付机制”这样的重要决定推迟,并且不考虑如何解决重要的非功能性需求和约束,那么就不得不面临软件项目失败的风险。

在讨论中,Bob 大叔和 Bronw 并不真的是处于对立的双方。他们都支持要清晰地分离核心领域知识与支持框架,但是前者更关注于领域知识,而后者认为还需要考虑并重视基础架构。你的方法是怎样的呢?

查看英文原文: Debate: The Annoying Detail

2011-11-29 07:212890
用户头像

发布了 340 篇内容, 共 126.0 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

TiSpark数据写入过程解析(源码解析)

TiDB 社区干货传送门

TiDB 底层架构

TiSpark On Kubernetes实践

TiDB 社区干货传送门

实践案例

使用SPM固定执行计划

TiDB 社区干货传送门

一言难尽的Prometheus监控实践

TiDB 社区干货传送门

实践案例

TiDB BR 备份至 MinIO S3 实战

TiDB 社区干货传送门

管理与运维

传统行业数据架构发展变化

TiDB 社区干货传送门

数据库架构选型

dm-V1.0.5使用汇总

TiDB 社区干货传送门

管理与运维

前缀索引在特殊场景下的优化尝试

TiDB 社区干货传送门

实践案例 TiDB 底层架构

TiCDC 4.0.15 初体验

TiDB 社区干货传送门

实践案例

TiDB 如何在 LVS FULL NAT 模式下显示客户端真实 IP

TiDB 社区干货传送门

实践案例

ticdc没报错,tso却不变的奇怪现象

TiDB 社区干货传送门

大事务的处理方式对比

TiDB 社区干货传送门

实践案例

使用 TiUP 安装部署 TiDB 集群实验流程

TiDB 社区干货传送门

版本升级 集群管理 管理与运维 安装 & 部署 扩/缩容

记一次TiDB的临时救场

TiDB 社区干货传送门

实践案例

记一次简单的Oracle离线数据迁移至TiDB过程

TiDB 社区干货传送门

骏彩竞猜分布式解决方案之路

TiDB 社区干货传送门

安装 & 部署

【考试指南】TiDB 5.0认证指南之PCTA PCTP

TiDB 社区干货传送门

TiDB 底层架构

探索TiDB Lightning源码来解决发现的bug

TiDB 社区干货传送门

TiDB 底层架构

TiDB在个推的落地实践 | 解决热点难题,提升性能超千倍

TiDB 社区干货传送门

性能调优

JOIN 查询的执行计划 比较

TiDB 社区干货传送门

性能调优 TiDB 底层架构

TiDB 在 Cisco Webex 架构中的部署和应用

TiDB 社区干货传送门

TiDB体系结构

TiDB 社区干货传送门

TiDB 底层架构

TiDB Binlog 支持 Oracle 目标库功能用户手册

TiDB 社区干货传送门

迁移

DR Auto-Sync 搭建和计划内切换操作手册

TiDB 社区干货传送门

TiDB监控Prometheus磁盘内存问题

TiDB 社区干货传送门

故障排查/诊断

高并发请求下 TiDB 集群的业务无损升级

TiDB 社区干货传送门

TiDB 如何获取集群创建时间

TiDB 社区干货传送门

实践案例 TiDB 底层架构

TiDB 悲观事务模式和Mysql的表象区别

TiDB 社区干货传送门

在CentOS7上进行TiDB/PD/TIKV编译分享

TiDB 社区干货传送门

实践案例 安装 & 部署

TiDB 运维基础操作脑图

TiDB 社区干货传送门

TiDB 元信息管理方式

TiDB 社区干货传送门

TiDB 底层架构

讨论:烦人的细节_架构_Abel Avram_InfoQ精选文章