写点什么

讨论:烦人的细节

  • 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:213199
用户头像

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

关注

评论

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

Zadig 正式推出 VS Code 插件,本地开发更高效

Zadig

vscode 插件 热部署 本地化开发 Zadig

linux检测系统是否被入侵(下)

入门小站

Linux

在线文本过滤小于指定长度工具

入门小站

工具

在线SQL转HTMLTable工具

入门小站

工具

直播预告|SQL也能玩转工业级机器学习?MLOps meetup V3带你一探究竟!

星策开源社区

人工智能 机器学习 sql 特征平台 MLOps

穿越过后,她说多元宇宙真的存在

脑极体

带链接跳转的微信红包封面制作教程和使用指南

boshi

小程序 微信红包封面 微信红包

Java Core「19」使用 Java IO API 创建 C/S 程序的方法

Samson

学习笔记 Java core 6月月更

Zadig 构建究竟何强大?一起来实践

Zadig

gitlab 云原生 jenkins Zadig

穿越过后,她说多元宇宙真的存在

脑极体

00 后云原生工程师:用开源 Zadig 为思创科技(广州公交)研发开源节流

Zadig

DevOps 研发效能 工程师 自动化运维

Prometheus 2.36.0 新特性

耳东@Erdong

release Prometheus 6月月更

构建实战化防御体系之立体防渗透

穿过生命散发芬芳

6月月更 攻防演练

安全 创新 实践|海泰方圆受邀参加“数字时代的网信创新与价值共创”技术交流研讨会

电子信息发烧客

2022最新Java面试突击手册,1000道面试题+优质面经

Java全栈架构师

Java 程序员 面试 算法 计算机网络

自媒体行业内卷严重:企业自媒体应该何去何从

石头IT视角

为什么要使用 Rust 语言?

面向加薪学习

rust

稳!上千微服务如何快速接入 Zadig(Helm Chart 篇)

Zadig

DevOps 微服务架构 持续交付 自动化运维 Zadig

Go Web 编程入门:HTTP 自定义路由

宇宙之一粟

Go 语言 6月月更

Zadig + SonarQube,为开发过程安全保驾

Zadig

DevOps 代码扫描 SonarQube 质量内建

Zadig 面向开发者的自测联调子环境技术方案详解

Zadig

DevOps Service Mesh CI/CD 测试环境治理

Zadig + 洞态 IAST:让安全溶于持续交付

Zadig

DevSecOps 代码安全检测 安全测试 Zadig

笔记

IT蜗壳-Tango

6月月更

微博评论的高性能高可用计算架构方案

joak

电商秒杀系统架构设计

哈喽

「架构实战营」

wrk压力测试工具介绍

乌龟哥哥

6月月更

油猴脚本学习

Sher10ck

脚本 油猴

华为云的AI深潜之旅

脑极体

稳!上千微服务如何快速接入 Zadig(K8s YAML 篇)

Zadig

DevOps 微服务架构 k8s 持续交付 自动化运维

要想Linux命令行玩的溜,还得apropos!此文运维必看!

wljslmz

Linux 运维 6月月更

HashMap分析-基础属性与结构

zarmnosaj

6月月更

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