大家好,我是梅宏。今天非常高兴来到格致论道讲坛和大家聊聊软件。谈得更具体一点,主要是面向互联网时代、互联网计算的一种软件新形态,我称之为网络软件。它的英文是Internetware,是中国学者生造的词,用来描绘互联网时代的软件,后面会讲到这个词是如何产生的。
软件无处不在。首先,什么是软件?按照学科定义,软件是由计算机程序和描述这个程序的文档组成的,程序是由数据结构加算法构成的。
软件可以由多个程序构成,它包含着数据,但是单纯的数据不能算软件。开发软件是一项复杂系统工程,编程序只是开发软件中间的一个部分,所以二者不能等同。当今社会已经进入数字经济时代,人类的社会经济活动高度依赖信息基础设施。而在信息基础设施里面,毫无疑问,软件起到非常重要的灵魂作用。在这个软件无处不在的时代,软件覆盖到我们生活和工作的方方面面。软件正在重新定义物理基础设施和社会经济基础设施。
我用两位名人的话来讲,一位是NetScape创始人,同时也是万维网名人堂的首批入选者马克·安德森,他说:“软件在吞噬这个世界”。另外一位是美国工程院院士、C++语言的发明人本贾尼·斯特劳斯特卢普,他说:“人类文明将运行在软件之上。”软件有多重要?给大家讲几个数字。这些数字不同的机构有不同的统计,可能有一些偏差,但整体上相差不太多。
2020年,在全球范围内,软件支出在GDP占比约为0.6%。其中发达国家像美国、新加坡和英国都超过了1%。还有一个统计,2023年预计全球软件支出8900亿美元,比2022年增长12.3%,在所有的IT类支出当中是最高的。按照世界银行的预测,2023年GDP总量大概是102万亿美元左右,而软件占比大概0.8%。
换一个视角,来看看软件在过去20年全球市值TOP10的企业中的作用。
2000年的时候,微软排在第一,此外绝大多数都是运营商。到2010年的时候,中国有3个在里面,分别是中国石油、工商银行和建设银行,榜单里很多都是银行,并且微软仍在。到2020年的时候,一共7个蓝色部分都是和计算相关的软件公司或者互联网公司,包括中国的阿里和腾讯也在里面。2022年底大概有4家还在里面。可以看出,20多年来,微软作为一个纯软件公司,一直霸榜在前三位。
此外谷歌和亚马逊都是以软件为核心业务的互联网公司。包括很多人在用苹果,大家会认为它是一个消费电子公司。但是乔布斯自己说了,苹果成功最大的秘诀,就是把自己当作一个软件公司。这就体现了软件的重要性。
软件学科研究的是什么呢?软件学科大体上分为4大部分,第一部分是核心——软件范型。软件范型是从软件工程师或程序员视角看到的软件模型及其构造原理,是软件技术体系的核心。那什么叫范型?
范型是描述了在一个历史时期构成一门科学学科的思维模式和基本概念的总和。因此,它是很重要的一个建模过程。接下来,软件是什么,长什么样?通常是通过软件语言来表达的,然后就是软件工程的构造方法,主要关注实现软件开发的问题。最后是软件如何运行,即就是软件运行支撑。再有一个要关注到软件质量好坏,就要进行软件质量评估。可以看到,软件范型就是整个软件学科的核心。
这么多年来,软件运行平台在发生变化,应用领域也在不断地扩展。软件范型从无结构到结构化、对象化,再到构件化、服务化,呈现一个螺旋式上升的过程。每次范型的变迁,都会导致整个软件技术体系的一次变化和一次跃升。整体发展趋势是模型更具有表达能力,更符合我们人类去思考问题、认识问题的方式和视角。
软件的诞生:从无结构到结构化。在早期是没有软件的,我们使用机器语言和汇编语言进行开发。
1946年,第一个冯·诺伊曼结构计算机EDVAC诞生。1948年,第一个“存储程序”在机器上成功运行,可以视其为“软件”的诞生。但事实上,那时候没有软件的概念,只有程序,采用“0101”的机器代码或者用符号的汇编语言来编写,开发成本很高,也很难测试和调试,基本要计算机工程师才能完成。
后来出现了高级语言,1957年的时候,图灵奖获得者约翰·巴克斯开发了一个面向科学工程计算的编程语言,就是FORTRAN。当时他的目的是让计算机自动编程序,写汇编代码,写“0101”的机器代码。FORTRAN首次使用了类人的表达方式,到现在还在广泛使用,它基本上就是数学公式。后续所有运算的操作,如指令、编译,就由编译系统来完成。他提出BNF范式,叫巴科斯-诺尔范式。在这以后,开始出现了软件的概念。
早期的软件或者程序是乱成一团麻的,我们把它称之为意大利通心粉式的或者链条式的。执行路径到处乱蹿,在20世纪70年代以前,软件都没有结构。我们的研究和国际上其他实验室的研究均发现,全身性的焦亡是导致脓毒血症的一个关键机制,包括新冠感染中,大家也许听说过“炎症风暴”,实际上这里面也有大量的炎性细胞坏死和细胞焦亡的发生。
1968年,迪杰斯特拉发表著名的“GoTo语句有害论”,他说GoTo语句导致程序的静态结构和动态结构不一样,所以运行的时候出了问题也很难找得到,难以查错,程序也很难理解。因此要把GoTo语句去掉。这件事情开启了结构化的先河。1968年,迪杰斯特拉结婚登记的时候,想把自己的职业登记成程序员。那时候计算机编程已经有了,但当地政府认为程序员这个职业不存在,最后结婚证上填的是“理论物理学家”。
所以,20世纪60年代以后开始出现软件的概念,正是在这个背景下,出现了结构化范型。
1971年,苏黎士理工的尼古拉斯·沃斯正式提出了“结构化程序设计”思想。他领导研发的PASCAL语言在计算机发展史上具有里程碑式的意义,也因此获得了图灵奖。沃斯提出:程序是数据结构加算法。现在很多程序语言的数据结构和控制结构都来自PASCAL,把一团乱麻的链条式结构变成基本结构。
程序由顺序、分叉、循环三个基本结构组成,就可以描述它的控制逻辑。在结构化语言里,C语言是应用最广泛的。C语言是为操作系统而写的语言,先有Unix操作系统,后来才有C语言,C语言又重新写了操作系统。
但是,结构化语言也有问题,它的缺点是面向过程,数据和操作是分离的,不太符合人的编程方式。因此在思考问题的时候,问题空间和解空间之间不是直接对应的映射关系。所以随后出现了对象化范型。
面向对象就是以“类”和“对象”这种的方式,把数据结构和数据一个一个操作紧密绑定起来,用更符合我们人类认识客观世界的抽象方式,来封装模块和构造程序。围绕对象化范型这个概念,诞生了两个图灵奖,这在计算机历史上这是极少见的。一个是奥利-约翰·达尔和克利斯登·奈加特,在Simula I和Simula 67语言中引入类、对象、动态绑定等概念。另外,艾伦·凯开发了Smalltalk。
他们前后在2001年和2003年获得图灵奖,这个是历史上少见的。
C++语言和Java语言让对象化范型得到广泛应用,到现在也是主要的语言。当对象化语言运行的时候,其中面向对象给出的基本承诺是复用。对象要能够复用,但是复用对象的粒度太小。通过复用的方式,来提高软件大规模开发的生产效率和质量,所以就诞生了构件化。构件的粒度比对象要大,它是按照需求和问题空间的描述,生产出符合标准的零部件,就是构件。
随后,再基于构件进行产品组装以生成程序。构件化、服务化在这个基础上发展起来。20世纪90年代,以CORBA、JEE为代表的中间件技术推动构件化范型在企业计算环境广泛应用。2000年以后,以Web服务、微服务、FaaS代表的服务化技术成为云计算的核心支撑,推动服务化范型的广泛应用。
谈中国的软件历史,就要提到北京大学的杨芙清院士,她是新中国第一代从事软件研究的科学家,从苏联留学回来。她在20世纪80年代开始软件工程研究,也是中国最早的。在她的带领以及国家科技攻关项目支持之下,北京大学软件团队开展了三期“青鸟工程”,聚焦于三种主流软件范型的研究。“七五”的时候是支撑结构化,“八五”的时候面向对象为主,“九五”期间开始走向构件化。
从20世纪90年代起,互联网进入大规模商用。
经历了几年发展,大概在2000年以后,人们开始认识到互联网正在成为一台全球泛在的计算机。与此同时,软件也要发生变化。这里列举的是2000年前后出现的很多新词。左边的都是技术术语,表现了学术界是怎么看待互联网的;右边都是社会经济领域怎么去看待互联网,出现了很多很多的概念。学术界和社会经济领域都把互联网看成是一个平台。
那从技术方面和应用方面去思考,在这个平台上面,软件应该怎么进化,软件产业应该怎么发展?
互联网环境下,软件形态发生了根本性变化。在传统封闭的单机环境下或者局域网环境下,传统软件形态的开发方式是什么呢?遇到一个问题,就将其分而治之,自顶向下不断地分解,在确定目标的情况下有序控制。
而互联网软件新形态不同于传统软件的形态,在微观上表现为实体之间按需协同的行为模式,在宏观上表现为实体自发形成应用领域的组织模式。重要的是,互联网软件新形态是基于复用、知识驱动,呈现出从无序到有序的螺旋成长的开发模式,因此说是自底向上、动态目标以及渐趋稳态的生长式发展。而传统的、封闭的、静态固定东西是基本定型的。那么在这时候,新的软件范型应该是什么样?
2000年的我们和国内的学者一起申请973项目的过程当中,造出了网络软件这个词。如果说我们把互联网看成是一个计算平台,软件应该是什么样的?这就是我们当时的出发点。网络软件是对开放、动态和多变的互联网环境下,软件系统基本形态的一种抽象。既是传统软件范型的自然延伸,又具有一些不同于传统软件范型的一些独有特征。网络软件大体有6个性:可信性、情境性、自主性、协同性、涌现性和演化性。
这6个特性和传统的不太一样。网络软件在2000年提出,到2002年就得到了国家973项目的支持,这是973项目里面第一个软件项目,我负责的项目做了2期。在这期间,基金委也支持了很多网络软件的面上项目。国家863计划在“十一五”和“十二五”期间都有以网络软件为对象的研究。
网络软件处于正在进行时,面临着一系列的挑战。
刚才谈到了模型及其语言、构造方法、运行支撑、质量评估与度量等等,我列了很多问题,但我们团队也不是所有的问题都研究。我们在构造方法、运行支撑上做了一些工作。比如在构造方法上,构建了一个全生命周期的软件体系结构模型,来支撑全生命周期软件开发。在运行支撑方面的研究最重要的是,所有的实体之间怎么能够实现按需开放的互操作?今天只讲互操作这一点,互操作一直是软件技术发展的主要驱动力之一。
互操作是异构系统之间功能和数据的互联互通,以实现协同工作。但系统异构是市场行为的产物,要做出特点和别人不同的产品,就很容易出现异构。同样,系统不能单独存在,开放互操作也是市场行为的产物。如果说操作系统屏蔽了硬件的异构性,中间件平台就屏蔽了操作系统,屏蔽了网络的异构性,搭建了统一的平台。单机时代,硬件之上有一个操作系统,操作系统解决了硬件互操作。
到了网络时代,我们就在操作系统之上,在所有的网络功能之上的软件中间件层,来解决互操作问题。
传统的互操作方法实际上有很大的技术挑战。传统的互操作技术大多是“白盒式”思路。什么叫白盒思路?通过全面掌握和分析理解信息系统各种细节,对原系统二次开发或重新开发,即正向工程。通常来讲,要解决互操作无外乎有两个途径。第一个途径是将所有系统丢掉重来一遍,新需求、新技术、新系统重新做。但是这种方式建设周期长、成本高,并且对规划能力和前瞻性要求也很高。
所以大部分采用的途径是利旧,也就是把原来的东西用起来,进行旧系统改造。具体地说,我们可以采取点对点集成的方案,也可以用总线加上系统适配器的方式来集成。这个过程中的挑战就在于,有的系统不是你开发的,所以就要先去了解原系统。了解别人开发的系统,可能比自己编写一个系统更麻烦。所以在改造过程中,还可能引入新的问题,其中包含但不限于对系统的了解不准确而导致的新问题。
在成本高、效率低、费时费力的情况下,应该怎样去做出调整?
对于这种成长式的软件,为了将大量存在的基本构件组合起来以完成新的功能,我们需要一种新的方法。那么,在对原有的系统不一定很了解的情况下,如何把它的功能集成起来呢?我们发明了一种“黑盒式”的方式,从“白盒”改为“黑盒”。具体地说,黑盒式互操作是把信息系统看成“黑盒”,不去了解它的内部。
我们发现,系统之间在云端和客户端和后台之间,有一个系统的反射回路。将反射回路构建出来,就实现了互操作基本要素,从而实现了从白盒到黑盒的重大变迁。以上是方法论的变化,我们在从白盒向黑盒的突破性变迁所提供的基础机理上,突破了一系列的核心技术。像人体一样,当外部给你一个刺激时,人体内部一定有一个反射弧。我们把反射弧找出来,分析反射弧所形成的内部规律。
通过监测,再反过来刺激它做出调整,把结构搞清楚,就能够构建这种黑盒的方式。在这种方式下,无需了解和修改原系统,消除了系统源码、数据库表、后台权限、原开发团队等白盒依赖。我们直接通过客户端,来自动重建运行时软件体系结构,并且生成一个互操作的框架。
以开发过程来看,比如中间件的方式,大家看上面这张图。在硬件和系统软件基础之上,有很多应用,对所有的应用都要做一次修改。
中间件构建在系统软件之上,所有的构件都在新平台之上,需要重新构建数据流、控制流来完成协作。这种开发方式成本太高且效率太低,那应该怎么做呢?我们把中间件往上提一层,原有的应用和构件不做变动,通过反射机制,把它的接口重建。在这个中间件基础上,构建面向新应用的数据流和控制流,这样一来就无需更改原有的系统。这就是“黑盒式”的基本逻辑。
我们是做软件的,要解决软件系统之间的集成问题,所以称之为功能互操作。
以黑盒式实现构件化软件的“功能互操作”,在多个领域得到应用。其中一个案例,在贵阳,五位工程师在没有源码、没有库表,也没有厂家配合的情况下,用一个月时间把贵阳市50多家单位的300多个系统,通过这种方式开发它的结构,把它连起来。大概测算了一下,整个工程效率大概提升了300倍。后来,在国家政务信息系统整合共享工程、互联网+政务服务试点工程里面,也应用了这项技术。
并且目前在智能制造、国家安全、国防军事领域等等,都得到了很大应用。我们解决的核心问题,就是通过自动构建访问接口,实现数据的互操作。大数据时代,数据的共享、互操作、数据之间的碰撞,是产生大数据价值最重要的途径。如果没有共享和互操作,我们也不可能挖掘出大数据的价值。这就是今天我想和大家分享的我们对软件的一些认识,以及我们团队做的一项具体的技术点。谢谢大家!