chapters 0-1,1-1,2-1 updated

This commit is contained in:
wang-hpc 2020-02-05 18:40:05 +08:00
parent a3bce6c8a4
commit bf24c7e128
3 changed files with 329 additions and 255 deletions

View File

@ -9,21 +9,21 @@
软件是信息系统的灵魂,
%软件是社会信息化的灵魂,
是世界数字化的直接目的、自动化的现代途径、智能化的逻辑载体。
时至今日,小到一个智能传感器、一块智能手表,大到一座智慧城市、一张国家电网,
是世界数字化的直接产物、自动化的现代途径、智能化的逻辑载体。
时至今日,小到一个智能传感器、一块智能手表,大到一座智慧城市、一张智能电网,
无不有赖于软件系统的驱动与驾驭。
软件已经成为信息化社会不可或缺的基础设施。
%软件已经成为现代社会不可或缺的基础设施。
软件重塑了从休闲娱乐、社会交往到生产生活、国计民生的方方面面,
软件重塑了从休闲娱乐、社会交往到生产生活、国计民生等社会经济的方方面面,
“软件定义一切”日益成为一种现实。
高效地生产和运用高质量软件系统的能力成为国家和社会发展的一种核心竞争力。
高效地构建和运用高质量软件系统的能力成为国家和社会发展的一种核心竞争力。
软件是计算的逻辑制品,其实质是以计算为核心手段实现应用目标的解决方案。
软件是定义计算的逻辑制品,其实质是以计算为核心手段实现应用目标的解决方案。
因此,软件科学与工程学科(以下简称软件学科)本质上是一门具有高度综合性的方法论学科。
60余年的发展历史表明软件学科具有独特的发展规律其内涵与外延随着计算平台与应用范围
的不断拓展而迅速发展。当前,随着物联网、云计算、大数据和人工智能技术的进一步发展,
60余年的发展历史表明软件学科具有独特的发展规律其内涵与外延随着计算平台与应用范围
的不断拓展而迅速发展。当前,随着物联网、云计算、大数据和人工智能应用的进一步发展,
软件及软件学科面临着前所未有的系统复杂性、适应性和可信性要求的重大挑战,也孕育着新的范式转换的重大机遇。
本报告回顾总结软件学科的发展历程和发展规律,进而针对人机物三元融合、软件定义一切的发展趋势,展望学科发展的关键问题和重要研究方向,并给出学科领域未来发展的政策建议。
本报告回顾总结软件学科的发展历程和发展规律,进而针对人机物三元融合、软件定义一切的发展趋势,展望学科发展的关键问题和重要研究方向,并给出学科领域未来发展的政策建议。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -37,22 +37,20 @@
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。
作为一种人工制品,其需以适应其所处环境的方式完成应用目标;作为逻辑制品,其困难不在于物理限制而在于逻辑构造。
因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案;后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案。软件没有“边际成本”,即生产成本几乎为零,主要成本在于它的“创造”。%每一个软件系统都需要独一无二的创造。
软件既受刚性约束,又能柔性适应。软件以计算为实现手段,受图灵可计算性、计算复杂性和逻辑正确性的刚性约束。软件作为逻辑制品,其本身没有任何物理意义的弹性。
而通用图灵机模型和存储程序式计算机架构又使得软件具有无与伦比的灵活性,在前述刚性约束下,可以表达千变万化的计算解决方案。
这是其他任何种类的制品所不具有的巨大优势。
软件是人类所制造的最复杂的一类制品。软件作为逻辑制品不受物理限制,其规模原则上可以无限扩展。
软件既受刚性约束,又能柔性适应。软件以计算为实现手段,受图灵可计算性、计算复杂性和逻辑正确性的刚性约束。%软件作为逻辑制品,其在静态表示上没有任何物理意义的弹性。
而通用图灵机模型和存储程序式计算机架构又使得软件具有无与伦比的灵活性,在前述刚性约束下,其丰富的动态语义可以表达千变万化的计算解决方案。
%这是其他任何种类的制品所不具有的巨大优势。
软件规模在原则上可以无限扩展。
其高度灵活性也使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”。
这就使得整个人工系统的复杂性向软件集中。
纵观软件的发展历程,其复杂性呈爆炸性增长趋势。
当前一辆汽车所涉及的软件代码已达上亿行的规模而谷歌所有的网络服务涉及的代码达到20亿行。
纵观软件的发展历程,其复杂性呈爆炸性增长趋势。软件成为人类所创造的最复杂的一类制品。
对复杂性的驾驭成为软件开发和运维的核心挑战。
\subsection{软件的重要作用}
进入21世纪以来信息技术及其应用飞速发展已经广泛覆盖并深入渗透到了社会生活的方方面面。
特别地,近年来,以云计算、大数据、移动互联网、物联网、人工智能为代表的新一代信息技术推动信息技术应用进入跨界融合的繁荣期
进入21世纪以来信息技术及其应用飞速发展已经广泛覆盖并深入渗透到了社会经济的方方面面。
特别地,近年来,以云计算、大数据、移动互联网、物联网、人工智能为代表的新一代信息技术推动软件进入跨界融合的繁荣
开始呈现出“网构化、泛在化、智能化”的新趋势,并不断催生新平台、新模式和新思维。
可以说,信息技术及其深度应用已经推动人类社会步入到一个新的发展阶段。
%对这样一个新的发展阶段,可以从不同的视角去考察和认知。
@ -62,51 +60,60 @@
%从信息应用视角,则可视为是以人工智能技术为基础,支持感知、认知到决策为特征的智能化时代。
%然而,如果
从使能技术的视角看,软件技术在信息技术中则始终处于“灵魂”地位,所有新的信息技术应用、平台和服务模式,均离不开软件技术作为基础支撑。
更为重要的是,软件技术不仅引领信息技术产业的变革,在很多传统领域(如汽车、能源、制造、零售等)中的存在比重和重要性也在不断加大,
从使能技术的视角看软件技术在信息技术中始终处于“灵魂”地位所有新的信息技术应用、平台和服务模式均离不开软件技术作为基础支撑例如谷歌所有的网络服务涉及的代码达到20亿行。
更为重要的是软件技术不仅引领信息技术产业的变革在很多传统领域如制造、能源、交通、零售等中的存在比重和重要性也在不断加大。例如宝马7系的软件总量超过2亿行特斯拉S总量超过4亿
行。
在支持这些传统领域产业结构升级换代甚至颠覆式创新的过程中起到核心关键作用,并进一步加速重构了全球分工体系和竞争格局。
例如作为新一轮科技革命和产业变革的标志德国的“工业4.0”和美国的“工业互联网”以及我国的“中国制造2025”均将软件技术作为发展重点。
无所不在的软件,正在走出信息世界的范畴,开始深度渗透到物理世界和人类社会,开始扮演着重新定义整个世界的重要角色。在这个意义上,我们正在进入一个“软件定义一切”的时代!
无所不在的软件,正在走出信息世界的范畴,开始深度渗透到物理世界和人类社会,并扮演着重新定义整个世界的重要角色。从这个意义上说,我们正在进入一个“软件定义一切”的时代!
\subsection{软件学科}
软件学科是以软件为研究对象,研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持、运行平台和生态环境的学科。
也就是说,软件学科本质上是一门方法论学科。
换言之,软件学科本质上是一门方法论学科。
%其带来的是一种人类思维的创新,以人机共融方式延伸了单纯人脑思维,形成了一种前所未有的创造力。
%
作为一门相对年轻而又发展迅速的学科,软件学科的内容一直在不断深化、边界一直在不断扩展。
从学科内容看,作为方法论的软件学科其总目标在于帮助开发者驾驭以计算为手段解决应用问题的复杂性。
而抽象是驾驭复杂性的基本手段。若采用以软件抽象为中心的视角,软件学科包含三个核心子领域,即程序设计语言与理论、系统软件、以及软件工程。
其中,程序设计语言与理论的核心任务是建立通用的抽象和构建新抽象的机制,系统软件的核心任务是高效实现通用的抽象,而软件工程的核心任务是使用和建立通用抽象完成特定应用目标。
如果把计算平台集合看作是平台空间,软件集合看作是解空间的话,软件学科主要研究如何将问题空间元素(问题)映射到解空间元素(解决方案)、以及如何构建平台空间元素(计算平台)以高效运行解空间元素(解决方案),而抽象是构建上述空间元素模型、并建立模型之间关系的元素。作为方法论的软件学科的总目标在于如何驾驭用计算为手段解决应用问题的复杂性,通过抽象方法建立模型及模型之间的联系成为驾驭上述空间及其之间映射复杂性的基本途径。若以软件抽象为中心视角,软件学科包含四个子领域,即软件范型、软件运行支撑、软件构造方法以及软件度量与质量评估。其中,软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,其核心任务是建立通用的抽象机制,包括抽象的表示和抽象之间的关系,为问题空间、解空间和平台空间建模;软件构造方法的核心任务是建立问题空间抽象到解空间抽象的映射方法,构建解决方案完成特定应用目标;软件运行支撑的核心任务是建立解空间向平台空间的映射方法并构建平台空间抽象的计算实现;软件度量与质量评估的核心任务通过从质量和效率的角度对软件抽象及其构造、运行进行度量和评估。四个子领域是密切联系、相互作用的。简而言之,软件范型回答“软件是什么”的问题;软件构造方法回答“怎样做软件”的问题;软件运行支撑回答“怎样运行软件”的问题;软件度量和质量评估回答“软件好不好”的问题。软件范型是核心和基础,它的变化将牵引构造方法、运行支撑、度量和质量评估的一系列变化;软件范型与构造方法、运行支撑是一体两翼,构成了软件方法和技术主体;软件度量和质量评估与前三者是一种横切关系,它通过量化发现软件和技术的规律,并评价解决方案对应用目标的满足程度。参见下图。
程序设计语言用于描述软件的计算行为,是软件开发的主要工具。
一方面,程序设计语言需要提供更高抽象层次和更灵活的语言设施以提高软件开发的效率;
另一方面,这些语言设施又需能高效地实现以保证软件的执行效率。
\begin{figure}[htbp]
\centering
\begin{minipage}[t]{0.7\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-6.png}
\caption{软件学科基本架构}
\label{fig:1-6}
\end{minipage}
\end{figure}
系统软件将计算系统的概念从硬件扩展到了软件层面上,负责驱动下层计算资源有效运转、为上层应用提供共性支撑。
系统软件主要包括操作系统、编译系统、中间件和数据库管理系统等。
软件范型主要内容是程序设计语言和软件理论。程序设计语言用于描述软件的计算行为,承载着软件的范型。
一方面,程序设计语言需要提供更有效、有力、更符合人类思维的语言设施以提高软件构造、运行的效率和质量;
另一方面,这些语言设施又需能高效地实现以保证软件的执行效率。而软件理论包括了程序理论和算法理论,给出软件抽象构造的理论基础。
软件构造方法针对的关键问题包括如何理解所面对的问题空间、如何理解当前需要软件来解决的问题并以此设计可能的解决方案、以及如何高效高质量地开发出能满足需求的软件等。软件构造方法包括了软件开发的技术、过程、管理等方面,形成了软件学科的软件工程分支的主要内容。
软件运行支撑将计算平台的概念从硬件扩展到了软件层面上,负责驱动下层计算资源有效运转、为上层应用提供共性支撑。其内容主要是在平台空间中实现解决方案、并构建平台空间的计算实现,包括操作系统、编译系统、中间件和数据库管理系统等。
%其中,操作系统负责管理计算系统软硬件资源、操纵程序运行,为应用软件提供公用支撑。
%编译系统(又称编译器)负责将源语言编写的源程序翻译为等价的可 运行目标程序;
%中间件将系统软件的概念扩展到网络环境,为分布式应用软 件部署、运行和管理提供支撑;数据库管理系统旨在统一管理和维护数据库中的数据,是存储、组织、联接、变换和加载数据的软件。
软件工程所针对的关键问题包括如何理解所面对的问题领域、如何理解当前需要软件来解决的问题并以此推断可能的解决方案、以及如何高效高质地开发出能胜任的软件等。其主要研究内容包括软件开发方法、软件质量度量和评估以及软件工程过程等方面。
软件度量与质量评估主要内容是将软件对作为观察对象,对围绕软件及与其相关的事物和活动进行度量,并对软件质量和效率进行评估和预测。软件度量与质量评估有助于发现软件及其构造和运行的规律,涉及到软件范型、构造和运行诸多方面,通常将其归在软件工程的主要内容之中
由于应用范围的迅速拓展,软件抽象中用于表述现实世界的数据抽象日益重要,数据量及其复杂性迅猛增长,数据管理逐渐从上述三个子领域中分离出来成为一个单独的子领域。
%由于应用范围的迅速拓展,软件抽象中用于表述现实世界的数据抽象日益重要,数据量及其复杂性迅猛增长,数据管理逐渐从上述三个子领域中分离出来成为一个单独的子领域。
\subsection{软件学科的重要地位}
软件学科在整个计算机学科中占有举足轻重的核心地位。从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%),其中以程序设计语言、编译和操作系统为主获奖的有22次获奖还有4次数据库获奖。
软件学科在整个计算机学科中占有举足轻重的核心地位。从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主的有22次获奖还有4次数据库获奖。
从目前我国人才培养一级学科划分看,软件学科横跨了计算机科学与技术软件工程、网络空间安全等三个一级学科,特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。
与本国际本科计算教育学科划分相比软件学科横跨了ACM/IEEE计算教程等五个学科,即计算机科学、计算机工程、软件工程、信息技术、信息系统。
从目前我国人才培养一级学科划分看,软件学科横跨了计算机科学与技术软件工程、网络空间安全等三个一级学科,特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。
与本国际本科计算教育学科划分相比软件学科横跨了ACM/IEEE Computing Curricula的五个学科,即计算机科学、计算机工程、软件工程、信息技术、信息系统。
随着软件学科的快速发展,软件学科也逐渐成为一门基础学科,并向其他学科渗透。
所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
随着信息技术及信息化的快速发展,软件学科也逐渐成为一门基础学科,并向其他学科渗透。
所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。
软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的科学研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。
@ -117,21 +124,21 @@
\subsection{软件学科发展历程}
以程序化的系列步骤表达解决方案是人类思维的基本形式之一。
只有等到上世纪四十年代末存储程序式电子计算机出现以后,现代意义上的软件才成为可能
直到上世纪四十年代末存储程序式电子计算机出现以后,现代意义上的软件才真正出现
粗略而言,软件的发展历程可分为四个阶段:
\begin{enumerate}
\item 从存储程序式电子计算机出现到实用高级程序设计语言出现之前为第一阶段上世纪40年代末到50年代中期。此阶段计算机处理能力有限应用领域主要集中于科学计算与工程计算。编制程序所用的工具是低级语言。系统软件仅能提供程序载入等简单功能。程序开发无系统方法强调编程技巧。
%
\item 从实用高级程序设计语言出现到软件工程提出之前为第二阶段上世纪50年代中期到60年代后期。此阶段计算机处理能力迅速提高应用领域扩展到商业数据处理等领域。人们开发了操作系统以充分利用系统资源。为了适应大量数据处理问题的需要, 数据库及其管理系统开始出现。FORTRAN、COBOL、ALGOL等高级语言的提出,大大提高了程序设计的效率;但软件的复杂程度迅速提高,研制周期变长, 质量难以保证,出现了所谓软件危机。为此人们提出结构化程序设计方法,并开始了程序正确性和软件可靠性的理论研究。
\item 从实用高级程序设计语言出现到软件工程提出之前为第二阶段上世纪50年代中期到60年代后期。此阶段计算机处理能力迅速提高应用领域扩展到商业数据处理等领域。人们开发了操作系统以充分利用系统资源。为了适应大量数据处理问题的需要, 数据库及其管理系统开始出现。FORTRAN、COBOL、ALGOL等高级语言大大提高了程序设计的效率但软件的复杂程度迅速提高研制周期变长 质量难以保证,出现了所谓软件危机。为此人们提出结构化程序设计方法,并开始了程序正确性和软件可靠性的理论研究。
%
\item 从软件工程提出到基于互联网的软件服务广泛使用之前为第三阶段上世纪60年代后期到90年代后期
计算机系统的处理能力继续增长,向嵌入式和网络化的平台延伸;应用领域扩展到社会生产生活的诸多方面。
计算机系统的处理能力继续增长,向嵌入式和局域网或基于广域网的企业计算延伸;应用领域扩展到社会生产生活的诸多方面。
以系统化、工程化的方法开发大型软件逐渐成为主流,软件开发方法和技术迅速发展,对象化、构件化等方法获得广泛应用。
%为了适应计算机网络的需要,出现了网络软件;随着微型计算机的推广,
分布式应用和分布式软件得到快速发展,出现了软件中间件。关系数据库管理系统高速发展,获得了很大的成功。
软件知识产权获得重视,基于软件产品形态的软件产业迅速发展。
%
\item 从基于互联网的软件服务广泛使用迄今为第四阶段90年代后期以来。随着互联网和万维网的普及以及物联网、移动网的兴起,
\item 从基于互联网的软件服务广泛使用迄今为第四阶段90年代后期以来。随着互联网和万维网的普及以及物联网、移动互联网的兴起,
软件的应用范围向泛在化发展,全面融入人类生产生活的各个方面。软件的核心价值日益以网络服务的形式呈现。
云计算、大数据和人工智能技术的进步推动了服务化的软件产业的繁荣。软件技术呈现出网构化、泛在化和智能化的发展趋势。
与此同时,开源软件运动取得了巨大成功,软件和软件技术的可获得性极大提升,对整个软件生态产生了重要影响。
@ -143,34 +150,34 @@
\subsection{软件学科发展规律}
纵观软件学科的历史,可以发现其发展的外在驱动力始终来自于计算平台的发展和应用范围的扩张,
而内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀计算平台资源,同时更好地满足用户对易用性的需求。
而内在驱动力来自于其核心问题的解决,追求更具表达能力、更符合人的思维模式的编程范型,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀计算平台,同时更好地满足用户对易用性的需求。
这是由软件学科的方法论学科本质所决定的。
软件的计算平台给出了其所依赖的平台空间,而应用问题域形成了软件的问题空间。
在平台空间和问题空间之间,形成了软件所需具有的功能、目的和适应形成的解空间。
通过对这三个空间的协同,可以帮助驾驭软件的复杂性,即尽量避免引入附属性的复杂性,更好理解和应对本质性的复杂性。
软件的计算平台给出了解决方案所依赖的平台空间,而应用问题域形成了软件的问题空间。
在平台空间和问题空间之间,构成了软件所需具有的功能、目的和适应能力构成的解空间。解空间受制于问题空间和平台空间。
%平台空间从广义上看属于解空间的一部分,也是基础部分。
通过对这三个空间的协同,可以帮助驾驭软件的复杂性,即尽量避免引入附属的复杂性,更好理解和应对本质的复杂性。
软件方法与技术体系的发展过程就是在平台和需求变化驱动力的推动之下,对这三个空间的认识不断深化并在其间有效协同的过程。
软件作为问题解决方案,其结果是对解空间中的概念的表达
三个空间驾驭复杂性的关键在于软件抽象,包括但不限于程序设计语言设施、软件构件、 软件服务等。
%软件作为问题解决方案,是在解空间中构建从问题空间的到平台空间的映射
三个空间驾驭复杂性的关键在于软件抽象,包括但不限于程序设计语言设施、软件构件、 软件服务等。
%如前所述,软件方法学及其程序设计语言表达的核心是建立(一般的)软件抽象,而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软 件。
不同层次的抽象(集中体现在软件范型及相应的语言等表达设施)、抽象的计算实现(集中体现在系统软件)和使用(集中体现在软件工程)组成了软件学科发展的脉络。
例如,前文所述的结构化软件范型乃是由于上世纪60年代计算机基础能力(计算、存储与外设)的快速发展和软件危机的出现而导致人们对基础的程序设计方法与语言的科学思考而产生的,
它以结构化的程序抽象较好地协同了软件开发的平台空间与解空间
而面向对象软件范型则进一步发展了从宏观角度控制复杂性的手段, 如关注分离、信息隐蔽、模块化等, 并强调将问题空间纳入软件设计的范畴,
提出与问题结构具有良好对应关系的面向对象程序抽象与支撑机制, 从而协调了软件设计平台空间、解空间以及问题空间
例如结构化软件范型乃是由于上世纪60年代计算机基础能力(计算、存储与外设)的快速发展和软件危机的出现而导致人们对基础的程序设计方法与语言的科学思考而产生的,
它以结构化的程序抽象较好地协调了软件开发的平台空间与解空间,解空间和平台空间匹配较好,但问题空间和解空间差距大
而面向对象软件范型则进一步发展了从宏观角度控制复杂性的手段, 如关注点分离、信息隐蔽、多态等, 并强调将问题空间纳入软件设计的范畴,
提出与问题结构具有良好对应关系的面向对象程序抽象与支撑机制, 从而协调了软件开发的问题空间和解空间,平台空间也发展了中间件和容器以支持对象在计算平台的实现
又如,关系型数据库以关系模型抽象很好地平衡了来自平台空间的性能需求和来自认知空间的易用性需求,取得了巨大成功;
但面临非结构化、海量数据的应用问题,数据库不再采用严苛的关系模型,转而使用更为灵活的键值对结构、文档模型、图模型等更为契合问题空间的抽象,
同时给出这些抽象在大规模分布计算平台的高效实现。
又如,关系型数据库以关系模型抽象很好地平衡了来自平台空间的性能需求和来自问题空间的易用性需求,取得了巨大成功;
但面临非结构化、海量数据的应用问题,数据库不再采用严苛的关系模型,转而使用更为灵活的键值对结构、文档模型、图模型等更为契合问题空间的抽象,
同时给出这些抽象在大规模分布计算平台的高效实现。
\subsection{我国的软件学科与产业}
我国软件学科起步较早,在几代科学家的不懈努力下取得了一系列的成果。例如,
在60年代中期就自主研发了ALGOL等语言的编译系统70年代初研发了XT系列操作系统。
\subsection{我国的软件学科与产业 ----- 需要更新,教育+产业}
我国软件学科起步较早在几代科学家的不懈努力下取得了一系列的成果。例如在上世纪60 年代中期就自主研发了ALGOL等语言的编译系统70年代初研发了XT系列操作系统
80-90年代在银河系列巨型机上配备了操作系统、高级语言编译程序等系统软件。
在软件相关的基础研究方面,八十年代初,唐稚松提出以时序逻辑作为软件开发过程的统一 基础,并着手建立 XYZ 系统
杨芙清领导了大规模、综合性的软件工程环境青鸟系统的研究和开发。徐家福等在软件自动化技术方面做了一系列的工作。
进入新世纪以来,梅宏和吕建等提出面向开放互联网环境的新软件范型网构软件及其支撑技术。
在软件相关的基础研究方面,我国在程序理论、算法理论等方面取得了一批基础性的成果,提出了以时序逻辑作为软件开发的统一基础
八十年代后,我国学者在大规模综合性的软件工程环境、软件自动化技术方面做了一系列的工作。
进入新世纪以来,提出面向开放互联网环境的新软件范型网构软件及其支撑技术体系
当前,从软件领域相关的重要学术期刊和会议上发表的论文及其引用的计量指标来看,
近年来我国软件学科在总量上进步迅速,已仅次于美国。
@ -182,7 +189,7 @@
2018年我国软件和信息技术服务企业数超过3.7万家从业人数达到643万人软件业务规模(包括 软件产品、信息技术服务、嵌入式系统软件)达到6.3万亿元。
在电子商务、社交网络、安防监控、民用无人机等方面的软件应用进入世界先进行列。
然而,总体来看,我国软件产业大而不强的问题仍然十分突出。在操作系统、程序设计语言、数据库管理系统和大数据处理平台等关键系统软件方面受制于人;
在不依赖市场区隔的关键软件服务技术创新方面仍落后于美国
在不依赖市场区隔的关键软件服务技术创新方面仍落后于发达国家
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -190,21 +197,20 @@
\section{发展趋势与挑战问题}
\subsection{软件成为基础设施}
当前,计算的泛在化和软件定义一切的发展趋势使得软件成为信息社会的基础设施,软件学科也进入了一个新的阶段。
当前,计算的泛在化和软件定义一切的发展趋势使得软件成为信息社会的基础设施,软件学科也进入了一个新的发展阶段。
所谓“计算的泛在化”是指计算变得无处不在而又无迹可寻。万物数字化、万物互联使得计算无处不在,形成了“人-机-物” 三元融合的发展趋势。计算自然融入人类 生产、生活活动的环境和过程之中,无需关注,不着痕迹。
所谓“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。而“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源,包括各种数字化机电设备和可传感物体对象在内的各类物理资源,乃至可通过激励机制调配的人力资源。
软件的基础设施地位具体表现为四个方面。首先,一大批基础软件本身就是信息基础设施,支撑各种应用软件的运行。
其次,一大批嵌入式软件已成为掌控并支撑物理基础设施运行的关键系统。
第三,一大批应用软件及其所提供的服务已成为信息社会不可或缺的基础资源与设施。
最后,从软件产业整体的角度看,随着传播和互联的渗透发展,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,
大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
软件的基础设施地位具体表现为两个方面。一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑。另一方面,软件正在 “融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着以互联网和其他网络(包括电信网、移动网、物联网等)的不断交汇融合,软件正在对传统物理世界基础设施和社会经济基础设施进行重塑和重构,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式升级、生产关系变革、产业升级、新兴产业和价值链的诞生与发展的重要引擎。从经济社会整体发展的角度,计算成为了人类与物理世界互动的中介,软件对人类社会的运行和人类文明的发展进步起到重要支撑作用。
%首先,一大批基础软件本身就是信息基础设施,支撑各种应用软件的运行。其次,一大批嵌入式软件已成为掌控并支撑物理基础设施运行的关键系统。第三,一大批应用软件及其所提供的服务已成为信息社会不可或缺的基础资源与设施。最后,从软件产业整体的角度看,随着传播和互联的渗透发展,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
在此宏观趋势下,软件学科的边界日益拓展、内涵不断深化。
\subsection{软件学科的拓展}
如前所述,作为一门方法论学科,软件学科的拓展来自软件应用范围扩张、计算平台的泛化和软件方法技术本身发展三个方面的驱动。
软件学科的拓展来自软件应用范围扩张、计算平台的泛化和软件方法技术本身发展三个方面的驱动。
从软件应用范围扩张的角度看,计算日益变得无处不在,“人-机-物”三元融合不断深入。
软件的角色也从负责应用过程中孤立、确定的信息处理环节,转变为负责定义并协同整个应用涉及的“人-机-物”各类资源,实现应用价值。
@ -215,28 +221,27 @@
软件定义技术为这个“人-机-物”融合的平台提供可编程计算抽象。
软件作为解决方案,在这个计算平台之上利用数据资源,协同人机物,实现应用价值;同时也通过在这个平台上提供服务,并进一步积累数据,不断拓展这个计算平台。
从软件方法技术发展的角度看,软件的基本形态从计算机硬件的附属品到独立的软件产品,转变到云化的和泛在的软件服务。%,转变为无处不在而又无迹可寻的泛在服务。
软件所实现的逻辑推理形式在基于规则的演绎之上发展出数据驱动的归纳,统计机器学习技术就是后者的典型表现。
软件开发的模式经历了从实现数学计算到模拟物理世界,再到虚实融合创造的转变。
对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上考虑软件及其利益相关者群体的竞争、协作等社会性特征。
从软件方法技术发展的角度看,软件的基本形态从计算机硬件的附属品到独立的软件产品,转变到云化和泛在的软件服务,%,转变为无处不在而又无迹可寻的泛在服务。
软件形态的耦合边界趋于模糊,开发运维一体化成为趋势;
面向计算平台和应用需求变化和拓展的软件演化成为软件的常态,元级结构以及在基于规则的演绎之上发展出数据驱动的归纳,将成为超大规模软件体系结构的重要元素,各种场景的适应和成长是软件运行支撑发展焦点;
软件开发经历了从实现数学计算到模拟物理世界,将拓展到虚实融合创造的转变,人类空间和赛博空间的虚实互动促进着软件方法技术向社会-技术系统Socio-technical System发展对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上,转换为考虑软件及其利益相关者群体的竞争、协作等社会性特征;软件度量和质量评估的科学观察对于技术的发展和软件生态的发展具有显著意义
%在元级方法论层面,正从以还原论为主向系统论发展,软件作为解决方案越来越多地被视为开放环境中的复杂适应系统,而不是封闭规约下的确定行为系统。
\subsection{软件科学的新理解}
在软件作为基础设施、软件定义一切的背景下,软件进一步成为构造开放环境下复杂系统的关键。在研究方法学的层面上,认识软件学科的内涵需要有新的视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以人为中心的价值观、以及关注群体协作平衡的生态观。
在软件作为基础设施、软件定义一切的背景下,软件进一步成为构造开放环境下复杂信息系统的关键。在研究方法学的层面上,认识软件学科的内涵需要有新的视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以人为中心的价值观、以及关注群体协作平衡的生态观。
\subsubsection{系统观}
所谓软件学科的系统观,有三层含义。第一层含义是系统工程。也就是说,软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注整个“人-机-物”融合系统的价值实现。
%所谓软件学科的系统观,有三层含义。第一层含义是系统工程。也就是说,软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注整个“人-机-物”融合系统的价值实现。
%软件定义一切的趋势使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”,是实现应用价值的整体解决方案。
%
第二层含义是复杂系统。现代软件系统具有前所未有的规模和内部复杂性,
%体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在
且其所处环境的具有开放性,并面临由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭规约下的确定行为系统向开放环境中的复杂自适应系统、从单体系统向系统之系统转变。
%
第三层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法。
% 第二层含义是复杂系统。现代软件系统具有前所未有的规模和内部复杂性,
%体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在且其所处环境的具有开放性,并面临由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭规约下的确定行为系统向开放环境中的复杂自适应系统、从单体系统向系统之系统转变。
%第三层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法。
所谓软件学科的系统观,有三层含义。
第一层含义是复杂系统。现代软件系统具有前所未有的规模和内部复杂性,且所处的环境具有开放性,并面临由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭规约下的确定行为系统向开放环境中的复杂自适应系统、从单体系统向系统之系统转变。第二层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法,超越还原论。第三层含义是系统工程。软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注“人-机-物”融合的整个系统的价值实现。
以系统观看软件学科发展,软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统Socio-technical System。人机物融合的软件系统,其复杂性本身就呈现在系统乃至系统之系统的层面上,综合性和系统性也愈来愈强。%系统观要求软件科学体系需超越传统还原论的思维藩篱。
以系统观看软件学科发展,软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统。人机物融合的软件系统,其复杂性本身就呈现在系统乃至系统之系统的层面上,综合性和系统性也愈来愈强。%系统观要求软件科学体系需超越传统还原论的思维藩篱。
%
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件设计和优化初显端倪,在一些特定领域获得很大成功。
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体Agent的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件设计和优化初显端倪,在一些特定领域获得很大成功。
%人们对于数据驱动的软件的设计,不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件。这种%
例如,基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。
然而,总体来看,这些研究仍较为初步,未能形成体系化的软件系统论和软件系统工程方法。
@ -267,21 +272,21 @@
首先,“软件定义+计算思维”将成为每个人解决现实问题、满足自身需求的新范式。未来的人类社会及日常生活的方方面面都将以软件定义的人机物融合应用的方式来实现。实现用户需求的应用软件将越来越多地以最终用户编程的方式面向应用场景按需构造。因此,最终用户必须具备基于计算思维的问题解决方案规划和构造能力。同时,这也要求我们为支持人机物融合的泛在服务软件提供通用的编程抽象(包括编程模型和语言),支持这种最终用户编程。
其次,适应泛在化、专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要具备面向不同专用硬件和平台的高效定制和裁剪能力。
其次,适应泛在化、专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要不依附于硬件的长期生长演化能力,并具备面向不同专用硬件和平台的高效定制和裁剪能力。
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据定义(代码也可以看作一种数据)的方式进行表示,并通过数据驱动的方式实现自演化和自生长。
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据驱动(代码也可以看作一种数据)的方式进行表示,并实现自演化和自生长。
最后,软件与人将在不断汇聚的群体智慧中实现融合发展。软件的覆盖面越来越广、渗透性越来越强,最终用户对于软件的依赖也越来越强。由此,软件所能获得的关于用户行为和反馈的数据越来越全面和丰富,并在此基础上形成越来越强的群体智慧。这种群体智慧注入软件后又将服务于每个最终用户,使得他们能够在各种应用场景中以更加智能化和个性化的方式满足自身的需求,从而使得软件在使用中越来越有“灵性”和“人性”。未来的软件学科及相关研究需要摈弃“人”与“软件”二元分离的思维定式,更加自觉的考虑人机共融,不仅考虑“人因”,更要考虑“群智”。
%
\subsubsection{价值观}
如前所述,软件在整个系统中角色定位日益从负责应用过程中的信息处理环节转变为实现应用价值的主要载体。
软件在整个系统中角色定位日益从负责应用过程中的信息处理环节转变为实现应用价值的主要载体。
这就要求对软件质量的理解从以软件制品为中心传统的质量观转变为以人为中心的价值观。
传统的软件质量观下,人们主要关注软件制品的正确性、高效性、易用性等外部质量属性和易维护性、易移植性等内部质量属性。这些质量属性一般是客观的。
软件的价值观是建立在传统的软件制品质量属性基础上,强调用户体验,强调软件系统的应用对人类价值的实现。软件通过一系列价值要素体现了主观的人类价值。
除了可以用经济价值衡量的软件质量以外,尤其需要强调软件的可信性、安全性、
%持续性
和伦理观等价值要素。
伦理和持续性等价值要素。
% 传统的软件质量观以软件制品为中心,人们主要通过客观度量软件系统来评估软件。
% 新时代下,软件制品的内外部质量要求进一步强化和扩展。
@ -300,16 +305,16 @@
%软件作为信息化社会的的基础设施,其可信性对于整个社会系统至关重要。
%软件系统的可信性,要求在软件开发、运行、维护、使用等过程采取有效的措施和方法确认其满足人们的普遍要求和期望,它体现了新时代软件的价值取向。
软件系统的可信性,包括软件本身可信和行为可信两个方面。
软件本身可信,指的是软件身份可信和能力可信,即:软件开发过程提供可信证据(如内部质量和外部质量)进行自证
软件本身可信,指的是软件身份可信和能力可信,即:软件开发过程提供可信证据(如内部质量和外部质量)进行自证
软件行为可信,指的是软件行为可追踪记录、不可更改,即:软件运行过程提供监控以控制其对周遭的影响,使得包含该软件在内的整个系统的对外表现符合用户要求。
软件形日趋多样,加剧了软件可信面临的挑战。
软件形日趋多样,加剧了软件可信面临的挑战。
%
% 2安全性
%
安全性要求软件为人类活动和生存环境提供必要的安全保障包括系统安全Safety和信息安全Security。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害信息安全是指能有效防控各类的非法获取、传播和使用。
安全性要求软件为人类活动和生存环境提供必要的安全保障包括系统安全Safety和信息安全Security。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害信息安全是指能有效防控各类信息的非法获取、传播和使用。
%软件信息安全保障失效的后果之一就是系统安全故障因此本书将两种安全性合二为一统称为安全性Safety\&Security。传统软件质量观将安全视作系统质量的一部分强调软件个体的安全性。随着人机物融合软件系统已融入人类社会并与人类无缝交互。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播
软件作为基础设施,参与并掌控了很多关键领域的资源,其安全性威胁会给整个系统带来致命的威胁。因此,安全性这一质量属性随着软件成为基础设施的现状变得愈发重要。
软件作为基础设施,描述并掌控了很多关键领域的资源,其安全性威胁会给整个系统带来致命的威胁。因此,安全性这一质量属性随着软件成为基础设施的现状变得愈发重要。
%
% 4持续性
@ -324,11 +329,13 @@
%
%作为人类价值载体,软件行为体现了人类价值观;由于软件无迹可寻,导致人类价值观又通过软件影响人类社会。因此,
软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理观。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终体现于软件系统的具体行为。因此,软件系统的伦理观,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理观。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终在软件系统的具体行为中体现。因此,软件系统的伦理观,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
%软件支撑的基础设施服务,为满足各类应用快速增长、新技术不断涌现的需求,需要具有开放扩展能力,即能集成各种异构的技术及系统,支持各类软件制品的即时加载/卸载,对内部状态及外部环境变化的感应、自主响应以及调控机制,以及个性化服务的定制等。显然,这种开放体系架构常常引入系统设计的脆弱性和质量隐患,从而给持续提供服务带来挑战。
软件系统成为支撑社会经济运行的基础设施需具有持续提供服务的能力。软件系统提供服务的可持续性Sustainability指的是在持续不间断运行、维护和发展过程中面对各种突发异常事件仍能提供令人满意的服务的能力。软件支撑的基础设施服务为满足各类应用快速增长、新技术不断涌现的需求需要具有开放扩展能力即能集成各种异构的技术及系统支持各类软件制品的即时加载/卸载,对内部状态及外部环境变化的感应、自主响应以及调控机制,以及个性化服务的定制等。
% \subsubsubsection{价值观下,软件方法学的关键科学问题}
% 软件价值观强化了可信性、安全性、持续性等具有新时代特色的价值要素,这些价值要素与软件开发运行维护过程的交融将经历一个长期的阶段,其带来的关键科学问题在于四个方面:
%
@ -351,7 +358,7 @@
%
\subsubsection{生态观}
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。
%生态化是软件的强大渗透力的必然结果:一方面软件活动延伸到了个体、群体和社会;另一方面软件所涉及的各种元素之间存在越来越多的依赖性、相关性和相互作用。
% \subsubsection{软件生态系统}
% “人-机-物”三元融合的新型应用模式涉及到广大社会群体,涉及面广,分工精细,不仅需要术业专攻的各种企业和个体参与,也使得它们可以根据其本身特点和业务诉求参与到开发、应用及其支撑的各个环节,从而形成联合生态。
@ -365,14 +372,15 @@
首先,多元素交互(开发者、用户、代码、项目、社区、企业等)是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性(因为核心参与者——开发者和用户——都是社会体)。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
其次,生态系统的关键元素是个体、代码和项目/社区,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,形成各种供应链,而个体、代码和项目之间因为彼此依存也存在各种影响。生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
其次,生态系统的关键元素是个体、代码和项目/社区,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,网状的依赖形成各种供应链,而个体、代码和项目之间因为彼此依存也存在各种影响。生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
第三,生态系统是由群体智能和计算机智能交互并融合而实现的。群体智能体现为分布在全球的开发者和用户,计算机智能体现为支撑分布式开发和使用的工具和基础设施(计算机辅助支持和人机交互)。群体智能(体现了众多的个体认知的汇聚,并涵盖商业智能和宏观调控的战略智能等)通过计算机智能凝炼为代码和产品,计算机智能支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。
第三,生态系统是由人类智能和机器智能交互并融合而实现的。人类智能体现为分布在全球的开发者和用户;机器智能体现为支撑分布式开发和使用的工具与基础设施,支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。通过众多的个体认知的汇聚,以及商业和宏观调控角度的战略调控,人类智能和机器智能相互协作、补充,并向群体混合智能方向发展。
%生态系统是由群体智能和计算机智能交互并融合而实现的。群体智能体现为分布在全球的开发者和用户,计算机智能体现为支撑分布式开发和使用的工具和基础设施(计算机辅助支持和人机交互)。群体智能(体现了众多的个体认知的汇聚,并涵盖商业智能和宏观调控的战略智能等)通过计算机智能凝炼为代码和产品,计算机智能支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。
% \subsubsection{生态观下的软件学科的关键科学问题}
软件从过去的个体作坊开发,到不同组织内或组织间参与的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战,包括:面临高昂的学习成本,个体开发者如何学习并加入复杂项目和生态?复杂生态中群体如何协作,协作行为如何发展?大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?等等。
软件从过去的个体作坊开发,到不同组织内或组织间人员混合参与的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战,包括:面临高昂的学习成本,个体开发者如何学习并加入复杂项目和生态?复杂生态中群体如何协作,协作行为如何发展?大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?等等。
%
% 第一,个体开发者学习成本进一步增大。
@ -393,25 +401,43 @@
%
\subsection{主要挑战与研究问题}
在此软件学科发展的新阶段,可以上述系统观、形态观、价值观和生态观的新视角,展望本学科的主要挑战和研究问题:
\begin{itemize}
\item 在软件理论方面,需研究如何应对大规模的数据与计算;如何保证复杂软件系统的正确性、可靠性、安全性;针对新型计算机的硬件架 构与新的计算平台,如何建立其理论分析基础等。
软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成的有机整体,其中软件范型是软件学科的核心内容范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
软件理论和软件语言方面将着力解决适应人机物融合的软件范型这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算)下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
软件构造方法将面向人机物融合场景的“软件定义”,软件需要在万物互联的平台上开发、运行、并持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。
软件运行支撑需要满足软件作为社会基础设施的规模、效能、持续、演进等诸多关键需求,并适应人机物融合的各类资源和应用场景的管理和实现。这将集中反映在未来的泛在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键问题。
软件度量和质量评估是软件学科的科学观察、工程构造相交融的重要方面。未来的重要变化是在复杂系统和软件生态层面的科学观察并以此为基础开展在软件开发和运行层面的持续发展。以各类软件大数据为核心的度量抽象将揭示
软件生态如何形成、如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作。数据驱动和规则驱动将在软件质量与安全保障上发挥重要的作用。
“数据为中心”是人机物融合时代的最为突出的特征,数据工程和数据管理是未来软件构造和运行支撑的共性沉淀。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。
软件学科的发展呈现了纵横交错的发展态势,即共性沉淀和领域牵引相辅相成的格局,这在人机物融合时代复杂多变的应用和开放平台上将更为显现。在不同的应用领域,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究各领域的环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题,在共性方法上发展领域特定方法,并反馈于共性方法的发展,从而系统综合地把握学科未来。
软件学科的发展离不开软件教育体系、内容、方法、手段的变革。软件教育需要适应“软件定义一切”普及教育的需求,还要在顺应人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育上有新发展。
%在此软件学科发展的新阶段,可以上述系统观、形态观、价值观和生态观的新视角,展望本学科的主要挑战和研究问题:
%\begin{itemize}
%\item 在软件理论方面,需研究如何应对大规模的数据与计算;如何保证复杂软件系统的正确性、可靠性、安全性;针对新型计算机的硬件架 构与新的计算平台,如何建立其理论分析基础等。
%为此,需要重点研究
\item 在软件语言方面,需研究如何通过对领域和应用问题的抽象,开发有效的领域特定语言;如何支持多范式程序设计,特别是加强大数据时代语言对数据处理的支持;如何开发人机物融合的泛在混合系统的编译技术;以及如何构建程序语言的安全性保障机制等。
\item 在软件开发方法方面,需研究人机物融合复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等新方法和新技术。
\item 在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键技术问题。
\item 在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。
\item 在人机物融合的领域特定软件系统构造方面,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题。
\item 在软件质量与安全保障方面,需重点研究数据驱动的智能软件系统质量保障、人机物融合场景下的软件系统可信增强、大规模复杂系统安全缺陷检测与保障以及物联网软件安全保障等挑战性问题。
\item 在软件生态方面,需要研究并阐明各类软件生态如何形成,如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作等。
\item 最后,在软件教育方面,需研究面向不同受众对象和认知水平的普及教育、反映人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育,给出适应软件学科发展的人才培养理念及教育方法。
\end{itemize}
%\item 在软件语言方面,需研究如何通过对领域和应用问题的抽象,开发有效的领域特定语言;如何支持多范式程序设计,特别是加强大数据时代语言对数据处理的支持;如何开发人机物融合的泛在混合系统的编译技术;以及如何构建程序语言的安全性保障机制等。
%\item 在软件开发方法方面,需研究人机物融合复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等新方法和新技术。
%\item 在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键技术问题。
%\item 在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。
%\item 在人机物融合的领域特定软件系统构造方面,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题。
%\item 在软件质量与安全保障方面,需重点研究数据驱动的智能软件系统质量保障、人机物融合场景下的软件系统可信增强、大规模复杂系统安全缺陷检测与保障以及物联网软件安全保障等挑战性问题。
%\item 在软件生态方面,需要研究并阐明各类软件生态如何形成,如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作等。
%\item 最后,在软件教育方面,需研究面向不同受众对象和认知水平的普及教育、反映人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育,给出适应软件学科发展的人才培养理念及教育方法。
%\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{政策建议}
\section{政策建议 ----没有更新}
%\section{资助机制与政策建议}
%在当前人机物三元融合往纵深发展、软件定义一切成为大势所趋的新时代,往为促进我国软件学科和软件产业的健康
@ -453,8 +479,8 @@
\section{小结}
经由七十余年的发展,计算机软件已经成为信息社会不可或缺的基础设施,支撑着国计民生,承载着现代文明。
本书无意也不能涵盖软件学科的所有方面,而科学研究的探索本质也决定了我们并不能确定地指出软件学科未来应该做什么、怎么做
本报告仅尽我们所知,力图澄清软件学科的定位、回顾其发展历程、梳理其发展规律,进而讨论其所面临的发展机遇与挑战,给出政策建议,以供参考。
本书目的是希望尽力勾画出在当前认知下软件体系及发展态势,指出面临的挑战和未来的研究方向。如未做到,乃能力及知识所限,请读者见谅
%无意也不能涵盖软件学科的所有方面,而科学研究的探索本质也决定了我们并不能确定地指出软件学科未来应该做什么、怎么做。本报告仅尽我们所知,力图澄清软件学科的定位、回顾其发展历程、梳理其发展规律,进而讨论其所面临的发展机遇与挑战,给出政策建议,以供参考。

View File

@ -5,19 +5,19 @@
《计算机科学技术百科全书》中对软件给出了如下描述~\cite{张效祥2005计算机科学技术百科全书}
\begin{center}
\begin{minipage}{.8\textwidth}
\kaishu 细言之,软件一词具有三层含义。一为个体含义,即指计算机系统中的单个程序及其文档;二为整体含义,即指在特定计算机系统中所有上述个体含义下的软件的总体三为学科含义,即指在研究、开发、维护以及使用前述含义下的软件所涉及的理论、原则、方法、技术所构成的学科。在这种含义下,软件宜称为软件学,但一般仍称作软件。
\kaishu 细言之,软件一词具有三层含义。一为个体含义,即指计算机系统中的单个程序及其文档;二为整体含义,即指在特定计算机系统中所有上述个体含义下的软件的总体;三为学科含义,即指在研究、开发、维护以及使用前述含义下的软件所涉及的理论、原则、方法、技术所构成的学科。在这种含义下,软件宜称为软件学,但一般仍称作软件。
\end{minipage}
\end{center}
上述描述主要是从计算机系统中与硬件相对应的角度,给出了软件的一种存在形式的描述。而从软件历史渊源看,它本质上是刻画完成给定应用目标的\index{可计算函数}可计算函数~\cite{Turing:1937:ComputableNumbers},这构成了软件的实质内容。在本书中,我们将软件\index{软件}视作是\emph{以计算为核心手段实现应用目标的解决方案}。软件属于人工制品,以适应其所处环境的方式完成应用目标;更进一步,它是一种计算的逻辑制品,既有图灵可计算性~\cite{Turing:1937:ComputableNumbers, Cooper:2002:CT:961908}和计算复杂性~\cite{Cook:1983:OCC:358141.358144}的刚性约束,同时又有通用图灵机模型给予的无与伦比的计算解空间。这也造就了软件成为人类认识世界、改造世界的文明发展的承载。
上述描述主要是从计算机系统中与硬件相对应的角度,给出了软件的一种存在形式的描述。而从软件历史渊源看,它本质上是刻画完成给定应用目标的\index{可计算函数}可计算函数~\cite{Turing:1937:ComputableNumbers},这构成了软件的实质内容。在本书中,我们将软件\index{软件}视作是\emph{以计算为核心手段实现应用目标的解决方案}。软件属于人工制品,以适应其所处环境的方式完成应用目标;更进一步,它是一种计算的逻辑制品,既有图灵可计算性~\cite{Turing:1937:ComputableNumbers, Cooper:2002:CT:961908}和计算复杂性~\cite{Cook:1983:OCC:358141.358144}的刚性约束,同时又有通用图灵机模型给予的巨大的通用性和灵活性。正是图灵机所具备的认识论意义上的强大表达和计算能力,提供了一种逼近人类认知的解空间,造就了软件成为人类认识世界、改造世界的文明发展的承载。
软件科学与工程学科以下简称软件学科是以软件为基本研究对象的人工科学或曰“人工制品科学”Science of Artificial~\cite{Simon:1996:SA:237774},包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统。回顾计算机科学技术的发展历史从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主获奖的有22次获奖还有4次数据库获奖。 因此,在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、关键问题、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略提供基础
软件科学与工程学科以下简称软件学科是以软件为基本研究对象的人工科学或曰“人工制品科学”Science of Artificial~\cite{Simon:1996:SA:237774},包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统。回顾计算机科学技术的发展历史从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主获奖的有22次还有4次数据库获奖。 因此,在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、主要线索、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略研究提供背景
\section{软件发展简史}
本节我们试图从 “编程”表达解决方案和 “抽象”实现复杂性控制两个基本视角简要回顾软件发展历史,为下节讨论软件学科发展基本规律提供背景。
\subsection{人力/机械计算时代}
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\ref{fig:1-1}的设计中蕴含了用程序方式编织特定图案的思想。类似的设备晚至1805年才在欧洲出现即所谓Jacquard's Loom参见图\ref{fig:1-2}。1842年人类的第一位程序员Ada Lavelace为Babagge的分析机写了第一个程序功能是计算Bernoulli数参见图\ref{fig:1-3}和图\ref{fig:1-4})。可见早在机械计算时代,可编程的思想已经产生了萌芽。
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\ref{fig:1-1}\footnote{南宋《耕织图》}的设计中蕴含了用程序方式编织特定图案的思想。类似的设备晚至1805年才在欧洲出现即所谓Jacquard's Loom参见图\ref{fig:1-2}\footnote{http://www.columbia.edu/cu/computinghistory/jacquard.html}。1842年人类的第一位程序员Ada Lavelace为Babagge的分析机写了第一个程序功能是计算Bernoulli数参见图\ref{fig:1-3}\footnote{https://en.wikipedia.org/wiki/Analytical\_Engine}和图\ref{fig:1-4}\footnote{https://computerhistory.org/blog/ada-lovelace-day/})。可见早在机械计算时代,可编程的思想已经产生了萌芽。
\begin{figure}[htbp]
\centering
@ -50,42 +50,50 @@
\end{minipage}
\end{figure}
Computer一词历史上出现在1613年用来指完成演算或计算的人员。这种说法一直持续到19世纪末后第二次工业革命时期产生了用来演算的机器为止\footnote{https://www.computerhope.com/issues/ch000984.htm}。著名的哈佛大学天文台在1877年至1919年期间雇佣了一批妇女作为处理天文数据的技术工人。在电子计算机出现之前的人力和机械计算时代Mathematic Tables项目是当时最大最复杂的计算项目,该项目的关键思想就是利用编程完成特定函数的计算。Gertrude Blanch女士作为“数学的导演”和“计算的经理”设计了人力计算团队执行的“算法”其算法设计成为此后数十年超越函数的标准计算思路。逐渐地人们发明了表达编程的记号和方法例如1921年Lillian和Frank Gilbreth的过程图Process Charts参见图1-5后来的程序流图与之形式十分类似又如1940年IBM的W.J. Eckert提出的打孔卡参见图1-6。我们可以看到计算和编程是紧密相关的而编程的结果事实上是给出了一种计算应用数学计算的解决方案它可以由人力计算或机械计算完成。然而在人力/机械计算时代,还未形成通用计算和编程的思想。
Computer一词历史上出现在1613年用来指完成演算或计算的人员。这种说法一直持续到19世纪末后第二次工业革命时期产生了用来演算的机器为止\footnote{https://www.computerhope.com/issues/ch000984.htm}。著名的哈佛大学天文台在1877年至1919年期间雇佣了一批妇女作为处理天文数据的技术工人。在电子计算机出现之前的人力和机械计算时代Mathematic Tables项目是最大最复杂的计算项目该项目的关键思想就是利用编程完成特定函数的计算。Gertrude Blanch女士作为“数学的导演”和“计算的经理”设计了人力计算团队执行的“算法”其算法设计成为此后数十年超越函数的标准计算思路。逐渐地人们发明了表达编程的记号和方法例如1921年Lillian和Frank Gilbreth的过程图Process Charts参见图1-5后来的程序流图与之形式十分类似又如1940年IBM的W.J. Eckert提出的打孔卡参见图1-6。我们可以看到计算和编程是紧密相关的而编程的结果事实上是给出了一种计算应用数学计算的解决方案它可以由人力计算或机械计算完成。然而在人力/机械计算时代,还未形成通用计算和编程的思想。
\subsection{电子计算时代}
上世纪四十年代出现了电子计算机。计算机先驱们相继研制了Colossus1943、ENIAC1946、EDSAC1949和Mark I1949等计算机~\cite{Aspray:1986:IDC:1435661.1436778}。EDSAC作为第一台存储程序结构的电子计算机开启了通用计算的时代。此时的程序通过一种微开关的形式加载到机器硬件上。五十年代后出现了用户和计算机之间的简单交互。Grace Hopper在1951年和1952年为UNIVAC I编写了A-0系统这是第一个电子计算机的编译器~\cite{Ridgway:1952:CR:800259.808980}。从今天的角度看A-0更像现代编译器概念的Loader或Linker可以认为是第一个系统软件。UNIVAC I的程序由一组子程序和参数序列组成。两年后-2系统成为了第一个开源软件。早期的驻留管理程序将程序从纸带或者穿孔卡上读入到计算机中进行加载这种技术直接导致了历史上第一个商用操作系统即1956年推出的IBM 704的操作系统。五十年代后人们开始意识到1936年提出的图灵机模型的理论意义图灵机由此成为计算机科学发展的理论基础。通用图灵机和通用计算使人们进一步认识到可编程是计算的基本属性人们通过编写程序使得计算机完成指定的任务。
1936年Alan Turing在他的著名论文“On computable numbers, with an application to the Entscheidungs problem”提出了图灵机,开创了计算理论。
上世纪四十年代出现了电子计算机。计算机先驱们相继研制了Colossus1943、ENIAC1946、EDSAC1949和Mark I1949等计算机~\cite{Aspray:1986:IDC:1435661.1436778}。EDSAC作为第一台存储程序结构的电子计算机开启了通用计算的时代。此时的程序通过一种微开关的形式加载到机器硬件上。五十年代后出现了用户和计算机之间的简单交互。Grace Hopper在1951年和1952年为UNIVAC I编写了A-0系统这是第一个电子计算机的编译器~\cite{Ridgway:1952:CR:800259.808980}。从今天的角度看A-0更像现代编译器概念的Loader或Linker可以认为是第一个系统软件。UNIVAC I的程序由一组子程序和参数序列组成。两年后-2系统成为了第一个开放源码的软件。早期的驻留管理程序将程序从纸带或者穿孔卡上读入到计算机中进行加载这种技术直接导致了历史上第一个商用操作系统即1956年推出的IBM 704操作系统。五十年代后人们开始意识到1936年提出的图灵机模型的理论意义图灵机由此成为计算机科学发展的理论基础。通用图灵机和通用计算使人们进一步认识到可编程是计算的基本属性人们通过编写程序使得计算机完成指定的任务。
\subsection{软件和软件工程的出现}
“软件”一词最早出现在1953年兰德公司R.R. Carhart的报告中用来说明讨论可靠性时与硬件相对应的“人因”。而人们现在通常理解中的“软件”这一术语来自John W. Tukey在1958年所发表的论文~\cite{Tukey:1958:Software},文中指出 “软件由精心编写的解释程序、编译器和自动编程等组成它们至少像电容器、晶体管、电线和磁带等现代计算机硬件一样重要”。软件形成了独立形态。1968年或许是巧合出现了两个软件发展史上的重大事件。这两个事件的背景都与IBM著名的IBM S/360系统相关。
第一个事件是软件与硬件的解绑~\cite{Humphrey:2002:SUP:513126.513132}。早期的软件依附在硬件之上解决应用问题此时的计算机系统中硬件和软件是相互捆绑的。所谓“捆绑”是指计算机公司如IBM在收费上采取只考虑硬件价格而软件和系统服务免费的策略。这在当时对于用户是很有吸引的也增强了公司的竞争力。到1964年时情况发生了变化IBM发布了新的IBM S/360系统其目标是用户能够升级硬件系统而不需要替换或改变它们的应用程序。这在事实上形成了一种把应用解决方案剥离出硬件系统的技术可行性。而稍后RCA也宣布了其新的Spectra 70系统与IBM S/360兼容。这使得IBM难以阻止RCA在市场上“免费”使用其软件。1968年IBM宣布了其软件和硬件系统的解绑。此后软件从计算机系统硬件中剥离出来获得了可以独立发展的空间有机会产生独立的商业和竞争模式。可以看到除了商业上的反垄断和市场竞争因素外软件本质上所具备的“解决方案”的独立性和计算平台抽象使得解绑具备了历史必然性和技术可行性。之后的发展以Bill Gates创立Microsoft和Larry Ellison创立Oracle为标志软件成为独立产品并形成巨大产业应用领域从以科学计算和商业计算不断扩大逐渐从作为硬件附属品的软硬一体化阶段过渡到软件产品化、产业化阶段。人们逐步认识到软件是计算机系统的灵魂其共性沉淀形成的系统软件向下管理计算机系统的各类资源向上满足用户对计算机系统的应用需求
自Von Neumann计算机诞生之初存储程序原理即表明了程序在计算中的核心位置。程序也被作为研究对象促进的计算机学科的发展。早期最重要的系统成果有两个方面一是从机器语言到汇编语言到高级语言及解释和编译技术的出现人们开发程序的生产率得到了迅速进步二是为了发挥硬件性能、改善人机交互、有效管理资源而产生了操作系统人们运行程序的可靠性和成本得以显著降低。围绕程序是什么、怎么写、怎样运行的研究随着计算机的发展形成了计算机学科的重要分支数据结构、算法理论和程序理论形成了学科的重要基础计算机应用领域开始拓展。计算机学科在世界范围内受到了重视一些高校先后设置了计算机系
第二个事件是软件工程\index{软件工程}的提出。计算机能力的快速提高和软件复杂性增加导致了所谓的“软件危机”现象。典型的案例是IBM S/360的操作系统OS/360的进度、开销和可靠性均不尽人意。北大西洋公约组织NATO在1968年举行了首次软件工程会议~\cite{Naur:1969:SER:1102020}。在这次会议上专家们首次提出需要与其他领域的工程方法一样系统化地进行软件开发。正如Margaret Hamilton在开发阿波罗在轨飞行和导航系统项目中所明确指出的“我努力使软件具有应有的地位使得构造软件的活动受到应有的尊重因而我开始用软件工程将其与硬件和其他类型的工程区分开来成为整个系统工程的一部分”~\cite{Cameron:2018:ComputingEdge}。软件工程的出现激活了软件发展的巨大活力。这一史实也提示了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
“软件”一词最早出现在1953年兰德公司R.R. Carhart的报告中用来说明讨论可靠性时与硬件相对应的“人因”。而人们现在通常理解中的“软件”这一术语来自John W. Tukey在1958年所发表的论文~\cite{Tukey:1958:Software},文中指出 “软件由精心编排的解释程序、编译器以及自动编程的其他方面组成它们至少像电容器、晶体管、电线和磁带等现代计算机硬件一样重要”。软件的概念逐渐地形成并清晰起来具有了形态程序和编程上早期认识。1968年或许是巧合出现了两个软件发展史上的重大事件。这两个事件的背景都与IBM著名的IBM S/360系统相关。
第一个事件是软件与硬件的解绑~\cite{Humphrey:2002:SUP:513126.513132}。早期的软件依附在硬件之上解决应用问题软件完全是针对其运行的硬件开发不能再用于其它硬件。此时的计算机系统中硬件和软件是相互“捆绑”的。技术上的一体带来了商业上的一体。计算机公司如IBM的商业模式在收费上采取只考虑硬件价格而软件和系统服务免费的策略。这在当时对于用户是很有吸引的也增强了公司的竞争力。到1964年时情况发生了变化IBM发布了新的IBM S/360系统其目标是用户能够升级硬件系统而不需要替换或改变他们的应用程序。这在事实上形成了一种把应用解决方案剥离出硬件系统的技术可行性。而稍后RCA也宣布了其新的Spectra 70系统与IBM S/360兼容。这使得IBM难以阻止RCA在市场上“免费”使用其软件。1968年IBM宣布了其软件和硬件系统的解绑。此后软件从计算机系统硬件中剥离出来获得了可以独立发展的空间有机会产生独立的商业和竞争模式。可以看到除了商业上的反垄断和市场竞争因素外软件本质上所具备的“解决方案”的独立性和计算平台抽象使得解绑具备了历史必然性和技术可行性。软件学科的独立存在凸显。之后的发展以Bill Gates创立Microsoft和Larry Ellison创立Oracle为标志软件成为独立产品并形成巨大产业应用领域从以科学计算和商业计算开始不断扩大逐渐从作为硬件附属品的软硬件一体化阶段过渡到软件产品化、产业化阶段。人们逐步认识到软件是计算机系统的灵魂其共性沉淀形成的系统软件向下管理计算机系统的各类资源向上满足用户对计算机系统的应用需求。
第二个事件是软件工程\index{软件工程}的提出。计算机能力的快速提高和软件复杂性增加导致了所谓的“软件危机”现象。典型的案例是IBM S/360的操作系统OS/360的进度、开销和可靠性均不尽人意。北大西洋公约组织NATO在1968年举行了首次软件工程会议~\cite{Naur:1969:SER:1102020}。在这次会议上专家们首次提出需要与其他领域的工程方法一样系统化地进行软件开发。正如Margaret Hamilton在开发阿波罗在轨飞行和导航系统项目中所明确指出的“我努力使软件具有其应有的地位使得构造软件的活动受到应有的尊重因而我开始用软件工程将其与硬件和其他类型的工程区分开来成为整个系统工程的一部分”~\cite{Cameron:2018:ComputingEdge}。软件工程的出现激活了软件发展的巨大活力。这一史实也说明了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
\subsection{软件发展的主线}
软件通常可分为应用软件、系统软件和支撑软件。应用软件是指特定应用领域专用的软件面向终端用户完成既定应用目标例如办公软件、聊天软件、财务软件等系统软件位于硬件层之上为应用软件提供服务如Windows或Linux操作系统、各种数据库系统、编译程序及软件中间件等支撑软件是支撑各种软件的开发与维护的软件如软件开发工具及环境等。系统软件和支撑软件又统称为基础软件。
软件通常可分为应用软件、系统软件和支撑软件。应用软件是指特定应用领域专用的软件面向终端用户完成既定应用目标例如办公软件、聊天软件、财务软件等系统软件位于硬件层之上为应用软件提供服务如Windows或Linux操作系统、各种数据库管理系统、编译程序及软件中间件等;支撑软件是支撑各种软件的开发与维护的软件,如软件开发工具及环境等。系统软件和支撑软件又统称为基础软件。
追溯软件发展可以有多条线索,既可以考察计算机系统平台、应用形式的发展,也可以采用程序设计语言、系统软件、支撑软件等角度。
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件从批处理式、交互式、网络化发展到云边端融合的软件形态
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,发展到商业计算、个人计算、网络计算、云计算、到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件重要主题,软件语言从机器语言、汇编语言、高级语言、发展到领域语言,成为描述软件的基本方式。
在此之上形成所谓的软件方法学\index{软件方法学}主要涉及指导软件设计的原理和原则以及基于这些原理、原则的方法和技术。狭义的也指某种特定的软件设计指导原则和方法体系。从ALGOL~\cite{Naur:1960:ALG:1061146.1061147}诞生至今,软件方法学从结构化方法~\cite{Dahl:1972:SP:1243380}、对象化方法~\cite{Booch:1986:OD:9794.9797, Meyer:1997:OSC:261119}、构件化方法~\cite{Heineman:2001:CSE:379381}、服务化方法~\cite{Huhns:2005:SCK:1053547.1053596},发展到网构化方法~\cite{Mei:2016:INS:3086926}%,形成一系列的支撑软件。
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件从批处理式、交互式、网络化发展到云边端融合等模式去支撑从少量集中到海量分布异构的资源管理和利用
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,拓展到商业计算、个人计算、网络计算、云计算,到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件学科的一大重要挑战,软件语言从机器语言、汇编语言、高级语言、发展到领域特定语言,成为描述软件的基本方式。
在此之上形成所谓的软件方法学\index{软件方法学},主要涉及指导软件设计的原理和原则,以及基于这些原理、原则的方法和技术。狭义的软件方法学也指某种特定的软件设计指导原则和方法体系。从ALGOL~\cite{Naur:1960:ALG:1061146.1061147}诞生至今,软件方法学从结构化方法~\cite{Dahl:1972:SP:1243380}、对象化方法~\cite{Booch:1986:OD:9794.9797, Meyer:1997:OSC:261119}、构件化方法~\cite{Heineman:2001:CSE:379381}、服务化方法~\cite{Huhns:2005:SCK:1053547.1053596},发展到网构化方法~\cite{Mei:2016:INS:3086926}%,形成一系列的支撑软件。
\subsubsection{以抽象为主线的软件学科发展}
软件解决问题的过程是从应用目标需求的问题空间到计算平台给予的解空间的映射过程。软件可以看成是现实世界中的问题及其求解方案在计算机上的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题,其本质是抽象~\cite{Booch:2007:ooadwa, Kramer:2007:AKC:1232743.1232745}。一方面,软件模型是现实世界的抽象表示,另一方面,它又是现实世界问题及其求解方案在计算机上实现(即计算机软件)的抽象规约。换言之,软件模型是将现实世界问题空间映射到计算机世界解空间的“桥梁”。
软件学科本质上是一门方法论学科。以计算手段解决问题的过程是从应用需求的问题空间到计算平台约束的解空间的映射过程,包括从解空间到平台空间上的计算实现\footnote{本质上,平台空间属于解空间中可直接计算执行的部分,其中计算平台形成了对解空间的约束。}。软件可以看成是现实世界中的问题及其求解方案在计算机上的一系列的符号表示。如何将现实世界表示为人和计算机都能够理解的符号系统是软件学科最核心的问题之一,此即软件模型及其建模问题~\cite{Booch:2007:ooadwa, Kramer:2007:AKC:1232743.1232745}。软件模型组成了解空间,是将现实世界问题空间映射到计算机世界平台空间的“桥梁”;用人工科学的角度看,软件模型的集合构成问题空间到平台空间的界面。
Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite{Lucy:1997:LinguisticRelativity}。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。软件的语汇就是软件的各种抽象设施,是建立软件模型的基本元素。认识软件的切入点是认识各种软件抽象,宏观地说,软件方法学的核心是探讨如何建立、实现和使用抽象。
抽象是驾驭复杂性的基本手段。软件抽象设施往往以软件语言,特别是以程序设计语言、模型语言和相应接口形式给出;软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示。模型和建模构成了软件范型的核心内容\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}。软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,而构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换,建立抽象和抽象之间的关系。从结构上看,基于认知程度的不同,高层抽象可以分解为低层抽象,底层抽象可以组合或聚集为高层抽象,抽象之间还有不同语义保持度的转换。在问题空间、解空间和平台空间表述时,都可以建立或者定义所需的抽象,也可以使用已定义的抽象表述对象或者实现一个新定义的抽象。
因而,软件学科本质上一门方法论学科,其中的关键是软件的范型~\cite{Floyd:1979:PP:359138.359140, Lu:2009:ISS:1640206.1640213, Mei:2012:ISP:2311627.2311662, Kuhn:1970:StructureSciRev}。软件范型是从软件工程师或程序员视角看到的软件模型及其构造原理而构造软件模型的语汇也称基本元素是各类软件抽象设施构造模型的方法是各类抽象的分解、组合和变换。Sapir-Whorf语言相对论假设对语汇的重要性给出了一个表述~\cite{Lucy:1997:LinguisticRelativity}。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。认识软件的切入点是认识各种软件抽象。它们构成了软件的语汇,包括但不限于程序设计语言设施、软件构件、软件服务等。宏观地说,软件方法学的核心是建立(一般的)软件抽象。
%而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软件。不同层次的抽象、抽象的计算实现和使用组成了软件发展的脉络。我们试图以软件各种抽象为主线来梳理和汇聚软件发展的基本历程。
%例如在典型的大数据处理系统如Google搜索引擎我们可以看到接口与服务、方法与设施、虚拟化与实现等不同层次组成的抽象栈它们分别对应着Web服务、MapReduce、Dryad、Pregel、BigTable、集群调度、分布式文件、操作系统等抽象层。
高度灵活性使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”。这就使得整个人工系统的复杂性向软件集中。驾驭复杂性的能力体现了软件发展的水平。
%弥补着从计算平台形成的解空间到应用目标的问题空间语义鸿沟,软件驾驭复杂性的抽象能力不断提高。
从早期的“程序=数据结构+算法”的初级抽象,到“软件=程序+文档”,结构化程序设计关注在于管理程序结构复杂性。进入网络化时代后,交互复杂性和规模复杂性日益突出,体系结构加设计模式抽象、服务加流程组合抽象为管理这些类高层复杂性应运而生,直至今日,知识(数据驱动)复杂性、领域(社会技术)复杂性需要纳入软件需要驾驭的复杂性之中,建立、实现、使用抽象的循环迭代不断往复,推进着软件技术的发展。
高度灵活性使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”。这就使得整个人工系统的复杂性向软件集中。驾驭复杂性的能力(复杂性的种类、程度的提升)体现了软件发展的水平。
从以算法复杂性为主,到结构复杂性,再进入网络化时代的交互复杂性和规模复杂性,直至今日,数据复杂性、社会复杂性也将纳入软件需要驾驭的复杂性之中,建立、实现、使用抽象的循环迭代不断往复,推进着软件技术的发展。
软件抽象设施往往以软件语言,特别是以程序/模型设计语言和相应接口形式给出。抽象的设施形成了模型语言,与抽象模型的构建原理一同形成了构成了软件范型。软件抽象与数学抽象不同在于,它是可编程的单元并有计算之实现,以管理硬件平台、高效实现抽象为构成了软件运行支撑技术的主要内容,也即系统软件。面向应用目标,使用抽象建立模型并以系统化的方法获得解决方案则构成了软件开发方法;进一步通过不同层次抽象形成的软件制品及其过程进行质量度量和评估,便构成了软件质量度量和评估方法;软件开发方法、软件质量度量和评估方法则构成了软件工程的主要内容。
软件抽象与数学抽象不同在于,它是可编程的单元并有计算之实现,以有效管理硬件平台、提升解空间抽象层次为目标,构成了软件运行支撑技术的主要内容,也即系统软件技术。面向应用目标,构建问题空间抽象并以系统化的方法映射到解空间为目标,则构成了软件开发方法的主要内容;进一步,通过科学观察,针对不同层次抽象的软件制品及其过程进行度量和质量评估,便构成了软件度量和质量评估的主要内容。
%软件开发方法、软件质量度量和评估方法则构成了软件工程的主要内容。
%围绕这些抽象软件学科的发展呈扇形展开,分化出以建立抽象为主要内容的软件方法学和程序设计语言;以实现抽象为主要内容的系统软件;以使用抽象为主的软件开发和工程。参见图\ref{fig:1-5}
@ -100,45 +108,57 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
\subsubsection{程序设计语言与程序理论}
程序设计语言提供计算平台直接实现的抽象和构建抽象的设施,是软件范型的表示载体和描述工具。程序设计语言总是力图以更一致、更准确的方式实现从问题域到解空间的映射,更方便地表达问题求解思路,从而使开发者可以用更少的代码完成更多的工作,用更优的结构来控制编程复杂性,用更加严格规范的语法来预防编程错误等。换言之,程序设计语言的设计总是以更具表达能力和提高软件开发效率和质量为主要追求目标。
程序设计语言提供计算平台直接实现的解空间抽象和构建抽象的设施,是软件范型的表示载体和描述工具。程序设计语言力图以更方便、更一致、更准确的方式表示软件,从而使开发者可以用更少的代码完成更多的工作,用更优的结构来控制编程复杂性,用更加严格规范的语法来预防编程错误等。换言之,程序设计语言的设计总是以更具表达能力和提高软件开发效率和质量为主要追求目标。
军事领域的科学计算是计算应用的最初需求。面向科学计算建立的抽象成为软件发展的早期里程碑。为了满足数值计算的需求John Backus于1953年发明了Fortran语言~\cite{Backus:1978:HFI:960118.808380}是历史上第一个正式推广的高级程序设计语言于1957年在IBM 704计算机上实现。Fortran语言提供的抽象对用数学公式表达的问题求解提供了直接支持。经过多年的版本更替Fortran语言至今仍在使用。Fortran的主要贡献者获得了图灵奖。
军事领域的科学和工程计算是计算应用的最初需求。面向科学和工程计算建立的抽象成为软件发展的早期里程碑。为了满足数值计算的需求John Backus于1953年发明了Fortran语言~\cite{Backus:1978:HFI:960118.808380}是历史上第一个正式推广的高级程序设计语言于1957年在IBM 704计算机上实现。Fortran语言提供的抽象对用数学公式表达的问题求解提供了直接支持。经过多年的版本更替Fortran语言至今仍在使用。Fortran的主要贡献者John Backus于1977年获得了图灵奖\footnote{https://amturing.acm.org/award\_winners/backus\_0703524.cfm}
1960年面向常规商业信息处理COBOL语言发布成为COBOL-60~\cite{Sammet:1978:EHC:800025.1198367}。COBOL提供了面向周期性循环处理和数据变换的抽象适合于报表、情报、计划编制等商业数据处理如今仍有应用。同一时间段面向通用计算的算法语言ALGOL 60诞生成为ACM当时算法描述的标准它提供了数据结构、块结构、递归等设施~\cite{Perlis:1978:ASD:800025.1198352, Naur:1978:ESL:800025.1198353}。ALGOL语言的意义重大一是它确立了结构化高级程序设计语言设计的基础之后的Pascal~\cite{Wirth:1993:RDP:154766.155378}、C~\cite{Ritchie:1993:DCL:154766.155580}、Java等命令式程序设计语言的基础;二是它催生了试图严格或形式化定义语言和程序的一大批软件基础理论成果。ALGOL 60的主要贡献者Peter Naur获得了2006年图灵奖。
1960年面向常规商业信息处理的COBOL语言发布COBOL-60~\cite{Sammet:1978:EHC:800025.1198367}。COBOL提供了面向周期性循环处理和数据变换的抽象适合于报表、情报、计划编制等商业数据处理如今仍有应用。同一时间段面向通用计算的算法语言ALGOL 60诞生成为ACM当时算法描述的标准它提供了数据结构、块结构、递归等设施~\cite{Perlis:1978:ASD:800025.1198352, Naur:1978:ESL:800025.1198353}。ALGOL语言的意义重大一是它确立了结构化高级程序设计语言设计的基础之后的Pascal~\cite{Wirth:1993:RDP:154766.155378}、C~\cite{Ritchie:1993:DCL:154766.155580}、Java等命令式程序设计语言都是在此基础上设计出来的;二是它催生了试图严格或形式化地定义语言和程序的一大批软件基础理论成果。ALGOL 60的主要贡献者Peter Naur获得了2006年图灵奖。
60年代末至80年代历经Simula 67~\cite{Nygaard:1978:DSL:800025.1198392}、Smalltalk~\cite{Kay:1993:EHS:154766.155364}、C++~\cite{Stroustrup:1993:HC:154766.155375}等语言,面向对象程序设计范型形成,提供了类(对象)、方法(消息传递)、继承等设施,建立了封装和多态等机制。面向对象语言的创立者Ole-Johan Dahl、Kristen Nygaard和重要贡献者Alan Kay也分别于2001年和2003年获得了图灵奖。
60年代末至80年代历经Simula 67~\cite{Nygaard:1978:DSL:800025.1198392}、Smalltalk~\cite{Kay:1993:EHS:154766.155364}、C++~\cite{Stroustrup:1993:HC:154766.155375}等语言,面向对象程序设计形成,提供了类(对象)、方法(消息传递)、继承等设施,引入了封装和多态等机制。面向对象语言的创立者Ole-Johan Dahl、Kristen Nygaard和重要贡献者Alan Kay也分别于2001年和2003年获得了图灵奖。
与命令式程序设计语言不同50年代末人们还探索了声明式程序设计语言其代表是基于Lambda演算的函数式语言LISP~\cite{McCarthy:1978:HL:800025.1198360}、基于Horn Logic的Prolog~\cite{Colmerauer:1993:BP:154766.155362}、基于关系演算的SQL~\cite{Chamberlin:2012:EHS:2420618.2420665}等。以LISP为例它提供了用于问题求解的函数抽象首次在语言中支持递归函数定义。LISP的设计思想深刻地影响了ML~\cite{Gordon:1978:MIP:512760.512773}、Haskell~\cite{Hudak:2007:HHL:1238844.1238856}等函数式程序设计语言~\cite{Backus:1978:PLV:359576.359579}的发展。
随着人们对程序设计安全可靠、便捷有效等求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范型的融合,例如面向对象语言和函数式语言融合并支持并发、安全计算出现了Scala、Rust等程序设计语言展现了强劲的势头另一方面是面向特定领域的语言受到了重视它们针对领域应用提供高效便捷的抽象例如面向大数据处理的Map Reduce~\cite{Dean:2008:MSD:1327452.1327492}、面向区块链智能合约的Solidity。
随着人们对程序设计安全可靠、便捷有效等求的提高,以及计算平台向并发、分布、异构发展,程序设计语言呈现了两方面走向:一是,程序设计范型的融合,例如面向对象语言和函数式语言融合并支持并发、安全计算出现了Scala、Rust等程序设计语言展现了强劲的势头另一方面是面向特定领域的语言受到了重视它们针对领域应用提供高效便捷的抽象例如面向大数据处理的Map Reduce~\cite{Dean:2008:MSD:1327452.1327492}、面向区块链智能合约的Solidity\footnote{https://en.wikipedia.org/wiki/Solidity}
程序设计语言向上要面向问题求解方法的表达向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和问题求解的计算理论成为了软件理论的重要部分。从ALGOL60开始关于程序构造的理论研究就开始了其基本内容是在计算理论的基础上建立程序的形式语义并对程序及其性质进行推理其本质是基于数学的方法来建立抽象及抽象之间的联系~\cite{floyd:1967:assigning, 陆汝钤:2017:计算系统的形式语义}。在60年代到70年代人们建立了程序设计语言的操作语义学、公理语义学、指称语义学和代数语义学。程序语言与形式语义的研究紧密联系例如1974年Barbara Liskov提出了抽象数据类型的程序设计思想~\cite{Liskov:1974:PAD:800233.807045},建立了现代面向对象语言的核心特征,包括强类型检查和通用类型支持,支持了对象化方法语言中的类抽象。以形式语义学为基础,人们长时期探索程序的形式开发和形式验证等形式化方法和技术以提高软件生产率和软件质量,取得显著的进展,例如模型检验获~\cite{Clarke:2000:MC:332656}得了2005年图灵奖。与程序相关的问题的求解判定和算法复杂性也成为程序设计语言设计和形式化方法的重要内容。
程序设计语言向上要面向问题求解方法的表达向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和围绕问题求解的计算理论成为了软件理论的重要部分。从ALGOL 60开始关于程序构造的理论研究就开始了其基本内容是在计算理论的基础上建立程序的形式语义并对程序及其性质进行推理其本质是基于数学的方法来建立抽象及抽象之间的联系~\cite{floyd:1967:assigning, 陆汝钤:2017:计算系统的形式语义}。在60年代到70年代人们建立了程序设计语言的操作语义学、公理语义学、指称语义学和代数语义学。
%程序语言与形式语义的研究紧密联系例如1974年Barbara Liskov提出了抽象数据类型的程序设计思想~\cite{Liskov:1974:PAD:800233.807045},建立了现代面向对象语言的核心特征,包括强类型检查和通用类型支持,支持了对象化方法语言中的类抽象。
以形式语义学为基础人们长期探索程序的形式开发和形式验证等形式化方法和技术以提高软件生产率和软件质量取得显著的进展。例如模型检验基于判定理论、利用高效的数据结构和算法能快速自动地验证一大类计算机硬件和软件系统的关键性质获得了2005年图灵奖~\cite{Clarke:2000:MC:332656}。与程序相关的问题的求解判定和算法复杂性也成为程序设计语言设计和形式化方法的重要内容。
\subsubsection{以实现抽象为目标的系统软件}
%\subsubsection{以实现抽象为目标的系统软件}
\subsubsection{系统软件}
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为在平台空间中建立抽象、使用抽象来实现更高级抽象的焦点。系统软件着力提高平台空间抽象的执行效率,并提升解空间的抽象层次,向问题空间抽象接近,拉近问题与解之间的间隔。具体说,一方面,系统软件通过建立、使用并实现有效的平台空间抽象对各类资源进行有效的管理;另一方面,系统软件力图在计算平台之上凝练建立、沉淀实现应用软件中的共性解空间抽象并加以复用,以尽可能提高软件开发效率。
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为建立抽象、使用抽象来实现更高级抽象的焦点。系统软件力图凝练应用软件中的共性并加以复用,以尽可能提高软件开发和运行的效率。
事实上,程序设计语言中许多重要概念来自于操作系统和编译器的设计。
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划
Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。这些抽象是用来支持相对应的设计方法也就是问题求解的方法。
操作系统抽象的三个基本要素是抽象表示、管理机制和策略。其基本思路是抽象表示沉淀共性模型管理机制和策略分离。例如进程是程序执行的抽象进程调度是进程抽象和计算资源的管理机制调度算法是管理进程的控制策略。进程抽象的实现中使用了进程控制块调度机制和算法分而治之地完成进程管理。操作系统中各类资源管理大多采取了这样的设计思路包括内存管理页面、换页、换页策略、I/O管理和安全管理等等。在编译器中从高级语言源程序到机器目标代码之间历经了抽象语法树、中间语言代码、四元式等多层级的抽象目标代码生成过程是这些层级抽象的映射。在系统软件发展过程中人们发现并设计了不同粒度的抽象、抽象使用和实现的原理与方法。
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划而例如Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。其他例子还包括
例如换页策略使用局部性原理、抽象的信息隐藏和分而治之原理等等。程序设计语言和软件工程中许多重要概念来自于操作系统和编译器的设计例如管程、递归协程序等等。Barbara Liskov在操作系统发展50周年研讨会上讨论了操作系统、程序语言和抽象之间的关系指出抽象对构建系统软件的作用。
%例如用多层次的软件栈来定义复杂系统。
%为了应对操作系统设计中可靠性、安全性、可配置、可扩展和多处理器程序设计等挑战微软的Singularity OS的首要任务开发新的抽象包括平台的抽象指令集、操作系统和应用统一可扩展的体系结构和一阶的应用抽象特别是应用抽象可递归地应用到操作系统自身包括内核和其他OS构件。Singularity OS的后继Midori OS支持了微软西海岸和亚洲的自然语言搜索服务。Midori表明了合理的抽象和软件栈能在内存、类型和并发安全之上构建系统和应用性能和安全并不是对立的。
追求充分发挥硬件的能力利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是系统软件的首要驱动力。六十年代集成电路的兴起增强了计算机的能力高效的管理硬件、发挥硬件效能成为操作系统重要驱动力。操作系统出现了不少新技术并变得强大复杂。典型的技术有多道程序设计、分时、实时、多处理器技术等等。70年代操作系统的设计进一步发展形成了UNIX操作系统成为当今主机操作系统的基础。80年代商业计算和微处理器时代到来出现了一批微机和工作站操作系统代表的是MS-DOSLinux、Solaris 和Windows等。90年代在"网络就是计算机"的推动下以主机和微机操作系统为基础中间件或网络化操作系统成为系统软件的增长点。进入新世纪后以iOS和Android代表的移动操作系统与主机操作系统向数据中心扩展的云操作系统形成了云端计算的软件基础设施的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。
20世纪60年代操作系统出现之初主要是解决在计算机上加载和运行程序、以及设备驱动、输入输出控制等工作。随着
集成电路的兴起增强了计算机的能力CPU和外设的性能差异突出高效地共享和管理硬件、发挥硬件效能成为操作系统重要驱动力。为此先后产生了多道程序设计、分时、实时等操作系统技术系统设计变得复杂能力也变得强大。著名的系统有IBM S/360的操作系统。以操作系统设计为矛盾焦点之一人们意识到了“软件危机”。软件的复杂性驾驭成为了一个至今仍在的挑战。70年代UNIX操作系统及其家族的发展和成熟成为当今主机操作系统的基础。80年代随着商业计算和微处理器时代到来出现了一批微机和工作站操作系统其代表是MS-DOS、Linux、Solaris和Windows等。90年代在"网络就是计算机"的理念推动下以主机和微机操作系统为基础以桥接异构的互联互通互操作为主要目标的中间件和网络化操作系统成为系统软件的增长点。进入新世纪后以iOS和Android代表的移动操作系统与主机操作系统向数据中心扩展所形成的云操作系统一同构建了云端计算系统软件的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。可见追求充分发挥硬件的能力利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是驱动着系统软件的发展。
操作系统中的三个基本元素是抽象、机制和策略。而其抽象的基本设计原则是机制与策略的分离、共性的沉淀。例如进程和进程管理、线程和并发、调度、内存管理、进程间通信、I/O管理、虚拟化、分布文件系统、分布共享内存、安全与隐私抽象-Ownership等等。在实现这些抽象的过程中人们发现并设计了计算求解的复杂性应对的原理和法则例如局部性原理、名字映射、分而治之、信息隐藏等等。Barbara Liskov讨论了操作系统、程序语言和抽象之间的关系指出抽象对系统组织的作用例如用多层次的软件栈来组织复杂系统。为了应对操作系统设计中可靠性、安全性、可配置、可扩展和多处理器程序设计等挑战微软的Singularity OS的首要任务开发新的抽象包括平台的抽象指令集、操作系统和应用统一可扩展的体系结构和一阶的应用抽象特别是应用抽象可递归地应用到操作系统自身包括内核和其他OS构件。Singularity OS的后继Midori OS支持了微软西海岸和亚洲的自然语言搜索服务。Midori表明了合理的抽象和软件栈能在内存、类型和并发安全之上构建系统和应用性能和安全并不是对立的
由于应用范围的迅速拓展,数据量及其复杂性迅猛增长,数据资源成为了重要管理对象。用于数据资源的抽象、操作和管理的数据库管理系统渐渐分离出来成为系统软件相对独立的部分
由于应用范围的迅速拓展,软件抽象中用于表述现实世界的数据抽象日益重要,数据量及其复杂性迅猛增长,关于数据抽象的表示和实现的数据管理渐渐分离出来成为系统软件相对独立的部分。
%\subsubsection{基于抽象构建应用解决方案的软件工程}
\subsubsection{软件工程}
随着软件工程思想的出现,软件开发方法和技术体系逐渐发展起来。
%面向应用建立问题解决方案的抽象成为软件开发方法的共识。
软件开发可以看作是使用各种抽象构建并实现新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路,信息隐藏是其基本原则。
\subsubsection{基于抽象构建应用解决方案的软件工程}
可编程和抽象作为软件的基本形态随着软件工程思想的出现软件开发方法和技术体系逐渐发展起来。面向应用建立问题解决方案的抽象成为软件开发方法的共识。软件开发可以看作是利用抽象构建新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路信息隐藏是其基本原则。软件开发方法中的诸多抽象大多来自于程序设计语言的思路。例如70年代的结构化系统分析和设计方法、80年代的面向对象分析和设计等等。软件开发和程序设计在抽象上尽可能地保持了一致或相容使得软件工程模型不同阶段、不同层次的抽象有着较好的对应。另一方面在程序设计语言抽象的基础上为了与人们应用问题求解思维过程的一致在软件的需求和高层设计上也出现了高层的抽象设施也称软件建模语言。例如在面向对象方法学的统一建模语言UML~\cite{Booch:1999:UML:291167}用Use Case对需求进行抽象建模用Message Sequence对设计中类交互序列进行抽象。
程序设计模型影响着甚至决定着软件范型。软件开发试图在问题空间中建立有更强表达能力、并易于向平台空间抽象高效映射的一系列抽象。因而软件开发的诸多基本抽象往往力求与程序设计语言的抽象尽可能相容或一致使得软件工程模型不同阶段、不同层次的抽象有着较好的对应保持较好的可跟踪性和平滑的实现映射。例如70年代的结构化分析和设计方法对应于结构化程序设计、80年代的面向对象分析和设计对应于面向对象程序设计等等。另一方面在程序设计语言抽象的基础上为了与人们应用问题求解思维过程的一致在软件的需求和设计上也出现了含有高层的抽象设施的软件语言也称软件建模语言。它们具有面向问题空间描述的抽象形式例如在面向对象方法学中的统一建模语言UML~\cite{Booch:1999:UML:291167}用Use Case对需求进行抽象建模用Message对需求和设计中类交互进行抽象。
更进一步,随着软件抽象粒度和层次的提升,软件开发方法和软件语言的发展愈加紧密。例如,基于复用思想的软件构件化方法中提出了软件体系结构,构件和构件间的连接子成为其重要组成;服务化方法定义了服务和服务间的流程编排;以及网构化方法提供了自主实体和实体间的按需连接,等等。
在计算为手段的解空间中,人们一方面不断地建立抽象,一方面不断地在计算平台上高效能实现抽象,两者相辅相成,螺旋上升。例如,结构化程序设计开创了程序设计得到的程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要一种方式可以从内嵌类型构造不同层次抽象的能力。这些动机促使了抽象数据类型的出现~\cite{Liskov:1974:PAD:800233.807045}\index{抽象数据类型}抽象数据类型用抽象对象上一组操作的方式定义了该类抽象对象即用类型上的操作来定义新类型。它一方面封装了底层操作抽象的细节又构造了一组新的类型抽象。迭代地这些不同抽象之间的关系通过分解、组合封装的方式形成低级抽象实现高级抽象、高级抽象精化为低级抽象的软件栈呈现一个垂直方向的模型映射关系。这形成了模型驱动Model-driven的软件开发方法~\cite{Schmidt:2006:MDE}。模型作为了软件系统的抽象描述逐渐基于模型Model-based这个说法就成为更能够表达其宽泛含义的术语基于模型的软件开发得到了较大的发展出现了基于模型的软件开发Model-based Software Development、基于模型的测试Model-based Testing、基于模型的规约Model-based Specification等技术。
软件生命期不同阶段有不同抽象,由抽象间的(使用/实现)关系复合构建映射成为软件开发的重要任务。
%例如,结构化程序设计使得程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而通过不同阶段抽象的映射和转换完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。
然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要具有从内嵌类型构造不同层次抽象的能力。同时,不同层次抽象之间内嵌信息隐藏能力。这些动机促使了抽象数据类型的出现~\cite{Liskov:1974:PAD:800233.807045}\index{抽象数据类型}抽象数据类型用抽象对象上一组操作的方式定义了该类抽象对象即用类型上的操作来定义新类型。它一方面封装了底层操作抽象的细节又构造了一组新的类型抽象。迭代地这些不同抽象之间的关系通过分解、组合封装的方式形成低级抽象实现高级抽象、高级抽象精化为低级抽象的分层软件结构呈现一个垂直方向的模型映射关系。将这种思想从类型抽象扩展至从需求层面、设计层面形成了模型驱动Model-driven的软件开发方法~\cite{Schmidt:2006:MDE}。模型成为了软件系统的抽象描述逐渐基于模型Model-based这个说法就成为更能够表达其宽泛含义的术语。基于模型的软件开发得到了较大的发展出现了基于模型的软件开发Model-based Software Development、基于模型的测试Model-based Testing、基于模型的规约Model-based Specification等技术。
%如图结构化抽象与THE OS、C与UNIX、面向对象与CORBA和EJB、服务化与Docker虚拟机交相辉映形成了以计算为手段的解平台提升并与结构化、对象化、构件化、服务化等软件开发方法携手同行。
软件开发方法从制品的角度来认识、构造和演进软件。另一方面软件作为人类的智力产品在工程化的角度软件度量和质量保证以及软件开发和演化的动态过程必不可少。软件开发方法必然延伸到了度量、质量和过程。例如UML不仅支持面向对象的分析与设计还支持从业务建模、需求获取、分析、设计、实现、测试到部署的不断迭代软件开发活动在此基础上形成了所谓统一软件开发过程。软件过程模式从早期的作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式主要有软件过程1970、CMM1988、SCRUM1995、RUP2000和外包2001社会化生产方式有开源1997、Git2005、Stack Overflow2007和DevOps2008
软件开发方法从制品的角度来认识、构造和演进软件。另一方面,软件作为人类的智力产品,其质量存不确定性,同时其产生和发展过程中蕴含着复杂的协作。因此,从工程化的角度,软件度量和质量保证,以及软件开发和演化的动态过程也是必不可少软件开发方法为基础,软件工程必然延伸到了度量、质量和过程。例如UML软件工程不仅支持面向对象的分析与设计,还支持从业务建模、需求获取、分析、设计、实现、测试到部署的迭代软件开发活动,在此基础上形成了所谓统一软件开发过程Unified Process。软件过程模式从早期的手工作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式主要有软件过程1970、CMM1988、SCRUM1995、RUP2000、外包2001、敏捷和极限编程2001、PSP2005社会化生产方式有开源1997、Git2005以及相应的开发社交平台Stack Overflow2007
%DevOps2008放到学科构架里面去说。
\section{软件学科的内涵、发展规律和基本架构}
\subsection{内涵与学科特征}
@ -148,32 +168,32 @@ Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程
\item[目的性] 达成什么应用目的
\item[适应性] 何种环境依赖之下
\end{description}
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。作为逻辑制品,其困难不在于物理限制而在于逻辑构造。因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。作为逻辑制品,其困难不在于物理限制而在于逻辑构造。因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案%后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
软件学科是以软件为研究对象研究以软件求解应用问题的理论、原则、方法和技术以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并教育在广泛多样应用的共性受惠的知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为在这个意义上软件学科实质上就是Wirth所说的计算机科学的主体。
软件学科是以软件为研究对象研究以软件求解应用问题的理论、原则、方法和技术以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并传授泛在多样化应用中共性知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为在这个意义上软件学科实质上就是Wirth所说的计算机科学的主体。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,软件最终运行的计算平台的物理和图灵可计算内生了软件发展遵循的科学规律。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,运行软件的硬件平台之物理和可计算内生了软件发展必须遵循科学规律和遵从的环境约束。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能、以及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
\subsection{学科发展的基本规律}
纵观软件学科发展历史,随着计算时代从数字化时代发展到网络化、信息化时代,再到目前人机物融合、智能化时代,软件和软件学科在继承中发展,同时变化成为常态,正所谓“变是不变的真理”。我们从两个方面来认识软件学科发展的规律:第一,本学科发展的驱动力是什么第二,本学科的研究方法论是什么。
纵观软件学科发展历史,随着计算时代从数字化时代发展到网络化,再到目前人机物融合、智能化时代,软件和软件学科在继承中发展,同时变化成为常态,正所谓“变是不变的真理”。我们从两个方面来认识软件学科发展的规律:第一,本学科发展的驱动力是什么第二,本学科的研究方法论是什么。
\subsubsection{发展的驱动力}
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。与诸多人工制品类似,软件学科发展的外部驱动力来自于两个方面:外在驱动力来自于应用范围的扩张、计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀计算平台资源,同时更好地满足用户对易用性的需求。此外,软件发展驱动力还来自人本属性,包括人的认知规律和人力资源管理的深化与提高。
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。与诸多人工制品类似,软件学科发展的驱动力来自于两个方面:外在驱动力来自于应用范围的扩张、计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀到系统软件平台中,同时更好地满足用户对易用性的需求。此外,软件发展驱动力还来自人本属性,包括人的认知规律和人力资源管理的深化与提高。
\textbf{外在驱动力}
计算平台的发展和应用范围的扩张分别形成了软件学科发展的平台驱动力和应用驱动力。平台的变迁形成了软件灵活成长的平台空间;而应用的扩张形成软件所解决的问题空间。在平台空间和问题空间之间,形成了软件所需具有的功能、目的和适应形成的解空间。软件的发展是这三个空间变化、渗透和互动的产物。
计算平台的发展和应用范围的扩张分别构成了软件学科发展的平台驱动力和应用驱动力。平台的变迁构成了软件灵活成长的平台空间;而应用的扩张构成软件所解决的问题空间。在平台空间和问题空间之间,构成了由软件填补的界面空间。软件的发展是这三个空间变化、渗透和互动的产物。
应用拉动,平台提高,推动软件的发展。从应用驱动力的角度,软件的应用范围不断扩展,渗透力不断增强。不断增长的应用诉求拉动了软件技术从最初单纯的计算与数据处理拓展到各个行业的应用、乃至现在泛在的无所不在的应用,软件学科的无可比拟的渗透力变得空前的强大,软件的形态、开发方法和运行支撑等诸多方面发生了巨大的变化。从平台驱动力的角度,计算平台从von Neumann计算机到网络就是计算机从云计算、端计算、边缘计算到全球泛在计算,形成了从封闭、静态环境(单机计算平台)到开放、动态环境(泛在计算平台)的态势,造就了软件发展的不竭动力,使得软件所能提供的解决方案的解空间更趋科学、高效。在应用驱动力和平台驱动力的联合作用下,软件正走向“定义一切”。
应用拉动,平台变化,推动软件的发展。从应用驱动力的角度,软件的应用范围不断扩展,渗透力不断增强。不断增长的应用诉求拉动了软件技术从最初单纯的计算与数据处理拓展到各个行业的应用、乃至现在无所不在的应用,软件学科的无可比拟的渗透力变得空前的强大,软件的形态、开发方法和运行支撑等诸多方面发生了巨大的变化。从平台驱动力的角度,计算平台从单机发展到局域网、互联网、物联网,从云计算、端计算、边缘计算到泛在计算,形成了从封闭、静态环境(单机计算平台)到开放、动态环境(泛在计算平台)的态势,造就了软件发展的不竭动力,使得软件所能提供的解决方案的解空间空前强大。在应用驱动力和平台驱动力的联合作用下,软件正走向“定义一切”。
\textbf{内在驱动力}
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从模式化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从系统化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
\subsubsection{学科方法}
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效和节约地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效、高质和低成本地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
\textbf{理论方法}
@ -187,9 +207,9 @@ Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,源于面向问题,通过系统的设计过程来构造解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及对象之间的联系,实验方法可以运用这些联系来预言软件行为并与现实世界比较,设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及其之间的联系;实验方法运用实验手段收集数据和实验结果,来预言软件行为并与现实世界比较;设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件到软件模型,即从软件能否构造一个符合该软件系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码逆向到软件抽象模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
%\begin{itemize}
% \item \textbf{举例}:基于大代码的软件自动生成方法就综合软件科学中的理论、实验和设计方法。程序综合是计算机科学的明珠。其理论研究是长期以来的科学问题。演绎推理的理论方法是其重要途径,形式规约开始构造一个正确的程序,自动定理证明和归纳综合是其基本思路,并逐步发展到了归纳推理。近来随着海量代码的累积,实验统计的方法逐步兴起,以实验方法从代码数据中学习,建立程序综合和推理的启发式预言有效地提高了综合效率。以归纳推理和统计推理相结合的程序综合设计方法成为了当前软件自动化研究的重要趋势,在代码自动生成、代码修复、人机协同编程等方面取得了重要进展。
@ -200,7 +220,7 @@ Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程
%我们着眼于软件学科发展历程的回顾重新梳理就现状划分了三个子领域即程序设计语言与理论、系统软件、软件工程。其中程序设计语言与理论的核心内容是建立抽象系统软件的核心内容是实现抽象软件工程的核心内容是使用抽象。它们与我国目前一级学科、ACM/IEEE计算学科的关系如图1-X所示。
我们就软件学科的现状,将软件学科体系梳理为四个方面的内容(见图\ref{fig:1-6}):软件范型、软件开发(构造方法、软件运行支撑及软件质量度量与评估。软件范型是软件学科的核心,每次软件范型的变迁(见图\ref{fig:1-7}),都会引发软件开发方法和运行支撑技术的相应变化,并导致新的软件质量度量和评估方法的出现。
我们就软件学科的现状,将软件学科体系梳理为四个方面的内容(见图\ref{fig:1-6}):软件范型、软件构造方法、软件运行支撑及软件度量与质量评估。软件范型是软件学科的核心,每次软件范型的变迁(见图\ref{fig:1-7}),都会引发软件开发方法和运行支撑技术的相应变化,并导致新的软件质量度量和评估方法的出现。
\begin{figure}[htbp]
\centering
@ -220,20 +240,19 @@ Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程
软件范型重点解决软件是什么的问题,描述了软件的模型和模型构造、运行的基本理论,包括了计算理论、程序设计语言和程序理论。计算理论包括可计算性理论、算法理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。我们将软件范型的学科内容归入程序设计语言与理论。
软件开发方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型研究大型软件系统高质量高效率开发的方法、技术和工具属于软件工程的范畴。软件开发是一项困难的任务而困难可区分为实质性Essential的和附属性Accidental的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不妥。软件开发方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件开发技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
软件构造方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型,研究大型软件系统高质量高效率开发的方法、技术和工具,属于软件工程的范畴。软件构造(开发是一项困难的任务而困难可区分为实质性Essential的和附属性Accidental的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不足。软件构造方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件构造技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
在运行支撑方面重点解决如何在计算平台上高效高可靠运行软件的问题。其基本途径是逐层的虚拟化技术和系统优化技术,运行平台包括操作系统、数据库、中间件等。操作系统可视为构架在硬件资源上的软件虚拟机,以追求更高效地发挥各种硬件资源所提供的计算能力,提供友好的人机交互界面。而数据库、中间件等均可视为架构在下层资源上的一层虚拟机,充分发挥下层资源的计算能力,提供高效的资源管理和更自然的人机界面。我们将运行支撑方面的学科内容归入系统软件的范畴。
在运行支撑方面重点解决如何在计算平台上高效高可靠运行软件的问题。其基本途径是逐层的虚拟化技术和系统优化技术,运行平台包括操作系统、数据库、中间件等。操作系统可视为构架在硬件资源上的软件虚拟机,以追求更高效地发挥各种硬件资源所提供的计算能力,提供友好的人机交互界面。而数据库、中间件等均可视为架构在下层资源上的一层虚拟机,充分发挥下层资源的计算能力,提供高效的资源管理和更自然的人机界面。本书中将运行支撑方面的学科内容归入系统软件的范畴。
软件质量度量和评估重点解决软件如何度量和评估的问题。其主要关注系统质量,追求软件的正确性、功能性指标和性能指标等。随着软件广泛应用,人们越来越关心软件系统是否更好(更快捷、更安全、更可靠、更灵活)地解决了现实世界中的问题,如何判断或度量软件是否可信、是否符合应用价值取向、是否达到目的成为软件学科的重要内容,通常将其与软件开发方法一并归入软件工程的范畴。
软件度量和质量评估重点解决软件如何度量和质量评估的问题。软件作为人工制品,本身及其构造、运行均可以成为科学观察和建模的对象,形成软件的静态模型、动态模型、科学度量模型、质量模型等软件度量的基本内容,特别的软件度量尤其关心其系统质量,追求软件的正确性、功能性指标和性能指标等。随着软件的广泛应用,人们越来越关心软件系统是否更好(更快捷、更安全、更可靠、更灵活)地解决了现实世界中的问题,如何判断或度量软件是否可信、是否符合应用价值取向、是否达到目的成为软件学科的重要内容。本书中将其与软件构造方法一并归入软件工程的范畴。
软件强大的渗透性,使得软件和产业紧密相联,并产生了软件产业。软件的问题解决方案和人工制品特性、软件发展的外部驱动力决定了其形成产业的必然,而强大的产业需求不断地拉动软件的发展,软件学科与软件产业相互促进,共生共荣。
软件强大的渗透性,使得软件和产业紧密相联,并产生了软件产业。软件的问题解决方案和人工制品特性、软件发展的外部驱动力决定了其形成产业的必然,而强大的产业需求不断地拉动软件的发展,软件学科与软件产业相互促进,共生共荣。
\section{结束语}
本章通过梳理软件发展的脉络,指出了软件是以计算为核心手段实现应用目标和价值的解决方案。可编程是软件的基本特征,建立抽象、实现抽象和使用抽象是软件发展的主线。软件作为最为复杂的人工制品,软件学科是以软件为研究对象,通过科学方法、实验方法和设计方法等途径,研究设计、运行、使用软件及其规律的学科。
软件是最为复杂的人工制品。本章通过梳理软件发展的脉络,指出了软件是以计算为核心手段实现应用目标和价值的解决方案。可编程是软件的基本特征,建立抽象、实现抽象和使用抽象是软件发展的主线。软件学科是以软件为研究对象,通过科学方法、实验方法和设计方法等途径,研究设计、运行、使用软件及其规律的学科。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
%\section{参考文献}

View File

@ -1,100 +1,124 @@
% !TEX root = main.tex
\section*{总论}
软件承载着文明\footnote{“Our civilization runs on software.” —C++之父Bjarne Stroustrup.}时至今日,软件定义一切和“人-机-物”三元融合\footnote{这里所谓人是指系统中的人类参与者及其社会关系,机是指计算平台和信息空间的数据、软件服务等各种资源,物是指数字化的设备装置和可传感的物品。或曰“信息-物理-社会”三元融合系统。}的发展趋势使得软件成为信息社会的基础设施。软件科学与工程学科已进入一个新的阶段,其发展日新月异,重要性日益凸显。在本书上篇回顾软件学科发展历程、梳理发展脉络、总结发展规律的基础上,本篇各章讨论在人机物融合的时代背景下,面向软件作为基础设施的时代要求,软件科学与工程学科的发展趋势、关键挑战与潜在突破,为下篇给出学科发展政策建议提供依据。
%\section*{总论}
%软件承载着文明\footnote{“Our civilization runs on software.” —C++之父Bjarne Stroustrup.}
软件是以计算为核心手段实现应用目标的解决方案。软件学科是研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持和生态环境的学科。也就是说,软件学科本质上是一门方法论学科~\cite{Wirth:2008:BHS:1449571.1449577}。其带来的是一种人类思维的创新,以人机共融的方式延伸了单纯人脑思维,形成了一种前所未有的创造力。随着软件应用范围的扩张、软件计算平台的泛化和软件方法技术的发展,软件学科的边界不断拓展,内涵不断深化。本章总论“软件作为基础设施”这一发展趋势,进而以系统观、形态观、价值观和生态观四个视角探讨软件学科的方法论新内涵。
%\footnote{这里所谓人是指系统中的人类参与者及其社会关系,机是指计算平台和信息空间的数据、软件服务等各种资源,物是指数字化的设备装置和可传感的物品。或曰“信息-物理-社会”三元融合系统。}
如第一章中所述,软件是以计算为核心手段实现应用目标的解决方案;软件学科是研究以软件求解应用问题的理论、原则、方法和技术,以及相应的工具支持和生态环境的学科。也就是说,软件学科本质上是一门方法论学科~\cite{Wirth:2008:BHS:1449571.1449577}。其带来的是一种人类思维的创新,以人机共融的方式延伸了单纯人脑思维,形成了一种前所未有的创造力。随着软件应用范围的扩张、软件计算平台的泛化和软件方法技术的发展,软件学科的边界不断拓展,内涵不断深化。本章总论“软件作为基础设施”这一发展趋势,进而以系统观、形态观、价值观和生态观四个视角探讨软件学科的方法论新内涵。
\section{软件作为基础设施}
从人类社会信息化的角度看,软件的基础设施地位具体表现为四个方面。首先,一大批基础软件作为信息基础设施,支撑着各种应用软件的运行。其次,一大批嵌入式软件已成为掌控并支撑物理基础设施运行的关键系统。第三,一大批应用软件及其所提供的服务已成为信息社会不可或缺的基础资源与设施。最后,从软件产业整体的角度看,随着传播和互联的渗透发展,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,构成国家的一种核心竞争力。
从人类社会信息化的角度看,软件的基础设施地位具体表现为两个方面。一方面,软件自身已成为信息技术应用基础设施的重要构成成分,以平台方式为各类信息技术应用和服务提供基础性能力和运行支撑。另一方面,软件正在 “融入”到支撑整个人类经济社会运行的“基础设施”中,特别是随着以互联网和其他网络(包括电信网、移动网、物联网等)的不断交汇融合,软件正在对传统物理世界基础设施和社会经济基础设施进行重塑和重构,通过软件定义的方式赋予其新的能力和灵活性,成为促进生产方式和生产关系变革、产业转型升级、新兴产业和价值链的诞生与发展的重要引擎。因而,计算成为了人类与物理世界互动的中介,软件成为了创造新文明的载体,软件“赋能、赋值”的作用正在被加速和加倍放大,对人类社会的运行和人类文明的发展进步起到重要支撑作用。大规模、高效率地生产高质量的软件产品和提供软件服务的能力已成为社会经济升级发展的新动能,成为国家的一种核心竞争力。
软件成为人类社会基础设施是社会信息化进程不断加深的必然结果,其技术基础是“计算的泛在化”和“软件定义一切”。
“计算的泛在化”是指计算变得无处不在而又无迹可寻。万物数字化、万物互联使得计算无处不在。网络化计算平台迅速拓展到无处不在的各类智能化设备和可传感物体,深入到人类社会生活的方方面面,形成了“人-机-物”三元融合的发展趋势。计算设备、网络设备、存储设备与各类传感器设备、判断设备、决策设备、作动设备所形成的数量众多、大大小小的平台已经互联融合,成为一体。与此同时,对于所服务的用户而言,计算自然融入人类生产、生活活动环境和过程之中,无需关注,不着痕迹。
“计算的泛在化”是指计算变得无处不在而又无迹可寻。互联网和其他网络(包括电信网、移动网、物联网等)的交汇融合,进一步推动了人类社会、信息空间、物理世界的融合。计算设备、网络设备、存储设备与各类传感器设备、判断设备、决策设备、作动设备所形成的数量众多、大大小小的平台互联融合,成为一体;与此同时,对于所服务的用户而言,计算自然融入人类生产、生活活动环境和过程之中,无需关注,不着痕迹,形成新的人机物融合计算环境。人机物融合标志着我们从终端互联、用户互联、应用互联开始走向万物互联,信息技术及其应用更加无处不在,“大数据”现象随之产生,信息化的第三波浪潮正在开启
“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源、包括各种数字化机电设备和可传感物体对象在内的各类物理资源、乃至可通过激励机制调配的人力资源。软件定义可递归分层,形成一种生长式、演化式的可扩展体系。这种软件定义的人机物融合平台逐渐呈现了“泛在操作系统”的发展方向。
“软件定义”是指软件以平台化的方式,向下管理各种资源,向上提供编程接口,其核心途径是资源虚拟化以及功能可编程。需要注意的是“软件定义”与“软件化”是不同的两个概念。“软件化”仅仅描述了根据业务需求来开发具有相应功能的软件应用系统的过程而“软件定义”则是一种技术手段其关注点在于将底层基础设施资源进行虚拟化并开放API通过可编程的方式实现灵活可定制的资源管理适应上层业务系统的需求和变化。“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源、包括各种数字化机电设备和可传感物体对象在内的各类物理资源、乃至可通过激励机制调配的人力资源。软件定义可递归分层,形成一种生长式、演化式的可扩展体系。这种软件定义的人机物融合平台逐渐呈现了“泛在操作系统”的发展方向。
“软件定义一切”实质上是通用可编程思想在各个领域的应用,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备,完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础,使得现代设备或装置往往都具备编程控制的能力,推动了人们基于通用计算机的思维架构(人们将其总结成计算思维)来理解和求解各领域问题,而通用计算机的软件则定义了问题的求解过程。因此,软件将并正在定义一切
“软件定义一切”实质上是通用可编程思想在各个领域的应用,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备,完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础,使得现代设备或装置往往都具备编程控制的能力,推动了人们基于通用计算机的思维架构(人们将其总结成计算思维)来理解和求解各领域问题。可见“软件定义一切”SDX意味着构造针对“X”的“操作系统”。未来的面向人机物融合的软件平台就是对海量异构基础设施资源进行按需、深度软件定义而形成的“泛在”操作系统Ubiquitous Operating System
\section{软件学科范畴的拓展}
作为一门方法论学科,软件学科拓展的驱动力来自软件应用范围扩张、计算平台的泛化和软件方法技术本身发展三个方面。
从软件应用范围扩张的角度看,正如上文所述,计算日益变得无处不在,“人-机-物”三元融合不断深入。在此趋势下,从宏观上看,软件从实现计算的工具逐步转变为信息社会不可或缺的基础设施;从微观上看,软件的角色也从负责应用过程中孤立、确定的信息处理环节,转变为负责定义并协同整个应用涉及的“人-机-物”各类资源,实现应用价值。软件作为系统解决方案,涉及的范畴扩展到各类物理设备、物品和人类的主观体验与价值实现;因而软件学科无可避免地涉及到控制科学、系统科学以及心理学、管理学、社会学等范畴的问题,并以软件学科自身的方法论将其内化和拓展。
从软件依赖的计算平台泛化的角度看,计算平台已经从传统的集中式单机发展到并行与分布式平台,再到今天的“云-边-端”异构多态计算平台。这个网络化计算平台不仅包括传统的互联网,还融合了传感网、物联网、移动互联网、社交网等,标志着计算平台不断向物理世界和人类社会快速延伸,形成了一种泛化的计算平台。软件定义技术为这个“人-机-物”融合的平台提供可编程计算抽象。同时,这个计算平台也使得海量的有关于“人-机-物”融合的应用场景数据不断被收集、处理和积累,成为平台上的重要资源。软件作为应用解决方案,在这个计算平台之上利用数据资源,协同人机物,实现应用价值;同时也通过在这个平台上提供服务,并进一步积累数据,从而不断拓展这个计算平台。
从软件依赖的计算平台泛化的角度看,计算平台已经从传统的集中式单机发展到并行与分布式平台,再到今天的“云-边-端”异构多态计算平台。这个网络化计算平台不仅包括传统的互联网,还融合了传感网、物联网、移动互联网、社交网等,标志着计算平台不断向物理世界和人类社会快速延伸,形成了一种泛化的计算平台。软件定义技术为这个“人-机-物”融合的平台提供可编程计算抽象。同时,这个计算平台也使得关于“人-机-物”融合的应用场景的海量数据不断被收集、处理和积累,成为平台上的重要资源。软件作为应用解决方案,在这个计算平台之上利用数据资源,协同人机物,实现应用价值;同时也通过在这个平台上提供服务,并进一步积累数据,从而不断拓展这个计算平台。
从软件方法技术发展的角度看当前软件的基本形态、所实现的逻辑推理形式、软件开发的隐喻metaphor模式、软件的生态环境、元级方法论都在发生深刻的改变。软件的基本形态从计算机硬件的附属品到独立的软件产品再到云化的软件服务继而转变为无处不在而又无迹可寻的泛在服务。软件所实现的逻辑推理形式在基于规则的演绎之上发展出数据驱动的归纳统计机器学习技术就是后者的典型表现。软件开发的隐喻模式经历了从实现数学计算到模拟物理世界再到虚实融合创造的转变。对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上考虑软件及其利益相关者群体的竞争、协作等社会性特征。在元级方法论层面正从以还原论为主向系统论发展软件作为解决方案越来越多地被视为开放环境中的复杂适应系统而不是封闭规约下的确定行为系统。
从软件方法技术发展的角度看当前软件的基本形态、所实现的逻辑推理形式、软件开发的隐喻metaphor模式、软件的生态环境、元级方法论都在发生深刻的改变。软件的基本形态从计算机硬件的附属品到独立的软件产品再到云化的软件服务继而转变为无处不在而又无迹可寻的泛在服务。软件所实现的逻辑推理形式在基于规则的演绎之上发展出数据驱动的归纳统计机器学习技术就是后者的典型表现。软件开发的隐喻模式\footnote{即软件开发从问题空间向解空间的映射模式}经历了从实现数学计算到模拟物理世界,再到虚实融合创造的转变。对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上考虑软件及其利益相关者群体的竞争、协作等社会性特征。在元级方法论层面,正从以还原论为主向系统论发展,软件作为解决方案越来越多地被视为开放环境中的复杂适应系统,而不是封闭规约下的确定行为系统。
随着软件学科的不断拓展,它也逐渐成为一门基础学科,并向其他学科渗透。所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。其一个标志是其基础内容进入国民基础教育课程体系。软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。而以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
随着软件学科的不断拓展,它也逐渐成为一门基础学科,并向其他学科渗透。所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。软件学科日益呈现出这些特征:软件是把物理世界拓展为信息-物理-社会融合世界的主要手段;与此同时,“软件定义”赋能的计算思维有可能成为继实验观察、理论推导、计算仿真、数据密集型科学之后的新的研究手段,尤其是为以信息-物理-社会融合系统为对象的科学研究提供赖以运作的理论基础和实践规范。而以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
%其一个标志是其基础内容进入国民基础教育课程体系。
\section{软件科学的新理解}
一般而言,驾驭系统固有复杂性的基本途径是有效抽象和层次分解。与其他人工制品不同,软件是纯粹的逻辑产品,原则上只受能行可计算的限制,可以实现最纯粹的抽象,也可以支持最具扩展性的层次分解。回顾软件学科的发展,贯穿始终的主题是以软件范型(建立抽象)为轴心,系统软件(实现抽象)和软件工程(使用抽象)相互促进、螺旋上升的过程。由于软件在应对复杂性方面具有独特优势,软件成为了各类复杂应用系统的“万能集成器”,也成为了人类构造的最复杂的各类系统的核心。另一方面,正因为此,软件而使得万物互联,其所形成的系统的复杂性往往集中体现为软件的复杂性。
一般而言,驾驭系统固有复杂性的基本途径是有效抽象和层次分解。与其他人工制品不同,软件是纯粹的逻辑产品,原则上只受能行可计算的限制,可以实现最纯粹的抽象,也可以支持最具扩展性的层次分解。回顾软件学科的发展,贯穿始终的主题是围绕建立抽象、实现抽象和使用抽象,以软件范型为基础,软件构造方法、软件运行支撑、软件度量和质量评估相互促进、螺旋上升的过程。由于软件在应对复杂性方面具有独特优势,软件成为了各类复杂应用系统的“万能集成器”,也成为了各类人造复杂系统的核心,并且这些系统的复杂性往往集中体现为软件的复杂性。
在软件作为基础设施、软件定义一切的背景下,软件进一步成为构造开放环境下复杂系统的关键。在展望软件学科在新时代所面临的挑战与机遇之前,我们首先在元级方法学,也就是研究方法学的层面上讨论观察软件学科内涵的若干新视角,包括以驾驭复杂性为目标的系统观、以泛在服务和持续演化为特征的形态观、以使用质量为核心的价值观、以及关注群体协作平衡的生态观。
\subsection{系统观}
所谓软件学科的系统观,有三层含义。
第一层含义是系统工程。也就是说,软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注“人-机-物”整个系统的价值实现。软件定义一切的趋势使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”,是实现应用价值的整体解决方案
第一层含义是复杂系统。现代软件系统的复杂性体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在其所处环境的开放性和由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭静态环境下的确定行为系统向开放动态环境中的可适应、可成长的系统、从单体系统向系统之系统转变
第二层含义是复杂系统。现代软件系统的复杂性体现在其前所未有的代码规模、软件处理的数据量、软件用户量和使用的多样性、软件通过网络形成的连接量和种类、涉及承载运行的计算和物理设备量和种类等方面,也体现在其所处环境的开放性和由于“人在回路”所带来的不确定性。这使得看待软件的视角从封闭规约下的确定行为系统向开放环境中的复杂自适应系统、从单体系统向系统之系统转变。
第二层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法,超越还原论。
第三层含义是系统工程。软件学科的关注点应从为应用系统提供高质量的软件部件,上升到关注“人-机-物”融合的整个系统的价值实现。软件定义一切的趋势使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”,是实现应用价值的整体解决方案。
第三层含义是系统论。对于上述复杂软件系统,常常难以用其组成部件的性质去解释其整体性质。此时单纯依赖还原论方法难以驾驭其复杂性,需要借鉴系统论方法。
\subsubsection{系统观下的软件学科发展}
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化(网构软件的实践),以及软件基础设施化、服务化都触发了软件生产方式、计算平台和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统Socio-technical System。人机物融合的软件系统其复杂性本身就呈现在系统乃至系统之系统的层面上综合性和系统性也愈来愈强。系统观要求软件科学体系需超越传统还原论的思维藩篱。
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件设计和优化初显端倪,在一些特定领域获得很大成功。人们对于数据驱动的软件的设计,不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是采用一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件。这种基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。然而,这些研究仍处于方法层次,还未到达方法论的层次,即关于研究问题需要遵循的途径和研究路线,也可视作具体方法的元级层次
软件作为人类智力产品,无论是软件制品本身,还是软件开发、使用过程和场景都与万物和人类有着紧密关联,其开发和运行的网络化、服务化\cite{cite网构软件书},以及软件基础设施化都触发了计算平台、软件生产方式和运行方式的变革。软件创新从个人、组织智慧发展到群体智慧创新。软件科学与自然科学、社会科学等各领域产生了千丝万缕的联系,信息物理融合、软件社会化、大数据时代的软件新形态使得软件必然成为技术-社会系统Socio-technical System。人机物融合的软件系统其复杂性本身就呈现在系统乃至系统之系统的层面上综合性和系统性也愈来愈强。系统观要求软件科学体系需破除传统还原论的思维藩篱
新的软件方法学的关键在于如何认识因果和相关。因果观是有前提的相对的相关性是绝对的。软件发展在人机物融合时代人在回路、“拟人化”计算Human Computation、人机共融等需要关于软件规律的元级方法论创新。
近年来,软件科学在系统观方向上进行了不少探索,包括:基于复杂网络来认识大规模软件系统的整体性质、基于多自主体的软件系统和方法、复杂自适应软件与系统、群体化软件开发方法等。网络化和大数据催发了融合软件系统与系统论研究的切入点,数据驱动的软件性能优化甚至软件设计初显端倪。通过对软件代码大数据特别是动态运行大数据的分析,软件性能优化在云计算平台等一些特定场景获得很大成功。对于数据驱动的软件设计,人们不再遵循传统的自顶向下、分而治之、逐步精化的经典还原论法则,而是采用一种基于输入输出的黑盒的数据描述,训练出深度神经网络,充当所需要的软件。这种基于深度学习的方法从海量的样本中归纳出神经网络,其泛化能力可视为通过神经元系统的涌现而达成的功能。然而,这些研究仍处于方法层次,还未到达方法论的层次,即关于研究问题需要遵循的途径和研究路线,也可视作具体方法的元级层次。
新的软件方法学的关键在于如何认识因果和相关。因果观是有前提的相对的相关性是绝对的探寻因果是认知的必需也是追求。软件发展在人机物融合时代人在回路、“拟人化”计算Human Computation、人机共融等需要关于软件规律的元级方法论创新。
在软件系统的建模方面,软件将从单纯信息处理向“场景计算”发展,这里的场景包括物理环境和社会环境。软件与软件所处的环境或应用场景共同决定了软件的特性和价值,包括功能、性能、安全、可靠等。软件将作用于环境,并且可以改变自身结构以适应环境变化和影响环境的需求。
在软件系统的机理方面,软件的语义将由传统的还原论形式语义方法,向多尺度、可演化的抽象方向发展,组合方式将从传统的静态组合方式向动态可演化的、具有涌现特性的方式发展,建立软件微观行为与宏观行为的辩证统一。面向人机物融合的认知,软件作为人工智能或者“智能+”的承载,将深化复杂自主系统的智能行为理论和方法,软件定义将成为人机物融合系统中学习赋能(型)资源的管理途径。
软件科学的发展也将促进系统论和系统学的发展。在软件定义一切的时代,软件成为复杂适应系统认知的载体和实验平台,而软件发展中形成的以形式化体系为基础的规则驱动软件理论,高性能计算之上建立的模拟仿真技术,与进入智能化阶段形成的大数据驱动的软件方法,为形成还原论和整体论的辩证统一奠定了良好的基础,软件走向人机物融合更是为系统论和系统学的发展提供了实践探索的大场景。
\subsubsection{系统观下软件方法学的关键科学问题}
软件科学的发展也将促进系统论和系统学的发展。在软件定义一切的时代,软件成为复杂适应性系统认知的载体和实验平台,而软件发展中形成的以形式化体系为基础的规则驱动软件理论,高性能计算之上建立的模拟仿真技术,与进入智能化阶段形成的大数据驱动的软件方法,为形成还原论和整体论的辩证统一奠定了良好的基础,软件走向人机物融合更是为系统论和系统学的发展提供了实践探索的大场景。
\subsubsection{系统观下关键科学问题}
软件学科的系统观形成、并与系统学的交叉融合将经历一个长期的阶段。当前软件学科所面临的一个关键科学问题是对于人机物融合系统的建模与分析,表现为两个方面:一是系统论驱动的复杂软件系统的观察和度量方法;二是兼容离散、连续、实时等不同特性的模型表示方法及其工具支持。在操作层面上,系统观下软件方法学的研究有紧密联系的两个抓手:
\hangafter=1
\setlength{\hangindent}{4.4em}
1 以复杂自适应软件系统为抓手,形成元级反射和学习赋能相结合的元级化理论,建立泛在操作系统的技术和平台;
\begin{enumerate}
\item 以复杂适应性软件系统为抓手,形成元级反射和学习赋能相结合的元级化理论,以此研究泛在操作系统的基本理论、关键技术和实现平台,为人机物融合的资源和应用场景建模提供计算的平台抽象;
\item 推进数据驱动软件开发方法的发展,打通传统软件方法与数据驱动软件方法的界限,突破大数据分析的可解释性和常识推理问题,为涌现现象规律的认识、解释、设计建立基础理论和方法。
\end{enumerate}
展望未来,多自主体形成的协同与自组织以及自适应结构和能力、网络化产生的大数据与数据语义的复杂网络,将是软件系统在传统规则驱动基础上走向人机物融合超大规模系统的基础。软件作为复杂系统乃至复杂巨系统,软件科学将与系统学共同发展—软件方法学将吸收系统论成果,并支撑系统论和系统学的发展。
\hangafter=1
\setlength{\hangindent}{4.4em}
2 推进数据驱动软件开发方法的发展,打通经典软件方法与数据驱动软件方法的界限,突破大数据分析的可解释性和常识推理问题,为涌现现象规律的认识、解释、设计建立基础理论和方法。
展望未来,多自主体形成的协同与自组织以及自适应结构和能力、网络化产生的大数据与数据语义的复杂网络,将是软件系统在传统规则驱动基础上走向人机物融合超大规模系统的基础。软件作为复杂系统乃至复杂巨系统,在软件定义时代,软件科学将与系统学共同发展,软件方法学将吸收系统论成果,并支撑系统论和系统学的发展。
\subsection{形态观}
随着计算机技术的发展和计算机应用的不断深入,软件的外在形态逐步从硬件附属物、独立的软件制品发展到网络化服务。与之相对应,软件开发范型也经历了无结构、结构化、面向对象、面向构件、面向服务的发展历程。当前,软件的外在形态正在朝着泛在化和可持续成长的方向发展:在空间维度上,软件应用的范围越来越广,对于人类生活和现实世界的渗透力越来越强,呈现出泛在化的趋势;时间维度上,软件应用随着上下文环境及用户需求的变化不断适应和演化,呈现出持续成长的趋势。与此同时,软件开发范型也进一步向网构化以及数据驱动的方向发展。
随着计算机技术的发展和计算机应用的不断深入,软件的外在形态逐步从硬件附属物、独立的软件制品发展到网络化服务。与之相对应,软件范型也经历了无结构、结构化、面向对象、基于构件、面向服务的发展历程。当前,软件范型进一步向网构化以及数据驱动的方向发展。其应用形态在空间维度上,随着软件应用的范围越来越广、对于人类生活和现实世界的渗透力越来越强,呈现出泛在化的趋势;在时间维度上,随着应用上下文环境及用户需求的变化不断适应和演化,呈现出持续成长的趋势。
\subsubsection{软件应用的泛在化}
计算和信息处理早已通过各种移动设备、嵌入式设备以及各种传感器渗透到了我们日常生活的方方面面,并通过各种通信技术实现了广泛的设备互连和信息互通。各种软件应用以嵌入式的方式实现预定义的信息处理和通信功能。近些年来,信息技术呈现软件定义一切的发展趋势,即软件全面接管人类社会以及物理社会中的各种资源(包括物理、计算和人力资源),以各种形式的接口对外提供服务。这一发展建立在软件的云化与服务化基础上,这使得软件的核心能力脱离了固化的用户界面和使用环境,可以按需灵活获取并组合。另一方面,硬件专用化使得运行在各种面向特定用途的硬件设备上的软件应用能够获得更好的执行效率。
面向最终用户的软件应用将越来越多地以人机物融合应用的形态出现,即软件以平台化、定制化和集成化的方式融合人、机、物三个方面的资源和服务从而满足用户的各种需求。这种新型的人机物融合应用具有泛在化、社会化、情境化、智能化的特点,即:软件应用无处不在同时又无迹可寻;所融合的人机物资源具备社会属性,来自于不同所有者并以社会化的方式产生价值交换;软件应用面向最终用户所处的情境按需构造,以满足即时的用户需求为目标;软件应用在智能化技术基础上,以非预设的方式按需聚合人机物资源并进行定制。
\subsubsection{软件应用的持续成长}
越来越多的软件都已具备面向动态变化环境的适应性和面向需求变化的演化性。软件通过监控、分析、决策、执行的反馈环路对其结构和行为进行调控并通过不断演化来保持其有用性。快速响应变更请求并实现持续的软件演化是软件产品保持竞争优势的一个必要条件。在过去的几十年中软件开发的主流方法已经从以瀑布模型为代表的计划驱动的方法演变为以敏捷开发为代表的快速迭代开发方法。基于云的软件应用以及软件开发平台的发展进一步催生了开发运维一体化DevOps的技术趋势。由此反映出软件演化中的反馈和迭代周期越来越短演化越来越频繁。另一方面越来越多的软件应用以服务化和云化的方式运行在提供服务的同时持续收集用户的行为及其反馈并在云端汇聚形成软件用户大数据。这种不断积累的用户数据为软件应用的持续优化和改进提供了新的途径。数据驱动的软件演化方式反映了用户行为已经在一定程度上取代专家成为掌握软件演化方向的主导力量。软件将逐步从被动演化转变为基于内生机制的持续生长。
\subsubsection{新形态下的软件学科内涵}
在软件定义一切以及人机物融合的发展背景下产生的软件应用的泛在化和持续成长的新特征对于软件学科的内涵发展将产生多个方面的影响。
越来越多的软件都已具备面向动态变化环境的适应性和面向需求变化的演化性。软件通过监控、分析、决策、执行的元级反馈环路对其结构和行为进行调控并通过不断演化来保持其可用性。快速响应变更请求并实现持续的软件演化是软件产品保持竞争优势的一个必要条件。在过去的几十年中软件开发的主流方法正在从以瀑布模型为代表的计划驱动的方法演变为以敏捷开发为代表的快速迭代开发方法。基于云的软件应用以及软件开发平台的发展进一步催生了开发运维一体化DevOps的技术趋势。由此反映出软件演化中的反馈和迭代周期越来越短演化越来越频繁。另一方面越来越多的软件应用以服务化和云化的方式运行在提供服务的同时持续收集用户的行为及其反馈并在云端汇聚形成软件用户大数据。这种不断积累的用户数据为软件应用的持续优化和改进提供了新的途径。数据驱动的软件演化方式反映了用户行为和体验的反馈已经在一定程度上成为掌握软件演化方向的主导力量。软件将逐步从被动演化转变为基于内生机制的持续生长。
\subsubsection{形态观下的软件学科发展}
在软件定义一切以及人机物融合的发展背景下软件应用的泛在化和持续成长的新特征对于软件学科将产生多个方面的影响。
首先,“软件定义+计算思维”将成为每个人解决现实问题、满足自身需求的新范式。未来的人类社会及日常生活的方方面面都将以软件定义的人机物融合应用的方式来实现。实现用户需求的应用软件将越来越多地以最终用户编程的方式面向应用场景按需构造。因此,最终用户必须具备基于计算思维的问题解决方案规划和构造能力。同时,这也要求我们为支持人机物融合的泛在服务软件提供通用的编程抽象(包括编程模型和语言),支持这种最终用户编程。
其次,适应泛在化、专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要具备面向不同专用硬件和平台的高效定制和裁剪能力。
其次,适应泛在专用化的计算设备和运行平台成为软件的普遍要求。大量的应用软件将从通用的硬件和平台迁移到专用的硬件和平台上,需要新的方法和工具支持来实现大范围的软件迁移和优化。针对通用目的开发的软件需要不依附于硬件的长期生长演化能力,并具备面向不同专用硬件和平台的高效定制和裁剪能力。
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据定义(代码也可以看作一种数据)的方式进行表示,并通过数据驱动的方式实现自演化和自生长。
再次,内生的持续成长能力将成为软件的基本能力。除了自适应能力外,软件将越来越多地具备支持自演化的持续生长能力。这种持续生长意味着通过各种智能化算法调整软件的算法和策略从而实现优化运行,而且还意味着软件通过各种生成以及合成能力不断增强自身的能力。因此,未来软件定义中功能与数据的界限将进一步模糊,越来越多的功能将通过数据驱动的方式进行设计,并实现自演化和自生长。
最后,软件与人将在不断汇聚的群体智慧中实现融合发展。软件的覆盖面越来越广、渗透性越来越强,最终用户对于软件的依赖也越来越强。由此,软件所能获得的关于用户行为和反馈的数据越来越全面和丰富,并在此基础上形成越来越强的群体智慧。这种群体智慧注入软件后又将服务于每个最终用户,使得他们能够在各种应用场景中以更加智能化和个性化的方式满足自身的需求,从而使得软件在使用中越来越有“灵性”和“人性”。未来的软件学科及相关研究需要摈弃“人”与“软件”二元分离的思维定式,更加自觉的考虑人机共融,不仅考虑“人因”,更要考虑“群智”。
\subsubsection{形态观下关键科学问题}
\subsubsection{形态观下软件方法学的关键科学问题}
形态观下软件学科面临的一个关键科学问题是如何面向最终用户场景、通过人机物资源的按需融合与自适应、自演化持续满足用户的多样化需求。这一问题的解决有赖于编程语言及系统软件支撑、软件构造方法、软件演化与维护方法等多个层面的方法和技术发展。
1最终用户是人机物融合应用的使用者同时也在个人所见的人机物资源视图基础上参与应用的构造过程。这方面的问题包括如何面向最终用户提供软件定义的人机物资源编程模型和语言如何发展示教编程programming by demonstration、图形化编排等面向非专业开发者的最终用户编程方法以及相配套的工具环境
2软件应用的泛在化要求各种面向通用目开发的软件以解构再重构的方式以用户为中心按需分布到泛在化、专用化的计算设备和运行平台上从而适应应用按需融合与自适应、自演化的要求。这方面的问题包括如何通过新型编译器、翻译器及其他系统软件工具支持遗留软件系统实现面向不同专用硬件和平台的高效定制和裁剪如何基于超轻量级容器、泛在操作系统等新型系统软件支持泛在环境下软件部件的高效动态部署和运行
3软件应用的持续生长要求软件以更加柔性的方式进行定义和构造同时以更加智能化的方式实现软件的动态构造和更新。这方面的问题包括如何通过运行时模型实现软件功能和实现策略的运行时定义如何基于用户行为和反馈数据实现对于软件用户满意度及环境适应性的评价如何根据用户目标、代码上下文及运行时反馈实现程序的自动合成和适应性调节
形态观下软件学科面临的核心科学问题是如何面向最终用户场景、通过人机物资源的按需融合与自适应、自演化持续满足用户的多样化需求。这一问题的解决有赖于编程语言及系统软件支撑、软件构造方法、软件演化与维护方法等多个层面的方法和技术发展。
\begin{enumerate}
\item 最终用户是人机物融合应用的使用者同时也直接参与在其所见的人机物资源视图上构造应用。这方面涉及的科学问题是如何面向最终用户提供基于软件定义的建模方法并提供相应的编程模型和语言技术层面包括如何发展示教编程programming by demonstration、图形化编排等面向非专业开发者的最终用户编程方法以及相配套的工具环境。
\item 软件应用的泛在化要求各种面向通用目的开发的软件以解构再重构的方式,以用户为中心按需分布到泛在化、专用化的计算设备和运行平台上,从而适应应用按需融合与自适应、自演化的要求。这方面的科学问题在于如何为“解构再重构”建立抽象,技术层面包括:如何通过新型编译器、翻译器及其他系统软件工具支持遗产软件系统实现面向不同专用硬件和平台的高效定制和裁剪;如何构建新型的泛在操作系统、支持泛在环境下软件部件的高效动态部署和运行。
\item 软件应用的持续生长要求软件以更加柔性的方式进行定义和构造,同时以更加智能化的方式实现软件的动态构造和更新。这方面的科学问题在于如何构建软件适应性演化、成长性构造的体系结构和核心机理,技术层面包括:如何通过运行时模型实现软件功能和实现策略的运行时定义;如何基于用户行为和反馈数据实现对于软件用户满意度及环境适应性的评价;如何根据用户目标、代码上下文及运行时反馈实现程序的自动合成和适应性调节。
\item 软件作为“万能集成器”扮演着人机物融合时代万物互联平台的重要角色,向下通过软件定义的方式接入各种人机物资源,向上支撑面向最终用户的人机物融合应用场景的实现。这方面的科学问题在于如何支持跨越人机物三元空间的统一的数据流、控制流和状态空间抽象及运行时代码自动生成?技术层面包括:如何将传统软件系统中局限于确定系统边界之内的人机物交互建模与实现方式扩展到面向开放系统的场景;如何面向用户需求实现人机物资源的统一调度并确保开放环境下的可信交互。
\end{enumerate}
\subsection{价值观}
传统的软件质量观以软件制品为中心,人们主要通过客观度量软件系统来评估软件。新时代下,软件制品的内外部质量要求进一步强化和扩展。更重要的变化是,软件通过服务的方式满足用户需求,软件无迹可寻的趋势强化了软件作为人类价值载体的特征,需要在传统的质量观的基础上发展以人为中心的价值观。
\subsubsection{从质量走向价值}
传统的软件质量模型定义了内部质量、外部质量和使用质量其主要关注包含内部质量和外部质量的系统质量。新时代下软件生态和形态特征变化使得对于软件质量需要有新的认识。一方面变化是软件的服务化特征软件系统通过服务满足用户需求用户不再拥有软件制品只享受软件提供的服务。软件服务可能由单一软件系统或多个质量参差不齐的软件组合完成因此软件质量既针对单一软件系统也针对软件系统的组合。另一方面技术对社会的影响使得软件体现了人类价值观。人类价值观指的是“基于人的一定的思维感官之上而作出的认知、理解、判断或抉择体现了人、事、物一定的价值或作用”价值观具有稳定性、持久性、历史性和选择性等特点软件通过一系列价值要素体现了主观的人类价值观这些价值要素包括隐私性、安全性Safety \& Security、平等性等。传统的质量观转变为 “以软件制品为基础,以用户体验为中心”的价值观。在价值观主导下,不同用户会有不同的软件预期,也会使得同一软件系统具有不同的价值;软件系统体现的价值观,在人机物融合的发展背景下将作用于物理世界,影响物理世界的价值走向。
\subsubsection{新时代软件系统的价值要素}
软件会有多个不同的角度来评价其价值。未来人机物融合的软件系统将在可信性、安全性、伦理观和持续性等价值要素上推动软件学科的发展。
传统的软件质量模型定义了内部质量、外部质量和使用质量,其主要关注包含内部质量和外部质量的系统质量。在人机物融合的趋势下,软件形态和生态特征变化要求重新认识软件质量。一方面变化是软件的服务化特征软件系统通过服务满足用户需求用户不再拥有软件制品只享受软件提供的服务。软件服务可能由单一软件系统或多个质量参差不齐的软件组合完成因此软件质量既针对单一软件系统也针对软件系统的组合。另一方面技术对社会的影响使得软件体现了人类价值观。人类价值观指的是“基于人的一定的思维感官之上而作出的认知、理解、判断或抉择体现了人、事、物一定的价值或作用”价值观具有稳定性、持久性、历史性和选择性等特点软件通过一系列价值要素体现了主观的人类价值观这些价值要素包括隐私性、安全性Safety \& Security平性等。传统的质量观转变为“以软件制品为基础,以用户体验为中心”的价值观。在价值观主导下,不同用户会有不同的软件预期,也会使得同一软件系统具有不同的价值;软件系统体现的价值观,在人机物融合的发展背景下将作用于物理世界,影响物理世界的价值走向。
\subsubsection{价值观下的软件学科发展}
软件会有多个不同的角度来评价其价值。未来人机物融合的软件系统将在可信性、安全性、伦理和持续性等价值要素上推动软件学科的发展。
1可信性
@ -102,74 +126,79 @@
2安全性
安全性要求为人类活动和生存环境提供必要的安全保障,包括系统安全Safety和信息安全Security。系统安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害,信息安全是指能有效防控各类的非法获取、传播和使用。软件信息安全保障失效的后果之一就是系统安全故障因此本书将两种安全性合二为一统称为安全性Safety\&Security。传统软件质量观将安全视作系统质量的一部分强调软件个体的安全性。随着人机物融合软件系统已融入人类社会并与人类无缝交互。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播。软件作为基础设施参与并掌控了很多关键领域的资源其安全性威胁会给整个系统带来致命的威胁。因此安全性这一质量属性随着软件成为基础设施的现状变得愈发重要。
安全性要求为人类活动和生存环境提供必要的安全保障,防危安全Safety和信息安全Security。防危安全是指能及时有效地避免给人员、设施、环境、经济等造成严重损害,信息安全是指能有效防控各类的非法获取、传播和使用。软件信息安全保障失效的后果之一就是防危安全故障因此本书将两种安全性合二为一统称为安全性Safety \& Security。传统软件质量观将安全视作系统质量的一部分强调软件个体的安全性。随着人机物融合软件系统已融入人类社会并与人类无缝交互。换言之泛在计算平台上软件与软件、软件与人的交互无处不在软件个体可影响整个泛在网络计算平台的行为软件个体的漏洞等故障很容易扩散传播。软件作为基础设施参与并掌控了很多关键领域的资源其安全性威胁会给整个系统带来致命的威胁。因此安全性随着软件成为基础设施的现状变得愈发重要。
3伦理
3伦理
作为人类价值载体,软件行为体现了人类价值观;由于软件无迹可寻,导致人类价值观又通过软件影响人类社会。因此,软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终体现于软件系统的具体行为。因此,软件系统的伦理,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
作为人类价值载体,软件行为体现了人类价值观;由于软件泛在化,导致人类价值观往往通过软件影响人类社会。软件与人从以往的“使用”关系变为了“伙伴”关系。因此,软件系统的行为应符合社会道德标准,不会对个人和社会产生负面结果,这种规范称为软件系统的伦理。社会道德定义了一定时间区域内人们行为规范,可具体表现为无歧视、尊重隐私、公平公正等,并最终体现于软件系统的具体行为。因此,软件系统的伦理,也体现于软件行为的上述方面,并需要通过软件开发和运行的诸多机制进行支持。
4持续性
软件系统成为支撑社会经济运行的基础设施掌控了国民经济和社会关键基础资源需具有持续提供服务的能力。软件系统提供服务的可持续性Sustainability指的是在持续不间断运行、维护和发展过程中面对各种突发异常事件仍能提供令人满意的服务的能力。软件支撑的基础设施服务为满足各类应用快速增长、新技术不断涌现的需求需要具有开放扩展能力即能集成各种异构的技术及系统支持各类软件制品的即时加载/卸载,对内部状态及外部环境变化的感应、自主响应以及调控机制,以及个性化服务的定制等。显然,这种开放体系架构常常引入系统设计的脆弱性和质量隐患,从而给持续提供服务带来挑战。
\subsubsection{价值观下,软件方法学的关键科学问题}
新时代下,软件价值观不仅囊括传统的软件质量观,而且凸显了新时代下软件系统对物理世界的使能作用带来的影响,强调通过人的主体作用减少避免软件系统违反人类价值观。具体地,价值观强化了可信性、安全性、伦理观、持续性等具有新时代特色的价值要素,这些价值要素与软件开发运行维护过程的交融将经历一个长期的阶段,其带来的关键科学问包括四个方面:
\hangafter=1
\setlength{\hangindent}{3.4em}
1) 软件以何种方式承载人类价值观?具体地,如何通过需求等阶段获得项目特定的价值观,将其细化并融合于软件开发过程(包括软件的分析、设计和实现等环节)中?
\subsubsection{价值观下关键科学问题}
软件价值观不仅囊括传统的软件质量观,而且凸显了新时代下软件系统对物理世界的使能作用带来的影响,强调通过人的主体作用减少避免软件系统违反人类价值观。具体地,价值观强化了可信性、安全性、伦理、持续性等具有新时代特色的价值要素,这些价值要素与软件开发运行维护过程的交融将经历一个长期的阶段,其带来的关键科学问题包括四个方面:
\hangafter=1
\setlength{\hangindent}{3.4em}
2) 如何定义复杂开放软件的可信性度量模型,并以此为基础通过开发运行环境证据的收集评估软件可信性?在开放环境下,可信性的定义也是动态多变的,如何在系统实现和运行中支持动态的可信性?
\begin{enumerate}
\item 软件以何种方式承载人类价值观?具体地,如何通过需求、设计等阶段获得项目特定的价值观,将其细化并融合于软件开发过程(包括软件的分析、设计和实现等环节)中?
\item 如何定义复杂开放软件的度量模型,并以此为基础通过开发运行环境证据的收集评估软件价值要素?在开放环境下,价值要素的定义也是动态多变的,如何在系统实现和运行中支持动态的价值变化?
\item 如何在复杂软件开发和运行过程中引入持续保值的机制,使得作为基础设施的软件系统在各种内外部非确定动态因素影响下不仅具有持续性,而且在演化成长中持续保值?
\end{enumerate}
% 3) 如何在泛在网络计算平台下系统地从硬件层、系统层、应用层等全栈来考量软件安全性Safety\&Security
\hangafter=1
\setlength{\hangindent}{3.4em}
3) 如何在泛在网络计算平台下系统化地从硬件平台、操作系统、应用软件等多层考虑软件安全性Safety\&Security
\hangafter=1
\setlength{\hangindent}{3.4em}
4) 如何在软件开发和运行过程中引入灵活性的机制,使得作为基础设施的软件系统提供的服务具有持续性?此外,这种灵活性机制,有可能会给软件质量等带来的影响,这也是支持持续性的软件系统需要在设计实现中需要解决的问题。
\subsection{生态观}
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。生态化是软件的强大渗透力的必然结果:一方面软件活动延伸到了个体、群体和社会;另一方面软件所涉及的各种元素之间存在越来越多的依赖性、相关性和相互作用。
软件的开发、维护和应用所涉及的各种元素(包括开发者、用户、代码、项目、社区、企业及其环境等)彼此交互、互相依赖,逐渐形成复杂生态系统,需要用生态化的观点去理解和研究。生态化是软件的强大渗透力的必然结果:一方面软件活动延伸到了个体、群体和社会;另一方面软件所涉及的各种元素之间存在越来越多的依赖性、相关性和相互作用。
\subsubsection{软件生态系统}
“人-机-物”三元融合的新型应用模式涉及到广大社会群体,涉及面广,分工精细,不仅需要术业专攻的各种企业和个体参与,也使得它们可以根据其本身特点和业务诉求参与到开发、应用及其支撑的各个环节,从而形成联合生态。
开源是一类典型生态系统。开源以燎原之势渗透到了软件产业各个领域,目前80\%的软件开发都是开源模式几乎100\%的IT企业都借鉴开源代码故而代码片段、软件包、软件以及技能、知识和上下游项目等的依赖无处不在,生态以一种自然的方式呈现于软件、开发者、开发社区和企业中。一些大规模复杂软件尤其是基础软件例如Linux内核OpenStack等因其基础性和流行度涉及到众多厂商的利益因此也会吸引庞大的群体企业和个体在其开发和应用市场中扮演不同的角色形成生态。
开源是一类典型生态系统。开源以燎原之势渗透到了软件产业各个领域。目前80\%的软件开发都是开源模式几乎100\%的IT企业都借鉴开源代码这使得代码片段、软件包、软件以及技能、知识和上下游项目等的依赖无处不在。一些大规模复杂软件尤其是基础软件例如Linux内核OpenStack等因其基础性和流行度涉及到众多厂商的利益因此也会吸引庞大的群体企业和个体在其开发和应用市场中扮演不同的角色形成生态。
总的来说,软件生态系统指参加软件活动(开发、运行、维护、应用等)的一组实体及其环境组成的、彼此交互的社区体系(系统之系统)。生态系统可以从下述几个维度来刻画。
总的来说,软件生态系统由软件活动(开发、运行、维护、应用等)中各类实体元素及其环境组成的、彼此交互的社区体系。生态系统可以从下述几个维度来刻画。
首先,多元素交互(开发者、用户、代码、项目、社区、企业等)是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性(因为核心参与者——开发者和用户——都是社会体)。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
首先,多元素交互是软件生态系统的最典型特征,而且交互的元素具有深刻的社会性。元素关系主要体现为协作、竞争和混合并保持生态的平衡。系统中要素关系(对立、独立或互补)之间的平衡是秩序之本,非平衡是运动变化之源。
其次,生态系统的关键元素是个体、代码和项目/社区,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,形成各种供应链,而个体、代码和项目之间因为彼此依存也存在各种影响。生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
其次,生态系统的关键元素是个体、代码、项目,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,网状的依赖形成各种供应链。个体、代码和项目之间因为彼此依存也存在各种影响,故而生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
第三,生态系统是由群体智能和计算机智能交互并融合而实现的。群体智能体现为分布在全球的开发者和用户,计算机智能体现为支撑分布式开发和使用的工具和基础设施(计算机辅助支持和人机交互)。群体智能(体现了众多的个体认知的汇聚,并涵盖商业智能和宏观调控的战略智能等)通过计算机智能凝炼为代码和产品,计算机智能支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。
\subsubsection{生态观下的软件学科的关键科学问题}
软件从过去的个体作坊开发,到不同组织内或组织间参与下的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战。
第三,生态系统是由人类智能和机器智能交互并融合而实现的。人类智能体现为分布在全球的开发者和用户;机器智能体现为支撑分布式开发和使用的工具与基础设施,支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。通过众多的个体认知的汇聚,以及商业和宏观调控角度的战略调控,人类智能和机器智能凝练为代码和产品,并向群体混合智能方向发展。
第一个体开发者学习成本进一步增大。首先因为软件之间广泛存在的依赖关系使得掌握一个新的软件需要学习别的软件。例如对某个软件进行调试需要学习的相关软件依赖包可能会很多。其次复杂依赖关系带来了新的问题涉及更多的学习内容。例如不同开源项目遵循相应许可证License的约束并且不同许可证之间存在兼容问题这就要求开发者在借鉴开源代码时需要了解对应的许可证。这其中的关键科学问题是个体开发者如何学习并加入复杂项目和生态
\subsubsection{生态观下关键科学问题}
软件从过去的个体作坊开发,到不同组织内或组织间人员混合参与的组织式开发,发展到了数以万计互相依赖的软件形成的供应链和庞大的生态系统下的社会化开发。其转变给软件开发带来了前所未有的创新可能。同时,规模指数级增长的项目及其之间庞杂的依赖关系使得供应链复杂度激增,进而给软件开发和应用及市场带来诸多挑战。
第二,群体协作更加复杂。首先群体元素更为多样,其次不同元素围绕生态中的各种软件活动存在错综复杂的协作关系,最后协作行为并非恒定而是不断发展和演化的。例如供应链上的软件项目互相依赖,开发者需要跨越多个项目去实现目标功能,开发者之间的协作不再拘泥于单个项目。例如具有不同商业目标的公司需要各司其职,互补有无,还需要跟竞争对手建立协作,在商业利益和群体目标之间实现平衡。已有的群体协作机制大多聚焦对单个项目的支持,互相依赖的项目之间因缺少有效的信息沟通与集成机制使得群体协调的复杂度增大。总之,这其中的关键科学问题是:复杂生态中群体如何协作,协作行为如何发展?
第一,个体开发者学习成本进一步增大。首先因为软件之间广泛存在的依赖和供应链关系使得掌握一个新的软件需要学习别的软件。例如,对某个软件进行调试需要学习的相关软件依赖包可能会很多。其次,复杂依赖关系带来了新的问题,涉及更多的学习内容。
%例如不同开源项目遵循相应许可证License的约束并且不同许可证之间存在兼容问题这就要求开发者在借鉴开源代码时需要了解对应的许可证。
其面临的关键科学问题是:个体开发者如何学习并加入复杂项目和生态?
第三生态可持续性受到的威胁持续增加。软件供应链上的节点是组成生态的关键元素它们互相依赖互相影响。一个软件的漏洞有可能使得其他依赖该软件的项目面临同样的危机。例如影响昭著的Heartbleed漏洞所涉及的OpenSSL项目中的两个文件至少存在于其他六千多个开源项目中。各大企业因为软件供应链的存在对软件溯源即追踪代码问题的来源有很大的需求投资也是可观的。然而软件供应链上节点间的依赖关系隐藏在开发活动数据中看不见摸不着但广泛存在这就使得软件生态的可持续受到更多潜在威胁。而生态的形成和可持续发展影响到软件甚至信息产业的革新和发展。这方面的关键科学问题是大规模代码和项目的供应链行为如何理解产业生态如何形成如何实现可持续发展
第二,群体协作更加复杂。群体元素更为多样,不同元素围绕生态中的各种软件活动存在着错综复杂的协作关系,协作行为并非恒定而是不断发展和演化的。
%例如供应链问题使得开发者需要跨越多个项目去实现目标功能,开发者之间的协作不再拘泥于单个项目。又如具有不同商业目标的公司需要各司其职,互补有无,还需要跟竞争对手建立协作,在商业利益和群体目标之间实现平衡。已有的群体协作机制大多聚焦对单个项目的支持,互相依赖的项目之间因缺少有效的信息沟通与集成机制使得群体协调的复杂度增大。
其面临的关键科学问题是:复杂生态中群体如何协作,协作行为如何发展?
总之,尽管有数千万个软件和项目及超过一千亿的源代码文件,但人们对软件生态中供应链的形成和发展,及其可能带来的风险和挑战却知之甚少。随着软件生态系统的快速延展,各类供应链关系逐步显现,如开发供应、技术供应、以及产销供应等。供应链中数以千万计的个体开发者、软件项目、公司等围绕软件形成复杂生态的各种活动数据都被软件支持工具记录下来,可以方便的获取,这为公众或者企业自己更好地理解生态的形成和发展,以降低或消除上述生态中的依赖风险、识别其他可能存在的风险提供了一种很好的方法。利用社会学理论对海量数据可视化出来的软件供应链网络进行分析,可以允许我们从个体学习、群体协作、以及生态持续的角度去识别评估风险,进而地更好保障软件生态的可持续发展。
第三,生态可持续性受到的威胁持续增加。软件供应链上的节点是组成生态的关键元素,它们互相依赖互相影响。一个软件的漏洞有可能使得其他依赖该软件的项目面临同样的威胁。
%例如影响昭著的Heartbleed漏洞所涉及的OpenSSL项目中的两个文件至少存在于其他六千多个开源项目中。
各大企业因为软件供应链的存在对软件溯源有很大的需求。然而软件供应链上节点间的依赖关系隐藏在开发活动数据中,看不见摸不着但广泛存在,这就使得软件生态的可持续受到更多潜在威胁。而生态的形成和可持续发展影响到软件甚至信息产业的模式变革和发展。这方面的关键科学问题是:大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?
综上,生态观对软件方法学带来显著的变化和跨越,软件学科跟其他学科的交叉性将更为凸显。软件和软件学科需要从以往关注个体软件的构建和运维转变到关注有广泛社会参与的软件体系的构建、运维和成长,以及软件生态的平衡和可持续发展。
尽管有数千万个软件项目及超过一千亿的源代码文件,但人们对软件生态中供应链的形成和发展,及其可能带来的风险和挑战却知之甚少。随着软件生态系统的快速延展,各类供应链关系逐步显现,如开发供应、技术供应、以及产销供应等。供应链中数以千万计的个体开发者、软件项目、公司等围绕软件形成复杂生态的各种活动数据都由软件支持工具记录下来,可以方便的获取,这为公众或者企业自己更好地理解生态的形成和发展,以降低或消除上述生态中的风险、识别其他可能存在的风险提供了一种很好的方法。利用社会学理论对海量数据可视化出来的供应链网络进行分析,可以从个体学习、群体协作、以及生态持续的角度去识别评估风险,进而地更好保障软件生态的可持续发展。
综上,生态观对软件方法学带来显著的变化,软件学科跟其他学科的交叉性将更为凸显。软件和软件学科需要从以往关注个体软件的构建和运维转变到关注有广泛社会参与的软件体系的构建、运维和成长,以及软件生态的平衡和可持续发展。
\section{软件学科的发展趋势}
本部分余下各章将采用上述系统观、形态观、价值观和生态观的新视角,结合学科自身的发展规律,讨论学科内各个领域方向所面临的一些主要挑战问题。
我们大胆预测,软件学科的未来发展将由这些问题上的突破和进展所塑造。
\begin{itemize}
\item 在软件理论方面,需研究如何应对大规模的数据与计算;如何保证复杂软件系统的正确性、可靠性、安全性;针对新型计算机的硬件架 构与新的计算平台,如何建立其理论分析基础等。
%为此,需要重点研究
\item 在软件语言方面,需研究如何通过对领域和应用问题的抽象,开发有效的领域特定语言;如何支持多范式程序设计,特别是加强大数据时代语言对数据处理的支持;如何开发人机物融合的泛在混合系统的编译技术;以及如何构建程序语言的安全性保障机制等。
\item 在软件开发方法方面,需研究人机物融合复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等新方法和新技术。
\item 在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键技术问题。
\item 在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。
\item 在人机物融合的领域特定软件系统构造方面,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题。
\item 在软件质量与安全保障方面,需重点研究数据驱动的智能软件系统质量保障、人机物融合场景下的软件系统可信增强、大规模复杂系统安全缺陷检测与保障以及物联网软件安全保障等挑战性问题。
\item 在软件生态方面,需要研究并阐明各类软件生态如何形成,如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链行为、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作等。
\item 最后,在软件教育方面,需研究面向不同受众对象和认知水平的普及教育、反映人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育,给出适应软件学科发展的人才培养理念及教育方法。
\end{itemize}
本书在第一篇总结了软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成有机整体,其中软件范型是软件学科的核心内容范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量评估等各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
软件理论和软件语言方面将着力解决如何建立适应人机物融合的软件范型这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算平台)下的程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件范型发展的基础。
软件构造方法将“软件定义”人机物融合的“场景计算机”,它要在万物互联的平台上持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。
软件运行支撑需要满足软件作为社会基础设施的规模、效能、持续、演进等诸多关键需求,并适应人机物融合的各类资源和应用场景的管理和实现。这将集中反映在未来的泛在操作系统与运行平台方面,需研究支持软件定义的新型运行平台架构、泛在资源的高效虚拟化和灵活调度、复杂软件系统持续适应演化的共性支撑、人机物融合过程中的安全与隐私保护等关键问题。
软件度量和质量评估是软件学科的科学观察、工程构造相交融的重要方面。未来的重要变化是在复杂系统和软件生态层面的科学观察并以此为基础开展在软件开发和运行层面的持续发展。以各类软件大数据为核心的度量抽象将揭示
软件生态如何形成、如何可持续发展的基本规律,进而理解并驾驭大规模代码和项目的供应链及其变化、支持个体学习并加入复杂项目和生态,改进复杂生态中群体的协作。数据驱动和规则驱动将在软件质量与安全保障上发挥重要的作用。
“数据为中心”是人机物融合时代的最为突出的特征,数据工程和数据管理是未来软件构造和运行支撑的共性沉淀。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。
软件学科的发展呈现了纵横交错的发展态势,即共性沉淀和领域牵引相辅相成的格局,这在人机物融合时代复杂多变的应用和开放平台上将更为显现。在不同的应用领域,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究各领域的环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题,在已有共性方法上发展领域特定方法,并反馈并带动新型共性方法的发展,从而系统综合地把握“以纵带横、纵横交错、落实在横”的学科未来。
软件学科的发展离不开软件教育体系、内容、方法、手段的变革。软件教育需要适应“软件定义一切”普及教育的需求,还要在顺应人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育上有新发展。
本部分余下各章将讨论学科内各个领域方向所面临的一些主要挑战问题。
我们大胆预测,软件学科的未来发展将由这些问题上的突破和进展所塑造。