什么是架构,架构的本质是什么

2023-11-19

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

一、什么是软件架构

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

正所谓,“道可道,非常道。名可名,非常名”。这也是行业内不同的组织和个人从不同的视角对 “什么是架构” 的定义或阐述。

下面是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

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

  • 系统的组织:表达系统的宏观结构
  • 组件及联系:组件化的思维,同时突出了环境要素。组件表达了系统的模块化,组件相互之间及组件与环境之间的关联表达元素间的相互作用。
  • 原则:用于指导设计和系统演进的原则

image.png

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

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

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

  • 结构:应用系统所选择的架构风格,比如微服务架构、单体架构还是SOA等
  • 架构属性:系统的非功能性属性,比如性能、可用性、可维护性等
  • 架构决策:系统设计过程中重要的架构决策
  • 设计原则:设计过程中的指导性原则

image.png

结构

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

架构属性

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

image.png

架构决策

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

  • 直接影响高优先级的架构属性
  • 修改对外接口:对外提供的接口修改往往需要进行充分影响分析
  • 引入或者移除依赖:依赖的加入和移除往往标示着组件能力的引进和废弃
  • 改变系统的通用结构:工程结构是应用架构的重要维度之一
  • 迫使研发人员改变开发方式
  • 接受战略性技术债:重构影响较大的技术债往往对现有系统会有较大影响

设计原则

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

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

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

  • IEEE定义更加结构化和规范化
  • Martin Fowler的定义侧重架构决策的重要性
  • Ralph Johnson 则更加泛化,突出 “重要” 这一核心因子
  • Neil Ford则更具象化

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

二、架构设计的边界

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

  • 系统的架构应该设计到什么粒度?
  • 架构设计是否要足够详细以便能直接指导开发人员开展编码工作?

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

  • “架构设计” 太过详细,涵盖了实现的 “细枝末节”,自己除了CRUD没有发挥的空间。
  • “架构设计” 太过宏观,基于设计方案根本无法指导开发,自己还得重新设计。

image.png

事实上,很多架构师自身对架构和设计的边界缺乏深入认知,相比于对架构边界的缩小,更多时候会出现架构设计边界放大的情况:架构师把架构设计当作详细的技术方案设计,牢牢把控系统实现的所有细节,产出大量的设计文档,然后交由核心开发人员做代码实现的执行工作

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

  • 压缩了团队核心开发人员的设计发挥空间,不利于其技术水平及认知的提升
  • 作为架构师你真的能讲所有的细节都Cover住吗?即使耗费巨大精力完成了 “完备” 的设计,来自一线开发所面临的各种场景是否能够提前预知和捕获?
  • 如果需求迭代持续如此,作为核心开发人员多半会有所 “怨言”
  • 作为团队的架构师精力有限,持续的细节输出会耗费巨大精力,而无法关注更加宏观的层面

以上问题的根源是什么?不能明确架构设计的边界!那如何解决这一问题呢?明确架构和设计的关系!

所有的架构都是设计,但设计不一定是架构!从架构的定义看架构设计的边界,选取两个视角:

  • 架构是系统中重要的东西,无论它是什么(之所以重要,是因为改变的成本高)
  • 架构设计涵盖系统中重要的架构决策

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

  • 应用架构风格的选择
  • 子系统间信息通信的方式
  • 工程采取的分层以及层间约束
  • 工程应该遵循的开发规范
  • 工程引入的三方类库,或者三方框架
  • 高优先级的架构属性:比如某次需求建设非常关注系统的性能,或者扩展性等架构属性
  • 其它 “重要的东西”

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

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

  • 架构设计信息要高效的同步至开发人员
  • 实现过程中的变更同样也要回向反馈至架构,以便对架构设计进行调整

image.png

在进行架构边界判定时要注意一个至关重要的因子:上下文!!!以上的判断准则必须要给定的上下文中才有价值。比如:实现过程中大家经常会适用一些设计模式,例如策略模式。那么,这种设计模式的选择是属于架构设计还是详细的实现设计?答案就是:It depends!!! 具体情况,具体分析。

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

三、架构模式与架构风格

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

  • 架构风格是系统设计的顶层抽象,从宏观视角表述我们的系统组成。更进一步,架构风格聚焦于系统的分层、模块以及交互形式。
  • 架构模式聚焦于对重复出现问题提供解决方案

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

  • 架构模式可以应用于架构风格,在同一架构风格上下文内可以应用一或多种架构模式
  • 架构风格可以组合以产生新的架构风格

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

image.png

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

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

image.png

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

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

  • 识记:识别和回溯事实性知识
  • 理解:理解事实的内涵
  • 应用:将事实、规则、概念、思想加以应用
  • 分析:将信息分解、关联、区分、实验、测试
  • 评估:将信息或思想的价值进行评价
  • 创造:整合不同的信息形成新的知识体系

image.png
不论是架构师还是开发人员,Bloom认知层次模型都适用。通过不断的学习扩展自身的知识体系,在识记、理解和应用的同时,要持续的培养分析、评估和创造的能力,逐步向高层次的认知水平提升。但需要注意的是:知识不等于认知,避免陷入知识学习的陷阱。知识是无限的,没有人能够以有限的精力去学习无限的知识。不论是开发人员还是架构师,又或者其他角色,不应该只将精力投入在知识边界的扩充,而应该注重从知识到认知提升的转变。

正如圣人庄子所说:吾生也有涯,而知也无涯。以有涯随无涯,殆矣!已而为知者,殆而已矣!

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

  • 悟:由内向外,通过不断积累、持续思考,由量变到质变,直至 “开悟”
  • 破:自外向内,高层次或不同的思想输入碰撞,加速认知层次的突破

image.png

五、结语

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是架构,架构的本质是什么 的相关文章

  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • 数据仓库进阶 《阿里大数据之路》第二篇 数据模型篇 (完整版)

    第8章 大数据领域建模综述 此文章为学习笔记 有兴趣的小伙伴可以根据以下指引获取更多 学习内容链接如下 视频 一起啃书 阿里大数据之路数据仓库建模基础理论研读 已完结 哔哩哔哩 bilibili 书籍 阿里大数据之路 8 1 为什么需要数据
  • 微服务项目之项目简介

    目录 项目模式 技术栈 项目架构图 模块 主模块 项目模式 电商模式 市面上有5种常见的电商模式 B2B B2C C2B C2C O2O 1 B2B模式 B2B Business to Business 是指 商家与商家建立的商业关系 如
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • 如果老板要求你的系统接入春晚大流量活动,你会心慌慌吗?

    目录 回头看看 原始系统技术架构 基于CDN的活动静态页面缓存方案 基于Nginx Tomcat Redis的多级缓存方案 超高并发写请求RocketMQ削峰填谷方案 系统限流防雪崩体系架构方案 今天给大家分享一个话题 就是如果要是你老板突
  • 企业架构LNMP学习笔记29

    Nginx负载均衡配置 架构分析 1 用户访问请求Nginx负载均衡服务器 2 Nginx负载均衡服务器再分发请求到Web服务器 实际配置负载均衡 只需修改作为负载均衡服务器的Nginx即可 当前架构中的server04 在客户端解析域名到
  • 系统架构设计师-计算机网络

    目录 一 计算机网络技术概述 1 网络概述 2 网络有关指标 3 网络分类 4 5G技术 二 组网技术 1 交换技术 2 基本交换原理 三 TCP IP协议簇 1 DHCP 2 DNS 四 网络规划与设计 一 计算机网络技术概述 1 网络概
  • 【微服务架构设计】微服务不是魔术:处理超时

    微服务很重要 它们可以为我们的架构和团队带来一些相当大的胜利 但微服务也有很多成本 随着微服务 无服务器和其他分布式系统架构在行业中变得更加普遍 我们将它们的问题和解决它们的策略内化是至关重要的 在本文中 我们将研究网络边界可能引入的许多棘
  • 4大主流CPU处理器技术架构

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 导读 RISC 精简指令集计算机 是一种执行较少类型计算机指令的微处理器 起源于80年代的MI
  • 分布式系统详解--基础知识(通信)

    分布式系统详解 基础知识 通信 上一篇文章我们写到了 分布式系统详解 基础知识 线程 简单了解了一下线程的基本概念和线程和分布式的那斩不断理还乱的关系 今天再讲解一下它的另外一个必备知识 通信 进程之间进行通信是分布式的核心 失去了通信 也
  • 单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?

    本文是回答一位知友的提问 单个 epoll 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景 不少教程上都提到线程池适合大量的网络短连接的任务场景 但我总感觉这个优势有点站不住脚 单 epoll 线程池模型 主要考虑到
  • 【CPU 架构】x86、x86_64、x64、arm64、aarch64

    x86 x86 64 x64 arm64 aarch64 1 服务器分类 2 CPU 架构 2 1 x86 架构 x86 x86 64 x64 2 2 arm 架构 arm64 和 aarch64 3 发展历史 1 服务器分类 按照 CPU
  • 微服务测试是什么?

    微服务测试是一种特殊的 测试类型 因为它涉及到多个独立的服务 以下是进行微服务测试的一般性步骤 1 确定系统架构 了解微服务架构对成功测试至关重要 确定每个微服务的职责 接口 依赖项和通信方式 了解这些信息可以帮助您更好地规划测试用例和测试
  • 双非本科进不了大厂?阿里技术四面+交叉面+HR面,成功拿到offer

    前言 前两天 我收到了阿里巴巴的实习offer 从学长内推开始面试到拿到最后offer经历了4面技术 一面交叉面和一面HR面 经过了漫长的等待和几次几乎折磨的面试之后 终于拿到了实习offer 自我介绍 本人来自西南某双非本科学校 该校学的
  • 《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-07-系统性能

    文章目录 1 性能指标 1 1 计算机的性能指标 1 2 路由器的性能指标 了解即可 1 3 交换机的性能指标 了解即可 1 4 网络的性能指标 1 5 操作系统的性能指标 1 6 数据库管理系统的性能指标
  • 什么是微服务

    微服务是一种架构风格 它把一个大型的复杂软件应用划分为一系列小的服务 每个服务都具有单一的功能 运行在其自己的进程中 并通常基于不同的编程语言和框架 这些服务之间通过轻量级通信机制相互通信 这种通信机制基于HTTP协议 微服务架构风格使得系
  • 专车数据层架构进化往事:好的架构是进化来的,不是设计来的

    很多年前 读了 子柳 老师的 淘宝技术这十年 这本书成为了我的架构启蒙书 书中的一句话像种子一样深埋在我的脑海里 好的架构是进化来的 不是设计来的 2015 年 我加入神州专车订单研发团队 亲历了专车数据层 架构进化 的过程 这次工作经历对
  • 阿里技术官亲笔力作:Kafka限量笔记,一本书助你掌握Kafka的精髓

    前言 分布式 堪称程序员江湖中的一把利器 无论面试还是职场 皆是不可或缺的技能 而Kafka 这款分布式发布订阅消息队列的璀璨明珠 其魅力之强大 无与伦比 对于Kafka的奥秘 我们仍需继续探索 要论对Kafka的熟悉程度 恐怕阿里的大佬们
  • [机缘参悟-131] :《洞见》:为什么佛学是真的 -2-从进化心理学了解佛家的三毒“贪嗔痴”的进化机制

    目录 一 佛家的三毒 贪嗔痴 二 进化心理学对贪嗔痴的解释 2 1 贪欲 2 1 1 贪欲的满足与快乐的本质 2 1 2 贪欲得不到满足与痛苦的本质 2 2 恶意和愤怒 2 3 愚痴和无知 2 3 1 大众对痴的解释 2 3 2 佛对痴的解
  • [机缘参悟-132] :《洞见》:为什么佛学是真的 -3- 冥想,洞见自己的内心

    目录 一 佛家修行的方法 二 冥想 2 1 冥想步骤 2 2 冥想的好处 2 3 冥想的方法 一 佛家修行的方法 佛教修行是指追求智慧 慈悲和解脱 以最终实现觉悟和解脱的过程 它包含了广泛的修行方法 以下是一些常见的佛教修行方法 冥想 冥想

随机推荐

  • Qt4----子例化QDialog(可扩展对话框的使用)

    1 linux下安装Qt4请参考如下博文 Qt4在linux下的安装 2 Qt4工程的创建请参考如下博文 Qt4创建工程的几种方法 linux系统 3 可扩展对话框 通过纯代码的形式 建立工程 点击 Detail 按钮 显示扩展对话框 包括
  • 再见,百度网盘!新 60MB/s!

    点击上方卡片 关注回复 青春网盘 即可获得下载链接 近些年 大家苦百度网盘久矣 非会员的限速导致下载速度大多停留再KB为单位 这个问题一直被人吐槽 有关部门规定网盘不许无底线限速 因此百度给出的整改措施是 推出百度网盘青春版 免费用户将享受
  • 【问答21】C语言:位域和字节序

    1 粉丝问题 自己编写的一个协议相关代码 位域的值解析和自己想象的有出入 结构体的头 解析代码和测试结果 就是说通过函数hexdump 解析出的内存是十六进制是 81 83 20 3B 从数据帧解析出的 opcode 0x8 该粉丝不明白为
  • SMB/CIFS--NetBOIS/Browser/NBNS 协议

    在NetBIOS出现之后 Microsoft就使用NetBIOS实现了 一个网络文件 打印服务系统 这个系统基于NetBIOS设定了一套文件共享协议 Microsoft称之为SMB Server Message Block 协议 这个协议被
  • Windows下编译FFmpeg详解

    Windows下编译FFmpeg 2 6 1详解 在诸多网友帮助下终于搞定了FFmpeg V2 6 1 由于编译环境和程序版本的不同 造成了很多不必要的时间浪费 特在此将编译过程和遇到的问题解决方法写出来 以便方便大家 编译环境 PC Wi
  • 文件操作中出现system.notsupportedexception异常

    偶然的用了如下代码 string sourceDoc lt 文件全路径 gt bool isExists File Exists sourceDoc 此时isExists变量得到的值为false 仔细查看了变量sourceDoc的值 确定路
  • springBoot:方法上配置produces = {"application/json;charset=UTF-8"} 参数

    方法上有 produces application json charset UTF 8 去掉方法上面的 produces application json charset UTF 8 之后 定义了返回格式
  • Django笔记

    文章目录 Django笔记 1 Django项目 2 学习笔记 3 仅供参考 第一天 1 项目环境搭建 1 1 cmd 创建项目虚拟环境和指定Django版本 1 2 pycharm 创建项目 虚拟环境文件夹
  • 分析系统 - 使用Python爬虫

    在竞争激烈的市场环境中 了解和分析竞争对手的销售策略和市场表现对于企业的成功至关重要 本文将介绍如何利用Python爬虫建立低成本的销售竞争对手分析系统 探索其方法 工具和好处 并同时解决可能出现的问题 销售竞争对手分析的目标是获取有关竞争
  • asoc widget path route(audio_map)

    上一篇文章中 我们介绍了音频驱动中对基本控制单元的封装 kcontrol 利用kcontrol 我们可以完成对音频系统中的mixer mux 音量控制 音效控制 以及各种开关量的控制 通过对各种kcontrol的控制 使得音频硬件能够按照我
  • 6_线性表的相关操作

    文章目录 线性表的一些常用操作 线性表操作的实现 用C语言描述线性表 小结 线性表的一些常用操作 创建线性表 销毁线性表 清空线性表 将元素插入线性表 将元素从线性表中删除 获取线性表中某个位置的元素 获取线性表的长度 线性表操作的实现 线
  • Ubuntu系统安装Nvidia显卡驱动、Cuda、Cudnn、Pytorch、Tensorflow

    如果你的机器显卡是集成显卡 或者是老旧版本 那么不支持GPU加速 只能使用CPU版本的Pytorch Tensorflow 本文的前提是你有一块好的Nvidia显卡 1 如何查看电脑的显卡型号 在windows系统上 查看显卡型号的方法如下
  • 【数据结构】【王道408】——PPT截图与思维导图

    自用视频PPT截图 视频网址王道B站链接 23考研 408新增考点 并查集 红黑树 2023年408真题数据结构篇 408考纲解读 考纲变化 目录 第一章 绪论 第二章 线性表 顺序表 单链表 双链表 循环链表 静态链表 差别 第三章 栈
  • python大一考试知识点_Python复习知识点总结(针对校招

    正文 Python是门动态语言 运行时候采取检查数据类型 Python解释器 让其他程序运行起来的程序 Python解释器读取程序 按照其中的语句顺序执行 并得出结果 做了什么 解释器将语句翻译成一组字节码指令 pyc 字节码运行速度比源代
  • 图片撕纸效果处理

  • 自动化办公神器!用Python批量识别发票并录入到Excel表格!可以讨财务女神开心了!

    故事的开始 今天去财务拿上个月的工资条核对 发现女神一脸闷闷不乐 好像天要塌下来一样 我对完工资就问 女神 你咋不开心 不是马上就要发工资了嘛 女神说 老板刚给我派了个任务 让我把上个月这个月的发票都做一个Excel表格 今天下班前给他 这
  • windows10下编译boost1.74

    系列文章目录 文章目录 系列文章目录 前言 一 准备 二 编译步骤 前言 最近公司的项目中用到boost1 74 我机器上已经编译了boost1 79 为了配合项目无奈只有重新编译boost1 74 一 准备 1 visual studio
  • VMware镜像文件下载

    VMware镜像文件下载 http blog sina com cn s blog 517c21c00102x5ja html 貌似Centos 6不能下载啊 其他的没有测试
  • 12个真实项目实战带你玩转Java并发编程

    这篇博客 我会总结如下内容 满满的干货 篇幅可能会很长 做好心理准备 Immutable Object 不可变对象模式 在不引入锁的条件下 能保证访问共享变量时是线程安全的 缺点是会频繁的创建变量 Guarded Suspension 保护
  • 什么是架构,架构的本质是什么

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