架构基础(一)——理解架构

极客时间从0开始学架构学习笔记

架构是什么

首先,先梳理一下和架构关系密切的一些概念

系统

定义:系统是一群有关联的个体组成,根据某种规则运作,能完成个体不能单独完成的工作的群体。

特征

  • 个体之间有关联

  • 规则运作

  • 个体和系统能力上的差异

举例

  • 团队也是一个系统

  • 家庭也是一个系统

  • XX管理平台

组件&模块

定义:组件和模块都是系统的组成部分

区别:

  • 组件是物理拆分

  • 模块是逻辑拆分

  • 独立性:组件»模块

以学生管理系统举例:

  • 模块拆分:登录模块、注册模块、信息管理模块

  • 组件拆分:nginx、web服务器、Mysql数据库

架构&框架

思考:

  1. 引入XX牛逼架构是为了什么?

系统可用性、性能、拓展性

  1. 引入XX框架是为了什么?

统一、开发效率

区别:

  • 架构关注系统结构

  • 框架关注系统规范

架构诞生历史

机器语言(1940年之前)

程序员面向0和1去写代码,难以想象中途一个0或者1写错了该如何Debug

汇编(20世纪40年代)

相比于机器语言,汇编语言使用助词符替代了机器的0、1操作码。虽然解决了阅读问题,但是本质上还是面向机器编程,而且对于不同的CPU需要写不同的汇编代码。

高级语言(20世纪50年代)

高级语言使得程序员可以不关注底层机器的结构和逻辑,只需要关注上层的业务逻辑。不需要考虑底层CPU的指令集差异。

第一次软件危机(20 世纪 60 年代~20 世纪 70 年代)

高级语言解放了程序员,但随着软件的规模和复杂度的不断增加,出现了第一次软件危机。具体表现为:

  • 质量低下

  • 软件项目无法按计划完成

  • 软件成本超支

这个时候出现了结构化程序设计方法,特点是抛弃 goto 语句,采取“自顶向下、逐步细化、模块化”的指导思想进行软件设计。

第二次软件危机(20 世纪 80 年代)

结构化编程缓解了软件危机,然而随着硬件的快速发展,业务需求越来越复杂,以及编程应用领域越来越广泛,第二次软件危机很快就到来了。这一次危机的根本原因是软件的发展速度跟不上硬件。软件的扩展能力弱。

这个时候面向对象思想开始流行。

软件架构

随着软件系统规模的增加,计算相关的算法和数据结构不再构成主要的设计问题;当系统由许多部分组成时,整个系统的组织,也就是所说的“软件架构”,导致了一系列新的设计问题——An Introduction to Software Architecture,Mary Shaw,David Garlan

在20 世纪 90 年代, Rational 和 Microsoft 内部的相关活动,软件架构的概念才开始越来越流行起来。

大公司开发的软件系统才具备较大规模,而只有规模较大的软件系统才会面临软件架构相关的问题

  • 系统规模庞大,内部耦合严重,开发效率低;

  • 系统耦合严重,牵一发动全身,后续修改和扩展困难;

  • 系统逻辑复杂,容易出问题,出问题后很难排查和修复。

架构目的

误区

  1. 每个系统都要做架构设计

一个基本没有复杂度、一两个人用的CURD系统谈不上架构设计

  1. 公司流程要求系统开发过程中必须有架构设计

  2. 为了高性能、高可用、可扩展,所以要做架构设计

一个实错系统,实际上可能就不需要高性能、高可用和可拓展性。

真正目的

架构是来解决软件系统复杂度带来的问题,围绕复杂度来解决问题。不要为了追求牛逼的技术而忽视现状。

这么多需求,从哪里开始下手进行架构设计呢?

识别需求的复杂度,针对这些复杂度有针对性的进行架构设计

我们的系统一定要做到每秒 TPS 10 万

我们真的需要TPS10万吗?高性能真的是我们的问题吗?

参考