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

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

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

@ -1,257 +1,264 @@
% !TEX root = main.tex
%\section{引言}
《计算机科学技术百科全书》中对软件给出了如下描述~\cite{张效祥2005计算机科学技术百科全书}
\begin{center}
\begin{minipage}{.8\textwidth}
\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}的刚性约束,同时又有通用图灵机模型给予的无与伦比的计算解空间。正是图灵机所具备的认识论意义上的强大表达和计算能力,造就了软件成为人类认识世界、改造世界的文明发展的承载。
软件科学与工程学科以下简称软件学科是以软件为基本研究对象的人工科学或曰“人工制品科学”Science of Artificial~\cite{Simon:1996:SA:237774},包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统。回顾计算机科学技术的发展历史从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主获奖的有22次还有4次数据库获奖。 因此,在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、关键问题、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略提供基础。
\section{软件发展简史}
本节我们试图从 “编程”表达解决方案和 “抽象”实现复杂性控制两个基本视角简要回顾软件发展历史,为下节讨论软件学科发展基本规律提供背景。
\subsection{人力/机械计算时代}
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\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
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-1.png}
\caption{提花机}
\label{fig:1-1}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-2.png}
\caption{Jacquard's Loom}
\label{fig:1-2}
\end{minipage}
\end{figure}
\begin{figure}[htbp]
\centering
\begin{minipage}[t]{0.48\textwidth}
\includegraphics[width=5cm]{fig1-1/1-3.jpg}
\caption{Babagge分析机}
\label{fig:1-3}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-4.jpg}
\caption{Babagge分析机的第一个程序}
\label{fig:1-4}
\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。我们可以看到计算和编程是紧密相关的而编程的结果事实上是给出了一种计算应用数学计算的解决方案它可以由人力计算或机械计算完成。然而在人力/机械计算时代,还未形成通用计算和编程的思想。
\subsection{电子计算时代}
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{软件和软件工程的出现}
自Von Neumann计算机诞生之初存储程序原理即表明了程序在计算中的核心位置。程序也被作为研究对象促进的计算机学科的发展。早期最重要的系统成果有两个方面一是从机器语言到汇编语言到高级语言及解释和编译技术的出现人们开发程序的生产率得到了迅速进步二是为了发挥硬件性能、改善人机交互、有效管理资源而产生了操作系统人们运行程序的可靠性和成本得以显著降低。围绕程序是什么、怎么写、怎样运行的研究随着计算机的发展形成了计算机学科的重要分支数据结构、算法理论和程序理论形成了学科的重要基础计算机应用领域开始拓展。计算机学科在世界范围内受到了重视一些高校先后设置了计算机系。
“软件”一词最早出现在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操作系统、各种数据库管理系统、编译程序及软件中间件等支撑软件是支撑各种软件的开发与维护的软件如软件开发工具及环境等。系统软件和支撑软件又统称为基础软件。
追溯软件发展可以有多条线索,既可以考察计算机系统平台、应用形式的发展,也可以采用程序设计语言、系统软件、支撑软件等角度。
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件支撑了资源管理和利用从批处理式、交互式、网络化发展到云边端融合等等形态。
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,拓展到商业计算、个人计算、网络计算、云计算,到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件学科的一大重要挑战,软件语言从机器语言、汇编语言、高级语言、发展到领域语言,成为描述软件的基本方式。
在此之上形成所谓的软件方法学\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}。换言之,软件模型是将现实世界问题空间映射到计算机世界解空间的“桥梁”。用人工科学的角度看,软件模型的集合形成了一层界面空间(或称认知空间),它一部分属于解决方案中的问题空间(不可执行类的模型),另一部分属于解决方案中的计算机解空间(可执行类的模型)。
软件模型是解决方案(现实世界描述、问题描述及其求解方案)的抽象表示,建模就是建立、使用和实现抽象。它们构成了软件范型的核心内容\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}
% word中未指明具体标题和图片序号
%\begin{figure}[htbp]
% \centering
% \includegraphics[width=0.80\textwidth]{fig1-1/1-5.jpg}
% \caption{}
% \label{fig:1-5}
%\end{figure}
\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年获得了图灵奖。
与命令式程序设计语言不同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\footnote{https://en.wikipedia.org/wiki/Solidity}
程序设计语言向上要面向问题求解方法的表达向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和围绕问题求解的计算理论成为了软件理论的重要部分。从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{系统软件}
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为建立抽象、使用抽象来实现更高级抽象的焦点。系统软件主要任务是建立、使用和实现计算平台抽象。一方面,系统软件通过建立并实现有效的抽象对各类资源进行有效的管理;另一方面,系统软件力图在计算平台之上凝练建立、沉淀实现应用软件中的共性抽象并加以复用,以尽可能提高软件开发。
操作系统中的三个基本要素是抽象、机制和策略。而其抽象的基本设计原则是机制与策略的分离、共性的沉淀。例如进程和进程管理、线程和并发、调度、内存管理、进程间通信、I/O管理、虚拟化、分布文件系统、分布共享内存、安全与隐私抽象-Ownership等等。在实现这些抽象的过程中人们发现并设计了应对计算求解的复杂性的理论和方法。
%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代表的移动操作系统与主机操作系统向数据中心扩展所形成的云操作系统构建了云端计算的软件基础设施的基本格局。更好地满足用户对易用性的需求成为系统软件生态化发展的重要因素。可见追求充分发挥硬件的能力利用软件技术统筹管理好硬件以形成灵活、高效、可信、统一的虚拟资源是驱动着系统软件的发展。
由于应用范围的迅速拓展,数据量及其复杂性迅猛增长,数据资源成为了重要管理对象。用于数据资源的抽象、操作和管理的数据库管理系统渐渐分离出来成为系统软件相对独立的部分。
%\subsubsection{基于抽象构建应用解决方案的软件工程}
\subsubsection{软件工程}
随着软件工程思想的出现软件开发方法和技术体系逐渐发展起来。面向应用建立问题解决方案的抽象成为软件开发方法的共识。软件开发可以看作是利用抽象构建新抽象获得问题解的过程。分而治之的模块化和组合化是使用抽象和在使用中建立新抽象的基本思路信息隐藏是其基本原则。程序设计模型影响着软件范型软件开发方法中的诸多抽象大多来自于程序设计语言的思路。例如70年代的结构化分析和设计方法、80年代的面向对象分析和设计等等。软件开发和程序设计在抽象上尽可能地保持了一致或相容使得软件工程模型不同阶段、不同层次的抽象有着较好的对应。另一方面在程序设计语言抽象的基础上为了与人们应用问题求解思维过程的一致在软件的需求和设计上也出现了含有高层的抽象设施的软件语言也称软件建模语言。例如在面向对象方法学中的统一建模语言UML~\cite{Booch:1999:UML:291167}用Use Case对需求进行抽象建模用Message Sequence对需求和设计中类交互序列进行抽象。
更进一步,随着软件抽象粒度和层次的提升,软件开发方法和软件语言的发展愈加紧密。例如,基于复用思想的软件构件化方法中提出了软件体系结构,构件和构件间的连接子成为其重要组成;服务化方法定义了服务和服务间的流程编排;以及网构化方法提供了自主实体和实体间的按需连接,等等。
在以计算为手段的解空间中,人们一方面不断地建立抽象,一方面不断地在计算平台上高能实现抽象,两者相辅相成,螺旋上升。例如,结构化程序设计使得程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而通过不同阶段抽象的映射和转换完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。
然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要一种方式可以从内嵌类型构造不同层次抽象的能力。这些动机促使了抽象数据类型的出现~\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
%DevOps2008放到学科构架里面去说。
\section{软件学科的内涵、发展规律和基本架构}
\subsection{内涵与学科特征}
软件实质是以计算为核心手段实现应用目标的解决方案,是最纯粹的人工制品\cite{Simon:1996:SA:237774},其内涵特征包括了三个方面:
\begin{description}
\item[功能性] 以何种结构和行为
\item[目的性] 达成什么应用目的
\item[适应性] 何种环境依赖之下
\end{description}
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。作为逻辑制品,其困难不在于物理限制而在于逻辑构造。因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案。%后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
软件学科是以软件为研究对象研究以软件求解应用问题的理论、原则、方法和技术以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并传授泛在多样化应用中共性知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为在这个意义上软件学科实质上就是Wirth所说的计算机科学的主体。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,运行软件的硬件平台之物理和可计算内生了软件发展必须遵循科学规律。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能、以及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
\subsection{学科发展的基本规律}
纵观软件学科发展历史,随着计算时代从数字化时代发展到网络化,再到目前人机物融合、智能化时代,软件和软件学科在继承中发展,同时变化成为常态,正所谓“变是不变的真理”。我们从两个方面来认识软件学科发展的规律:第一,本学科发展的驱动力是什么;第二,本学科的研究方法论是什么。
\subsubsection{发展的驱动力}
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。与诸多人工制品类似,软件学科发展的驱动力来自于两个方面:外在驱动力来自于应用范围的扩张、计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀到系统软件平台中,同时更好地满足用户对易用性的需求。此外,软件发展驱动力还来自人本属性,包括人的认知规律和人力资源管理的深化与提高。
\textbf{外在驱动力}
计算平台的发展和应用范围的扩张分别形成了软件学科发展的平台驱动力和应用驱动力。平台的变迁形成了软件灵活成长的解空间;而应用的扩张形成软件所解决的问题空间。在解空间和问题空间之间,形成了由软件填补的界面空间。软件的发展是这三个空间变化、渗透和互动的产物。
应用拉动,平台变化,推动软件的发展。从应用驱动力的角度,软件的应用范围不断扩展,渗透力不断增强。不断增长的应用诉求拉动了软件技术从最初单纯的计算与数据处理拓展到各个行业的应用、乃至现在无所不在的应用,软件学科的无可比拟的渗透力变得空前的强大,软件的形态、开发方法和运行支撑等诸多方面发生了巨大的变化。从平台驱动力的角度,计算平台从单机发展到局域网、互联网、物联网,从云计算、端计算、边缘计算到泛在计算,形成了从封闭、静态环境(单机计算平台)到开放、动态环境(泛在计算平台)的态势,造就了软件发展的不竭动力,使得软件所能提供的解决方案的解空间空前强大。在应用驱动力和平台驱动力的联合作用下,软件正走向“定义一切”。
\textbf{内在驱动力}
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从模式化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
\subsubsection{学科方法}
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效和节约地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
\textbf{理论方法}
理论方法首先给出软件对象的定义描述,并假设它们之间可能的联系,通过证明来判断这些联系是否成立,并解释所得到的结果。源于以图灵机为代表的形式化计算模型的奠基性贡献,使得计算平台具有刚性的数学理论约束,使得数学一开始就进入了计算机理论研究。通过建立形式理论、推理获得结果并解释结果,形成了软件作为数学对象来研究和开发的方法学。这种方法提供了开发模型并理解模型边界的分析框架,在软件正确性方面发挥了重要作用。理论方法根植于数学,将计算视作数学对象开展研究。
\textbf{实验方法}
实验方法属于实验科学方法,其本质是建模。它首先基于假设构造一个模型,通过对实验成果的统计/量化度量和分析,来确认所获得的模型。例如,为评价一种软件开发的新方法或者工具,需要通过建立假设条件下的模型,开展度量和分析,以说明方法和工具较已有方法的先进性。实验方法源自于自然科学和社会科学方法。对于软件学科的研究,可以利用计算的手段开展软件的实验研究,亦即仿真,包括用软件模拟软件的模型方法或用数据科学方法来研究软件及其环境的现象和方法。
\textbf{设计方法}
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,源于面向问题,通过系统的设计过程来构造解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及对象之间的联系,实验方法可以运用这些联系来预言软件行为并与现实世界比较,设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码到软件模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
%\begin{itemize}
% \item \textbf{举例}:基于大代码的软件自动生成方法就综合软件科学中的理论、实验和设计方法。程序综合是计算机科学的明珠。其理论研究是长期以来的科学问题。演绎推理的理论方法是其重要途径,形式规约开始构造一个正确的程序,自动定理证明和归纳综合是其基本思路,并逐步发展到了归纳推理。近来随着海量代码的累积,实验统计的方法逐步兴起,以实验方法从代码数据中学习,建立程序综合和推理的启发式预言有效地提高了综合效率。以归纳推理和统计推理相结合的程序综合设计方法成为了当前软件自动化研究的重要趋势,在代码自动生成、代码修复、人机协同编程等方面取得了重要进展。
%\end{itemize}
\subsection{软件学科的基本架构}
%出于不同目的考虑学科可有不同的划分。从目前我国人才培养一级学科划分看软件学科横跨了计算机科学与技术软件工程、网络空间安全等三个一级学科。特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。与本国际本科计算教育学科相比软件学科横跨了ACM/IEEE计算教程等五个学科即计算机科学、计算机工程、软件工程、信息技术、信息系统。它们的覆盖关系如图1-X所示。
%我们着眼于软件学科发展历程的回顾重新梳理就现状划分了三个子领域即程序设计语言与理论、系统软件、软件工程。其中程序设计语言与理论的核心内容是建立抽象系统软件的核心内容是实现抽象软件工程的核心内容是使用抽象。它们与我国目前一级学科、ACM/IEEE计算学科的关系如图1-X所示。
我们就软件学科的现状,将软件学科体系梳理为四个方面的内容(见图\ref{fig:1-6}):软件范型、软件构造方法、软件运行支撑及软件度量与质量评估。软件范型是软件学科的核心,每次软件范型的变迁(见图\ref{fig:1-7}),都会引发软件开发方法和运行支撑技术的相应变化,并导致新的软件质量度量和评估方法的出现。
\begin{figure}[htbp]
\centering
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-6.png}
\caption{软件学科基本架构}
\label{fig:1-6}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-7.png}
\caption{软件范型的变迁}
\label{fig:1-7}
\end{minipage}
\end{figure}
软件范型重点解决软件是什么的问题,描述了软件的模型和模型构造、运行的基本理论,包括了计算理论、程序设计语言和程序理论。计算理论包括可计算性理论、算法理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。我们将软件范型的学科内容归入程序设计语言与理论。
软件构造方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型研究大型软件系统高质量高效率开发的方法、技术和工具属于软件工程的范畴。软件构造开发是一项困难的任务而困难可区分为实质性Essential的和附属性Accidental的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不足。软件构造方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件构造技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
在运行支撑方面重点解决如何在计算平台上高效高可靠地运行软件的问题。其基本途径是逐层的虚拟化技术和系统优化技术,运行平台包括操作系统、数据库、中间件等。操作系统可视为构架在硬件资源上的软件虚拟机,以追求更高效地发挥各种硬件资源所提供的计算能力,提供友好的人机交互界面。而数据库、中间件等均可视为架构在下层资源上的一层虚拟机,充分发挥下层资源的计算能力,提供高效的资源管理和更自然的人机界面。本书中将运行支撑方面的学科内容归入系统软件的范畴。
软件度量和质量评估重点解决软件如何度量和质量评估的问题。软件作为人工制品,本身及其构造、运行均可以成为科学观察和建模的对象,形成软件的静态模型、动态模型、科学度量模型、质量模型等软件度量的基本内容,特别的软件度量尤其关心其系统质量,追求软件的正确性、功能性指标和性能指标等。随着软件的广泛应用,人们越来越关心软件系统是否更好(更快捷、更安全、更可靠、更灵活)地解决了现实世界中的问题,如何判断或度量软件是否可信、是否符合应用价值取向、是否达到目的成为软件学科的重要内容。本书中将其与软件构造方法一并归入软件工程的范畴。
软件强大的渗透性,使得软件和产业紧密相联,并产生了软件产业。软件的问题解决方案和人工制品特性、软件发展的外部驱动力决定了其形成产业的必然性,而强大的产业需求不断地拉动软件的发展,软件学科与软件产业相互促进,共生共荣。
\section{结束语}
软件是最为复杂的人工制品。本章通过梳理软件发展的脉络,指出了软件是以计算为核心手段实现应用目标和价值的解决方案。可编程是软件的基本特征,建立抽象、实现抽象和使用抽象是软件发展的主线。软件学科是以软件为研究对象,通过科学方法、实验方法和设计方法等途径,研究设计、运行、使用软件及其规律的学科。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及对应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
%\section{参考文献}
%\begin{itemize}
% \item \cite{Liskov:1974:PAD:800233.807045}. Liskov \& Zilles. Programming with Abstract Data Types, ACM SIGPLAN Notices, 1974
% \item \cite{Floyd:1979:PP:359138.359140}. Floyd. The paradigms of programming, CACM 1979
% \item \cite{Humphrey:2002:SUP:513126.513132}. Watts S. Humphrey. Software Unbundling: A Personal Perspective. IEEE Annals of the History of Computing. 2002
% \item \cite{Simon:1996:SA:237774}. H.A. Simon. The Science of the Artificial. 1968
%\end{itemize}
% !TEX root = main.tex
%\section{引言}
《计算机科学技术百科全书》中对软件给出了如下描述~\cite{张效祥2005计算机科学技术百科全书}
\begin{center}
\begin{minipage}{.8\textwidth}
\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}的刚性约束,同时又有通用图灵机模型给予的巨大的通用性和灵活性。正是图灵机所具备的认识论意义上的强大表达和计算能力,提供了一种逼近人类认知的解空间,造就了软件成为人类认识世界、改造世界的文明发展的承载。
软件科学与工程学科以下简称软件学科是以软件为基本研究对象的人工科学或曰“人工制品科学”Science of Artificial~\cite{Simon:1996:SA:237774},包括研究和分析、开发和运行、使用和演化软件等活动所涉及的理论、原则、方法、技术、工具和系统。回顾计算机科学技术的发展历史从1966年首届图灵奖至2018年的53次颁奖中属于软件领域的有37次69.8\%其中以程序设计语言、编译和操作系统为主获奖的有22次还有4次数据库获奖。 因此,在方法论的意义上,软件学科构成整个计算机科学技术学科的相当大的部分,并与系统科学、控制科学以及经济学、社会学等相关学科交叉融合,具有高度综合性。作为本书第一部分的开篇,本章将简要回顾软件和软件技术的发展历程,通过梳理软件发展脉络,总结软件学科的基本内涵、主要线索、研究方法和发展规律,为第一部分软件学科历史回顾的展开进行铺垫,同时为第二部分学科发展战略研究提供背景。
\section{软件发展简史}
本节我们试图从 “编程”表达解决方案和 “抽象”实现复杂性控制两个基本视角简要回顾软件发展历史,为下节讨论软件学科发展基本规律提供背景。
\subsection{人力/机械计算时代}
程序化是人类思维的基本形式之一。如果我们广义地理解“计算”,“软件"的历史可以追溯到千年之前。人类历史上最早的计算设备是算盘,其算法口诀可视为一种程序化计算的规则。到东汉年代,提花机(参见图\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
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-1.png}
\caption{提花机}
\label{fig:1-1}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-2.png}
\caption{Jacquard's Loom}
\label{fig:1-2}
\end{minipage}
\end{figure}
\begin{figure}[htbp]
\centering
\begin{minipage}[t]{0.48\textwidth}
\includegraphics[width=5cm]{fig1-1/1-3.jpg}
\caption{Babagge分析机}
\label{fig:1-3}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-4.jpg}
\caption{Babagge分析机的第一个程序}
\label{fig:1-4}
\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。我们可以看到计算和编程是紧密相关的而编程的结果事实上是给出了一种计算应用数学计算的解决方案它可以由人力计算或机械计算完成。然而在人力/机械计算时代,还未形成通用计算和编程的思想。
\subsection{电子计算时代}
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{软件和软件工程的出现}
自Von Neumann计算机诞生之初存储程序原理即表明了程序在计算中的核心位置。程序也被作为研究对象促进的计算机学科的发展。早期最重要的系统成果有两个方面一是从机器语言到汇编语言到高级语言及解释和编译技术的出现人们开发程序的生产率得到了迅速进步二是为了发挥硬件性能、改善人机交互、有效管理资源而产生了操作系统人们运行程序的可靠性和成本得以显著降低。围绕程序是什么、怎么写、怎样运行的研究随着计算机的发展形成了计算机学科的重要分支数据结构、算法理论和程序理论形成了学科的重要基础计算机应用领域开始拓展。计算机学科在世界范围内受到了重视一些高校先后设置了计算机系。
“软件”一词最早出现在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操作系统、各种数据库管理系统、编译程序及软件中间件等支撑软件是支撑各种软件的开发与维护的软件如软件开发工具及环境等。系统软件和支撑软件又统称为基础软件。
追溯软件发展可以有多条线索,既可以考察计算机系统平台、应用形式的发展,也可以采用程序设计语言、系统软件、支撑软件等角度。
从计算平台看,软件运行平台从主机平台、微机平台、局域网平台、互联网平台到万物互联平台;系统软件也从批处理式、交互式、网络化发展到云边端融合等模式去支撑从少量集中到海量分布异构的资源管理和利用。
从应用形式看,软件的应用目标从最初军事为主的科学计算起步,拓展到商业计算、个人计算、网络计算、云计算,到如今泛在计算等林林总总各个领域的场景需求,应用软件极大丰富。
为更好地面向需求,满足各类质量、进度和成本约束,驾驭各类复杂性成为软件学科的一大重要挑战,软件语言从机器语言、汇编语言、高级语言、发展到领域特定语言,成为描述软件的基本方式。
在此之上形成所谓的软件方法学\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{以抽象为主线的软件学科发展}
软件学科本质上是一门方法论学科。以计算手段解决问题的过程是从应用需求的问题空间到计算平台约束的解空间的映射过程,包括从解空间到平台空间上的计算实现\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}。软件范型是从软件工程师(或程序员)视角看到的软件模型及其构造原理,而构造软件模型的语汇(也称基本元素)是各类软件抽象设施,构造模型的方法是各类抽象的分解、组合和变换,建立抽象和抽象之间的关系。从结构上看,基于认知程度的不同,高层抽象可以分解为低层抽象,底层抽象可以组合或聚集为高层抽象,抽象之间还有不同语义保持度的转换。在问题空间、解空间和平台空间表述时,都可以建立或者定义所需的抽象,也可以使用已定义的抽象表述对象或者实现一个新定义的抽象。
%而系统软件的核心在于实现这些抽象,软件工程则使用这些抽象构造应用软件。不同层次的抽象、抽象的计算实现和使用组成了软件发展的脉络。我们试图以软件各种抽象为主线来梳理和汇聚软件发展的基本历程。
%例如在典型的大数据处理系统如Google搜索引擎我们可以看到接口与服务、方法与设施、虚拟化与实现等不同层次组成的抽象栈它们分别对应着Web服务、MapReduce、Dryad、Pregel、BigTable、集群调度、分布式文件、操作系统等抽象层。
%弥补着从计算平台形成的解空间到应用目标的问题空间语义鸿沟,软件驾驭复杂性的抽象能力不断提高。
高度灵活性使得软件不仅仅是系统中的信息处理工具,也是管理各类资源、融合人机物的“万能集成器”。这就使得整个人工系统的复杂性向软件集中。驾驭复杂性的能力(复杂性的种类、程度的提升)体现了软件发展的水平。
从以算法复杂性为主,到结构复杂性,再进入网络化时代的交互复杂性和规模复杂性,直至今日,数据复杂性、社会复杂性也将纳入软件需要驾驭的复杂性之中,建立、实现、使用抽象的循环迭代不断往复,推进着软件技术的发展。
软件抽象与数学抽象不同在于,它是可编程的单元并有计算之实现,以有效管理硬件平台、提升解空间抽象层次为目标,构成了软件运行支撑技术的主要内容,也即系统软件技术。面向应用目标,构建问题空间抽象并以系统化的方法映射到解空间为目标,则构成了软件开发方法的主要内容;进一步,通过科学观察,针对不同层次抽象的软件制品及其过程进行度量和质量评估,便构成了软件度量和质量评估的主要内容。
%软件开发方法、软件质量度量和评估方法则构成了软件工程的主要内容。
%围绕这些抽象软件学科的发展呈扇形展开,分化出以建立抽象为主要内容的软件方法学和程序设计语言;以实现抽象为主要内容的系统软件;以使用抽象为主的软件开发和工程。参见图\ref{fig:1-5}
% word中未指明具体标题和图片序号
%\begin{figure}[htbp]
% \centering
% \includegraphics[width=0.80\textwidth]{fig1-1/1-5.jpg}
% \caption{}
% \label{fig:1-5}
%\end{figure}
\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年获得了图灵奖。
与命令式程序设计语言不同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\footnote{https://en.wikipedia.org/wiki/Solidity}
程序设计语言向上要面向问题求解方法的表达向下要在计算机系统上实现。围绕语言的语法、语义和语用等方面的程序理论和围绕问题求解的计算理论成为了软件理论的重要部分。从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{系统软件}
随着硬件能力快速提高,以操作系统和编译器为代表的系统软件成为在平台空间中建立抽象、使用抽象来实现更高级抽象的焦点。系统软件着力提高平台空间抽象的执行效率,并提升解空间的抽象层次,向问题空间抽象接近,拉近问题与解之间的间隔。具体说,一方面,系统软件通过建立、使用并实现有效的平台空间抽象对各类资源进行有效的管理;另一方面,系统软件力图在计算平台之上凝练建立、沉淀实现应用软件中的共性解空间抽象并加以复用,以尽可能提高软件开发效率。
操作系统抽象的三个基本要素是抽象表示、管理机制和策略。其基本思路是抽象表示沉淀共性模型管理机制和策略分离。例如进程是程序执行的抽象进程调度是进程抽象和计算资源的管理机制调度算法是管理进程的控制策略。进程抽象的实现中使用了进程控制块调度机制和算法分而治之地完成进程管理。操作系统中各类资源管理大多采取了这样的设计思路包括内存管理页面、换页、换页策略、I/O管理和安全管理等等。在编译器中从高级语言源程序到机器目标代码之间历经了抽象语法树、中间语言代码、四元式等多层级的抽象目标代码生成过程是这些层级抽象的映射。在系统软件发展过程中人们发现并设计了不同粒度的抽象、抽象使用和实现的原理与方法。
%John Cocke在解决上下文无关语言的有效扫描中发明了动态规划而例如Robert Floyd为了构建层次化自顶向下的扫描器发明了递归协程序作为抽象结构。其他例子还包括
例如换页策略使用局部性原理、抽象的信息隐藏和分而治之原理等等。程序设计语言和软件工程中许多重要概念来自于操作系统和编译器的设计例如管程、递归协程序等等。Barbara Liskov在操作系统发展50周年研讨会上讨论了操作系统、程序语言和抽象之间的关系指出抽象对构建系统软件的作用。
%例如用多层次的软件栈来定义复杂系统。
%为了应对操作系统设计中可靠性、安全性、可配置、可扩展和多处理器程序设计等挑战微软的Singularity OS的首要任务开发新的抽象包括平台的抽象指令集、操作系统和应用统一可扩展的体系结构和一阶的应用抽象特别是应用抽象可递归地应用到操作系统自身包括内核和其他OS构件。Singularity OS的后继Midori OS支持了微软西海岸和亚洲的自然语言搜索服务。Midori表明了合理的抽象和软件栈能在内存、类型和并发安全之上构建系统和应用性能和安全并不是对立的。
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对需求和设计中类交互进行抽象。
更进一步,随着软件抽象粒度和层次的提升,软件开发方法和软件语言的发展愈加紧密。例如,基于复用思想的软件构件化方法中提出了软件体系结构,构件和构件间的连接子成为其重要组成;服务化方法定义了服务和服务间的流程编排;以及网构化方法提供了自主实体和实体间的按需连接,等等。
软件生命期不同阶段有不同抽象,由抽象间的(使用/实现)关系复合构建映射成为软件开发的重要任务。
%例如,结构化程序设计使得程序具有良好的结构,在这个指导思想下,问题求解可以看作是一系列的分解过程,即从一个较高层的过程,逐步地加入细节得到较低层的抽象,从而通过不同阶段抽象的映射和转换完成整个程序。逐步精化和层次化的程序结构是结构化程序设计的基本原理。在结构化程序设计的基础上,当程序员在某个抽象层次上使用下一层次提供的抽象时并不需要考虑底层的实现细节。
然而高级程序设计语言不可能以内嵌的方式提供问题求解需要的所有抽象,需要具有从内嵌类型构造不同层次抽象的能力。同时,不同层次抽象之间内嵌信息隐藏能力。这些动机促使了抽象数据类型的出现~\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、敏捷和极限编程2001、PSP2005社会化生产方式有开源1997、Git2005以及相应的开发社交平台Stack Overflow2007等。
%DevOps2008放到学科构架里面去说。
\section{软件学科的内涵、发展规律和基本架构}
\subsection{内涵与学科特征}
软件实质是以计算为核心手段实现应用目标的解决方案,是最纯粹的人工制品\cite{Simon:1996:SA:237774},其内涵特征包括了三个方面:
\begin{description}
\item[功能性] 以何种结构和行为
\item[目的性] 达成什么应用目的
\item[适应性] 何种环境依赖之下
\end{description}
不同于一般物品,软件是一种人工制品,同时也是一种纯粹的逻辑制品。作为逻辑制品,其困难不在于物理限制而在于逻辑构造。因此,软件开发活动本质上不同于传统工程制造:后者在于“造物”,前者可谓“拟人”—即表达人脑思维形成的问题解决方案。%后者可有规模效应,而对前者而言,每一个软件系统都是独一无二的创造。
软件学科是以软件为研究对象研究以软件求解应用问题的理论、原则、方法和技术以及相应的工具支持、运行平台和生态环境的学科。其核心内容是以计算为工具的问题求解方法论目标是达成效能、效率和价值的统一。N. Wirth在“软件工程简史”一文中指出 “如果说我们能从过去学到什么,那就是计算机科学本质上是方法论学科。它开发并传授泛在多样化应用中共性知识和技术”~\cite{Wirth:2008:BHS:1449571.1449577}。我们认为在这个意义上软件学科实质上就是Wirth所说的计算机科学的主体。
软件的功能性、目的性和适应性,使得软件学科呈现出了艺术、科学和工程共存的学科特征。这源自于软件本身融合了人类活动、数学物理规律约束的计算模型和装置、以及面向应用价值的工程设计。软件之目的性是其工程属性的来源,而功能性的设计及设计的柔性孕育了艺术、方法和原创的结合,运行软件的硬件平台之物理和可计算内生了软件发展必须遵循科学规律和遵从的环境约束。艺术、科学和工程在软件发展的不同阶段和侧面会相互渗透乃至相互转换。归根到底,其目的性表征的价值、软硬平台与外部环境所形成的功能、以及界面适应性是其核心,这也成就了软件成为万能集成器和粘合剂的基础设施地位。
\subsection{学科发展的基本规律}
纵观软件学科发展历史,随着计算时代从数字化时代发展到网络化,再到目前人机物融合、智能化时代,软件和软件学科在继承中发展,同时变化成为常态,正所谓“变是不变的真理”。我们从两个方面来认识软件学科发展的规律:第一,本学科发展的驱动力是什么;第二,本学科的研究方法论是什么。
\subsubsection{发展的驱动力}
软件是兼具刚性约束和柔性适应的产物。平台和应用的可计算、复杂性和正确性形成了软件需要遵循的刚性约束,而内在的各种方法学引导、功能和适应性设计则造就了软件的柔性多样,也给予了软件学科无穷的发展活力。与诸多人工制品类似,软件学科发展的驱动力来自于两个方面:外在驱动力来自于应用范围的扩张、计算平台的发展;内在驱动力来自于其核心问题的解决,追求更高效地发挥计算机硬件所提供的计算能力,不断凝练应用共性并沉淀到系统软件平台中,同时更好地满足用户对易用性的需求。此外,软件发展驱动力还来自人本属性,包括人的认知规律和人力资源管理的深化与提高。
\textbf{外在驱动力}
计算平台的发展和应用范围的扩张分别构成了软件学科发展的平台驱动力和应用驱动力。平台的变迁构成了软件灵活成长的平台空间;而应用的扩张构成软件所解决的问题空间。在平台空间和问题空间之间,构成了由软件填补的界面空间。软件的发展是这三个空间变化、渗透和互动的产物。
应用拉动,平台变化,推动软件的发展。从应用驱动力的角度,软件的应用范围不断扩展,渗透力不断增强。不断增长的应用诉求拉动了软件技术从最初单纯的计算与数据处理拓展到各个行业的应用、乃至现在无所不在的应用,软件学科的无可比拟的渗透力变得空前的强大,软件的形态、开发方法和运行支撑等诸多方面发生了巨大的变化。从平台驱动力的角度,计算平台从单机发展到局域网、互联网、物联网,从云计算、端计算、边缘计算到泛在计算,形成了从封闭、静态环境(单机计算平台)到开放、动态环境(泛在计算平台)的态势,造就了软件发展的不竭动力,使得软件所能提供的解决方案的解空间空前强大。在应用驱动力和平台驱动力的联合作用下,软件正走向“定义一切”。
\textbf{内在驱动力}
从学科内在的技术角度看,软件的发展有四个基本驱动力,即,追求更具表达能力、更符合人类思维模式、易构造、易演化的软件模型;支持高效率和高质量的软件开发;充分发挥硬件资源的能力,支持高效能、高可靠和易管理的软件运行;桥接异构性,实现多个应用系统之间的互操作。基于抽象的复杂性控制成为学科发展的核心要素。围绕抽象和复杂性控制,软件技术从系统化走向形式化和自动化,软件也向超大规模、开放适应、持续成长方向发展。
\subsubsection{学科方法}
从研究的角度,软件学科需要建立在计算机上运行软件的科学和工程基础。从应用的角度,需要建立开发软件制品的方法和过程来高效、高质和低成本地构建软件系统。与计算学科类似~\cite{Denning:1989:CD:63238.63239},在软件学科中,基本方法可以归为三类,即理论方法、实验方法和设计方法。
\textbf{理论方法}
理论方法首先给出软件对象的定义描述,并假设它们之间可能的联系,通过证明来判断这些联系是否成立,并解释所得到的结果。源于以图灵机为代表的形式化计算模型的奠基性贡献,使得计算平台具有刚性的数学理论约束,使得数学一开始就进入了计算机理论研究。通过建立形式理论、推理获得结果并解释结果,形成了软件作为数学对象来研究和开发的方法学。这种方法提供了开发模型并理解模型边界的分析框架,在软件正确性方面发挥了重要作用。理论方法根植于数学,将计算视作数学对象开展研究。
\textbf{实验方法}
实验方法属于实验科学方法,其本质是建模。它首先基于假设构造一个模型,通过对实验成果的统计/量化度量和分析,来确认所获得的模型。例如,为评价一种软件开发的新方法或者工具,需要通过建立假设条件下的模型,开展度量和分析,以说明方法和工具较已有方法的先进性。实验方法源自于自然科学和社会科学方法。对于软件学科的研究,可以利用计算的手段开展软件的实验研究,亦即仿真,包括用软件模拟软件的模型方法或用数据科学方法来研究软件及其环境的现象和方法。
\textbf{设计方法}
设计方法是人工科学的特有方法。它着眼于为了解决一个问题来工程化地构造一个软件,其基本过程是表述需求、表述规约、设计和实现系统并测试系统。设计中不断对已有的软件解决方案观察,提出更好的解决方案,建立/开发、度量和分析,重复直到满足问题需求。这种模式是一种演化改进的方法,关键在于设计时符合人的思维模式,尽量减少问题求解的额外复杂度。设计方法属于工程方法,源于面向问题,通过系统的设计过程来构造解决方案。
上述三类方法各自具有不可替代的作用,理论方法用来描述和揭示软件模型及其之间的联系;实验方法运用实验手段收集数据和实验结果,来预言软件行为并与现实世界比较;设计方法则是依据软件模型和计算对象的映射规律来设计完成解决方案。
以模型为数学对象,形成了软件学科的基础(数学)理论方面的内容,其基本方法是理论方法。从软件代码逆向到软件抽象模型,即从软件代码能否构造一个符合该代码系统的模型,并对软件进行断言或者预言,形成了软件学科的科学方面的内容,其基本方法是实验方法。从应用目标到设计软件模型再到软件,即面向问题获得求解模型并构造一个符合该模型的软件系统,形成了软件学科的工程方面的内容,其基本方法是设计方法。这三个方面在软件学科的研究中并不是正交的,往往会联合在一起共同解决学科问题,三者的紧密联系也使得软件学科区别于数学、自然科学和传统工程科学。
%\begin{itemize}
% \item \textbf{举例}:基于大代码的软件自动生成方法就综合软件科学中的理论、实验和设计方法。程序综合是计算机科学的明珠。其理论研究是长期以来的科学问题。演绎推理的理论方法是其重要途径,形式规约开始构造一个正确的程序,自动定理证明和归纳综合是其基本思路,并逐步发展到了归纳推理。近来随着海量代码的累积,实验统计的方法逐步兴起,以实验方法从代码数据中学习,建立程序综合和推理的启发式预言有效地提高了综合效率。以归纳推理和统计推理相结合的程序综合设计方法成为了当前软件自动化研究的重要趋势,在代码自动生成、代码修复、人机协同编程等方面取得了重要进展。
%\end{itemize}
\subsection{软件学科的基本架构}
%出于不同目的考虑学科可有不同的划分。从目前我国人才培养一级学科划分看软件学科横跨了计算机科学与技术软件工程、网络空间安全等三个一级学科。特别是与计算机软件与理论二级学科和软件工程一级学科关系密切。与本国际本科计算教育学科相比软件学科横跨了ACM/IEEE计算教程等五个学科即计算机科学、计算机工程、软件工程、信息技术、信息系统。它们的覆盖关系如图1-X所示。
%我们着眼于软件学科发展历程的回顾重新梳理就现状划分了三个子领域即程序设计语言与理论、系统软件、软件工程。其中程序设计语言与理论的核心内容是建立抽象系统软件的核心内容是实现抽象软件工程的核心内容是使用抽象。它们与我国目前一级学科、ACM/IEEE计算学科的关系如图1-X所示。
我们就软件学科的现状,将软件学科体系梳理为四个方面的内容(见图\ref{fig:1-6}):软件范型、软件构造方法、软件运行支撑及软件度量与质量评估。软件范型是软件学科的核心,每次软件范型的变迁(见图\ref{fig:1-7}),都会引发软件开发方法和运行支撑技术的相应变化,并导致新的软件质量度量和评估方法的出现。
\begin{figure}[htbp]
\centering
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-6.png}
\caption{软件学科基本架构}
\label{fig:1-6}
\end{minipage}
\begin{minipage}[t]{0.48\textwidth}
\centering
\includegraphics[width=5cm]{fig1-1/1-7.png}
\caption{软件范型的变迁}
\label{fig:1-7}
\end{minipage}
\end{figure}
软件范型重点解决软件是什么的问题,描述了软件的模型和模型构造、运行的基本理论,包括了计算理论、程序设计语言和程序理论。计算理论包括可计算性理论、算法理论等。可计算性理论回答什么能或不能在计算平台上求解,算法理论回答如何在计算平台上高效能行求解问题。程序设计语言和程序理论回答软件抽象是什么以及它们之间联系的问题。我们将软件范型的学科内容归入程序设计语言与理论。
软件构造方法重点解决如何面向应用目标开发软件的问题。其主要围绕相应的软件范型研究大型软件系统高质量高效率开发的方法、技术和工具属于软件工程的范畴。软件构造开发是一项困难的任务而困难可区分为实质性Essential的和附属性Accidental的~\cite{Brooks:1987}。可以认为,前者来自于软件所要解决问题本身所固有的复杂性和多变性,而后者源自解决问题时所用技术手段和过程步骤方面的不足。软件构造方法旨在消除附属性困难,并帮助开发者理解和驾驭问题本身的实质性困难。软件构造技术核心是有效控制问题求解的附属复杂性,是一个不断建立抽象、使用抽象来实现抽象的过程。
在运行支撑方面重点解决如何在计算平台上高效高可靠地运行软件的问题。其基本途径是逐层的虚拟化技术和系统优化技术,运行平台包括操作系统、数据库、中间件等。操作系统可视为构架在硬件资源上的软件虚拟机,以追求更高效地发挥各种硬件资源所提供的计算能力,提供友好的人机交互界面。而数据库、中间件等均可视为架构在下层资源上的一层虚拟机,充分发挥下层资源的计算能力,提供高效的资源管理和更自然的人机界面。本书中将运行支撑方面的学科内容归入系统软件的范畴。
软件度量和质量评估重点解决软件如何度量和质量评估的问题。软件作为人工制品,本身及其构造、运行均可以成为科学观察和建模的对象,形成软件的静态模型、动态模型、科学度量模型、质量模型等软件度量的基本内容,特别的软件度量尤其关心其系统质量,追求软件的正确性、功能性指标和性能指标等。随着软件的广泛应用,人们越来越关心软件系统是否更好(更快捷、更安全、更可靠、更灵活)地解决了现实世界中的问题,如何判断或度量软件是否可信、是否符合应用价值取向、是否达到目的成为软件学科的重要内容。本书中将其与软件构造方法一并归入软件工程的范畴。
软件强大的渗透性,使得软件和产业紧密相联,并产生了软件产业。软件的问题解决方案和人工制品特性、软件发展的外部驱动力决定了其形成产业的必然性,而强大的产业需求不断地拉动软件的发展,软件学科与软件产业相互促进,共生共荣。
\section{结束语}
软件是最为复杂的人工制品。本章通过梳理软件发展的脉络,指出了软件是以计算为核心手段实现应用目标和价值的解决方案。可编程是软件的基本特征,建立抽象、实现抽象和使用抽象是软件发展的主线。软件学科是以软件为研究对象,通过科学方法、实验方法和设计方法等途径,研究设计、运行、使用软件及其规律的学科。
第一篇的后续几章分别从程序设计语言与理论、系统软件、软件工程、软件产业等方面进一步阐述学科领域的内涵和外延,以及相应的发展历程、现状和存在的主要矛盾。目的是从各方面来阐述软件发展的学科特性,把握学科现状和发展规律,为展望学科的未来发展奠定理性思考的基础。
%\section{参考文献}
%\begin{itemize}
% \item \cite{Liskov:1974:PAD:800233.807045}. Liskov \& Zilles. Programming with Abstract Data Types, ACM SIGPLAN Notices, 1974
% \item \cite{Floyd:1979:PP:359138.359140}. Floyd. The paradigms of programming, CACM 1979
% \item \cite{Humphrey:2002:SUP:513126.513132}. Watts S. Humphrey. Software Unbundling: A Personal Perspective. IEEE Annals of the History of Computing. 2002
% \item \cite{Simon:1996:SA:237774}. H.A. Simon. The Science of the Artificial. 1968
%\end{itemize}

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通过可编程的方式实现灵活可定制的资源管理适应上层业务系统的需求和变化。“软件定义一切”则将软件平台所管理的资源和提供的编程抽象泛化到包括计算、存储、网络、软件服务等在内的各类计算资源、包括各种数字化机电设备和可传感物体对象在内的各类物理资源、乃至可通过激励机制调配的人力资源。软件定义可递归分层形成一种生长式、演化式的可扩展体系。这种软件定义的人机物融合平台逐渐呈现了“泛在操作系统”的发展方向。
“软件定义一切”实质上是通用可编程思想在各个领域的应用是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础使得现代设备或装置往往都具备编程控制的能力推动了人们基于通用计算机的思维架构人们将其总结成计算思维来理解和求解各领域问题。可见“软件定义一切”SDX意味着构造针对“X”的“操作系统”。未来的面向人机物融合的软件平台就是对海量异构基础设施资源进行按需、深度软件定义而形成的“泛在”操作系统Ubiquitous Operating System
“软件定义一切”实质上是通用可编程思想在各个领域的应用,是一种以软件实现分层抽象的方式来驾驭复杂性的方法论。数字化使得几乎所有的设备都包含了独立或者集成的计算设备,完成“感知、判断、控制、作动”闭环的部分或者全部。这个改变是信息化发展的基础,使得现代设备或装置往往都具备编程控制的能力,推动了人们基于通用计算机的思维架构(人们将其总结成计算思维~\cite{SIGCSE07CompThinking}来理解和求解各领域问题。可见“软件定义一切”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

@ -1,232 +1,232 @@
\centerline{毛新军,魏峻,孙艳春,邓水光}
~\\
学 科教育基于学科的独立知识体系,宣传和普及学科知识,培养学科专业人才。学科教育是构成学科的要素之一,并受学科的发展、教育理念和方法的进步等因素的影响。近年来,随着软件学科的边界不断拓展,内涵持续变化,地位不断提升,以及对人类社会的影响面日益扩大,软件学科教育的重要性日益凸显。与此同时,随着我国经济结构的调整和升级以及以信息技术为代表的新经济的快速发展\cite{aihua2017fast},软件学科教育需要为国家的经济转型培养高素质的专业人才。如何加强软件学科教育,提高人才培养的质量和水平,让更多的社会大众从中受惠和受益,成为全社会关注的话题。
软件学科的研究主体是人类及其思维活动,客体是软件及其内在规律。在人机物融合时代,“软件无所不在”、“软件定义一切”使得软件成为人类社会的重要基础设施\cite{hong2018everything},软件系统的环境、边界、构成、形态、交互等发生了深刻的变化。这些变化不仅推动了软件学科的发展和进步,而且使得软件学科教育的对象、面临的挑战等也随之发生变化。
首先,随着软件的日益普及,软件对人类社会和现实世界的渗透力越来越强、影响面越来越广,受其辐射和影响的人群也越来越多,并随之产生了一系列新的问题、出现了新的价值取向,如伦理、道德、可信、隐私保护、安全等。越来越多的大众融入到了软件定义的世界(如使用微信来开展社交),甚至通过编程等方式参与软件的构造。总体而言,\textbf{软件学科与人类社会间的关系变得更为紧密,软件学科教育日趋普及化和全民化。}
其次,随着计算平台不断向物理世界和人类社会的快速延伸,软件作为“集成器”在连接物理系统和社会系统中发挥着日趋重要的作用,软件泛在化和人机物融合的趋势日益明显,软件成为诸多行业和领域(如机器人、航空、航天、生物医学等)解决其特定问题的核心手段和必不可少的工具。\textbf{这些行业、领域的专业人士需要掌握软件学科的基础知识和核心能力,学会运用软件工具来解决特定领域的问题;与此同时,软件学科的专业人才也需要向特定领域扩展和渗透,软件学科教育呈现出与其他学科教育日益交融的趋势。}
第三,软件系统变得日益复杂,并体现多元价值,传统的还原论开发方法在应对软件日益增长的复杂性方面面临着诸多挑战\cite{huaiming2014complex},需要从生态系统的角度认识软件系统及其开发和演化。随着软件学科外延的拓展和内涵的发展,软件学科需与更多的学科进行交叉。开源软件的成功以及开源文化的流行对人才培养提出了新的要求\cite{hong2017opensource, bandyopadhyay2016ict},使得软件学科教育的知识体系\cite{borque2014swebok}不断的丰富和发展,对软件专业人才的知识、能力、素质和技能等要求也随之发生变化。\textbf{软件学科教育需在知识体系层面与时俱进,需从系统观和系统能力、生态观、多元价值观、伦理等方面加强专业人才的培养。}
最后当前教育理念和技术的发展日新月异教育教学改革非常活跃如MOOC、SPOC、个性化学习、学习路径推荐等计算机软件在教育改革和人才培养中发挥着日益重要的作用。\textbf{软件学科教育需要借鉴当前先进的教育理念和方法\cite{computerEducation},结合自身的特点和人才培养的特殊要求,利用软件学科已经积累的资源,交叉大数据分析、机器学习、数据挖掘等技术手段,研制教育软件工具,以推动软件学科教育和人才培养的改革}
概括起来,软件学科作为基础学科,其教育的影响面大,面临挑战多,需要推动普及教育,加强跨学科教育,深化专业教育,重视人才培养理念和教育方法的改革,促进软件伦理建设。
\section{重大挑战问题}
为了适应人机物融合时代软件学科的发展以及人才培养的需求,软件学科教育在普及教育(§\ref{subsection:10_1_1})、跨学科教育(§\ref{subsection:10_1_2})、专业教育(§\ref{subsection:10_1_3})、教育理念和方法改革(§\ref{subsection:10_1_4})、软件伦理建设(§\ref{subsection:10_1_5})等面临一系列的重大挑战问题。
\subsection{普及教育问题}
\label{subsection:10_1_1}
在人机物融合时代,软件不仅是人类社会的基础设施,而且正成为承载人类文明的新载体。如何做好现代软件文明的继承者、传播者和创作者,软件学科教育必须顺应这一时代要求,从单一性的专业教育向大众化的通识教育转变,即惠及普通大众,从儿童、少年、青年、中年到老年\cite{xiaoming2019older},人人能用软件,人人能评软件,人人能读软件,人人能写软件。
\begin{itemize}
\item[$\bullet$] \textbf{如何培养以计算思维为核心,融合创新思维的系统性认知能力}
\end{itemize}
软件是人类智力活动的创作结果。软件学科普及教育首先需要解决社会大众(尤其是青少年)针对软件及其开发的系统化认知问题。从系统观的视角上看,软件学科的核心认知能力是计算思维,它是信息社会中现代人的基本素养,也是人类诸多认知能力的核心要素之一\cite{wing2014computational, grover20185th}。从内涵上看,计算思维能力绝不仅仅是编程技能,也不纯粹是掌握某些程序设计语言,而且还包括应用软件来创新解决问题以及由此所需的创新思维能力。现阶段软件已渗透到自然科学、工程技术、社会人文等方方面面,计算思维与其他认知能力(如批判思维、创新思维等)相互作用,相互影响,不可分离。软件学科教育要突出软件作为“集成器”在连接物理系统和社会系统中的关键作用,强化通过软件来解决各种实际问题的思维训练。为此,软件学科的普及教育需要充分揭示计算思维能力与其他认知能力之间的关系,深化以计算思维、创新思维为核心的普及教育,提高大众的系统化认知能力。现阶段,软件学科的普及教育还是以编程技能培养为主,我们对计算思维与创新思维二者相互作用的认识还不够深入,无法满足软件学科普及性教育的需要。
\begin{itemize}
\item[$\bullet$] \textbf{不同教育受众认知能力的成长有何规律,如何构建适应不同受众的普及教育知识体系}
\end{itemize}
软件学科普及教育受众对象的涉及面广、差异性大,其中青少年教育是核心和关键。他们是一类认知能力正逐步成长的特殊人群,其基本认知能力,如抽象思维能力、表达交流能力、逻辑分析与推理能力、计算抽象能力等正处于逐步形成的阶段。针对不同的受众对象,他们在计算思维等认知能力的成长方面有何规律性?不同认知能力的形成存在怎样的依赖性?计算思维的训练与哪些认知能力密切相关?等等基础性的问题值得去探究。与此同时,计算思维等认知能力的培养需要依托软件学科和非软件学科的诸多相关知识,这些知识需要与实际问题域相结合,以加强计算思维能力的训练和实践。因此,如何以软件学科知识为核心,建立起科学的、层次性的、可满足不同受众和认知能力培养需求的知识体系,是软件学科普及教育亟需解决的关键问题。
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与认知能力和水平相适应且贯穿终身的软件学科普及教育理念与方法}
\end{itemize}
软件学科普及教育对象来自各行各业,知识背景不一样,认知能力千差万别,且需面对从儿童期、少年期、青年期、中年期甚至到老年期等不同时期的人群,因此普及教育模式不能单一化,教育方法不能统一化。对于儿童和少年,游戏编程、可视化和实物编程有利于推动以计算思维为核心的认知能力逐步形成和深化;对于青少年,创新思维与软件核心认知能力的紧密融合可有效推动其认知能力的提升;对于成年人,通过软件创意创作把个人智慧进行沉淀和累积更能发挥其特长;对于老年人,编程成为他们除了琴棋书画广场舞之外的另一个重要兴趣方向。与此同时,随着信息技术的发展,教育的方式和方法也在不断的改变。为此,软件学科普及教育需要寻求适应不同普及对象、不同行业领域、不同认知水平的教育理念和方法。
\subsection{跨学科教育问题}
\label{subsection:10_1_2}
从形态观的视角,软件对人类社会和现实世界的渗透力越来越强,呈现出泛在化的趋势,与众多的专业和学科联系紧密;从系统观的视角,软件作为“集成器”在连接物理系统和社会系统中发挥关键作用,与诸多的应用领域密切相关。无疑,非软件学科的专业人才越来越多的需要具备软件学科的相关知识和能力,软件学科专业的人才也需要向其他学科渗透,以帮助其他学科解决特定专业和学科领域的相关问题。如何实现软件学科教育与其他学科教育的双向融合成为当前软件学科教育面临的一项重大挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何实现软件学科知识体系与其它学科专业知识体系的融合}
\end{itemize}
现有的许多学科与软件学科关系紧密,但在教育层面,它们很少融合软件学科的知识体系。随着软件学科的日趋泛在化以及对各个领域、行业和专业的不断渗透,以及社会对复合型、创新型人才的迫切需求,如何把软件学科的相关知识体系融入到非软件学科(如航空、航天、机器人、新材料等)的知识体系中,或者让软件学科的人才融入到其他学科领域之中,构建跨专业、多学科交叉的融合性知识体系,将成为软件学科教育和其它非软件学科教育面临的一项重大挑战。
其他学科教育需要借鉴和引入“软件定义+计算思维”的理念,使得相关专业人才具备利用软件学科的思维方法解决专业特定问题的能力,这种新的融合性教学模式能够充分发挥软件学科的优势和专业特长,有利于激励学生探索交叉学科的新领域,促进学生能力和素质的全面发展。实现“非软件学科 + 软件学科”相融合的教育改革,既是当前诸多专业教育面临的机遇,也是它们必须应对的挑战。针对相关学科专业(如农业、气象、生物医学、现代服务业等)的人才培养,在保障以本学科专业为主导的前提下,如何加强软件学科相关知识的学习和能力的培养,如何调整培养方案和知识体系,完成从“专业型”到“融合型”学科培养方式的转型,是当前非软件学科教育亟待解决的问题。
当前各大高校设置了介绍软件学科知识的公共基础课程(如大学计算机基础、计算机导论、计算机程序设计等),以帮助相关学科和专业的学生建立起初步的计算思维和编程能力,但是统一的授课内容导致软件学科知识与其他学科知识脱节,没有考虑不同学科和专业培养目标和应用需求的差异性,未能实现个性化和差异化教学,尤其是缺乏软件学科与其他学科相结合的优秀教学案例。
\begin{itemize}
\item[$\bullet$] \textbf{如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才}
\end{itemize}
随着行业软件化转型需求的不断增长,诸多学科和专业与软件学科的融合日趋紧密,迫切需要具有软件学科知识的复合型、创新型跨界专业人才。然而,现有的许多专业人才培养尚无法满足这一需求,极大制约了相关行业的转型、专业和学科的发展,导致这种状况的原因是多方面的:一些非软件学科的专业人才培养直接将软件学科中的某些先进软件技术套用到相关专业领域之中,并没有系统地考虑这些技术在跨界专业领域中的实用性以及软件应用需求的特殊性;它们更多地关注于自身专业领域的相关知识和能力,忽视和错失了软件学科的知识和技术给专业领域问题的解决带来的新机遇。因此,如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才,将是诸多专业和学科教育面临的重大机遇和挑战。在现有的人才培养体系下,我们应该深入思考如何在掌握专业基础知识的同时,将软件学科的知识与相关专业学科的知识相交叉和融合,实现从单一专业人才到跨界复合型、创新型人才的转变,满足人机物融合时代对复合型、创新型人才的巨大需求。
\subsection{专业教育问题}
\label{subsection:10_1_3}
在人机物融合时代,软件的环境、边界、构成、形态、交互、复杂性等发生了深刻的变化,软件学科的内涵和外延也在不断的发展,其知识体系不断的丰富,对软件学科专业人才的能力、素质和技能等要求也随之发生变化,进而对软件学科专业教育提出了新的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何认识人机物融合时代对软件学科专业能力提出的新要求?}
\end{itemize}
在人机物融合时代,由于软件系统自身形态、复杂性、价值观等发生了深刻的变化。软件学科教育需要从提升可持续核心竞争力的角度,加强专业人才的能力和素质培养\cite{computerEducation}
复杂庞大的软件系统在人类社会的诸多领域发挥着日益重要的作用和影响,如银行金融、城市服务、国防军事、电力通讯等等。这类系统不仅在基本形态、运维方式、质量要求等方面有其特殊性,而且在支持这类系统建设的软件开发隐喻、软件生态环境、元级方法论等也呈现出新的特点。软件学科教育迫切地需要培养能够掌握和驾驭这类软件系统开发和运维的人才。
从系统观的视角,人机物融合时代的软件系统已不再是纯粹的技术系统,而是需要与物理世界、社会系统等进行高度融合。这类系统的开发需要采用系统论方法(而非还原论方法)来驾驭复杂性,要从“人机物”相互融合的角度和层次来认识软件系统的构成,要将软件视为融合人机物的“万能集成器”;需要从横向(系统的联盟)和纵向(系统的层次)、高层、宏观、全局等视角来分析系统的构成及考虑系统的设计,需要站在系统的高度综合考虑人、机、物之间的关系,通过人、机、物三者间的协同给出软件系统的解决方案,也即软件学科专业人才需要具备“系统能力”。
人机物融合时代的软件系统也呈现出新的特点,软件规模超大(如几亿甚至十几亿行代码)、软件需求不清晰且持续变化,软件系统表现为一类系统之系统而非单一系统、动态演化系统而非静态确定系统、社会技术系统而非纯粹技术系统\cite{sommerville2012large,northrop2006ultra}等等。因此,软件形态和复杂性的变化以及软件学科范畴的拓展对软件学科专业人才的能力和素质提出了更高的要求,他们需要具备解决人机物融合时代背景下的解决复杂工程问题的能力,这种能力需建立多学科知识的基础之上,以应对人机物融合带来的各种问题和挑战。
在人机物融合时代,软件开发方式和手段也在发生深刻的变化。例如,建设开源生态、借助开源软件、利用群智开发等成为重要的趋势,开源软件已成为信息技术及产业发展的重要方向。然而,当前开源软件人才的培养无论在质或量上均存在较大不足\cite{hong2017opensource}。此外,软件学科教育需要深入地探究如何有效地利用海量、多样、高质量的开源软件和群智资源来培养软件学科人才\cite{xinjun2019software}
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与人机物融合时代软件学科特点相适应的专业知识体系?}
\end{itemize}
在人机物融合时代,不仅软件系统的构成、形态和复杂性在变,人们对软件系统的价值观认识也在变(如更加关注软件的可信性、隐私性、安全性、平等性、持续性等),支撑软件系统开发和运维的方法和技术也在不断的变化。软件开发和运维不仅是个体和团队行为,而且延伸到社会层次,表现为一种社会化行为。开源软件的成功实践表明,大规模群体化软件创作成为一种重要的软件开发方式,软件生态变得极为重要。此外,软件学科不断地与其他相关的学科进行交叉,如大数据、人工智能、社会学、系统科学等等。这意味着人机物融合时代的软件学科专业教育知识体系发生了深刻的变化,其知识域在不断拓展,知识点在不断增加。为了满足软件学科教育的新要求,需要建立起支撑系统能力、解决复杂工程问题能力以及创新能力等能力培养所需的知识体系。因此,软件学科专业教育需构建与人机物融合时代软件学科发展相适应、满足软件学科专业人才培养需求的知识体系。
\subsection{教育理念和方法改革问题}
\label{subsection:10_1_4}
在人机物高度融合的时代,软件学科教育既要根据软件学科的特点、顺应学科的发展趋势,也要充分利用好学科发展的成果,促进学科人才的培养。软件学科教育在教育理念、方法和模式等方面面临着一系列的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何借助软件学科成果来加强软件学科教育?}
\end{itemize}
在几十年的发展过程中,软件学科领域积累了丰富、多样和海量的资源,包括代码、模型、文档、数据、开发知识、工具等等。尤其是近年来,随着开源软件、群智开发、软件开发知识分享等的快速发展,互联网上的开源社区汇聚了大量的软件资源和开发数据。这既给软件学科教育创造了条件、提供了机会和奠定了“物质”基础,同时也给软件学科教育提出了新的问题和挑战\cite{xinjun2019software}:如何借助这些软件资源来深入探究软件学科人才(如软件工程师)的成长轨迹和培养路径?如何有效利用这些软件资源来支持软件学科的教育、促进软件人才的培养?
\begin{itemize}
\item[$\bullet$] \textbf{如何顺应教育理念和方法的发展来改革软件学科教育的方式和手段?}
\end{itemize}
以互联网为基础的信息技术正改变甚至颠覆传统的教学理念和方法以MOOC、SPOC等为代表的大规模在线教育意味着互联网大众不仅是教育的受益者也是教育的参与者。软件学科教育朝着普及化和全民化的方向发展越来越多的大众涉足软件的使用、评价甚至开发因而成为软件学科教育的对象。这就需要为软件学科的大众化和普及化教育投入足够的教育资源、提供有效的方式和手段。以群智软件开发方法为代表的软件开发隐喻给软件学科教育提供了新的启示借助于互联网大众、利用群智力量来推进软件学科教育将是未来的一个重要趋势它不仅可促进软件学科教育的普及化而且还可通过大众的参与和协同共同分享学习的经验和资源。
\begin{itemize}
\item[$\bullet$] \textbf{如何为软件学科教育提供软件工具?}
\end{itemize}
软件可为特定领域的问题提供基于计算平台的解决方案。软件学科教育也是一个特殊的应用领域,它涉及与教育有关的诸多问题的解决,如教育资源的组织、分享和推荐,学习者的交互和协同,教育成效的考核和评估等等。因此,如何为软件学科教育提供支撑软件成为一个开放性的问题。
\subsection{软件伦理建设问题}
\label{subsection:10_1_5}
\begin{figure}[!b]
\centering
\includegraphics[width=.8\linewidth]{fig2-10/mainwork.png}
\caption{软件学科教育的主要研究内容}
\label{fig:fig2_10_1}
\end{figure}
在人机物融合时代,计算机软件对人类社会的方方面面产生了重大和深远的影响,也带来一些深层次、前所未有的风险和问题,如私密数据被窃取、软件留有后门、系统受到攻击等等。我们社会还没有建立起针对这些风险和问题的伦理准则和法律体系;软件研究者、开发者和使用者的行为缺乏约束,也没有有效和高效的监管手段,以确保其遵守和履行法律、道德和伦理规范。软件伦理教育没有得到国家、社会和行业、公众等的足够重视。缺乏软件专业背景的人员和大众很难从系统外部及时感知和发现潜在的软件伦理问题。自动化、智能化甚至量子化软件新技术的发展及应用将给人类社会带来更多的未知,评估它们对人类社会产生的长远影响需要对技术本身以及潜在的应用场景有深入的理解,以及足够的前瞻预测能力。
\section{主要研究内容}
针对上述重大挑战问题,软件学科教育需要开展以下诸多方面的研究工作,包括:以“知识普及 + 思维培养”为核心的普及教育(§\ref{subsection:10_2_1});以“复合型 + 创新型”为目的的跨学科教育(§\ref{subsection:10_2_2});以“知识体系+能力培养”为核心的专业教育(§\ref{subsection:10_2_3});以“探究规律 + 方法创新 ”为主体的教育理念和方法改革(§\ref{subsection:10_2_4});以“规范内涵 + 自动检测”为核心的软件伦理建设(§\ref{subsection:10_2_5})。
\subsection{以“知识普及 + 思维培养”为核心的普及教育}
\label{subsection:10_2_1}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科核心认知能力的成长模型和规律及其知识体系}
\end{itemize}
软件学科的认知能力以计算思维为核心,包含抽象思维、表达交流、逻辑分析和推理、计算抽象等,这些能力有其各自的特殊性,相互间存在依赖性。为此,需要深入研究以计算思维能力为核心的认知能力成长模型,探究不同受众认知能力的成长规律。与此同时,这些能力培养所需的知识潜藏在数学、语文、物理、化学、自然科学等课程的知识体系之中。软件学科认知能力的培养和上述知识之间存在横切关系,代表这些知识体系的课程很少与实际的软件及其开发相关联。因此,需要从横切和纵切二个方面,探究并建立起支撑软件学科核心认知能力培养的知识体系。
\begin{itemize}
\item[$\bullet$] \textbf{以计算思维为核心,融合创新思维的系统化认知能力培养方法}
\end{itemize}
人机物融合时代,软件使能的创新是软件学科辐射影响的主要目标,软件学科教育要在培养计算思维能力的同时,强化基于软件来解决问题的创新思维能力的培养。因此,我们需要研究如何将“计算思维”与“创新思维”二者相结合来深化软件学科的普及教育,探究“计算思维+创新思维”融合培养的学习路径,建立起支撑“计算思维 + 创新思维”培养的方法和手段。
\begin{itemize}
\item[$\bullet$] \textbf{适应不同认知水平且贯穿终生的软件学科普及教育方法}
\end{itemize}
普及教育受众的专业和知识背景具有多样化的特点,年龄层次和认知水平有较大的差异性。为此,需要借鉴生态化发展的思路,研究与教育对象的生理、心理和认知相适应的教育教学方法;研究同质生态教育方法和异质生态关联的迁移教育方法;研究如何借助于信息系统(尤其是软件系统)来支持和推广软件学科的普及教育。
\subsection{以“复合型 + 创新型”为目标的跨学科教育}
\label{subsection:10_2_2}
\begin{itemize}
\item[$\bullet$] \textbf{基于“专业学科知识 + 软件学科知识”的跨学科教育知识体系}
\end{itemize}
作为基础学科,软件学科教育需要面向其他的学科专业实现外延式的发展。针对不同专业自身的特点,结合软件学科知识在该专业人才培养中所起到的作用,采取“专业学科知识 + 软件学科知识”的方式来拓展专业知识体系,开展适用于自身专业需求的教学改革,使得相关专业人才具备软件学科的知识并能运用它们来解决特定专业问题。为此需要研究如何将软件学科的知识差异化地融入到相关专业的知识体系之中,实现与相关专业知识的有机融合,实现跨学科知识体系的交叉融合和互补,为跨界人才培养奠定基础。
\begin{itemize}
\item[$\bullet$] \textbf{具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法}
\end{itemize}
随着软件学科在其他专业领域的不断渗透,在这些学科专业人才培养方案的设计中,必须解决软件学科知识储备不足的问题。由于专业背景和专业思维的差异性,不同学科专业教育对软件学科知识结构的需求和相关课程衔接也不尽相同,因此跨界的软件学科人才培养需要多元化的知识和课程体系,为此需要探究如何实施“因材施教”的教学理念,分析不同专业对软件学科的“个性化”需求,构建专业软件化的新型课程体系,设计差异化的跨界软件学科人才培养方案,以实现软件学科和其他相关学科专业交叉融合,让非软件专业的学生也具备软件学科的思维能力,以满足社会对复合型、创新型的跨界软件学科人才的需求。
软件学科的跨界人才培养也是双向的。软件学科跨界进入其他学科领域的发展趋势愈发明显。在该形式的跨界教育中,教育对象已具备良好的计算思维能力,需要研究他们如何跳出软件学科知识领域的思维定势,强化跨界学科知识的学习,如何以全新的视角建立起软件学科与其他学科间的关联性,探索跨界学科计算的本质,培养适用于跨界专业的计算思维能力。
\subsection{以“知识体系 能力培养”为核心的专业教育}
\label{subsection:10_2_3}
\begin{itemize}
\item[$\bullet$] \textbf{面向多学科交叉融合的软件学科专业教育知识体系}
\end{itemize}
针对人机物融合时代的软件学科特点和人才培养要求,深入研究软件学科与哪些相关学科发生了交叉、交叉的边界和范围是什么;人们对软件的价值取向发生了什么样的变化,这些变化对学科的知识体系提出了什么样的要求;软件学科自身发展带来哪些方面的变化,这些变化处于知识体系的哪些层次和方面;需要研究如何根据产业界的成功实践以及学术界的研究成果来丰富和完善软件学科的知识体系。另外,还需要从软件学科专业人才能力培养的视点,探讨系统能力、解决复杂工程问题能力的培养对知识体系提出什么要的要求。在上述研究的基础上,建立起人机物融合时代面向多学科交叉融合的软件学科专业教育的知识体系,包括知识领域、知识单元、知识点等。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科专业教育的核心能力及其培养方法}
\end{itemize}
创新实践能力、系统能力、解决复杂工程问题能力等是人机物融合时代软件学科专业教育的核心能力。这三类能力的关注点和侧重点有所不同,培养方式和手段也不尽相同。实践无疑是专业教育环节中支撑能力培养的主要手段。为此需要在软件学科的范畴中深入研究创新实践能力、系统能力和解决复杂工程问题能力的内涵、构成和模型,分析不同能力之间的内在关联性,探究能力持续性培养和形成的特点和规律性,探究如何通过渐进式、综合性的实践来促进这三类能力的培养,以及针对能力培养的考评方式和方法。
\subsection{以“探寻规律 + 方法创新”为主体的教育理念和方法改革}
\label{subsection:10_2_4}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科人才培养模型及规律}
\end{itemize}
软件学科教育对象的涉及面广,年龄层次和知识背景差异性大,培养的目的和要求多样化。软件学科教育牵涉多方面的专业和非专业知识,需要强化不同层次的能力和素质培养。这些知识、能力和素质之间存在内在的关联性。为此,软件学科教育需要针对不同的培养对象和目标,深入探究人才培养模型,包括知识体系、能力体系、工程素质等,分析它们在培养过程中所发挥的作用以及相互之间的继承性和依赖性。此外,软件学科人才的成长受多方面因素的影响,包括自身的素质和能力,外在的教育者及合作群体,学习的环境和激励机制,甚至学习过程中所依赖的软件平台(如开源社区)等。为此,需要研究软件学科人才的成长模型,依此来指导教育政策和机制的设计以及平台的建设。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科资源在人才培养中的挖掘和应用 }
\end{itemize}
经过几十年的积累,尤其是近年来开源软件、群智软件开发等的发展,软件学科积累了大量、多样、极有价值的软件资源,如以开源社区为载体的开源代码、知识问答、软件开发历史数据等。软件学科教育需要深入挖掘软件学科资源,系统研究如何在课程教学、实践教学和人才培养过程中有效地应用这些资源,如何将抽象的知识与具体的资源相结合来促进知识的讲授、推动实践教学、培养能力和素养,如何建立起支撑软件学科人才培养的开源教育资源。
\begin{itemize}
\item[$\bullet$] \textbf{群体化学习}
\end{itemize}
借助互联网平台,通过吸引、汇聚和管理大规模的学习者,使得他们以竞争和合作等多种自主协同方式来开展学习将是未来重要学习方式,我们称之为群体化学习。软件学科教育需要充分借助于互联网大众的智慧和理念,施行群体化学习的思想,以促进软件学科人才的大规模、高质量、普及化的培养。为此,基于群智理论和方法,借助于互联网上的大数据分析,研究支持群体化学习的组织结构和协同模型,分析和设计群体化学习的激励机制,探究不同组织结构、协同模型和激励机制对群体化学习成效、质量和受益面等产生的影响及涌现结果,开展基于群体化学习的教育和教学方法的改革。
\begin{itemize}
\item[$\bullet$] \textbf{大规模在线开放实践MOOP}
\end{itemize}
能力和素质培养是软件学科教育的一项主要任务。针对软件学科的发展特点需要研究软件学科人才的能力和素质模型建立不同能力和素质之间的关系分析普及教育、专业教育、跨学科教育等分别需要达到什么样的水平和层次探究软件学科内涵的拓展如何影响能力和素质。实践是支撑能力和素质培养的主要教学途径。依托大规模人群的在线开放实践称为MOOP将成为能力和素质培养的重要趋势也是对MOOC在该方面存在欠缺的有效弥补。为此需要研究支撑能力和素质培养的实践体系建设探究如何将诸如游戏化机制等引入到MOOP之中以激励大众参与和贡献分析针对MOOP的量化表示与评测方法建立起针对能力和素质培养的评价体系与指标。
\begin{itemize}
\item[$\bullet$] \textbf{支撑软件学科教育的软件系统}
\end{itemize}
针对软件学科教育的特殊需求,借助于软件学科资源大数据,交叉诸如人工智能、大数据分析、移动计算等技术,研究支撑软件学科教育的关键软件技术,包括开源社区中学习资源(如开源软件和软件开发知识)的同步和分享技术,针对学习者个性化特点及需求的教育资源推荐技术,实现教育软件与开源社区间互操作和交互技术,基于教育大数据来构建学习者个性化学习路径的方法,对学习者的学习情况和成长进行跟踪和考评的技术等等,并在此基础上研发软件学科教育软件。
\subsection{以“规范内涵 + 自动检测”为核心的软件伦理建设}
\label{subsection:10_2_5}
\begin{itemize}
\item[$\bullet$] \textbf{规范化和可检验的软件伦理内涵}
\end{itemize}
国家、软件行业主管部门应与行业主体、学术团体、社会公众等众多利益相关方通力合作,通过多学科交叉的方式,研究软件伦理的规范化内涵;综合人员、过程、行为、制品、法规等多个方面,研究并制定软件伦理的可解释、可检验的条文和准则,制定相关的法律法规和行业标准。
\begin{itemize}
\item[$\bullet$] \textbf{软件伦理的自动化检测技术和监督方法}
\end{itemize}
研究针对软件开发者行为和制品的软件伦理合规检测技术,尤其是自动化检测技术。例如,面向软件版权保护的代码溯源技术、软件许可证违规使用检测技术,软件及软件使用者恶意和危险行为检测技术等;研究并制定软件伦理的合规监督方法,如过程、规范、标准等,形成覆盖全面、导向明确、规范有序、协调一致的检测和监督技术体系,以快速、高效和准确地发现和修正违背伦理的问题。
\section{本章小结}
在人机物融合时代,随着软件辐射面和影响面的扩大,软件学科的发展和进步,软件学科教育的内涵和外延也在发生改变,它涉及普及教育、专业教育、跨专业教育、教育理念与方法改革等多个方面,面临着一系列重大的问题的挑战,包括:如何针对具有不同认知水平的受众对象开展普及教育?如何根据人机物融合时代特点来深化专业教育?如何加强软件学科与其他学科的融合来实现跨专业的教育?以及如何改革软件学科的教育理念和方法来满足不断增长的人才培养需求、如何应对软件伦理问题等等。为了迎接上述挑战,软件学科教育需开展一系列研究,包括:以“知识普及 + 思维培养”为核心的普及教育、以“复合型 + 创新型”为目标的跨学科教育、以“知识体系+能力培养”为核心的专业教育、以“探究规律 + 方法创新”为主体的教育理念和方法改革、以“规范内涵 + 自动检测”为核心的软件伦理建设。
\bibliographystyle{unsrt}
\bibliography{reflib}
\centerline{毛新军,魏峻,孙艳春,邓水光}
~\\
学 科教育基于学科的独立知识体系,宣传和普及学科知识,培养学科专业人才。学科教育是构成学科的要素之一,并受学科的发展、教育理念和方法的进步等因素的影响。近年来,随着软件学科的边界不断拓展,内涵持续变化,地位不断提升,以及对人类社会的影响面日益扩大,软件学科教育的重要性日益凸显。与此同时,随着我国经济结构的调整和升级以及以信息技术为代表的新经济的快速发展\cite{aihua2017fast},软件学科教育需要为国家的经济转型培养高素质的专业人才。如何加强软件学科教育,提高人才培养的质量和水平,让更多的社会大众从中受惠和受益,成为全社会关注的话题。
软件学科的研究主体是人类及其思维活动,客体是软件及其内在规律。在人机物融合时代,“软件无所不在”、“软件定义一切”使得软件成为人类社会的重要基础设施\cite{hong2018everything},软件系统的环境、边界、构成、形态、交互等发生了深刻的变化。这些变化不仅推动了软件学科的发展和进步,而且使得软件学科教育的对象、面临的挑战等也随之发生变化。
首先,随着软件的日益普及,软件对人类社会和现实世界的渗透力越来越强、影响面越来越广,受其辐射和影响的人群也越来越多,并随之产生了一系列新的问题、出现了新的价值取向,如伦理、道德、可信、隐私保护、安全等。越来越多的大众融入到了软件定义的世界(如使用微信来开展社交),甚至通过编程等方式参与软件的构造。总体而言,\textbf{软件学科与人类社会间的关系变得更为紧密,软件学科教育日趋普及化和全民化。}
其次,随着计算平台不断向物理世界和人类社会的快速延伸,软件作为“集成器”在连接物理系统和社会系统中发挥着日趋重要的作用,软件泛在化和人机物融合的趋势日益明显,软件成为诸多行业和领域(如机器人、航空、航天、生物医学等)解决其特定问题的核心手段和必不可少的工具。\textbf{这些行业、领域的专业人士需要掌握软件学科的基础知识和核心能力,学会运用软件工具来解决特定领域的问题;与此同时,软件学科的专业人才也需要向特定领域扩展和渗透,软件学科教育呈现出与其他学科教育日益交融的趋势。}
第三,软件系统变得日益复杂,并体现多元价值,传统的还原论开发方法在应对软件日益增长的复杂性方面面临着诸多挑战\cite{huaiming2014complex},需要从生态系统的角度认识软件系统及其开发和演化。随着软件学科外延的拓展和内涵的发展,软件学科需与更多的学科进行交叉。开源软件的成功以及开源文化的流行对人才培养提出了新的要求\cite{hong2017opensource, bandyopadhyay2016ict},使得软件学科教育的知识体系\cite{borque2014swebok}不断的丰富和发展,对软件专业人才的知识、能力、素质和技能等要求也随之发生变化。\textbf{软件学科教育需在知识体系层面与时俱进,需从系统观和系统能力、生态观、多元价值观、伦理等方面加强专业人才的培养。}
最后当前教育理念和技术的发展日新月异教育教学改革非常活跃如MOOC、SPOC、个性化学习、学习路径推荐等计算机软件在教育改革和人才培养中发挥着日益重要的作用。\textbf{软件学科教育需要借鉴当前先进的教育理念和方法\cite{computerEducation},结合自身的特点和人才培养的特殊要求,利用软件学科已经积累的资源,交叉大数据分析、机器学习、数据挖掘等技术手段,研制教育软件工具,以推动软件学科教育和人才培养的改革}
概括起来,软件学科作为基础学科,其教育的影响面大,面临挑战多,需要推动普及教育,加强跨学科教育,深化专业教育,重视人才培养理念和教育方法的改革,促进软件伦理建设。
\section{重大挑战问题}
为了适应人机物融合时代软件学科的发展以及人才培养的需求,软件学科教育在普及教育(§\ref{subsection:10_1_1})、跨学科教育(§\ref{subsection:10_1_2})、专业教育(§\ref{subsection:10_1_3})、教育理念和方法改革(§\ref{subsection:10_1_4})、软件伦理建设(§\ref{subsection:10_1_5})等面临一系列的重大挑战问题。
\subsection{普及教育问题}
\label{subsection:10_1_1}
在人机物融合时代,软件不仅是人类社会的基础设施,而且正成为承载人类文明的新载体。如何做好现代软件文明的继承者、传播者和创作者,软件学科教育必须顺应这一时代要求,从单一性的专业教育向大众化的通识教育转变,即惠及普通大众,从儿童、少年、青年、中年到老年\cite{xiaoming2019older},人人能用软件,人人能评软件,人人能读软件,人人能写软件。
\begin{itemize}
\item[$\bullet$] \textbf{如何培养以计算思维为核心,融合创新思维的系统性认知能力}
\end{itemize}
软件是人类智力活动的创作结果。软件学科普及教育首先需要解决社会大众(尤其是青少年)针对软件及其开发的系统化认知问题。从系统观的视角上看,软件学科的核心认知能力是计算思维,它是信息社会中现代人的基本素养,也是人类诸多认知能力的核心要素之一\cite{wing2014computational, grover20185th}。从内涵上看,计算思维能力绝不仅仅是编程技能,也不纯粹是掌握某些程序设计语言,而且还包括应用软件来创新解决问题以及由此所需的创新思维能力。现阶段软件已渗透到自然科学、工程技术、社会人文等方方面面,计算思维与其他认知能力(如批判思维、创新思维等)相互作用,相互影响,不可分离。软件学科教育要突出软件作为“集成器”在连接物理系统和社会系统中的关键作用,强化通过软件来解决各种实际问题的思维训练。为此,软件学科的普及教育需要充分揭示计算思维能力与其他认知能力之间的关系,深化以计算思维、创新思维为核心的普及教育,提高大众的系统化认知能力。现阶段,软件学科的普及教育还是以编程技能培养为主,我们对计算思维与创新思维二者相互作用的认识还不够深入,无法满足软件学科普及性教育的需要。
\begin{itemize}
\item[$\bullet$] \textbf{不同教育受众认知能力的成长有何规律,如何构建适应不同受众的普及教育知识体系}
\end{itemize}
软件学科普及教育受众对象的涉及面广、差异性大,其中青少年教育是核心和关键。他们是一类认知能力正逐步成长的特殊人群,其基本认知能力,如抽象思维能力、表达交流能力、逻辑分析与推理能力、计算抽象能力等正处于逐步形成的阶段。针对不同的受众对象,他们在计算思维等认知能力的成长方面有何规律性?不同认知能力的形成存在怎样的依赖性?计算思维的训练与哪些认知能力密切相关?等等基础性的问题值得去探究。与此同时,计算思维等认知能力的培养需要依托软件学科和非软件学科的诸多相关知识,这些知识需要与实际问题域相结合,以加强计算思维能力的训练和实践。因此,如何以软件学科知识为核心,建立起科学的、层次性的、可满足不同受众和认知能力培养需求的知识体系,是软件学科普及教育亟需解决的关键问题。
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与认知能力和水平相适应且贯穿终身的软件学科普及教育理念与方法}
\end{itemize}
软件学科普及教育对象来自各行各业,知识背景不一样,认知能力千差万别,且需面对从儿童期、少年期、青年期、中年期甚至到老年期等不同时期的人群,因此普及教育模式不能单一化,教育方法不能统一化。对于儿童和少年,游戏编程、可视化和实物编程有利于推动以计算思维为核心的认知能力逐步形成和深化;对于青少年,创新思维与软件核心认知能力的紧密融合可有效推动其认知能力的提升;对于成年人,通过软件创意创作把个人智慧进行沉淀和累积更能发挥其特长;对于老年人,编程成为他们除了琴棋书画广场舞之外的另一个重要兴趣方向。与此同时,随着信息技术的发展,教育的方式和方法也在不断的改变。为此,软件学科普及教育需要寻求适应不同普及对象、不同行业领域、不同认知水平的教育理念和方法。
\subsection{跨学科教育问题}
\label{subsection:10_1_2}
从形态观的视角,软件对人类社会和现实世界的渗透力越来越强,呈现出泛在化的趋势,与众多的专业和学科联系紧密;从系统观的视角,软件作为“集成器”在连接物理系统和社会系统中发挥关键作用,与诸多的应用领域密切相关。无疑,非软件学科的专业人才越来越多的需要具备软件学科的相关知识和能力,软件学科专业的人才也需要向其他学科渗透,以帮助其他学科解决特定专业和学科领域的相关问题。如何实现软件学科教育与其他学科教育的双向融合成为当前软件学科教育面临的一项重大挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何实现软件学科知识体系与其它学科专业知识体系的融合}
\end{itemize}
现有的许多学科与软件学科关系紧密,但在教育层面,它们很少融合软件学科的知识体系。随着软件学科的日趋泛在化以及对各个领域、行业和专业的不断渗透,以及社会对复合型、创新型人才的迫切需求,如何把软件学科的相关知识体系融入到非软件学科(如航空、航天、机器人、新材料等)的知识体系中,或者让软件学科的人才融入到其他学科领域之中,构建跨专业、多学科交叉的融合性知识体系,将成为软件学科教育和其它非软件学科教育面临的一项重大挑战。
其他学科教育需要借鉴和引入“软件定义+计算思维”的理念,使得相关专业人才具备利用软件学科的思维方法解决专业特定问题的能力,这种新的融合性教学模式能够充分发挥软件学科的优势和专业特长,有利于激励学生探索交叉学科的新领域,促进学生能力和素质的全面发展。实现“非软件学科 + 软件学科”相融合的教育改革,既是当前诸多专业教育面临的机遇,也是它们必须应对的挑战。针对相关学科专业(如农业、气象、生物医学、现代服务业等)的人才培养,在保障以本学科专业为主导的前提下,如何加强软件学科相关知识的学习和能力的培养,如何调整培养方案和知识体系,完成从“专业型”到“融合型”学科培养方式的转型,是当前非软件学科教育亟待解决的问题。
当前各大高校设置了介绍软件学科知识的公共基础课程(如大学计算机基础、计算机导论、计算机程序设计等),以帮助相关学科和专业的学生建立起初步的计算思维和编程能力,但是统一的授课内容导致软件学科知识与其他学科知识脱节,没有考虑不同学科和专业培养目标和应用需求的差异性,未能实现个性化和差异化教学,尤其是缺乏软件学科与其他学科相结合的优秀教学案例。
\begin{itemize}
\item[$\bullet$] \textbf{如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才}
\end{itemize}
随着行业软件化转型需求的不断增长,诸多学科和专业与软件学科的融合日趋紧密,迫切需要具有软件学科知识的复合型、创新型跨界专业人才。然而,现有的许多专业人才培养尚无法满足这一需求,极大制约了相关行业的转型、专业和学科的发展,导致这种状况的原因是多方面的:一些非软件学科的专业人才培养直接将软件学科中的某些先进软件技术套用到相关专业领域之中,并没有系统地考虑这些技术在跨界专业领域中的实用性以及软件应用需求的特殊性;它们更多地关注于自身专业领域的相关知识和能力,忽视和错失了软件学科的知识和技术给专业领域问题的解决带来的新机遇。因此,如何培养具有软件学科知识和能力的复合型、创新型跨界专业人才,将是诸多专业和学科教育面临的重大机遇和挑战。在现有的人才培养体系下,我们应该深入思考如何在掌握专业基础知识的同时,将软件学科的知识与相关专业学科的知识相交叉和融合,实现从单一专业人才到跨界复合型、创新型人才的转变,满足人机物融合时代对复合型、创新型人才的巨大需求。
\subsection{专业教育问题}
\label{subsection:10_1_3}
在人机物融合时代,软件的环境、边界、构成、形态、交互、复杂性等发生了深刻的变化,软件学科的内涵和外延也在不断的发展,其知识体系不断的丰富,对软件学科专业人才的能力、素质和技能等要求也随之发生变化,进而对软件学科专业教育提出了新的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何认识人机物融合时代对软件学科专业能力提出的新要求?}
\end{itemize}
在人机物融合时代,由于软件系统自身形态、复杂性、价值观等发生了深刻的变化。软件学科教育需要从提升可持续核心竞争力的角度,加强专业人才的能力和素质培养\cite{computerEducation}
复杂庞大的软件系统在人类社会的诸多领域发挥着日益重要的作用和影响,如银行金融、城市服务、国防军事、电力通讯等等。这类系统不仅在基本形态、运维方式、质量要求等方面有其特殊性,而且在支持这类系统建设的软件开发隐喻、软件生态环境、元级方法论等也呈现出新的特点。软件学科教育迫切地需要培养能够掌握和驾驭这类软件系统开发和运维的人才。
从系统观的视角,人机物融合时代的软件系统已不再是纯粹的技术系统,而是需要与物理世界、社会系统等进行高度融合。这类系统的开发需要采用系统论方法(而非还原论方法)来驾驭复杂性,要从“人机物”相互融合的角度和层次来认识软件系统的构成,要将软件视为融合人机物的“万能集成器”;需要从横向(系统的联盟)和纵向(系统的层次)、高层、宏观、全局等视角来分析系统的构成及考虑系统的设计,需要站在系统的高度综合考虑人、机、物之间的关系,通过人、机、物三者间的协同给出软件系统的解决方案,也即软件学科专业人才需要具备“系统能力”。
人机物融合时代的软件系统也呈现出新的特点,软件规模超大(如几亿甚至十几亿行代码)、软件需求不清晰且持续变化,软件系统表现为一类系统之系统而非单一系统、动态演化系统而非静态确定系统、社会技术系统而非纯粹技术系统\cite{sommerville2012large,northrop2006ultra}等等。因此,软件形态和复杂性的变化以及软件学科范畴的拓展对软件学科专业人才的能力和素质提出了更高的要求,他们需要具备解决人机物融合时代背景下的解决复杂工程问题的能力,这种能力需建立多学科知识的基础之上,以应对人机物融合带来的各种问题和挑战。
在人机物融合时代,软件开发方式和手段也在发生深刻的变化。例如,建设开源生态、借助开源软件、利用群智开发等成为重要的趋势,开源软件已成为信息技术及产业发展的重要方向。然而,当前开源软件人才的培养无论在质或量上均存在较大不足\cite{hong2017opensource}。此外,软件学科教育需要深入地探究如何有效地利用海量、多样、高质量的开源软件和群智资源来培养软件学科人才\cite{xinjun2019software}
\begin{itemize}
\item[$\bullet$] \textbf{如何构建与人机物融合时代软件学科特点相适应的专业知识体系?}
\end{itemize}
在人机物融合时代,不仅软件系统的构成、形态和复杂性在变,人们对软件系统的价值观认识也在变(如更加关注软件的可信性、隐私性、安全性、平等性、持续性等),支撑软件系统开发和运维的方法和技术也在不断的变化。软件开发和运维不仅是个体和团队行为,而且延伸到社会层次,表现为一种社会化行为。开源软件的成功实践表明,大规模群体化软件创作成为一种重要的软件开发方式,软件生态变得极为重要。此外,软件学科不断地与其他相关的学科进行交叉,如大数据、人工智能、社会学、系统科学等等。这意味着人机物融合时代的软件学科专业教育知识体系发生了深刻的变化,其知识域在不断拓展,知识点在不断增加。为了满足软件学科教育的新要求,需要建立起支撑系统能力、解决复杂工程问题能力以及创新能力等能力培养所需的知识体系。因此,软件学科专业教育需构建与人机物融合时代软件学科发展相适应、满足软件学科专业人才培养需求的知识体系。
\subsection{教育理念和方法改革问题}
\label{subsection:10_1_4}
在人机物高度融合的时代,软件学科教育既要根据软件学科的特点、顺应学科的发展趋势,也要充分利用好学科发展的成果,促进学科人才的培养。软件学科教育在教育理念、方法和模式等方面面临着一系列的挑战。
\begin{itemize}
\item[$\bullet$] \textbf{如何借助软件学科成果来加强软件学科教育?}
\end{itemize}
在几十年的发展过程中,软件学科领域积累了丰富、多样和海量的资源,包括代码、模型、文档、数据、开发知识、工具等等。尤其是近年来,随着开源软件、群智开发、软件开发知识分享等的快速发展,互联网上的开源社区汇聚了大量的软件资源和开发数据。这既给软件学科教育创造了条件、提供了机会和奠定了“物质”基础,同时也给软件学科教育提出了新的问题和挑战\cite{xinjun2019software}:如何借助这些软件资源来深入探究软件学科人才(如软件工程师)的成长轨迹和培养路径?如何有效利用这些软件资源来支持软件学科的教育、促进软件人才的培养?
\begin{itemize}
\item[$\bullet$] \textbf{如何顺应教育理念和方法的发展来改革软件学科教育的方式和手段?}
\end{itemize}
以互联网为基础的信息技术正改变甚至颠覆传统的教学理念和方法以MOOC、SPOC等为代表的大规模在线教育意味着互联网大众不仅是教育的受益者也是教育的参与者。软件学科教育朝着普及化和全民化的方向发展越来越多的大众涉足软件的使用、评价甚至开发因而成为软件学科教育的对象。这就需要为软件学科的大众化和普及化教育投入足够的教育资源、提供有效的方式和手段。以群智软件开发方法为代表的软件开发隐喻给软件学科教育提供了新的启示借助于互联网大众、利用群智力量来推进软件学科教育将是未来的一个重要趋势它不仅可促进软件学科教育的普及化而且还可通过大众的参与和协同共同分享学习的经验和资源。
\begin{itemize}
\item[$\bullet$] \textbf{如何为软件学科教育提供软件工具?}
\end{itemize}
软件可为特定领域的问题提供基于计算平台的解决方案。软件学科教育也是一个特殊的应用领域,它涉及与教育有关的诸多问题的解决,如教育资源的组织、分享和推荐,学习者的交互和协同,教育成效的考核和评估等等。因此,如何为软件学科教育提供支撑软件成为一个开放性的问题。
\subsection{软件伦理建设问题}
\label{subsection:10_1_5}
\begin{figure}[!b]
\centering
\includegraphics[width=.8\linewidth]{fig2-10/mainwork.png}
\caption{软件学科教育的主要研究内容}
\label{fig:fig2_10_1}
\end{figure}
在人机物融合时代,计算机软件对人类社会的方方面面产生了重大和深远的影响,也带来一些深层次、前所未有的风险和问题,如私密数据被窃取、软件留有后门、系统受到攻击等等。我们社会还没有建立起针对这些风险和问题的伦理准则和法律体系;软件研究者、开发者和使用者的行为缺乏约束,也没有有效和高效的监管手段,以确保其遵守和履行法律、道德和伦理规范。软件伦理教育没有得到国家、社会和行业、公众等的足够重视。缺乏软件专业背景的人员和大众很难从系统外部及时感知和发现潜在的软件伦理问题。自动化、智能化甚至量子化软件新技术的发展及应用将给人类社会带来更多的未知,评估它们对人类社会产生的长远影响需要对技术本身以及潜在的应用场景有深入的理解,以及足够的前瞻预测能力。
\section{主要研究内容}
针对上述重大挑战问题,软件学科教育需要开展以下诸多方面的研究工作,包括:以“知识普及 + 思维培养”为核心的普及教育(§\ref{subsection:10_2_1});以“复合型 + 创新型”为目的的跨学科教育(§\ref{subsection:10_2_2});以“知识体系+能力培养”为核心的专业教育(§\ref{subsection:10_2_3});以“探究规律 + 方法创新 ”为主体的教育理念和方法改革(§\ref{subsection:10_2_4});以“规范内涵 + 自动检测”为核心的软件伦理建设(§\ref{subsection:10_2_5})。
\subsection{以“知识普及 + 思维培养”为核心的普及教育}
\label{subsection:10_2_1}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科核心认知能力的成长模型和规律及其知识体系}
\end{itemize}
软件学科的认知能力以计算思维为核心,包含抽象思维、表达交流、逻辑分析和推理、计算抽象等,这些能力有其各自的特殊性,相互间存在依赖性。为此,需要深入研究以计算思维能力为核心的认知能力成长模型,探究不同受众认知能力的成长规律。与此同时,这些能力培养所需的知识潜藏在数学、语文、物理、化学、自然科学等课程的知识体系之中。软件学科认知能力的培养和上述知识之间存在横切关系,代表这些知识体系的课程很少与实际的软件及其开发相关联。因此,需要从横切和纵切二个方面,探究并建立起支撑软件学科核心认知能力培养的知识体系。
\begin{itemize}
\item[$\bullet$] \textbf{以计算思维为核心,融合创新思维的系统化认知能力培养方法}
\end{itemize}
人机物融合时代,软件使能的创新是软件学科辐射影响的主要目标,软件学科教育要在培养计算思维能力的同时,强化基于软件来解决问题的创新思维能力的培养。因此,我们需要研究如何将“计算思维”与“创新思维”二者相结合来深化软件学科的普及教育,探究“计算思维+创新思维”融合培养的学习路径,建立起支撑“计算思维 + 创新思维”培养的方法和手段。
\begin{itemize}
\item[$\bullet$] \textbf{适应不同认知水平且贯穿终生的软件学科普及教育方法}
\end{itemize}
普及教育受众的专业和知识背景具有多样化的特点,年龄层次和认知水平有较大的差异性。为此,需要借鉴生态化发展的思路,研究与教育对象的生理、心理和认知相适应的教育教学方法;研究同质生态教育方法和异质生态关联的迁移教育方法;研究如何借助于信息系统(尤其是软件系统)来支持和推广软件学科的普及教育。
\subsection{以“复合型 + 创新型”为目标的跨学科教育}
\label{subsection:10_2_2}
\begin{itemize}
\item[$\bullet$] \textbf{基于“专业学科知识 + 软件学科知识”的跨学科教育知识体系}
\end{itemize}
作为基础学科,软件学科教育需要面向其他的学科专业实现外延式的发展。针对不同专业自身的特点,结合软件学科知识在该专业人才培养中所起到的作用,采取“专业学科知识 + 软件学科知识”的方式来拓展专业知识体系,开展适用于自身专业需求的教学改革,使得相关专业人才具备软件学科的知识并能运用它们来解决特定专业问题。为此需要研究如何将软件学科的知识差异化地融入到相关专业的知识体系之中,实现与相关专业知识的有机融合,实现跨学科知识体系的交叉融合和互补,为跨界人才培养奠定基础。
\begin{itemize}
\item[$\bullet$] \textbf{具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法}
\end{itemize}
随着软件学科在其他专业领域的不断渗透,在这些学科专业人才培养方案的设计中,必须解决软件学科知识储备不足的问题。由于专业背景和专业思维的差异性,不同学科专业教育对软件学科知识结构的需求和相关课程衔接也不尽相同,因此跨界的软件学科人才培养需要多元化的知识和课程体系,为此需要探究如何实施“因材施教”的教学理念,分析不同专业对软件学科的“个性化”需求,构建专业软件化的新型课程体系,设计差异化的跨界软件学科人才培养方案,以实现软件学科和其他相关学科专业交叉融合,让非软件专业的学生也具备软件学科的思维能力,以满足社会对复合型、创新型的跨界软件学科人才的需求。
软件学科的跨界人才培养也是双向的。软件学科跨界进入其他学科领域的发展趋势愈发明显。在该形式的跨界教育中,教育对象已具备良好的计算思维能力,需要研究他们如何跳出软件学科知识领域的思维定势,强化跨界学科知识的学习,如何以全新的视角建立起软件学科与其他学科间的关联性,探索跨界学科计算的本质,培养适用于跨界专业的计算思维能力。
\subsection{以“知识体系 能力培养”为核心的专业教育}
\label{subsection:10_2_3}
\begin{itemize}
\item[$\bullet$] \textbf{面向多学科交叉融合的软件学科专业教育知识体系}
\end{itemize}
针对人机物融合时代的软件学科特点和人才培养要求,深入研究软件学科与哪些相关学科发生了交叉、交叉的边界和范围是什么;人们对软件的价值取向发生了什么样的变化,这些变化对学科的知识体系提出了什么样的要求;软件学科自身发展带来哪些方面的变化,这些变化处于知识体系的哪些层次和方面;需要研究如何根据产业界的成功实践以及学术界的研究成果来丰富和完善软件学科的知识体系。另外,还需要从软件学科专业人才能力培养的视点,探讨系统能力、解决复杂工程问题能力的培养对知识体系提出什么要的要求。在上述研究的基础上,建立起人机物融合时代面向多学科交叉融合的软件学科专业教育的知识体系,包括知识领域、知识单元、知识点等。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科专业教育的核心能力及其培养方法}
\end{itemize}
创新实践能力、系统能力、解决复杂工程问题能力等是人机物融合时代软件学科专业教育的核心能力。这三类能力的关注点和侧重点有所不同,培养方式和手段也不尽相同。实践无疑是专业教育环节中支撑能力培养的主要手段。为此需要在软件学科的范畴中深入研究创新实践能力、系统能力和解决复杂工程问题能力的内涵、构成和模型,分析不同能力之间的内在关联性,探究能力持续性培养和形成的特点和规律性,探究如何通过渐进式、综合性的实践来促进这三类能力的培养,以及针对能力培养的考评方式和方法。
\subsection{以“探寻规律 + 方法创新”为主体的教育理念和方法改革}
\label{subsection:10_2_4}
\begin{itemize}
\item[$\bullet$] \textbf{软件学科人才培养模型及规律}
\end{itemize}
软件学科教育对象的涉及面广,年龄层次和知识背景差异性大,培养的目的和要求多样化。软件学科教育牵涉多方面的专业和非专业知识,需要强化不同层次的能力和素质培养。这些知识、能力和素质之间存在内在的关联性。为此,软件学科教育需要针对不同的培养对象和目标,深入探究人才培养模型,包括知识体系、能力体系、工程素质等,分析它们在培养过程中所发挥的作用以及相互之间的继承性和依赖性。此外,软件学科人才的成长受多方面因素的影响,包括自身的素质和能力,外在的教育者及合作群体,学习的环境和激励机制,甚至学习过程中所依赖的软件平台(如开源社区)等。为此,需要研究软件学科人才的成长模型,依此来指导教育政策和机制的设计以及平台的建设。
\begin{itemize}
\item[$\bullet$] \textbf{软件学科资源在人才培养中的挖掘和应用 }
\end{itemize}
经过几十年的积累,尤其是近年来开源软件、群智软件开发等的发展,软件学科积累了大量、多样、极有价值的软件资源,如以开源社区为载体的开源代码、知识问答、软件开发历史数据等。软件学科教育需要深入挖掘软件学科资源,系统研究如何在课程教学、实践教学和人才培养过程中有效地应用这些资源,如何将抽象的知识与具体的资源相结合来促进知识的讲授、推动实践教学、培养能力和素养,如何建立起支撑软件学科人才培养的开源教育资源。
\begin{itemize}
\item[$\bullet$] \textbf{群体化学习}
\end{itemize}
借助互联网平台,通过吸引、汇聚和管理大规模的学习者,使得他们以竞争和合作等多种自主协同方式来开展学习将是未来重要学习方式,我们称之为群体化学习。软件学科教育需要充分借助于互联网大众的智慧和理念,施行群体化学习的思想,以促进软件学科人才的大规模、高质量、普及化的培养。为此,基于群智理论和方法,借助于互联网上的大数据分析,研究支持群体化学习的组织结构和协同模型,分析和设计群体化学习的激励机制,探究不同组织结构、协同模型和激励机制对群体化学习成效、质量和受益面等产生的影响及涌现结果,开展基于群体化学习的教育和教学方法的改革。
\begin{itemize}
\item[$\bullet$] \textbf{大规模在线开放实践MOOP}
\end{itemize}
能力和素质培养是软件学科教育的一项主要任务。针对软件学科的发展特点需要研究软件学科人才的能力和素质模型建立不同能力和素质之间的关系分析普及教育、专业教育、跨学科教育等分别需要达到什么样的水平和层次探究软件学科内涵的拓展如何影响能力和素质。实践是支撑能力和素质培养的主要教学途径。依托大规模人群的在线开放实践称为MOOP将成为能力和素质培养的重要趋势也是对MOOC在该方面存在欠缺的有效弥补。为此需要研究支撑能力和素质培养的实践体系建设探究如何将诸如游戏化机制等引入到MOOP之中以激励大众参与和贡献分析针对MOOP的量化表示与评测方法建立起针对能力和素质培养的评价体系与指标。
\begin{itemize}
\item[$\bullet$] \textbf{支撑软件学科教育的软件系统}
\end{itemize}
针对软件学科教育的特殊需求,借助于软件学科资源大数据,交叉诸如人工智能、大数据分析、移动计算等技术,研究支撑软件学科教育的关键软件技术,包括开源社区中学习资源(如开源软件和软件开发知识)的同步和分享技术,针对学习者个性化特点及需求的教育资源推荐技术,实现教育软件与开源社区间互操作和交互技术,基于教育大数据来构建学习者个性化学习路径的方法,对学习者的学习情况和成长进行跟踪和考评的技术等等,并在此基础上研发软件学科教育软件。
\subsection{以“规范内涵 + 自动检测”为核心的软件伦理建设}
\label{subsection:10_2_5}
\begin{itemize}
\item[$\bullet$] \textbf{规范化和可检验的软件伦理内涵}
\end{itemize}
国家、软件行业主管部门应与行业主体、学术团体、社会公众等众多利益相关方通力合作,通过多学科交叉的方式,研究软件伦理的规范化内涵;综合人员、过程、行为、制品、法规等多个方面,研究并制定软件伦理的可解释、可检验的条文和准则,制定相关的法律法规和行业标准。
\begin{itemize}
\item[$\bullet$] \textbf{软件伦理的自动化检测技术和监督方法}
\end{itemize}
研究针对软件开发者行为和制品的软件伦理合规检测技术,尤其是自动化检测技术。例如,面向软件版权保护的代码溯源技术、软件许可证违规使用检测技术,软件及软件使用者恶意和危险行为检测技术等;研究并制定软件伦理的合规监督方法,如过程、规范、标准等,形成覆盖全面、导向明确、规范有序、协调一致的检测和监督技术体系,以快速、高效和准确地发现和修正违背伦理的问题。
\section{本章小结}
在人机物融合时代,随着软件辐射面和影响面的扩大,软件学科的发展和进步,软件学科教育的内涵和外延也在发生改变,它涉及普及教育、专业教育、跨专业教育、教育理念与方法改革等多个方面,面临着一系列重大的问题的挑战,包括:如何针对具有不同认知水平的受众对象开展普及教育?如何根据人机物融合时代特点来深化专业教育?如何加强软件学科与其他学科的融合来实现跨专业的教育?以及如何改革软件学科的教育理念和方法来满足不断增长的人才培养需求、如何应对软件伦理问题等等。为了迎接上述挑战,软件学科教育需开展一系列研究,包括:以“知识普及 + 思维培养”为核心的普及教育、以“复合型 + 创新型”为目标的跨学科教育、以“知识体系+能力培养”为核心的专业教育、以“探究规律 + 方法创新”为主体的教育理念和方法改革、以“规范内涵 + 自动检测”为核心的软件伦理建设。
%\bibliographystyle{unsrt}
%\bibliography{reflib}