探索软件工程的演变:从起源到现代

发表时间: 2023-03-19 18:28

为了更好的体系化软件工程相关技术,第一篇文档先整体视角回顾整个软件工程核心的关键时间点,后续再逐步展开。


1.【1930~1946】 计算机理论奠基时代

计算机出现之前,就已经有很多数学家为计算机软件的出现打下了坚实的数学理论基础,最著名的是“阿兰. 图灵”,在 20 世纪三、 四十年代就创建立了“图灵机”理论, 从理论上解决了计算机软件和核心——“计算复杂性”以及“算法表示”问题。

通用图灵机等于向我们展示这样一个过程:程序和其输入可以先保存到存储带上,图灵机就按程序一步一步运行直到给出结果,结果也保存在存储带上。

“图灵”机

图灵机理论是计算机最重要核心的理论

  • 它证明了通用计算理论,肯定了计算机实现的可能性,同时它给出了计算机应有的主要架构。
  • 引入了读写与算法与程序语言的概念,极大的突破了过去的计算机器的设计理念。
  • 阐述了计算机的极限计算能力就是通用图灵机的计算能力,很多问题可以转化到图灵机这个简单的模型来考虑。

我们可以隐约看到现代计算机主要构成(其实就是冯诺依曼理论的主要构成),存储器(相当于存储带),中央处理器(控制器及其状态,并且其字母表可以仅有0和1两个符号),1O系统(相当于存储带的预先输入);

如果说图灵(Alan Turing)奠定了计算机的理论基础,那么冯·诺依曼(John Von Neumann)是将图灵的理论物化成为实际的物理实体,成为计算机体系结构的奠基者,被称为“计算机之父”。

冯·诺依曼与冯·诺依曼机

“冯·诺依曼机”,该架构由算术和逻辑单元 (ALU)、控制单元和临时存储器寄存器组成,它们共同构成了中央处理器 (CPU)。CPU 连接到内存单元,该内存单元包含将要由CPU处理和操作的所有数据。CPU还连接到输入和输出设备,以根据需要更改数据,并检索运行程序的结果。

自 1945 年冯诺依曼提出这一架构以来,直到今天,它基本上仍是当今大多数通用计算机的运行方式,几乎没有改变。

2.【1946~1955】计算机诞生之初的无“软件”概念阶段

1946年2月14日,美国宾夕法尼亚大学制成世界上第一台通用电子数字计算机ENIAC,即电子数字积分电脑,简称“埃尼阿克”。发明者莫克利和艾克特均为美国人,其初衷也是美国奥伯丁武器试验场为了满足计算弹道需要而研制的。


埃尼阿克

“埃尼阿克/ENIAC”的发明,标志着信息时代的开始。

之后不久,继任者EDVAC采用二进制和冯·诺伊曼结构,成为真正意义上的电子计算机。

从此产生了一个新的职业:程序员。但早期,受限于计算机性能,当时的程序主要处理科学计算问题。早期程序员更准确的称呼是“Computer”(计算师)而不是“Programmer”,彼时主流程序语言是汇编,一种面向机器的低级语言。

打孔纸和汇编语言

机器语言通常称为“第一代语言”,其后又产生了“汇编语言”,即“第二代语言”。

汇编语言实际上就是机器语言,区别就是汇编语言中用一些符号代替0 和1 的序列, 仅仅是便于记忆。

3.【1955~1970】高级程序设计语言的兴起和软件危机爆发

随着计算机硬件性能的提升,高级程序设计语言开始兴起,Fortran是世界上最早出现的高级程序设计语言,它的出现改变了传统的人与计算机的交互方式,将人们从繁琐的劳动中解放出来,将大部分精力投入高级的思考中去,因此Fortran的出现具有划时代的意义。之后的许多语言都受到它的影响。

高级语言fortan

此时也随之开始出现了“软件”的概念。但当时的程序编码随意,整个软件看起来像是一碗意大利面一样杂乱无章。

  • 早期的软件工程师,他们多是经过训练的数学家和电子工程师,硬件通常用来执行一个单一的程序,而这个程序又是为一个特定的目的而编制的。
  • 早期当通用硬件成为平常事情的时候,软件的通用性却是很有限的。大多数软件是由使用该软件的个人或机构研制的,软件往往带有强烈的个人色彩。
  • 早期的软件开发也没有什么系统的方法可以遵循,软件设计是在某个人的头脑中完成的一个隐藏的过程。而且, 除了源代码往往没有软件说明书等文档。

随着软件系统的规模越来越庞大,软件产品的质量越来越差,生产效率越来越低,维护的难度越来越大,从而导致了“软件危机”。

1968年北大西洋公约组织的计算机科学家在联邦德国召开的国际学术会议_上第一次提出了“软件危机”(software crisis)这个名词。

概括来说, 软件危机包含两方面问题:

  • 如何开发软件,以满足不断增长,日趋复杂的需求;
  • 如何维护数量不断膨胀的软件产品。


4.【1970~1990】软件工程的诞生


1968年,NATO (北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念。软件工程是一门研究如何用系统化、规范、数量化等工程原则和方法去进行软件的开发和维护的学科。

软件工程包括两方面内容:软件开发技术和软件项目管理。软件开发技术包括软件开发方法学、软件工具和软件工程环境。软件项目管理包括软件度量、项目估算、进度控制、人员组织、配置管理、项目计划等。

此后软件工程理论开始蓬勃发展,提出了许多软件开发模型,比如瀑布模型、增量开发、螺旋模型、敏捷开发等。

瀑布模型

增量开发

螺旋模型

敏捷开发

这个阶段的软件是面向过程开发的单机软件。

5.【1990~1999】面向对象和Web的诞生

面向对象的诞生是编程史最重要的里程碑事件,它提出了一种全新的软件设计思想和开发模型,从此面向对象分析(OOA)、面向对象设计(OOD)、面向对象编码(OOP)成为软件工程师的口头禅。随之而来的是面向对象建模语言(以UML为代表)、软件复用、基于组件的软件开发等新的方法和领域。与之相应的是从企业管理的角度提出的软件过程管理。

面向对象分析

另外值得注意的是,1991 年 8 月 6 日,第一个网站上线。该站点由 Tim Berners - Lee 创建,网站详细介绍了万维网(W3)项目。它最初是在欧洲核研究组织 CERN 的 NeXT 计算机上运行的。

第一个静态页面


该网站的诞生开启了Web1.0时代。此时,Web Page还只是文档,由网页编辑和平面设计师编写产生,并不需要软件工程师开发。

6.【1999~2005】Web软件开发兴起(全栈开发,单体架构时代)

随着互联网的普及和网速的提升,传统单机软件逐步发展为基于Web的应用。Web Page从静态变为动态,开始需要程序员介入。

特别是三大主流动态网站技术横空出世!.php => PHP,.jsp => Java Web, .asp => ASP

他们都是在服务器(Server)端生成动态计算和生成的Html页面(Pages) ,然后将整个页面发送给前端。

此阶段主要特点是静态页面逐步转为动态页面,其中比较出名的一些框架比如:

struts框架

此阶段的工程师皆为全栈开发工程师,页面由服务端生成,页面内可以通过脚本直接操作后端服务逻辑。

架构上此阶段主要是单体架构(Monolithic Architecture): 系统中主要的过程调用都是进程内调用,不会发生进程间通信。 如下所示是单体架构常见的分层模式。

单体架构

分层架构

7.【2005~2012】Web2.0时代(AJAX技术兴起,前后端分离,SOA架构时代)


随着互联网进一步普及和基础设施进一步完善,Web应用从单纯浏览和获取信息,向用户生产内容(User Generated Content)转变,互联网进入Web2.0时代。AJAX技术的兴起,解耦了Web软件的展现层和业务逻辑层,并最终促使Web软件的前后端分离,从此Web全栈开发工程师,分解为前端工程师和后端工程师两种职业。前端工程师深入软件可视化交互领域,后端工程师摆脱掉展现层的包袱后,开始重新思考服务端的软件架构,SOA(Service-Oriented Architecture,面向服务架构)思想开始盛行。

web1.0~3.0主要特点

前端架构演变

前端架构经历了从单体,到前后端分离,再到微服务,最终发展到现在的微前端的过程如下图所示

微前端的思路是把微服务的架构引入到前端,其核心都是要能够以业务为单元构建端到端的垂直架构,使得单个的团队能够独立自主的进行相关的开发,同时又具备相当的灵活性,按需求来组成交付应用。

SOA(Service-Oriented Architecture,面向服务的架构)是一种在计算机环境中设计、开发、部署和管理离散模型的方法。SOA不是一种新鲜事物,它是在企业内部IT系统重复构建以及效率低下的背景下提出的。在SOA模型中,所有的功能都被定义成了独立的服务,所有的服务通过服务总线(ESB)或流程管理器来连接。这种松散耦合的结构使得能够以最小的代价整合已经存在的各种异构系统,当然,由于需要实现对各种异构系统的适配(通常使用ESB来完成不同系统之间的协议转换及数据格式转换),因此,其本身也会引入更多的复杂性。

单体架构

面向服务的架构


8.【2012~2018】移动互联网时代(B/S→多端/S)

进入移动互联网时代,Web软件的B/S结构,转变为多端/S(PC浏览器,移动浏览器,Android,IOS,小程序)。原来前后端一对一变成多对一,服务端“组件化”能力被重视,微服务架构提出并开始盛行。



SOA是一种思想,ESB是SOA的中心化实现,微服务是SOA的去中心实现

ESB由于其复杂性逐渐淡出主流圈,微服务成为主流,场景的微服务下的架构图

微服务架构


软件工程的发展和商业化进程全景