一起看看,软件工程发展简史
为了更好的体系化软件工程相关技术,第一篇文档先整体视角回顾整个软件工程核心的关键时间点,后续再逐步展开。
软件工程发展简史
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由于其复杂性逐渐淡出主流圈,微服务成为主流,场景的微服务下的架构图
微服务架构
软件工程的发展和商业化进程全景
软件的发展史其实就是在裸机(硬件)和终端用户之间不断沉淀(平台化)的过程。
1、“计算机"理论阶段:20 世纪三、 四十年代——理论
计算机出现之前,就已经有很多数学家为计算机软件的出现打下了坚实的数学理论基础,最著名的是“阿兰. 图灵”,在 20 世纪三、 四十年代就创建立了“图灵机”理论, 从理论上解决了计算机软件和核心——“计算复杂性”以及“算法表示”问题。
正是有了这样的数学理论作为基础,加上当时电子技术的突飞猛进,二者相结合,才产生了计算机这样一个划时代的伟大产物。
2、第一台电子管计算机:1946 年——硬件
美国宾夕法尼亚大学经过几年的艰苦努力,研制出世界上第一台电子计算机,是电子管计算机,结构上以CPU为中心,使用机器语言,速度慢、存储量小,主要用于数值计算。
计算机都是按照“冯 . 诺依曼”体系设计的, 其运行的基本原理, 可以简单概括为“程序存储、集中控制”,“约翰 . 冯. 诺依曼”被称为“计算机之父”。
3、打孔纸带“编程”——语言
计算机的内部处理的全都是1 和 0 的二进制数字, 表示“开”和“关”.
而计算机刚刚发明出来的时候, 操作人员就必须用很多真正的“开关”来操作计算机,进步一点以后, 出现了“机器语言”的概念,使用例如在纸带上打孔的方式,把一些原来需要人手工拨动开关的操作序列,变成按照某种规则在纸带上的一系列孔的序列。
这种打着孔的纸带可以被看作是今天的鼠标、键盘、打印机、显示器、磁盘这些东西的总和,这些东西在当年,“打孔纸带”一个人就全包了。
今天我们分分钟编好一个程序,并且可以多语言混合编写。然而你能想象最初的编程竟然是通过打控纸写程序。
打孔卡(punch card)编程时期:20 世纪 60 年代,IBM 并为打孔卡设立了标准。
基本原理是通过打孔纸带上的圆孔或方孔,透光,则表示1,其他表示0。通过纸带输入老式计算机中,进行程序控制。
4、早期的“程序猿”
伴随着第一台电子计算机的问世诞生了。以写软件为职业的人也开始出现,他们多是经过训练的数学家和电子工程师,硬件通常用来执行一个单一的程序,而这个程序又是为一个特定的目的而编制的。
早期当通用硬件成为平常事情的时候,软件的通用性却是很有限的。大多数软件是由使用该软件的个人或机构研制的,软件往往带有强烈的个人色彩。
早期的软件开发也没有什么系统的方法可以遵循,软件设计是在某个人的头脑中完成的一个隐藏的过程。而且, 除了源代码往往没有软件说明书等文档。
5、机器语言——>“汇编语言”
机器语言通常称为“第一代语言”,其后又产生了“汇编语言”,即“第二代语言”。
汇编语言实际上就是机器语言,区别就是汇编语言中用一些符号代替0 和1 的序列, 仅仅是便于记忆。
此外,有少量的扩展功能,比如可以通过定义“宏”来产生类似于“子程序”这样的逻辑概念,通过编写汇编语言程序产生机器代码,效率提高了很多, 但是它依然是紧密依赖于机器的,和后来被广泛使用的高级语言是完全不同的。
6、Fortran——第一个高级语言:1954 年
1954 年,“约翰 . 巴科斯”建立了高级语言的思想,并设计出了世界上第一个真正意义上(至今广泛应用)的高级语言,第一个完全脱离机器硬件的高级语言—Fortran问世。
7、典型的操作系统FMS:1955
1955-,典型的操作系统是FMS (FORTRAN Monitor SystemFORTRAN 监控系统)和IBSYS (IBM为7094机配备的操作系统)。
8、晶体管计算机:1958年
1958年晶体管计算机,结构上以存储器为中心,使用高级语言应用范围扩大到数据处理和工业控制。
9、第一个数据库管理系统-IDS:1961年
1961年第一个数据库管理系统- -IDS由通用电气(GE)公司的Charles Bachmar开发出 。.
10、小规模集成电路计算机:1964年
1964年中小规模集成电路计算机,结构上仍以存储器为中心,增加了多种外部设备, 软件得到一定发展,计算机处理图像、文字和资料功能加强。
11、远程联机系统:60 年代中期之前
60 年代中期之前的第一代计算机网络是以单个计算机为中心的远程联机系统。
典型应用是由一台计算机和全美范围内2 000 多个终端组成的飞机定票系统。
终端是一台计算机的外部设备包括显示器和键盘,无CPU和内存。
12、“软件危机"与”软件工程“:60 年代中期
“软件危机”于60年代中期软件开始作为- -种产品被广泛使用,出现了“软件作坊”专职应别人的需求写软件。
这一软件开发的方法基本上仍然沿用早期的个体化软件开发方式,但软件的数量急剧膨胀,软件需求日趋复杂,维护的难度越来越大,开发成本令人吃惊地高,而失败的软件开发项目却屡见不鲜。
“软件危机” 就这样开始了!
1968年北大西洋公约组织的计算机科学家在联邦德国召开的国际学术会议_上第一次提出了“软件危机”(software crisis)这个名词。
概括来说, 软件危机包含两方面问题:
一、如何开发软件,以满足不断增长,日趋复杂的需求;
二、如何维护数量不断膨胀的软件产品。
同年秋季,NATO (北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。
在那次会议上第一次提出了软件工程(software engineering)这个概念。软件工程是一门研究如何用系统化、规范、数量化等工程原则和方法去进行软件的开发和维护的学科。
软件工程包括两方面内容:软件开发技术和软件项目管理。软件开发技术包括软件开发方法学、软件工具和软件工程环境。软件项目管理包括软件度量、项目估算、进度控制、人员组织、配置管理、项目计划等。
13、“生命周期模型“五步走:60 年代末
60年代末“软件危机”后出现的第一个生命周期模型。如下所示:分析→设计→编码→测试→维护,使人们认识到了文档的标准以及开发者之间、开发者与用户之间的交流方式的重要性。
一些重要文档格式的标准被确定下来,包括变量、符号的命名规则以及原代码的规范式。
14、1969年UNIX出现
1969年12月,Internet的前身–美国的ARPA网投入运行,它标志着我们常称的计算机网络的兴起。.
1969年,提出了结构化程序设计方法。
15、1970年之后
1970年,第一个结构化程序设计语言- Pascal 语言出现。标志着结构化程序设计时期的开始,即PO (面向过程的开发或结构化方法)以及结构化的分析、设计和相应的测试方法。
1971年.大、超大规模集成电路计算机,应用更加广泛,出现了微型计算机。
1972 C语言 出现
1975年的第六版UNIX 才开始走出贝尔实验室
1979年0racle公司引入了第一个商用SQL关系数据库管理系统。
1983年C+出现
1983年IBMDB数据库产品推出的。
由于各种各样的应用软件需要在各种平台之间进行移植,或者一个平台需要支持多种应用软件和管理多种应用系统,软、硬件平台和应用系统之间需要可靠和高效的数据传递或转换,使系统的协同性得以保证。
这些,都需要一种构筑于软、 硬件平台之上,同时对更上层的应用软件提供支持的软件系统,而中间件正是在这个环境下应运而生。
1984年Tuxedo作为第-一个严格意义上的中间件产品由AT&T的贝尔实验室开发完成
1985年Windows 1. 0正式推出。之前软件结构体系也是Mainframe结构,该结构下客户、数据和程序被集中在主机上。
随着PC个人微机应用的推广,PC 联网的需求也随之增大,各种基于PC互联的微机局域网纷纷出台。
16、20世纪80年代
20世纪80年代中期出现了Client/Server结构。此结构把数据库内容放在远程的服务器上,而在客户机上安装相应软件。C/S软件一般采用两层结构。
1986年Eiffel出现。
80年代末面向对象的分析、设计方法(00A和00D)的出现,随之而来的是面向对象建模语言(以UML为代表)、软件复用、基于组件的软件开发等新的方法和领域。与之相应的是从企业管理的角度提出的软件过程管理。
17、20世纪90年代
90年代,中间件技术才开始迅速发展,建立在计算机和网络技术基础上的计算机网络技术得到了迅猛的发展。
1993年美国宣布建立国家信息基础设施NII后,全世界许多国家纷纷制定和建立本国的NII,从而极大地推动了计算机网络技术的发展,使计算机网络进入了一个崭新的阶段。
目前,全球以美国为核心的高速计算机互联网络即Internet已经形成。
1994年PHP出现
1995年Java出现
1996年JavaScript出现
18、2000年之后
2000年C#出现
业务基础平台作为一个新的软件层级尤为引人注目。业务基础平台是以业务导向和驱动的、可快速构建应用系统的软件平台。
2005年,ERP厂商再度引发“平台热”,金碟、SAP都在此时高调推出平台战略。
2006年被炒得沸沸扬扬的SOA (Service-0riented Architecture 作为下一代软件架构,主要用于解决传统对象模型中无法解决的异构和耦合问题。
……
总结
软件的发展史其实就是在裸机(硬件)和终端用户之间不断沉淀(平台化)的过程。
当与裸机接近的某个层次发展成熟后,与这个层次相关的创新和成果会明显减少,而从这个层次更靠近终端用户业务的层次的创新和成果会增多。就这样不断不断的沉淀形成平台,不断的向用户和业务领域靠拢。