当前位置: 首页 > news >正文

架构设计的历史背景

架构设计的历史背景

在探讨架构设计的历史背景时,了解软件开发进化的历史是一个重要的起点。了解软件开发的演变过程可以帮助我们更好地理解架构设计的起源和发展。现在,让我们来简要回顾一下软件开发的历史,并探索软件架构出现的背景。

首先,我们可以回顾软件开发的初期阶段。在计算机科学的早期,软件开发主要集中在低级编程语言和硬件相关的编程。当时的软件往往是简单的、单一的程序,由一小部分程序员编写和维护。这时期的软件开发没有明确的架构设计概念,主要关注功能实现和性能优化。

随着计算机科学的快速发展,软件变得越来越复杂,软件项目也越来越庞大。在1980年代,面向对象编程(Object-Oriented Programming, OOP)的概念逐渐被引入,这为软件开发带来了新的编程范式和架构设计思想。面向对象编程通过将程序组织成类和对象的集合,提供了更好的模块化和封装性,使得软件的复杂性得以管理。

随着软件项目的规模和复杂性的不断增加,出现了一些软件开发方法学和流程,如结构化编程、软件工程和面向对象分析与设计等。这些方法学强调了软件的模块化和组织结构,为软件架构设计奠定了基础。

1990年代,互联网的快速发展推动了软件开发的新变革。分布式计算和网络通信的需求使得分布式架构和服务导向架构(Service-Oriented Architecture, SOA)开始兴起。SOA强调了松耦合和可扩展性,将软件系统划分为独立的服务,通过网络进行通信和交互。

随着云计算和大数据技术的兴起,现代软件系统变得更加复杂和高度分布式。微服务架构(Microservices Architecture)成为了一种流行的架构设计模式,通过将软件系统划分为一系列小型、自治的服务,实现了更好的可伸缩性和灵活性。

此外,近年来,前端技术和移动应用的迅速发展也对软件架构设计提出了新的挑战。前端架构如MVC(Model-View-Controller)和现代前端框架如React、Angular和Vue等,以及移动端架构如MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)等,都在架构设计中扮演了重要角色。

总的来说,软件架构的历史背景可以追溯到软件开发的初期阶段,经过了结构化编程、面向对象编程、分布式架构和服务导向架构等不断演化和发展的过程。现代软件架构设计强调了模块化、组织结构、松耦合、可伸缩性和灵活性等特性,以适应日益复杂和高度分布式的软件系统需求。

如果想要深入理解架构设计的本质,了解其历史背景和推动因素是非常有价值的。这可以帮助我们更好地理解架构设计的演变过程、背后的原理和思想,并在实际应用中更加灵活和合理地运用不同的架构设计模式和方法。

机器语言(1940年之前)

最早的软件开发使用的是“ 机器语言”,直接使用二进制码0和1来表示机器可以识别的指令和数据。例如,在8086机器上完成“s=768+12288-1280”的数学运算,机器码如下:

101100000000000000000011
000001010000000000110000
001011010000000000000101

不用多说,不管是当时的程序员,还是现在的程序员,第一眼看到这样一串东西时,肯定是一头雾水,因为这实在是太难看懂了,这还只是一行运算,如果要输出一个“hello world”,面对几十上百行这样的0/1串,眼睛都要花了!

看都没法看,更何况去写这样的程序,如果不小心哪个地方敲错了,将1敲成了0,例如:

101100000000000000000011
000001010000000000110000
001011000000000000000101

如果要找出这个程序中的错误,程序员的心里阴影面积有多大?

归纳一下,机器语言的主要问题是三难: 太难写、太难读、太难改

汇编语言(20世纪40年代)

为了解决机器语言编写、阅读、修改复杂的问题, 汇编语言 应运而生。汇编语言又叫“ 符号语言”,用助记符代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。

例如,为了完成“将寄存器BX的内容送到AX中”的简单操作,汇编语言和机器语言分别如下。

机器语言:1000100111011000
汇编语言:mov ax,bx

相比机器语言来说,汇编语言就清晰得多了。mov是操作,ax和bx是寄存器代号,mov ax,bx语句基本上就是“将寄存器BX的内容送到AX”的简化版的翻译,即使不懂汇编,单纯看到这样一串语言,至少也能明白大概意思。

汇编语言虽然解决了机器语言读写复杂的问题,但本质上还是 面向机器 的,因为写汇编语言需要我们精确了解计算机底层的知识。例如,CPU指令、寄存器、段地址等底层的细节。这对于程序员来说同样很复杂,因为程序员需要将现实世界中的问题和需求按照机器的逻辑进行翻译。例如,对于程序员来说,在现实世界中面对的问题是4 + 6 = ?。而要用汇编语言实现一个简单的加法运算,代码如下:

.section .data
  a: .int 10
  b: .int 20
  format: .asciz "%d\n"
.section .text
.global _start
_start:
  movl a, %edx
  addl b, %edx
  pushl %edx
  pushl $format
  call printf
  movl $0, (%esp)
  call exit

这还只是实现一个简单的加法运算所需要的汇编程序,可以想象一下,实现一个四则运算的程序会更加复杂,更不用说用汇编写一个操作系统了!

除了编写本身复杂,还有另外一个复杂的地方在于:不同CPU的汇编指令和结构是不同的。例如,Intel的CPU和Motorola的CPU指令不同,同样一个程序,为Intel的CPU写一次,还要为Motorola的CPU再写一次,而且指令完全不同。

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

为了解决汇编语言的限制和问题,计算机先驱们在20世纪50年代开始设计了多个高级语言,其中最早的几种高级语言包括Fortran、LISP和Cobol,并且这些语言至今在特定领域仍在广泛使用。

这些语言被称为“高级语言”的原因在于,它们提供了比汇编语言更高层次的抽象,使程序员不需要关注底层的机器结构和逻辑,而只需专注于解决具体的问题和业务逻辑。高级语言通过提供更加简洁、抽象和易读的语法和语义,使得编写和维护复杂软件变得更加高效和可靠。

Fortran(FORmula TRANslator)是一种面向科学和工程计算的高级语言,它的发明使得科学家和工程师能够更加方便地进行复杂计算和数据处理。

LISP(LISt Processor)是一种基于列表结构的编程语言,它在人工智能和符号计算等领域有着广泛的应用,被认为是最早的函数式编程语言之一。

Cobol(Common Business Oriented Language)是一种面向商业应用的高级语言,它主要用于处理商务和金融领域的数据和业务逻辑,被广泛用于企业级应用开发。

这些高级语言的出现使得程序员能够更加专注于解决具体的业务问题,而不需要关注底层的硬件细节,从而提高了软件开发的效率和可维护性。随着计算机技术的不断发展,高级语言也在不断演化和壮大,为现代软件开发提供了丰富的工具和方法。。

还是以4 + 6=?这个加法为例,如果用LISP语言实现,只需要简单一行代码即可:

(+ 4 6)

除此以外,通过编译程序的处理,高级语言可以被编译为适合不同CPU指令的机器语言。程序员只要写一次程序,就可以在多个不同的机器上编译运行,无须根据不同的机器指令重写整个程序。

第一次软件危机与结构化程序设计(20世纪60年代~20世纪70年代)

软件危机是指在软件开发过程中出现的一系列问题,包括软件质量低下、项目无法如期完成、项目超支等。随着软件规模和复杂度的增加,这些问题在20世纪60年代中期变得尤为突出。

为了解决软件危机,人们采取了多种方法。其中之一是软件工程,这是一种以工程化的方式来管理和组织软件开发的方法。软件工程强调对软件开发过程的规范化、标准化和管理化,包括需求分析、设计、编码、测试和维护等各个阶段的管理和控制,以提高软件的质量和可靠性。

另一种解决软件危机的方法是结构化程序设计,这是一种以“自顶向下、逐步细化、模块化”为指导思想的软件开发方法。结构化程序设计抛弃了过于复杂的控制流程,如goto语句,采用了更加清晰和模块化的程序设计方式,从而降低了软件开发的复杂度,并提高了软件的可读性和可维护性。

结构化程序设计在20世纪70年代成为了软件开发的潮流,为后来的软件开发方法和技术奠定了基础。这些解决软件危机的方法虽然并没有完全根除软件危机,但在一定程度上缓解了软件开发过程中的问题,并为后续的软件开发方法和技术的发展铺平了道路。

第二次软件危机与面向对象(20世纪80年代)

面向对象的思想主要包括了以下几个方面的概念和技术:

  1. 封装(Encapsulation):将数据和操作数据的方法封装在一起,形成类(Class),通过类来创建对象(Object)。封装可以隐藏内部的实现细节,使得代码更加模块化、可维护和可复用。
  2. 继承(Inheritance):通过继承关系,可以从已有的类派生出新的类,从而实现代码的复用。继承可以建立类之间的层次关系,通过继承可以重用现有的代码并扩展其功能。
  3. 多态(Polymorphism):不同的对象可以对同一个方法做出不同的响应。多态性使得程序更加灵活和可扩展,可以通过统一的接口来操作不同的对象。

面向对象的思想强调了将现实世界的问题抽象成对象和类的概念,通过对对象之间的交互和合作进行建模来解决问题。面向对象的方法具有以下优点:

  1. 模块化和可维护性:面向对象的方法将代码组织成模块化的类和对象,使得代码更加清晰、易于维护和扩展。
  2. 代码复用:通过继承和多态的特性,可以在不重复编写代码的情况下实现代码的复用,提高了开发效率。
  3. 灵活性和可扩展性:面向对象的方法提供了灵活性和可扩展性,可以通过继承、多态等特性来适应不断变化的业务需求。
  4. 团队协作:面向对象的方法可以提供清晰的接口和抽象,使得不同的团队成员可以并行开发和协作,提高了团队的协作效率。

然而,面向对象的方法也存在一些限制和局限性,例如:

  1. 学习曲线:面向对象的思想需要开发人员掌握类、对象、继承、多态等概念和技术,对于初学者来说可能需要一定的学习和适应时间。
  2. 性能开销:面向对象的方法可能在性能上有一定的开销,例如对象的创建和销毁、方法的调用等,特别是在资源有限的嵌入式系统等场景下需要谨慎使用。
  3. 设计复杂性:面向对象的方法需要进行良好的设计,包括类的设计、继承关系的设计等,如果设计不当可能导致系统的复杂性增加。

总的来说,面向对象的思想为软件开发面向对象的思想通过将软件系统的不同部分抽象为对象,并通过对象之间的交互来实现系统的功能,从而提供了一种更加模块化、可扩展、可维护的软件设计方式。面向对象的编程语言(如C++、Java、C#等)提供了丰富的面向对象特性,如封装、继承和多态,使得开发人员可以更加高效地进行软件开发。

面向对象的思想解决了部分第二次软件危机的问题,特别是在软件的扩展方面。通过封装对象的数据和行为,使得对象可以被看作是独立的实体,从而可以更加灵活地进行功能扩展和修改,而不会影响到其他部分的代码。此外,面向对象的继承和多态特性也使得软件可以更加容易地进行复用和重构,从而提高了软件的可维护性和可复用性。

然而,面向对象也存在一些限制和挑战。面向对象的编程模型需要开发人员具备抽象、封装、继承和多态等概念的理解和运用,这对于一些初学者来说可能较为复杂。此外,面向对象的编程模型在处理某些类型的问题时可能并不是最优的选择,例如并发编程、实时系统等。同时,面向对象的编程语言和工具也可能存在性能、复杂性和学习曲线等方面的问题。

总的来说,面向对象的思想在软件开发中起到了积极的作用,但并不是解决软件危机的唯一方法。随着软件开发领域的不断演进和发展,新的编程范式和开发方法不断涌现,为解决软件危机和提高软件开发效率提供了更多的选择。

软件架构的历史背景

软件架构的历史背景可以追溯到20世纪60年代的软件危机,当时软件开发面临着规模越来越大、复杂度越来越高的问题。在20世纪90年代,随着大型软件系统的出现,软件架构作为一种新的设计方法逐渐流行起来。

在过去,软件架构的概念并不像现在这样普遍,因为当时的软件规模相对较小,软件开发团队也较小。然而,随着计算技术的发展和应用场景的不断扩大,软件规模急剧增加,软件开发变得更加复杂和困难。大型软件系统往往由许多组件构成,这些组件之间存在复杂的相互关系和依赖关系,导致系统的组织和管理变得复杂。这就引发了对软件架构的研究和关注,以解决这些新的设计问题。

软件架构的概念从20世纪90年代开始流行,其中一些大公司如Rational和Microsoft在其内部推动了软件架构的发展。这些公司面临着大规模软件系统的设计和开发问题,需要寻找解决方案来提高开发效率、降低维护成本,并改善软件系统的可靠性和质量。软件架构作为一种新的设计方法,提供了对软件系统进行组织、管理和设计的方法论,从而解决了大型软件系统面临的一系列新问题。

软件架构的发展可以看作是软件工程领域对不断增长的软件规模和复杂性的一种应对方式。随着软件技术的不断发展和应用场景的不断拓展,软件架构的研究和应用在现代软件开发中变得越来越重要,成为构建可靠、高效、可维护的软件系统的重要方法之一。

小结

今天我带你回顾了软件开发进化的历史,以及软件架构出现的历史背景,从历史发展的角度,希望对你深入了解架构设计的本质有所帮助

本文由 mdnice 多平台发布

相关文章:

架构设计的历史背景

架构设计的历史背景 在探讨架构设计的历史背景时,了解软件开发进化的历史是一个重要的起点。了解软件开发的演变过程可以帮助我们更好地理解架构设计的起源和发展。现在,让我们来简要回顾一下软件开发的历史,并探索软件架构出现的背景。 首先…...

C#,初学琼林(06)——组合数的算法、数据溢出问题的解决方法及相关C#源代码

1 排列permutation 排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。特别地,当mn时,这个排列被称作全…...

MySQL数据库——绘制E-R图:数据库概要设计阶段

在MySQL数据库的概要设计阶段,绘制E-R图是非常重要的一步。E-R图(实体关系图)是一种图形化的工具,用于描述数据库中实体之间的关系。 以下是在MySQL数据库概要设计阶段绘制E-R图的步骤: 确定实体:在MySQL数…...

对类和对象的理解

对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的…...

edge-tts微软文本转语音库,来听听这些语音是否很熟悉?

上期图文教程,我们分享了Azure机器学习的文本转语音的账号申请与API申请的详细步骤,也介绍了基于python3实现Azure机器学习文本转语音功能的代码实现过程,虽然我们可以使用Azure账号免费提供一年的试用期,但是毕竟是要付费的,我们的API也无法长期使用,好在微软发布了edge…...

MySQL更换存储引擎

要更换 MySQL 5.7 中某个表的存储引擎,可以使用以下的 SQL 命令: sql复制代码 ALTER TABLE table_name ENGINEengine_name; 其中,table_name 是需要更换存储引擎的数据表名称,engine_name 则是需要更换成的新存储引擎名称。 举…...

filebeat收集不规则多行日志

现环境有多行日志输出内容和格式不确定,合并后使用grok默认正则无法收集,需要自己编写正则 日志内容如下: ERROR|2023-04-06 14:27:52|helper|test|http|/api/ad/listBanner|1d60fff861bqwe4b0397be554141eb 127.0.0.1|1b4429-5adb-44d4-acf…...

Token Contrast for Weakly-Supervised Semantic Segmentation

文章来源:[CVPR2023] Keywords:Weakly-Supervised Semantic Segmentation(WSSS);over-smoothing; ViT 一、本文提出的问题以及解决方案: 本文解决了over-smoothing问题,该问题其实是在之前的GCN网络中提出…...

Jenkins运行在docker中使用Maven构建Java应用程序

这篇笔记是Jenkins入门教程使用Maven构建Java应用程序的一个补充说明,因为我照着文档操作的过程中遇到不少问题,遂一一做个笔记。 我的主机是Windows 11,安装的docker是Docker Desktop 4.18.0。 第一点,在Windows里执行docker命…...

将excel导入到sqlite的方法代码

Python实现excel转sqlite的方法,具体如下: Python环境的安装配置就不说了,个人喜欢pydev的开发环境。 python解析excel需要使用第三方的库,这里选择使用xlrd 下面是源代码: #!/usr/bin/python # encodingutf-8 Creat…...

Redis主从复制、哨兵和集群部署

文章目录一、主从复制1、主从复制-哨兵-集群2、主从复制的概念3、主从复制的作用4、主从复制流程5、部署Redis 主从复制步骤6、实例操作:部署Redis 主从复制二、哨兵模式1、哨兵模式的原理2、哨兵模式的作用3、哨兵结构由两部分组成,哨兵节点和数据节点4…...

protobuf序列化

文章目录protubufprotobuf序列化protobuf的原理定义message编译message文件应用protobufMessage 基本用法Message 嵌套使用protubuf protobuf序列化 protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多&#xff…...

更新时无冲突的情况(阁瑞钛伦特软件-九耶实训)

大多数使用“与资源库同步”菜单的目的是想查看本地和远程资源的差异,并不想将本地的内容进行更新。 而“更新”菜单则不然,它的主要作用是将远程仓库中的内容下载到本地,以使本地的版本内容和仓库中的内容一致。 Step01:复用前…...

3.4 函数的单调性和曲线的凹凸性

学习目标: 如果我要学习函数的单调性和曲线的凹凸性,我会采取以下几个步骤: 理解概念和定义:首先,我会学习单调性和凹凸性的定义和概念。单调性是指函数的增减性质,可以分为单调递增和单调递减&#xff1b…...

LeetCode 404. 左叶子之和 | C++语言版

LeetCode 404. 左叶子之和 | C语言版LeetCode 404. 左叶子之和题目描述解题思路思路一:使用递归代码实现运行结果参考文章:思路二:减少遍历节点数代码实现运行结果参考文章:LeetCode 404. 左叶子之和 题目描述 题目地址&#xf…...

arm架构安装Rancher并导入k8s集群解决Error: no objects passed to apply

Rancher介绍 Rancher 2.0-2.4版本 是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。 Rancher 2.5版本 是为使用容…...

安装PaddleSpeech

github地址https://github.com/PaddlePaddle/PaddleSpeech 创建虚拟环境 conda create -p E:\Python\envs\nlppaddle python3.7 # conda create -p E:\Python\envs\speechstu python3.8激活虚拟环境 conda activate E:\Python\envs\nlppaddle # conda activate E:\Python\…...

UE “体积”的简单介绍

目录 一、阻挡体积 二、摄像机阻挡体积 三、销毁Z体积 四、后期处理体积 一、阻挡体积 你可以在静态网格体上使用阻挡体积替代碰撞表面,比如建筑物墙壁。这可以增强场景的可预测性,因为物理对象不会与地面和墙壁上的凸起细节相互作用。它还能降低物理模…...

微信 JAVA SDK 封装

weixin-popular 微信 JAVA SDK,是微信平台(公众平台、开放平台、商户平台、服务商平台)接口服务的JAVA 实现,开发 严格按照官方技术文档,合理划分包名、定义字段及方法,能胜任任何微信相关的业务。 使用建…...

上海智慧校园视频智能分析算法 yolov7

上海智慧校园视频智能分析算法通过yolov7python网络模型分析技术,上海智慧校园视频智能分析算法对校园内学生打架、翻墙、倒地、异常聚集、攀高等行为实时监测预警。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能够同时支持移动 GP…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...