2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

架构设计原则的力量

  • 2017-01-19
  • 本文字数:2469 字

    阅读完需:约 8 分钟

这篇文章先是出现在 IEEE Software 杂志上,IEEE Software 是一本提供严谨科技资讯的杂志。企业总是在可靠性和灵活性上面临挑战,IT 经理和技术领导者依赖 IT 专家们来提供高超的解决方案。

本文要点

  • 架构原则确保设计决策在一定程度上能够满足需求
  • 借助架构原则,可以在没有微管理的情况下建立边界和优先级
  • 好的架构原则具有建设性,是合理的、良好定义的、可测试的,并且是重要的
  • 偶尔会发生架构原则被破坏的情况,这时我们必须找出原因,因为这是一个改进架构原则的好时机
  • 在架构原则的开发、捕捉和沟通上投入适当的时间有助于理论与实践之间的融合

人们经常会谈论系统的“架构设计原则”(或者直接叫“架构原则”)。不过在对“原则”进行清晰地定义之前,它所表示的意思还是很含糊的。对架构设计原则的角色和好处进行良好的定义,它将成为一个强有力的工具。

在这篇文章里,我将对架构设计原则做出定义,并探讨什么才是好的原则,以及如何在实际当中使用这些原则,从而能够从中获得价值。

原则的定义

我不打算对设计和架构这两者做任何刻意的区分,因为我认为在这里对它们进行区分没有任何意义。因此,我将会谈论一些设计原则,它们同时适用于细节层面和抽象层面。

牛津英语词典把原则描述为“一种基本的事实或主张,它是信念或行动的基础”,而设计是“一种计划或草稿,它展示了一栋建筑、一套服装或其它物体在成形之前的外观和功能或运行方式”。所以,我们可以把软件的设计原则定义为:

一种基本的事实或主张,它是决定软件系统运行方式的基础。

重点是,原则清晰地描述了意图,能够为设计工作提供指导。还有其它一些对设计原则的定义。在《Architecture Principles》[参考 1] 这本书里,Danny Greefhorst 和 Erik Proper 对设计原则给出了最具概括性的定义:

一个声明性的陈述,对人为事物的设计属性进行规范的定义,确保它们能够满足必要的需求

虽然这样的定义有些抽象,不过它至少澄清了设计原则的角色,它确保架构能够在一定程度上满足需求。

在进行抽象的定义之后,我们来看看真实的架构原则是什么样的。下面的表格展示了一个简单的架构原则,它是来自银行领域的一个真实案例。简单地说,这个原则:

  • 提供了一个名字
  • 给出了一个简洁清晰的描述
  • 清楚地解释了原则背后的动机
  • 定义了它所适用的领域(适用于特定类型的应用程序的消息服务,这些应用程序包含了特定的数据类型)
  • 解释了这个原则的重要性,这样我们就可以选择合适的时机应用它

(点击放大图像)

对于设计过程来说,这样的输入是很有用处的,因为它强调了组织的优先级事项,并解释了原则的重要性,以及何时会变得重要。

架构原则的好处

架构原则概括了架构的功能:为系统设计清晰地定义必需的约束,而不必按照惯例定义所有的设计细节。我在之前的一个专栏文章里提到,架构就是要处理好系统组件之间的关系[参考2]。所以,架构原则有助于建立边界和优先级,不需要关心系统的每个组件是如何工作的。好的架构原则可以为我们带来如下的好处。

为设计决策提供基础

原则能够澄清优先级和约束,从而帮助人们做出可靠的设计决策。事实上,我发现架构原则可以让一些抽象的想法更易于理解,比如业务目标,同时它们能够帮助设计者做好技术决策。以后我会在新的专栏文章里深入探讨这个话题。

为决策、成本和时间提供依据

作为设计者,我们经常要面对一些情况,比如最终的计划总是比我们所预期的要占用更多的成本或时间,但我们却很难解释清楚为什么这个计划是正确的。有了清晰定义的原则,我们就能够解释这个问题。例如,系统必须支持高可用部署这个原则就可以解释为什么我们要为系统构建多节点运维能力,尽管这样做不是最省钱的方案。

增强合作、沟通和公共价值

跟其它架构元素一样,架构原则必须在组织层面进行,而不是在个人层面。这样可以确保这些原则在早期就得到验证,并且让组织感觉到它们是属于集体的。而且,这样有助促进人们之间的合作,并建立公共价值,培养人们在区分事项重要性方面的共识。

定义优秀的架构原则

要定义好架构原则并不容易。给出一个浅显或凌乱的列表很容易,它们可能缺乏可操作性,以致于无法应用到实际当中。要定义有价值的原则并不容易。

我的长期合作伙伴Nick Rozanski 列出了优秀架构原则所要具备的一些特点[参考3],如下表。要达到这些标准需要付出一定的努力,不过这样所能得出的原则是很有价值的,它们提供了重要的具有可操作性的行动指南。

(点击放大图像)

什么时候可以违背原则

原则是用来指导设计并达成一致性的。不过有时候架构原则会遭到破坏,因为人们意识不到它们的存在(这种情况很普遍),而有时候人们会忽略它们(如果是这种情况,你一定要找出背后的原因)。

破坏原则需要付出代价,而且通常是长期的代价。所以,如果有人违反了原则,必须给出正当的理由。当发生这种情况时,你必须搞清楚破坏原则所能得到的好处能够抵消它所造成的损失。

遭到破坏的架构原则也会给架构师带来有用的信息。首先,被破坏的原则正好反映了系统设计在某些方面的重要性。其次,如果破坏原则是有正当的理由,那么说明理论和现实之间存在不匹配,我们必须予以纠正。最后,在知道了破坏设计原则所对应的系统点之后,我们就可以在系统演化时有针对性地处理这些点。

虽然人们经常谈论他们系统的架构原则,不过他们经常叫不出它们的名字,也无法解释其中的原理。在系统的生命周期中,特别是在早期阶段,识别、讨论、捕捉和沟通设计原则是非常重要的。这个过程很难,不过最终的结果有助于让理论和实际保持一致。

参考

  1. D. Greefhorst 和 E. Proper 合著的《Architecture Principles: The Cornerstones of Enterprise Architecture》,由 Springer 出版,2011 年。
  2. E. Woods 的“Architecting in the Gaps: A Metaphor for Architecture Work”,IEEE Software 杂志,2015 年第 4 期,第 32 卷,第 3335 页。
  3. N. Rozanski 和 E. Woods 合著《 Software Systems Architecture》,第 2 版,Addison-Wesley 出版,2011 年。

关于作者

Eoin Woods是 Endava 的首席技术官。可以通过 eion.woods@endava.com 联系到他。

查看英文原文: Harnessing the Power of Architectural Design Principles

2017-01-19 16:165686
用户头像

发布了 322 篇内容, 共 157.7 次阅读, 收获喜欢 148 次。

关注

评论

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

Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

霍格沃兹测试开发学社

算法 KECP 被顶会 EMNLP 收录,极少训练数据就能实现机器阅读理解

阿里云大数据AI技术

自然语言处理 机器学习 12 月 PK 榜 机器阅读

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

IoT高级设备检索——设备管理运维类

阿里云AIoT

数据库 监控 物联网 传感器 Cloud Native

前端面试题(附答案)

loveX001

JavaScript

百度 Android 直播秒开体验优化

百度Geek说

android 百度app 12 月 PK 榜 直播优化

React Context源码是怎么实现的呢

flyzz177

React

React源码解读之React Fiber

flyzz177

React

手把手教你构建数据安全体系,守住安全合规红线

王巍

数据安全

基于阿里云IoT平台OTA进行APP确认升级的方案——业务架构类

阿里云AIoT

物联网 UED 数据格式

跨机房ES同步实战

京东科技开发者

迁移 迁移数据 异步多活 Elastic Search 数据库·

KAFKA EAGLE 监控MRS kafka之操作实践

华为云开发者联盟

开发 华为云 12 月 PK 榜

ChatGPT中文版杀疯了,已登录AI模型市场

felix

极客时间运维进阶训练营第七周作业

9527

潦草手写体也能轻松识别,快速提取文字不用愁

HarmonyOS SDK

HMS Core

Git实战(五)| 让工作更高效,搞定Git的分支管理

霍格沃兹测试开发学社

深入理解JS作用域链与执行上下文

loveX001

JavaScript

前端面试指南之JS面试题总结

loveX001

JavaScript

群晖DS218+做maven私服(nexus3)

程序员欣宸

maven 12月月更 群晖

掌握 CORS 跨域请求,读这一篇文章就够了

范家鹏

HTTP CORS 跨域 异步请求 跨域资源共享

损失高达3亿美元|如何保护源代码安全?

SEAL安全

12 月 PK 榜 源代码安全 最小权限管理 零信任模型

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

做了一份前端面试复习计划,保熟~

loveX001

JavaScript

ReactDOM.render在react源码中执行之后发生了什么?

flyzz177

React

React源码分析3-render阶段(穿插scheduler和reconciler)

goClient1992

React

React源码分析1-jsx转换及React.createElement

goClient1992

React

2小时开发《点球射门游戏》,动画演示思路(上),代码已开源

非喵鱼

Java 开源 游戏 12 月 PK 榜 世界杯足球游戏

区块链“入局”证券市场,未来前景有多大?

旺链科技

区块链 产业区块链 证券行业 12 月 PK 榜

React源码分析2-深入理解fiber

goClient1992

React

架构设计原则的力量_架构_Eoin Woods_InfoQ精选文章