京东云开发者|探寻软件架构的本质,到底什么是架构?

京东云开发者
• 阅读 200

不论是开发人员还是架构师,我们都一直在跟软件系统打交道,架构是在工作中出现最频繁的术语之一。那么,到底什么是架构?你可能有自己的答案,也有可能没有答案。对“架构”的理解需要我们不断在实践中思考、归纳、演绎,形成自己的认知。

1 到底什么是软件架构 ?

定义 ”架构是什么“ 是件非常困难的事情,不同的组织对于软件架构有不同的定义,每个人心中也有自身对于系统架构定义的认知。就好比我们无法百分之百表述模型而只能产出模型不同维度的视图,对架构进行完备的定义是不可能的。

“道可道,非常道。名可名,非常名”。

行业内不同的组织和个人从不同的视角对 “什么是架构” 进行了定义或阐述。

IEEE 关于架构的定义

the fundamental organization of a system, embodied in its components, their relationships to each other and the environment, and the principles governing its design and evolution --ANSI/IEEE

将系统架构定义为:架构是系统组织结构 + 组件及联系(组件间以及组件和环境之间) + 原则的组合。通过图形化的形式表述该架构定义如下图所示,这是一个非常简洁、概念清晰的定义,其言简意赅的表达了架构的几个核心要素:

系统的组织:表达系统的宏观结构

组件及联系:组件化的思维,同时突出了环境要素。组件表达了系统的模块化,组件相互之间及组件与环境之间的关联表达元素间的相互作用。

原则:用于指导设计和系统演进的原则



京东云开发者|探寻软件架构的本质,到底什么是架构?



大师 Martin Fowler对于架构的定义有着更加简洁的抽象,Martin Fowler 认为软件架构是:重要并且难以改变的决策。架构设计是关于权衡的艺术,架构设计过程中充满了各种各样的决策,这些决策也终将反应系统架构。

Software Architecture = Important and hard to change decisions --Martin Fowler

Ralph Johnson则对架构有更加 “泛化” 的定义 软件架构就是重要的东西,不论它是什么!

The software architecutre is the important stuff ! Whatever it is ! --Ralph Johnson

以上的定义从高层抽象视角对什么是架构给予了自己的回答,相比之下,Neil Ford 从架构组成元素入手,从更偏向实践的角度对架构进行了阐述。核心思想是软件系统的架构包括以下组合元素:

结构:应用系统所选择的架构风格,比如微服务架构、单体架构还是SOA等

架构属性:系统的非功能性属性,比如性能、可用性、可维护性等

架构决策:系统设计过程中重要的架构决策

设计原则:设计过程中的指导性原则



京东云开发者|探寻软件架构的本质,到底什么是架构?



结构

结构是系统架构的重要组成部分,其从宏观上表述了系统的结构组成。架构设计的核心任务之一是为系统选择合适的架构风格。比如,架构师基于上下文的权衡,可以选择模块化单体架构风格,也可以选择微服务架构风格。



京东云开发者|探寻软件架构的本质,到底什么是架构?



架构属性

架构属性亦称质量属性,或非功能属性,通常表示系统需要具备或满足的某种 “能力”,比如高性能、可扩展性、弹性、伸缩性、容错性、可测试性、可维护性等等。架构设计的目标需要关注系统需要满足的架构属性,架构最终要体现对架构属性支持的相关架构决策。架构属性众多,系统需要关注的是这些架构属性的子集,具体的某次特定的架构设计所需要关注的架构属性需要依据问题域的上下文而具体分析。同时,不同的架构属性间可能存在冲突,这种情况同样需要架构师的权衡和决策



京东云开发者|探寻软件架构的本质,到底什么是架构?



架构决策

架构决策是系统架构设计过程中对解决方案的选择,其描述了系统必须遵循的规则。架构决策随着权衡分析而自然存在,其是系统架构设计的重要维度之一。并不是所有的决策都是架构决策,架构决策应该关注对系统有重要影响的部分。比如对架构风格的选择对系统存在重要影响,其改变的成本较高,理当属于架构决策的范畴。比较典型架构决策包括但不限于:

•直接影响高优先级的架构属性

•修改对外接口:对外提供的接口修改往往需要进行充分影响分析

引入或者移除依赖:依赖的加入和移除往往标示着组件能力的引进和废弃

改变系统的通用结构:工程结构是应用架构的重要维度之一

迫使研发人员改变开发方式

接受战略性技术债:重构影响较大的技术债往往对现有系统会有较大影响

:架构决策建议以轻量级的文档化形式进行记录,参考文章 《轻量级的架构决策记录机制》一文

设计原则

设计原则与架构决策不同,其本质区别是:设计原则是一种指导,而非强制的规则。架构决策需要遵守,设计原则提供参考性指引

比如,设计原则可能是:在可能的情况下,跨系统间的通信尽可能使用异步消息机制以提高性能和降低耦合。




以上对架构的定义各有特点:

•IEEE定义更加结构化和规范化

•Martin Fowler的定义侧重架构决策的重要性

•Ralph Johnson 则更加泛化,突出 “重要” 这一核心因子

•Neil Ford则更具象化

我个人更倾向于Ralph Johnson 对于架构的抽象化定义,简单却不失对架构本质的阐述,这也是我在工作中判断架构边界的准则之一。

2 架构设计的边界

如果你是团队的架构师,你是否有以下**困惑**:

•系统的架构应该设计到什么粒度?

•架构设计是否要足够详细以便能直接指导开发人员开展编码工作?

如果你是团队的核心开发人员,你是否 抱怨

"架构设计" 太过详细,涵盖了实现的 “细枝末节”,自己除了CRUD没有发挥的空间

"架构设计" 太过宏观,基于设计方案根本无法指导开发,自己还得重新设计



京东云开发者|探寻软件架构的本质,到底什么是架构?



很多架构师自身对架构和设计的边界缺乏深入认知,相比于对架构边界的缩小,更多时候会出现架构设计边界放大的情况:

架构师把架构设计当作详细的技术方案设计,牢牢把控系统实现的所有细节,产出大量的设计文档,然后交由核心开发人员做代码实现的执行工作。

这种现象会导致如下问题:

•压缩了团队核心开发人员的设计发挥空间,不利于其技术水平及认知的提升

•作为架构师你真的能讲所有的细节都Cover住吗?即使耗费巨大精力完成了 “完备” 的设计,来自一线开发所面临的各种场景是否能够提前预知和捕获?

•如果需求迭代持续如此,作为核心开发人员多半会有所 “怨言”

•作为团队的架构师精力有限,持续的细节输出会耗费巨大精力,而无法关注更加宏观的层面

•.......

以上问题的根源是什么?不能明确架构设计的边界!

架构设计与设计(实现相关)的边界或粒度问题

团队架构师与开发人员间的职责边界

判断架构边界的前提之一是:明确架构和设计的关系!

所有的架构都是设计,但设计不一定是架构!

从架构的定义看架构设计的边界,选取两个视角:

架构是系统中重要的东西!无论它是什么(之所以重要,是因为改变的成本高)

架构设计涵盖系统中重要的架构决策

所以,架构设计应该涵盖系统中重要的东西,这些 “重要的东西” 可能是:

应用架构风格的选择

子系统间信息通信的方式

工程采取的分层以及层间约束

工程应该遵循的开发规范

工程引入的三方类库,或者三方框架

高优先级的架构属性:比如某次需求建设非常关注系统的性能,或者扩展性等架构属性

•其它 "重要的东西"

架构设计涵盖了系统所需的重要的架构决策,从宏观层面对系统实现予以指引。而详细的设计则为具体的开发实现提供指导,比如,详细的E-R图设计、具体的代码级别的模式选择、某个组件的具体实现等等。

架构不是一成不变,需要持续演进,而实现相关的设计也可能在项目进行中持续变化,因此,二者不能完全割裂,而是需要在实现过程中进行双向反馈

•架构设计信息要高效的同步至开发人员

•实现过程中的变更同样也要回向反馈至架构,以便对架构设计进行调整



京东云开发者|探寻软件架构的本质,到底什么是架构?



在进行架构边界判定时要注意一个至关重要的因子:上下文!!!以上的判断准则必须要给定的上下文中才有价值。

比如:实现过程中大家经常会适用一些设计模式,例如策略模式。那么,这种设计模式的选择是属于架构设计还是详细的实现设计?答案就是:It depends!!! 具体情况,具体分析



京东云开发者|探寻软件架构的本质,到底什么是架构?



如果当前上下文,我们非常关注系统的扩展性,该架构属性是我们高优先级的架构属性,那么,核心模块的策略模式的应用可以看作是架构设计的范畴。而如果上下文中扩展性不是我们关注的高优先级的架构属性,相比我们更关注性能,那么,这种代码级的设计模式选择应该属于架构设计的范畴之外了,而需要划分到实现设计层面,交由核心开发自主决定。

3 架构模式(Patterns)与架构风格(Styles)

架构模式架构风格是极容易混淆的两个概念,很多开发人员将其理解为同一事物,而实际上二者有本质区别。

•架构风格是系统设计的顶层抽象,从宏观视角表述我们的系统组成。更进一步,架构风格聚焦于系统的分层、模块以及交互形式。

•架构模式聚焦于对重复出现问题提供解决方案

二者概念不同,并不存在冲突,其联系如下图所示:

架构模式可以应用于架构风格,在同一架构风格上下文内可以应用一或多种架构模式

•架构风格可以组合以产生新的架构风格



京东云开发者|探寻软件架构的本质,到底什么是架构?



比较典型的例子是CQRS:CQRS本身是一种模式,将命令和查询的职责在不同维度进行分离。该模式我们可以在单体架构风格中使用,也可以在微服务架构风格中使用,当然也可以在SOA架构风格中使用。



京东云开发者|探寻软件架构的本质,到底什么是架构?



4 为什么要做架构设计 ?

至于 “为什么要做架构设计” 也是一个古老且频繁出现的问题,有太多的文章阐述为社么要架构设计:有的宏观,有的具体,有的“务实”,有的“务虚”。我把这个问题作为一个独立章节阐述,并不是想进行大篇幅的论述,只是想突出它的重要性,这个问题值得耗费一些精力去深入理解其背后的原因。但,在此不做展开过多说明,通过一句话来进行概括:

之所以要进行架构设计,是因为:重要 !

•做,收益高

•不做,成本高

5 开发人员和架构师的知识模型

作为开发人员,更加关注知识的深度,以便有足够的知识储备满足工作需要。开发人员在职业生涯的早期,应该关注于自身知识储备的增长,并保持技术深度。



京东云开发者|探寻软件架构的本质,到底什么是架构?



作为架构师,之所以技术的广度比深度更重要,是因为架构师的重要职责之一是进行架构决策。系统架构设计是关于权衡的艺术,在特定的问题域上下文下,架构师需要在诸多可行的解决方案间进行权衡和决策,这也对其技术广度提出了要求。开发人员成长为架构师,应该更加关注知识的广度,并在几个特定领域深耕,以便有足够的知识支撑架构决策。



京东云开发者|探寻软件架构的本质,到底什么是架构?



虽然开发人员和架构师在知识域的关注点上存在差异,但在认知层面都可以统一到Bloom认知层次模型。该模型将认知层次划分为逐步递进的六个层次:

识记:识别和回溯事实性知识

理解:理解事实的内涵

应用:将事实、规则、概念、思想加以应用

分析:将信息分解、关联、区分、实验、测试

评估:将信息或思想的价值进行评价

创造:整合不同的信息形成新的知识体系



京东云开发者|探寻软件架构的本质,到底什么是架构?



不论是架构师还是开发人员,Bloom认知层次模型都适用。通过不断的学习扩展自身的知识体系,在识记、理解和应用的同时,要持续的培养分析、评估和创造的能力,逐步向高层次的认知水平提升。

但需要注意的是:知识不等于认知,避免陷入知识学习的陷阱。知识是无限的,没有人能够以有限的精力去学习无限的知识。不论是开发人员还是架构师,又或者其他角色,不应该只将精力投入在知识边界的扩充,而应该注重从知识到认知提升的转变。

吾生也有涯,而知也无涯。以有涯随无涯,殆矣!已而为知者,殆而已矣! ----《庄子》

格物以致知,对表象不断的归纳、演绎直至事物的本象,探寻事物背后的规律,建立更高层的认知。这种认知层次由下及上的跃升有两种方式:

:由内向外,通过不断积累、持续思考,由量变到质变,直至 “开悟”

:自外向内,高层次或不同的思想输入碰撞,加速认知层次的突破



京东云开发者|探寻软件架构的本质,到底什么是架构?





为学日益,为道日损。损之又损,以⾄于⽆为。⽆为⽽⽆不为。 --《道德经》

6 结语

对架构定义的探讨实际上是一种朴素的 “格物” 的过程,每个人都应该寻找自己的答案。跳脱对架构定义探讨的视野,大家的工作和学习何尝不是如此呢 ?!大道至简,殊途同归,格物致知,与君共勉!

作者:倪新明

点赞
收藏
评论区
推荐文章
Stella981 Stella981
1年前
RabbitMQ 和 Kafka 的区别?
作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因,许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力
Stella981 Stella981
1年前
CentOS 7.6 源码安装搭建LNMP架构(Nginx、MYSQL、PHP)
LNMP架构LNMP是什么搭建环境搭建准备LNMP软件包搭建nginx搭建mysql数据库搭建php搭建Discuz!论坛LNMP是什么LNMP:Linux系统下NginxMySQLPHP这种网站服务器架构。Nginx是一个高性能的HTTP和
Stella981 Stella981
1年前
Modelsim和Quartus II联合使用
写在前面的话在这里梦翼师兄想特地强调一下Modelsim这个软件,那么这个软件到底是做什么的呢?在这里,我问大家一个问题,假设我们有一块硬件电路板设计完成以后,不知道功能是否正常,那么我们需要怎么做呢?答案很简单的啦,就是我们所谓的“测试”,给电路板上电以后,输入一定的测试激励,观察电路板有什么样的结果输出,如果输出结果和输入激励的对应关系是
Stella981 Stella981
1年前
Serverless架构:有明云PaaS
  今天大多数公司无论是在开发应用程序的时候还是将其部署到服务器的时候,无论是选择公有云还是私有云,都需要提前估算究竟需要多少台服务器,都需要部署运行应用程序和依赖的各种各样的软件到服务器上。如果我们不想在这些与业务无关的繁琐的细节上耗费精力,是否有一种简单的架构能够满足我们的需求呢?答案是Serverless(无服务器)架构。  Serverl
Wesley13 Wesley13
1年前
SOA面向服务的分布式架构详解
导语:SOA作为一种面向服务的架构,是一种软件架构设计的模型和方法论。从业务角度来看,一切以最大化“服务”的价值为出发点,SOA利用企业现有的各种软件体系,重新整合并构建起一套新的软件架构。这套软件架构能够随着业务的变化,随时灵活地结合现有服务,组成新软件,共同服务于整个企业的业务体系。简单的理解,我们可以把SOA看作是模块化的组件,每个模块都可以实现独立功
AWS认证解决方案架构师证书有效期是多久?aws认证架构师考什么?
随着云计算的出现,有许多平台考试为学员提供认证服务,而要想顺利拿到aws证书,需要找一家专业的认证平台。那么AWS认证解决方案架构师证书有效期是多久?aws认证架构师考什么?小编给大家讲一下!一、什么是架构师?是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员。主要着眼于系统的“技术实现”。因此他/她应
Wesley13 Wesley13
1年前
5 年前的 Dubbo,2 年前的 Spring Cloud,都输给了这个架构!
每年的QCon全球软件开发大会和ArchSummit全球架构师峰会,世界各地优秀的技术大佬们,在台上分享自己负责开发的项目,卓越的架构思想,引领着整个行业前进。作为一名开发工程师,及时掌握这些先进的方案和理念,对自己的成长是非常重要的,尤其是想要成为架构师的开发人员,如果仅仅是技术好,显然是做不了架构师的。曾有这样一位大厂的高级工程师去参加面试,
Wesley13 Wesley13
1年前
InfoQ 趋势报告:架构和设计领域技术演变详解
https://www.infoq.cn/article/R7lWXd0R4VFf3E0bB\38本文概述了我们对当前“架构和设计”领域的看法,这个领域侧重于基础设施模式、技术框架模式的实现,以及软件架构师必须掌握的设计流程和技能。关键要点:我们看到了“演化式架构”设计需求的增长,这种架构建立在可替换性设计和关注“胶水”
京东云开发者 京东云开发者
4个月前
一键开启云原生网络安全新视界
本文作者:陈桐乐李卓嘉随着云原生的兴起,微服务、容器、kubernetes容器编排正在快速改变着企业软件架构的形态,单体架构、分布式架构、微服务架构,软件架构在持续演进的过程中,变得越来越复杂,管理和维护也越来越困难,不断出现的安全漏洞也在持续挑
京东云开发者 京东云开发者
1星期前
ArchKeeper (开篇):架构守护平台的问题与理念
在敏捷开发环境下,系统通过迭代增量的交付价值,系统架构也是如此。团队不可能在项目之初就建立完美的系统架构,系统架构应该随着系统迭代不断演进。架构演进和架构腐化是看待架构的不同视角:架构腐化着眼于现状,架构演进侧重于未来架构腐化不可避免,随着时间流转腐化现象必然发生。而我们需要做的是:通过某种方式及早发现和修正