zenith-docs 1.0.0 Help

软件架构

这篇文档描述了什么是架构、架构的分类、什么是软件架构师、什么是架构设计。让我们对架构有一个清晰的认识。

架构的定义

什么是架构呢?根据 IEEE 的定义:

什么是系统呢?系统是一系列的组件的集合。什么是组件呢?是一系列功能的封装体。所以从本质上来说,组件、模块、子系统、系统都是一样的,本质上都是功能的集合。只是粒度不同,组件 < 模块 < 子系统 < 系统。

什么是环境?环境或者上下文,指的是会对这个系统的开发、运行等造成影响的环境和设置。实际上就是提供了开发、运行这个系统所必要的软硬件环境。从更宽泛的角度而言,也包括商业环境、政策法规环境、市场环境等。

所以,总结起来,有以下几点:

  • 架构定义了系统结构 :尤其是高层结构,它并不关心具体的实现,而聚焦于粗略、概要、抽象的结构设计。

  • 架构定义了行为 :比如说组件之间的交互、关系,这些关系包括依赖关系、扩展关系等。

  • 架构关注系统的主要元素 :比如说用户关注的重点、难点、有特色、有亮点的功能,影响到高性能、高可用等质量元素。

  • 架构要平衡系统利益相关者的需要 :就是对这个系统感兴趣、有利益关系的人活着团队,所有和系统有关系的人,并不一定是使用这个系统的人。

  • 架构需要基于合理的证据决策具体化 :什么是合理的证据,比如说基于已经成功的竞品,证明是可行的、或者是之前的经验、或者是小范围的测试,而不是,基于自己的想象。

  • 架构会受到环境的影响 :比如说软硬件环境、商业环境、政策法规环境以及市场环境等。

  • 架构会影响到开发团队的结构 :比如说我要开发一个微服务架构,那么团队也需要按照微服务架构要求组织。

架构的分类

和架构的定义一样,业内并没有对架构的分类有着统一的标准。架构的分类有着不同的划分维度,比如说按照实现层次划分、按照软工阶段划分、按照视图类型划分、按照关注方向划分、按照技术实现风格划分等等......当中还有一些可能是重叠的。

software-architecture-categories

什么是架构设计

软件架构设计指的是对一个软件系统进行的架构定义、文档编写、维护和改进、并验证实现的一系列活动,架构设计的产物就是一个系统的架构。

所以架构设计本质上是一个围绕着软件的整个生命周期展开的过程,比如说架构定义、文档编写、改进维护(迭代演化)以及验证实现等。也是这一系列活动的组合,这些活动最后会产生系统的架构。

架构设计是一门尚不成熟的科学 ,目前它有着各种各样的方法论、处在一个探索的阶段,是不成熟的。从科学上说,它关注的是实现技术、实现流程、资源分配调度、实现方法、架构的完善和改进等。

架构设计也是一门艺术 ,需要一定的创造力。因为问题层出不穷,当已有的技术、方法不足以应对的时候,需要发挥创造力去创造新的技术、新的方法。或是在已有的架构设计技术上进行微调、组合、扩展。

架构设计是一系列的活动,是一个不断演化和完善的过程 。它涵盖了软件工程的全部生命周期,从软件的立项、到软件的设计、开发、运行、迭代都是要全程参与的。

架构设计需要不断决策、不断去平衡,是一种平衡的艺术 。比如说需要平衡性能和成本。比如说方案和时间的平衡,你要考虑的时间越长、成本以及复杂度会越大。比如说技术方案和当前开发人员水平的平衡。

架构设计是利益相关者的共识 。架构设计需要平衡所有利益相关者的需求利益,所以需要所有的利益相关者达成最后的共识,而不是只关注部分利益相关者。

架构设计承认经验的复用 。架构设计不会从零开始设计,从前的经验、开源的框架技术、好的设计模式、其他公司的经验都可以拿来复用,而不是自己从头开始设计、造轮子。

什么是功能设计

功能设计指的是针对架构设计后要具体实现的每一个部分所进行的设计,包含设计这部分实现的整体结构、划分子模块、确定每个模块的实现算法、对外提供的接口等,从而形成的具体实现的设计方案。

功能设计和架构设计是互补的关系,架构设计关注的是高层和整体,而功能设计更关注实现和落地。可以类比成,架构设计是骨骼,而功能设计是肉。

功能设计要考虑其粒度,大到可以是一个系统、小到可以是一个具体功能的设计。由于具体的功能多种多样,因此进行好的功能设计,需要较强的设计技巧和设计能力。

什么是架构师

一般来说,架构师都是由比较优秀的工程师成长而来的,换句话说架构师本身也应该是一个优秀的工程师。但是工程师和架构师的差异有哪些呢?

Cx xbz kh u9p k29gnheg vu

架构师只是是负责系统架构设计的人、团队和组织。

架构师也是技术领导,领导并负责架构设计,并根据架构设计做出决策。架构师也必须掌握足够的技术知识和架构设计技能,他还需要具备很好的编程能力,实际参与架构原型的设计和开发,并参与到一些基础、重要、复杂、通用功能的实现。架构师还需要深入理解业务以及业务领域知识,让架构更好支持业务目标。架构师应该具备良好的沟通能力,讲解架构、指导开发、协调冲突等。他还必须了解软件的开发全流程,为项目开发全流程提供必要的支持。

作为一名架构师,需要具备领导能力、管理能力、技术能力、设计能力、领域知识和业务能力、沟通能力。业务能力和技术能力是最基本和最核心的能力,决定了我们可以做出符合要求的系统。领导能力和管理能力,可以让做的过程正确、高效。

Architect's skills

架构师、架构设计以及架构之间的关系如下:

T d6nml3m60huq wc9v5oe

软件架构的核心思想

我觉得架构的核心思想,就是分而治之(Divide and Conquer)这一个古老的策略思想。其体现在下面这些维度:

  • 封装 :通过将复杂性隐藏在模块或组件的内部,只暴露简单的接口给外部使用,实现了问题的简化和隔离。

  • 隔离 :通过物理或逻辑上分隔系统的不同部分,确保系统的某一部分变化不会直接影响到其他部分,从而将复杂问题划分为更小、更易管理的片段。

  • 从内向外 :首先关注系统的核心功能,然后逐步扩展到边缘功能,这样可以确保在解决最关键的问题的同时,逐步探索并解决周边的问题。

  • 从大到小从粗到细 :这涉及到先设计系统的高层结构,然后再逐步细化到具体的实现,这种方法允许开发者先解决大问题,再逐步攻克小问题。

  • 从抽象到具体 :通过定义广泛的概念和模型来概括问题,然后逐步细化到具体的实现细节,帮助开发者保持对问题的全局视角,同时逐步深入到问题的具体层面。

  • 划分小的任务批次进行迭代 :通过将大任务划分为多个小任务,并采用迭代的方法逐步完成,可以使得问题的解决过程更加灵活和可控。

架构的目的

作为架构师,需要了解我们的需求,需要了解行业、竞争对手的产品,然后进行对比,取百家所长形成符合自己内部需求和用户需求的架构。 架构师不是设计完了就完了的,要追踪整个产品线,贯穿整个软件开发流程。需要不断完善,不断做决策,及时响应变化。

和产品沟通,了解需求。设计架构,指导开发。将大块的业务,分割成很多小块。分割完成之后,要设计如何交互 。然后是如何决策,如何演进。

总结

首先介绍了架构的定义,根据IEEE的定义,架构描述了一个系统的基本组织结构,包括系统的组件、组件间关系、组件与环境的关系,以及指导设计和演化的原则。系统被定义为一系列组件的集合,而组件则是功能的封装体。环境指的是对系统开发、运行等产生影响的环境和设置,包括软硬件环境、商业环境、政策法规环境等。

总结架构的特点有:

  1. 架构定义了系统的结构,关注于高层次的、抽象的结构设计。

  2. 架构定义了系统的行为,包括组件之间的交互和关系。

  3. 架构关注系统的主要元素,即用户关注的重点、难点和有特色的功能。

  4. 架构要平衡系统利益相关者的需求,包括对系统感兴趣的人和团队。

  5. 架构需要基于合理的证据做决策,而非基于主观想象。

  6. 架构受到环境的影响,包括软硬件环境、商业环境、政策法规环境和市场环境等。

  7. 架构会影响到开发团队的结构,例如,采用微服务架构需要相应的团队组织。

接着,介绍了架构的分类。架构的分类没有统一的标准,可以按照实现层次、软工阶段、视图类型、关注方向和技术实现风格等划分。举例包括移动架构、前端架构、系统架构、应用架构、技术架构、数据库架构等多种分类方式。

随后解释了架构设计的概念。架构设计是对软件系统进行架构定义、文档编写、维护和改进、验证实现等一系列活动的过程。架构设计是一门既不成熟的科学又是一门艺术,需要关注实现技术、流程、资源分配、调度、创造力等方面。它是软件工程生命周期的一个组成部分,需要不断演化和完善,涉及整个项目的立项、设计、开发、运行和迭代。

进一步介绍了功能设计,它是架构设计的补充,关注具体实现的每一部分的设计,包括整体结构、子模块划分、实现算法和对外接口等。功能设计和架构设计相辅相成,类比为架构设计是骨骼,功能设计是肉。

最后讨论了架构师的角色。架构师是负责系统架构设计的人、团队和组织,同时也是技术领导。他们需要掌握技术知识和架构设计技能,具备编程能力,深入理解业务和业务领域知识,拥有沟通、领导、管理等多方面的能力。架构师的工作包括参与架构设计、决策制定、支持项目的全流程,并平衡各方需求,承认经验的复用。

Last modified: 05 August 2024