Ji's revisions

This commit is contained in:
Xiaoxing Ma 2020-02-05 18:12:37 +08:00
parent 625fc4ba7a
commit 8af71c1625
4 changed files with 1016 additions and 1011 deletions

View File

@ -76,9 +76,7 @@
作为一门相对年轻而又发展迅速的学科,软件学科的内容一直在不断深化、边界一直在不断扩展。
从学科内容看,作为方法论的软件学科的总目标在于帮助开发者驾驭以计算为手段解决应用问题的复杂性,
而抽象是驾驭复杂性的基本手段。若采用以软件抽象为中心的视角,软件学科包含四个核心子领域,即软件范型、软件运行支撑、软件构造方法以及软件度量与质量评估。
其中,软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,其核心任务是建立通用的抽象机制,包括抽象的表示和抽象之间的关系;软件运行支撑的核心任务是高效支撑这些抽象及其构成的程序运行;软件构造方法的核心任务是使用抽象构建解决方案完成特定应用目标;软件度量与质量评估的核心任务通过从复杂度和质量的角度对软件抽象进行度量和评估,发现软件规律。参见下图。
如果把计算平台集合看作是平台空间,软件集合看作是解空间的话,软件学科主要研究如何将问题空间元素(问题)映射到解空间元素(解决方案)、以及如何构建平台空间元素(计算平台)以高效运行解空间元素(解决方案),而抽象是构建上述空间元素模型、并建立模型之间关系的元素。作为方法论的软件学科的总目标在于如何驾驭用计算为手段解决应用问题的复杂性,通过抽象方法建立模型及模型之间的联系成为驾驭上述空间及其之间映射复杂性的基本途径。若以软件抽象为中心视角,软件学科包含四个子领域,即软件范型、软件运行支撑、软件构造方法以及软件度量与质量评估。其中,软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,其核心任务是建立通用的抽象机制,包括抽象的表示和抽象之间的关系,为问题空间、解空间和平台空间建模;软件构造方法的核心任务是建立问题空间抽象到解空间抽象的映射方法,构建解决方案完成特定应用目标;软件运行支撑的核心任务是建立解空间向平台空间的映射方法并构建平台空间抽象的计算实现;软件度量与质量评估的核心任务通过从质量和效率的角度对软件抽象及其构造、运行进行度量和评估。四个子领域是密切联系、相互作用的。简而言之,软件范型回答“软件是什么”的问题;软件构造方法回答“怎样做软件”的问题;软件运行支撑回答“怎样运行软件”的问题;软件度量和质量评估回答“软件好不好”的问题。软件范型是核心和基础,它的变化将牵引构造方法、运行支撑、度量和质量评估的一系列变化;软件范型与构造方法、运行支撑是一体两翼,构成了软件方法和技术主体;软件度量和质量评估与前三者是一种横切关系,它通过量化发现软件和技术的规律,并评价解决方案对应用目标的满足程度。参见下图。
\begin{figure}[htbp]
\centering
@ -91,17 +89,17 @@
\end{figure}
软件范型主要内容是程序设计语言和软件理论。程序设计语言用于描述软件的计算行为,承载着软件的范型。
一方面,程序设计语言需要提供更高抽象层次和更灵活的语言设施以提高软件构造、运行的效率和质量;
一方面,程序设计语言需要提供更有效、有力、更符合人类思维的语言设施以提高软件构造、运行的效率和质量;
另一方面,这些语言设施又需能高效地实现以保证软件的执行效率。而软件理论包括了程序理论和算法理论,给出软件抽象构造的理论基础。
软件运行支撑将计算系统的概念从硬件扩展到了软件层面上,负责驱动下层计算资源有效运转、为上层应用提供共性支撑。其内容主要是在计算平台上实现抽象的软件技术以及相应的软件系统,包括操作系统、编译系统、中间件和数据库管理系统等。
软件构造方法针对的关键问题包括如何理解所面对的问题空间、如何理解当前需要软件来解决的问题并以此设计可能的解决方案、以及如何高效高质量地开发出能满足需求的软件等。软件构造方法包括了软件开发的技术、过程、管理等方面,形成了软件学科的软件工程分支的主要内容。
软件运行支撑将计算平台的概念从硬件扩展到了软件层面上,负责驱动下层计算资源有效运转、为上层应用提供共性支撑。其内容主要是在平台空间中实现解决方案、并构建平台空间的计算实现,包括操作系统、编译系统、中间件和数据库管理系统等。
%其中,操作系统负责管理计算系统软硬件资源、操纵程序运行,为应用软件提供公用支撑。
%编译系统(又称编译器)负责将源语言编写的源程序翻译为等价的可 运行目标程序;
%中间件将系统软件的概念扩展到网络环境,为分布式应用软 件部署、运行和管理提供支撑;数据库管理系统旨在统一管理和维护数据库中的数据,是存储、组织、联接、变换和加载数据的软件。
软件构造方法针对的关键问题包括如何理解所面对的问题领域、如何理解当前需要软件来解决的问题并以此推断可能的解决方案、以及如何高效高质量地开发出能满足需求的软件等。软件构造方法包括了软件开发的技术、过程、管理等方面,形成了软件学科的软件工程分支的主要内容。
软件度量与质量评估主要内容是将软件对作为观察对象,对围绕软件及与其相关的事物和活动进行度;发现软件及其构造和运行的规律;并对软件质量和软件满足应用价值进行评估和预测。软件度量与质量评估涉及到软件范型、构造和运行诸多方面,通常将其归在软件工程的主要内容之中。
软件度量与质量评估主要内容是将软件对作为观察对象,对围绕软件及与其相关的事物和活动进行度量,并对软件质量和效率进行评估和预测。软件度量与质量评估有助于发现软件及其构造和运行的规律,涉及到软件范型、构造和运行诸多方面,通常将其归在软件工程的主要内容之中。
%由于应用范围的迅速拓展,软件抽象中用于表述现实世界的数据抽象日益重要,数据量及其复杂性迅猛增长,数据管理逐渐从上述三个子领域中分离出来成为一个单独的子领域。
@ -111,7 +109,7 @@
从目前我国人才培养一级学科划分看,软件学科横跨了计算机科学与技术、软件工程、网络空间安全等三个一级学科,特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。
与本国际本科计算教育学科划分相比软件学科横跨了ACM/IEEE Computing Curricula的五个学科即计算机科学、计算机工程、软件工程、信息技术、信息系统。
随着软件学科的快速发展,软件学科也逐渐成为一门基础学科,并向其他学科渗透。
随着信息技术及信息化的快速发展,软件学科也逐渐成为一门基础学科,并向其他学科渗透。
所谓基础学科,是指某个拓展人类可认识改造的世界疆域之不可替代的知识体系,具有独特的思维方式与方法论,为其他学科发展提供不可或缺的支撑。以软件知识为主体的计算机教育已经成为包括我国在内的多个国家的国民基础教育课程体系的主要内容之一。
@ -131,10 +129,10 @@
\begin{enumerate}
\item 从存储程序式电子计算机出现到实用高级程序设计语言出现之前为第一阶段上世纪40年代末到50年代中期。此阶段计算机处理能力有限应用领域主要集中于科学计算与工程计算。编制程序所用的工具是低级语言。系统软件仅能提供程序载入等简单功能。程序开发无系统方法强调编程技巧。
%
\item 从实用高级程序设计语言出现到软件工程提出之前为第二阶段上世纪50年代中期到60年代后期。此阶段计算机处理能力迅速提高应用领域扩展到商业数据处理等领域。人们开发了操作系统以充分利用系统资源。为了适应大量数据处理问题的需要, 数据库及其管理系统开始出现。FORTRAN、COBOL、ALGOL等高级语言的提出,大大提高了程序设计的效率;但软件的复杂程度迅速提高,研制周期变长, 质量难以保证,出现了所谓软件危机。为此,人们提出结构化程序设计方法,并开始了程序正确性和软件可靠性的理论研究。
\item 从实用高级程序设计语言出现到软件工程提出之前为第二阶段上世纪50年代中期到60年代后期。此阶段计算机处理能力迅速提高应用领域扩展到商业数据处理等领域。人们开发了操作系统以充分利用系统资源。为了适应大量数据处理问题的需要, 数据库及其管理系统开始出现。FORTRAN、COBOL、ALGOL等高级语言大大提高了程序设计的效率但软件的复杂程度迅速提高研制周期变长 质量难以保证,出现了所谓软件危机。为此,人们提出结构化程序设计方法,并开始了程序正确性和软件可靠性的理论研究。
%
\item 从软件工程提出到基于互联网的软件服务广泛使用之前为第三阶段上世纪60年代后期到90年代后期
计算机系统的处理能力继续增长,向嵌入式和网络化的平台延伸;应用领域扩展到社会生产生活的诸多方面。
计算机系统的处理能力继续增长,向嵌入式和局域网或基于广域网的企业计算延伸;应用领域扩展到社会生产生活的诸多方面。
以系统化、工程化的方法开发大型软件逐渐成为主流,软件开发方法和技术迅速发展,对象化、构件化等方法获得广泛应用。
%为了适应计算机网络的需要,出现了网络软件;随着微型计算机的推广,
分布式应用和分布式软件得到快速发展,出现了软件中间件。关系数据库管理系统高速发展,获得了很大的成功。
@ -152,22 +150,23 @@
\subsection{软件学科发展规律}
纵观软件学科的历史,可以发现其发展的外在驱动力始终来自于计算平台的发展和应用范围的扩张,
而内在驱动力来自于其核心问题的解决,追求更具表达能力、更符合人的思维模式的编程范型,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀计算平台资源,同时更好地满足用户对易用性的需求。
而内在驱动力来自于其核心问题的解决,追求更具表达能力、更符合人的思维模式的编程范型,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀计算平台,同时更好地满足用户对易用性的需求。
这是由软件学科的方法论学科本质所决定的。
软件的计算平台给出了解决方案所依赖的平台空间,而应用问题域形成了软件的问题空间。
在平台空间和问题空间之间,形成了软件所需具有的功能、目的和适应能力构成的解空间。平台空间从整体看属于解空间的一部分,也是基础部分。
在平台空间和问题空间之间,构成了软件所需具有的功能、目的和适应能力构成的解空间。解空间受制于问题空间和平台空间。
%平台空间从广义上看属于解空间的一部分,也是基础部分。
通过对这三个空间的协同,可以帮助驾驭软件的复杂性,即尽量避免引入附属的复杂性,更好理解和应对本质的复杂性。
软件方法与技术体系的发展过程就是在平台和需求变化驱动力的推动之下,对这三个空间的认识不断深化并在其间有效协同的过程。
软件作为问题解决方案,是在解空间中构建从问题空间的到平台空间的映射。
%软件作为问题解决方案,是在解空间中构建从问题空间的到平台空间的映射。
协调三个空间驾驭复杂性的关键在于软件抽象,包括但不限于程序设计语言设施、软件构件、 软件服务等。
%如前所述,软件方法学及其程序设计语言表达的核心是建立(一般的)软件抽象,而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软 件。
不同层次的抽象(集中体现在软件范型及相应的语言等表达设施)、抽象的计算实现(集中体现在系统软件)和使用(集中体现在软件工程)组成了软件学科发展的脉络。
例如结构化软件范型乃是由于上世纪60年代计算机基础能力(计算、存储与外设)的快速发展和软件危机的出现而导致人们对基础的程序设计方法与语言的科学思考而产生的,
它以结构化的程序抽象较好地协调了软件开发的平台空间与解空间。
而面向对象软件范型则进一步发展了从宏观角度控制复杂性的手段, 如关注点分离、信息隐蔽、模块化等, 并强调将问题空间纳入软件设计的范畴,
提出与问题结构具有良好对应关系的面向对象程序抽象与支撑机制, 从而协调了软件开发的问题空间和解空间。
它以结构化的程序抽象较好地协调了软件开发的平台空间与解空间,解空间和平台空间匹配较好,但问题空间和解空间差距大
而面向对象软件范型则进一步发展了从宏观角度控制复杂性的手段, 如关注点分离、信息隐蔽、多态等, 并强调将问题空间纳入软件设计的范畴,
提出与问题结构具有良好对应关系的面向对象程序抽象与支撑机制, 从而协调了软件开发的问题空间和解空间,平台空间也发展了中间件和容器以支持对象在计算平台的实现
又如,关系型数据库以关系模型抽象很好地平衡了来自平台空间的性能需求和来自问题空间的易用性需求,取得了巨大成功;
但面临非结构化、海量数据的应用问题后,数据库不再采用严苛的关系模型,转而使用更为灵活的键值对结构、文档模型、图模型等更为契合问题空间的抽象,
@ -224,8 +223,8 @@
从软件方法技术发展的角度看,软件的基本形态从计算机硬件的附属品到独立的软件产品,转变到云化和泛在的软件服务,%,转变为无处不在而又无迹可寻的泛在服务。
软件形态的耦合边界趋于模糊,开发运维一体化成为趋势;
面向计算平台和应用需求变化和拓展的软件演化成为软件的常态,元级结构以及在基于规则的演绎之上发展出数据驱动的归纳,将成为超大规模软件体系结构的核心,各种场景的适应和成长是软件运行支撑发展焦点;
软件开发经历了从实现数学计算到模拟物理世界,将拓展到虚实融合创造的转变,人类空间和赛博空间的虚实互动促进着软件方法技术向社会-技术系统Socio-technical System发展对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上考虑软件及其利益相关者群体的竞争、协作等社会性特征软件度量和质量评估的科学观察对于技术的发展和软件生态的发展具有显著意义。
面向计算平台和应用需求变化和拓展的软件演化成为软件的常态,元级结构以及在基于规则的演绎之上发展出数据驱动的归纳,将成为超大规模软件体系结构的重要元素,各种场景的适应和成长是软件运行支撑发展焦点;
软件开发经历了从实现数学计算到模拟物理世界,将拓展到虚实融合创造的转变,人类空间和赛博空间的虚实互动促进着软件方法技术向社会-技术系统Socio-technical System发展对软件作为客体对象的考察从以个体及其生产使用为主扩展到在生态的层面上,转换为考虑软件及其利益相关者群体的竞争、协作等社会性特征;软件度量和质量评估的科学观察对于技术的发展和软件生态的发展具有显著意义。
%在元级方法论层面,正从以还原论为主向系统论发展,软件作为解决方案越来越多地被视为开放环境中的复杂适应系统,而不是封闭规约下的确定行为系统。
\subsection{软件科学的新理解}
@ -287,7 +286,7 @@
软件的价值观是建立在传统的软件制品质量属性基础上,强调用户体验,强调软件系统的应用对人类价值的实现。软件通过一系列价值要素体现了主观的人类价值。
除了可以用经济价值衡量的软件质量以外,尤其需要强调软件的可信性、安全性、
%持续性
伦理和持续性等价值要素。
伦理和持续性等价值要素。
% 传统的软件质量观以软件制品为中心,人们主要通过客观度量软件系统来评估软件。
% 新时代下,软件制品的内外部质量要求进一步强化和扩展。
@ -308,7 +307,7 @@
软件系统的可信性,包括软件本身可信和行为可信两个方面。
软件本身可信,指的是软件身份可信和能力可信,即:软件开发过程提供可信证据(如内部质量和外部质量)进行自证。
软件行为可信,指的是软件行为可追踪记录、不可更改,即:软件运行过程提供监控以控制其对周遭的影响,使得包含该软件在内的整个系统的对外表现符合用户要求。
软件形日趋多样,加剧了软件可信面临的挑战。
软件形日趋多样,加剧了软件可信面临的挑战。
%
% 2安全性
%
@ -376,12 +375,12 @@
其次,生态系统的关键元素是个体、代码和项目/社区,三者互相融合、依赖和影响。个体之间、代码之间、项目之间存在各种依赖,网状的依赖形成各种供应链,而个体、代码和项目之间因为彼此依存也存在各种影响。生态的要义在于供应链的形成和各种影响的相互作用需要抵达平衡。
第三,生态系统是由人类智能和机器智能交互并融合而实现的。人类智能体现为分布在全球的开发者和用户;机器智能体现为支撑分布式开发和使用的工具与基础设施,支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。通过众多的个体认知的汇聚,以及商业和宏观调控角度的战略调控,人类智能和机器智能凝练为代码和产品,并向混合群体智能方向发展。
第三,生态系统是由人类智能和机器智能交互并融合而实现的。人类智能体现为分布在全球的开发者和用户;机器智能体现为支撑分布式开发和使用的工具与基础设施,支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。通过众多的个体认知的汇聚,以及商业和宏观调控角度的战略调控,人类智能和机器智能相互协作、补充,并向群体混合智能方向发展。
%生态系统是由群体智能和计算机智能交互并融合而实现的。群体智能体现为分布在全球的开发者和用户,计算机智能体现为支撑分布式开发和使用的工具和基础设施(计算机辅助支持和人机交互)。群体智能(体现了众多的个体认知的汇聚,并涵盖商业智能和宏观调控的战略智能等)通过计算机智能凝炼为代码和产品,计算机智能支持人们更好地协作、开发和无处不在的使用,并且在开发和使用活动中不断迭代增强。
% \subsubsection{生态观下的软件学科的关键科学问题}
软件从过去的个体作坊开发,到不同组织内或组织间参与的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战,包括:面临高昂的学习成本,个体开发者如何学习并加入复杂项目和生态?复杂生态中群体如何协作,协作行为如何发展?大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?等等。
软件从过去的个体作坊开发,到不同组织内或组织间人员混合参与的组织式开发,发展到了数以万计互相依赖的软件或项目形成的供应链和庞大的生态系统。其转变给软件开发带来了前所未有的创新水平。同时,规模指数级增长的软件或项目及其之间庞杂的依赖关系使得软件供应链的复杂度激增,进而给软件开发和应用及市场带来诸多挑战,包括:面临高昂的学习成本,个体开发者如何学习并加入复杂项目和生态?复杂生态中群体如何协作,协作行为如何发展?大规模代码和项目的供应链行为如何理解?产业生态如何形成,如何实现可持续发展?等等。
%
% 第一,个体开发者学习成本进一步增大。
@ -405,7 +404,7 @@
软件学科是由软件范型、软件开发方法、软件运行支撑、软件度量和质量评估等四方面形成的有机整体,其中软件范型是软件学科的核心内容范型的变化将牵引软件技术体系的变化。而上述系统观、形态观、价值观和生态观的新视角将引起软件范型的变化,并辐射到软件开发、运行和度量各个层面方法和技术的变革,进而从整体软件的生态与教育方面产生深刻的影响。
软件理论和软件语言方面将着力建立适应人机物融合的软件范型的基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算)下程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
软件理论和软件语言方面将着力解决适应人机物融合的软件范型这一基础性问题。软件理论的核心是从复杂系统的角度来建立构建正确、高效、可靠、安全软件系统的理论和算法基础,特别是需要应对大规模的数据与计算的算法理论,以及在新的硬件架构(异构多态)和计算平台(量子计算)下程序理论等等。与软件理论紧密相关,软件语言应重点研究领域和应用问题表达和求解的新抽象,加强大数据时代语言对数据处理的支持,以及开发人机物融合的泛在混合系统的编译技术,在领域特定语言和语言工程、多范式程序设计范式融合、软件语言和实现的内生安全等方面奠定软件定义的形态基础。
软件构造方法将面向人机物融合场景的“软件定义”,软件需要在万物互联的平台上开发、运行、并持续演进地提供服务,具有自主性、协同性、演化性、情境性、涌现性和可信性等诸多特性。这在软件构造的技术方法和组织模式上均需要新方法和技术,包括:复杂场景分析与建模、软件自适应与自成长、基于人机协作的群智化软件开发、数据驱动的软件自动化、安全可信高度智能的开发运维一体化等。
@ -416,7 +415,7 @@
“数据为中心”是人机物融合时代的最为突出的特征,数据工程和数据管理是未来软件构造和运行支撑的共性沉淀。在数据工程方面,需要应对异构数据整理、数据分析和数据安全与隐私保护等挑战。在数据管理方面,需研究如何管理大数据、特别是如何利用新硬件混合架构来实现大数据的管理。
软件学科的发展呈现了纵横交错的发展态势,即共性沉淀和领域牵引相辅相成的格局,这在人机物融合时代复杂多变的应用和开放平台上将更为显现。在不同的应用领域,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究各领域的环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题,在共性方法上发展领域特定方法,并反馈于共性方法的发展,从而系统综合地把握“以纵带横、纵横交错、落实在横”的学科未来。
软件学科的发展呈现了纵横交错的发展态势,即共性沉淀和领域牵引相辅相成的格局,这在人机物融合时代复杂多变的应用和开放平台上将更为显现。在不同的应用领域,面对系统边界的可伸缩性、系统成分的异构性和系统模型的混成性,需研究各领域的环境建模及其软件定义方法、模型驱动场景感知和认知、异构资源的统一表示和封装、系统学习赋能机制及性能确保、异构模型的融合和验证以及空间分布系统的的时空一致性等关键技术问题,在共性方法上发展领域特定方法,并反馈于共性方法的发展,从而系统综合地把握学科未来。
软件学科的发展离不开软件教育体系、内容、方法、手段的变革。软件教育需要适应“软件定义一切”普及教育的需求,还要在顺应人机物融合时代特点的专业教育、融合软件学科知识的其他学科专业教育上有新发展。

71
Ch1-1-History.tex Normal file → Executable file
View File

@ -9,9 +9,9 @@
\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{软件发展简史}
本节我们试图从 “编程”表达解决方案和 “抽象”实现复杂性控制两个基本视角简要回顾软件发展历史,为下节讨论软件学科发展基本规律提供背景。
@ -63,35 +63,36 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
“软件”一词最早出现在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为标志软件成为独立产品并形成巨大产业应用领域从以科学计算和商业计算开始不断扩大逐渐从作为硬件附属品的软硬件一体化阶段过渡到软件产品化、产业化阶段。人们逐步认识到软件是计算机系统的灵魂其共性沉淀形成的系统软件向下管理计算机系统的各类资源向上满足用户对计算机系统的应用需求。
第一个事件是软件与硬件的解绑~\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}。软件工程的出现激活了软件发展的巨大活力。这一史实也提示了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
第二个事件是软件工程\index{软件工程}的提出。计算机能力的快速提高和软件复杂性增加导致了所谓的“软件危机”现象。典型的案例是IBM S/360的操作系统OS/360的进度、开销和可靠性均不尽人意。北大西洋公约组织NATO在1968年举行了首次软件工程会议~\cite{Naur:1969:SER:1102020}。在这次会议上专家们首次提出需要与其他领域的工程方法一样系统化地进行软件开发。正如Margaret Hamilton在开发阿波罗在轨飞行和导航系统项目中所明确指出的“我努力使软件具有其应有的地位使得构造软件的活动受到应有的尊重因而我开始用软件工程将其与硬件和其他类型的工程区分开来成为整个系统工程的一部分”~\cite{Cameron:2018:ComputingEdge}。软件工程的出现激活了软件发展的巨大活力。这一史实也说明了软件发展的外在驱动力,即不断增长的应用需求和计算能力。
\subsection{软件发展的主线}
软件通常可分为应用软件、系统软件和支撑软件。应用软件是指特定应用领域专用的软件面向终端用户完成既定应用目标例如办公软件、聊天软件、财务软件等系统软件位于硬件层之上为应用软件提供服务如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}。软件模型组成了解空间,是将现实世界问题空间映射到计算机世界平台空间的“桥梁”;用人工科学的角度看,软件模型的集合构成问题空间到平台空间的界面
软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示,建模就是建立、使用和实现抽象。它们构成了软件范型的核心内容\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}。其较弱的版本称为语言相对论,是指语言影响思维与决策;而较强的版本称为语言决定论,则是指语言决定思维与认知边界。软件的语汇就是软件的各种抽象设施,是建立软件模型的基本元素。认识软件的切入点是认识各种软件抽象,宏观地说,软件方法学的核心是探讨如何建立、实现和使用抽象。
抽象是驾驭复杂性的基本手段。软件抽象设施往往以软件语言,特别是以程序设计语言、模型语言和相应接口形式给出;软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示。模型和建模构成了软件范型的核心内容\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}
@ -107,13 +108,13 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
\subsubsection{程序设计语言与程序理论}
程序设计语言提供计算平台直接实现的抽象和构建抽象的设施,是软件范型的表示载体和描述工具。程序设计语言总是力图以更一致、更准确的方式实现从问题空间到解空间的映射,更方便地表达问题求解思路,从而使开发者可以用更少的代码完成更多的工作,用更优的结构来控制编程复杂性,用更加严格规范的语法来预防编程错误等。换言之,程序设计语言的设计总是以更具表达能力和提高软件开发效率和质量为主要追求目标。
程序设计语言提供计算平台直接实现的解空间抽象和构建抽象的设施,是软件范型的表示载体和描述工具。程序设计语言力图以更方便、更一致、更准确的方式表示软件,从而使开发者可以用更少的代码完成更多的工作,用更优的结构来控制编程复杂性,用更加严格规范的语法来预防编程错误等。换言之,程序设计语言的设计总是以更具表达能力和提高软件开发效率和质量为主要追求目标。
军事领域的科学和工程计算是计算应用的最初需求。面向科学和工程计算建立的抽象成为软件发展的早期里程碑。为了满足数值计算的需求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年图灵奖。
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}的发展。
@ -126,30 +127,36 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
%\subsubsection{以实现抽象为目标的系统软件}
\subsubsection{系统软件}
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为建立抽象、使用抽象来实现更高级抽象的焦点。系统软件主要任务是建立、使用和实现计算平台抽象。一方面,系统软件通过建立并实现有效的抽象对各类资源进行有效的管理;另一方面,系统软件力图在计算平台之上凝练建立、沉淀实现应用软件中的共性抽象并加以复用,以尽可能提高软件开发。
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为在平台空间中建立抽象、使用抽象来实现更高级抽象的焦点。系统软件着力提高平台空间抽象的执行效率,并提升解空间的抽象层次,向问题空间抽象接近,拉近问题与解之间的间隔。具体说,一方面,系统软件通过建立、使用并实现有效的平台空间抽象对各类资源进行有效的管理;另一方面,系统软件力图在计算平台之上凝练建立、沉淀实现应用软件中的共性解空间抽象并加以复用,以尽可能提高软件开发效率
操作系统中的三个基本要素是抽象、机制和策略。而其抽象的基本设计原则是机制与策略的分离、共性的沉淀。例如进程和进程管理、线程和并发、调度、内存管理、进程间通信、I/O管理、虚拟化、分布文件系统、分布共享内存、安全与隐私抽象-Ownership等等。在实现这些抽象的过程中人们发现并设计了应对计算求解的复杂性的理论和方法。
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划
例如Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。其他例子还包括局部性原理、名字映射、分而治之、信息隐藏等等。程序设计语言和软件工程中许多重要概念来自于操作系统和编译器的设计。Barbara Liskov在操作系统发展50周年研讨会上讨论了操作系统、程序语言和抽象之间的关系指出抽象对系统组织的作用例如用多层次的软件栈来组织复杂系统。
操作系统抽象的三个基本要素是抽象表示、管理机制和策略。其基本思路是抽象表示沉淀共性模型管理机制和策略分离。例如进程是程序执行的抽象进程调度是进程抽象和计算资源的管理机制调度算法是管理进程的控制策略。进程抽象的实现中使用了进程控制块调度机制和算法分而治之地完成进程管理。操作系统中各类资源管理大多采取了这样的设计思路包括内存管理页面、换页、换页策略、I/O管理和安全管理等等。在编译器中从高级语言源程序到机器目标代码之间历经了抽象语法树、中间语言代码、四元式等多层级的抽象目标代码生成过程是这些层级抽象的映射。在系统软件发展过程中人们发现并设计了不同粒度的抽象、抽象使用和实现的原理与方法。
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划而例如Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。其他例子还包括
例如换页策略使用局部性原理、抽象的信息隐藏和分而治之原理等等。程序设计语言和软件工程中许多重要概念来自于操作系统和编译器的设计例如管程、递归协程序等等。Barbara Liskov在操作系统发展50周年研讨会上讨论了操作系统、程序语言和抽象之间的关系指出抽象对构建系统软件的作用。
%例如用多层次的软件栈来定义复杂系统。
%为了应对操作系统设计中可靠性、安全性、可配置、可扩展和多处理器程序设计等挑战微软的Singularity OS的首要任务开发新的抽象包括平台的抽象指令集、操作系统和应用统一可扩展的体系结构和一阶的应用抽象特别是应用抽象可递归地应用到操作系统自身包括内核和其他OS构件。Singularity OS的后继Midori OS支持了微软西海岸和亚洲的自然语言搜索服务。Midori表明了合理的抽象和软件栈能在内存、类型和并发安全之上构建系统和应用性能和安全并不是对立的。
20世纪60年代集成电路的兴起增强了计算机的能力高效地管理硬件、发挥硬件效能成为操作系统重要驱动力。操作系统出现了不少新技术并变得强大复杂。典型的技术有多道程序设计、分时、实时、多处理器技术等等。70年代操作系统的设计进一步发展形成了UNIX操作系统成为当今主机操作系统的基础。80年代随着商业计算和微处理器时代到来出现了一批微机和工作站操作系统其代表是MS-DOS、Linux、Solaris和Windows等。90年代在"网络就是计算机"的理念推动下以主机和微机操作系统为基础以桥接异构的互联互通互操作为主要目标的中间件和网络化操作系统成为系统软件的增长点。进入新世纪后以iOS和Android代表的移动操作系统与主机操作系统向数据中心扩展所形成的云操作系统构建了云端计算的软件基础设施的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。可见追求充分发挥硬件的能力利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是驱动着系统软件的发展。
20世纪60年代操作系统出现之初主要是解决在计算机上加载和运行程序、以及设备驱动、输入输出控制等工作。随着
集成电路的兴起增强了计算机的能力CPU和外设的性能差异突出高效地共享和管理硬件、发挥硬件效能成为操作系统重要驱动力。为此先后产生了多道程序设计、分时、实时等操作系统技术系统设计变得复杂能力也变得强大。著名的系统有IBM S/360的操作系统。以操作系统设计为矛盾焦点之一人们意识到了“软件危机”。软件的复杂性驾驭成为了一个至今仍在的挑战。70年代UNIX操作系统及其家族的发展和成熟成为当今主机操作系统的基础。80年代随着商业计算和微处理器时代到来出现了一批微机和工作站操作系统其代表是MS-DOS、Linux、Solaris和Windows等。90年代在"网络就是计算机"的理念推动下以主机和微机操作系统为基础以桥接异构的互联互通互操作为主要目标的中间件和网络化操作系统成为系统软件的增长点。进入新世纪后以iOS和Android代表的移动操作系统与主机操作系统向数据中心扩展所形成的云操作系统一同构建了云端计算系统软件的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。可见追求充分发挥硬件的能力利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是驱动着系统软件的发展。
由于应用范围的迅速拓展,数据量及其复杂性迅猛增长,数据资源成为了重要管理对象。用于数据资源的抽象、操作和管理的数据库管理系统渐渐分离出来成为系统软件相对独立的部分。
%\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软件工程不仅支持面向对象的分析与设计还支持从业务建模、需求获取、分析、设计、实现、测试到部署的迭代化软件开发活动在此基础上形成了所谓统一软件开发过程Unified Process。软件过程模式从早期的手工作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式主要有软件过程1970、CMM1988、SCRUM1995、RUP2000和外包2001社会化生产方式有开源1997、Git2005以及相应的开发社交平台Stack Overflow2007
软件开发方法从制品的角度来认识、构造和演进软件。而另一方面软件作为人类的智力产品其质量存在不确定性同时其产生和发展过程中蕴含着复杂的协作。因此从工程化的角度看软件度量和质量保证以及软件开发和演化的动态过程也是必不可少的。以软件开发方法为基础软件工程必然延伸到了度量、质量和过程。例如UML软件工程不仅支持面向对象的分析与设计还支持从业务建模、需求获取、分析、设计、实现、测试到部署的迭代化软件开发活动在此基础上形成了所谓统一软件开发过程Unified Process。软件过程模式从早期的手工作坊式生产组织方式、企业化生产组织方式发展到社会化生产方式。企业化生产组织方式主要有软件过程1970、CMM1988、SCRUM1995、RUP2000、外包2001、敏捷和极限编程2001、PSP2005社会化生产方式有开源1997、Git2005以及相应的开发社交平台Stack Overflow2007
%DevOps2008放到学科构架里面去说。
@ -165,7 +172,7 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
软件学科是以软件为研究对象研究以软件求解应用问题的理论、原则、方法和技术以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并传授泛在多样化应用中共性知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为在这个意义上软件学科实质上就是Wirth所说的计算机科学的主体。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,运行软件的硬件平台之物理和可计算内生了软件发展必须遵循科学规律。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能、以及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,运行软件的硬件平台之物理和可计算内生了软件发展必须遵循科学规律和遵从的环境约束。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能、以及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
\subsection{学科发展的基本规律}
@ -176,17 +183,17 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
\textbf{外在驱动力}
计算平台的发展和应用范围的扩张分别形成了软件学科发展的平台驱动力和应用驱动力。平台的变迁形成了软件灵活成长的解空间;而应用的扩张形成软件所解决的问题空间。在解空间和问题空间之间,形成了由软件填补的界面空间。软件的发展是这三个空间变化、渗透和互动的产物。
计算平台的发展和应用范围的扩张分别构成了软件学科发展的平台驱动力和应用驱动力。平台的变迁构成了软件灵活成长的平台空间;而应用的扩张构成软件所解决的问题空间。在平台空间和问题空间之间,构成了由软件填补的界面空间。软件的发展是这三个空间变化、渗透和互动的产物。
应用拉动,平台变化,推动软件的发展。从应用驱动力的角度,软件的应用范围不断扩展,渗透力不断增强。不断增长的应用诉求拉动了软件技术从最初单纯的计算与数据处理拓展到各个行业的应用、乃至现在无所不在的应用,软件学科的无可比拟的渗透力变得空前的强大,软件的形态、开发方法和运行支撑等诸多方面发生了巨大的变化。从平台驱动力的角度,计算平台从单机发展到局域网、互联网、物联网,从云计算、端计算、边缘计算到泛在计算,形成了从封闭、静态环境(单机计算平台)到开放、动态环境(泛在计算平台)的态势,造就了软件发展的不竭动力,使得软件所能提供的解决方案的解空间空前强大。在应用驱动力和平台驱动力的联合作用下,软件正走向“定义一切”。
\textbf{内在驱动力}
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从模式化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从系统化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
\subsubsection{学科方法}
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效和节约地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效、高质和低成本地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
\textbf{理论方法}
@ -200,9 +207,9 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,源于面向问题,通过系统的设计过程来构造解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及对象之间的联系,实验方法可以运用这些联系来预言软件行为并与现实世界比较,设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及其之间的联系;实验方法运用实验手段收集数据和实验结果,来预言软件行为并与现实世界比较;设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码到软件模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码逆向到软件抽象模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
%\begin{itemize}
% \item \textbf{举例}:基于大代码的软件自动生成方法就综合软件科学中的理论、实验和设计方法。程序综合是计算机科学的明珠。其理论研究是长期以来的科学问题。演绎推理的理论方法是其重要途径,形式规约开始构造一个正确的程序,自动定理证明和归纳综合是其基本思路,并逐步发展到了归纳推理。近来随着海量代码的累积,实验统计的方法逐步兴起,以实验方法从代码数据中学习,建立程序综合和推理的启发式预言有效地提高了综合效率。以归纳推理和统计推理相结合的程序综合设计方法成为了当前软件自动化研究的重要趋势,在代码自动生成、代码修复、人机协同编程等方面取得了重要进展。
@ -245,7 +252,7 @@ Computer一词历史上出现在1613年用来指完成演算或计算的人
软件是最为复杂的人工制品。本章通过梳理软件发展的脉络,指出了软件是以计算为核心手段实现应用目标和价值的解决方案。可编程是软件的基本特征,建立抽象、实现抽象和使用抽象是软件发展的主线。软件学科是以软件为研究对象,通过科学方法、实验方法和设计方法等途径,研究设计、运行、使用软件及其规律的学科。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
%\section{参考文献}

View File

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

View File

@ -227,6 +227,6 @@
\section{本章小结}
在人机物融合时代,随着软件辐射面和影响面的扩大,软件学科的发展和进步,软件学科教育的内涵和外延也在发生改变,它涉及普及教育、专业教育、跨专业教育、教育理念与方法改革等多个方面,面临着一系列重大的问题的挑战,包括:如何针对具有不同认知水平的受众对象开展普及教育?如何根据人机物融合时代特点来深化专业教育?如何加强软件学科与其他学科的融合来实现跨专业的教育?以及如何改革软件学科的教育理念和方法来满足不断增长的人才培养需求、如何应对软件伦理问题等等。为了迎接上述挑战,软件学科教育需开展一系列研究,包括:以“知识普及 + 思维培养”为核心的普及教育、以“复合型 + 创新型”为目标的跨学科教育、以“知识体系+能力培养”为核心的专业教育、以“探究规律 + 方法创新”为主体的教育理念和方法改革、以“规范内涵 + 自动检测”为核心的软件伦理建设。
\bibliographystyle{unsrt}
\bibliography{reflib}
%\bibliographystyle{unsrt}
%\bibliography{reflib}