update figures in Ch2-8 and Ch2-10 and small modification to Ch1-4 and Ch2-8-10
This commit is contained in:
parent
9c8ad4d7af
commit
42b80a707e
|
@ -416,7 +416,7 @@
|
|||
\begin{enumerate}
|
||||
\item 大力加强面向泛在计算的程序设计语言以及支撑环境、软件开发方法的基础性研究,以领域特定的程序设计语言的设计原理与高效实现为核心,以程序设计语言的演化和互操作性机理为重点,通过程序设计语言的基础研究,加大程序设计语言的支撑环境和工具链的开发,从而有效而深入地解决计算的泛在和多样性,软件的复杂性和软件的安全性等带来的新时代的挑战。
|
||||
%
|
||||
\item 推进对以“连接协调”为核心的新型架构下的新一代操作系统模型和机理的研究。研究如何为各类新型异构资源建立适当抽象,并按照应用需求进行灵活调度。研究操作系统和运行平台如何充分发挥其“元层”支撑作用,有效驱动和实现“信息-物理-社会”空间的协同持续演化。
|
||||
\item 推进对以“连接协调”为核心的新型软件体系结构下的新一代操作系统模型和机理的研究。研究如何为各类新型异构资源建立适当抽象,并按照应用需求进行灵活调度。研究操作系统和运行平台如何充分发挥其“元层”支撑作用,有效驱动和实现“信息-物理-社会”空间的协同持续演化。
|
||||
%
|
||||
\item 推进以人为中心的软件价值的研究和规范。面向泛在计算场景下的软件价值,研究各种社会因素带来的突破使用质量的新的软件价值,并建立相关约束和规范,包括提示用户可能存在的风险,制定智能软件的质量标准、检测方法和实施办法等。
|
||||
\item 推进对大规模代码和项目的供应链和生态行为的研究和分析。研究个体如何认知复杂项目和生态,群体如何高效高质地协作完成各类软件活动相关的任务,涵盖公司、个体开发者及用户在内的广泛社会力量如何围绕软件构建可持续性演化的生态系统等。%并进一步推进国内软件产业生态系统的建设。
|
||||
|
|
|
@ -144,7 +144,7 @@
|
|||
|
||||
虽然“中间件”这一名词在60年代中后期即已出现,但早期计算机厂商通常提供从操作系统到应用软件的一揽子解决方案,使得二者之间的鸿沟并不凸显。20世纪80年代初,网络技术走向成熟,如何高效构造跨越多个计算结点的分布式应用成为焦点。在传统操作系统之上,开发人员只能通过操作系统的Socket API原生接口,以完全手工方式实现分布式应用中的网络消息传递,其过程繁琐、复杂且低效。同时,除了通信支持外,相对于单机软件,分布式系统还有很多特有的理论和技术问题(如并发支持、事务管理、访问控制等),而传统操作系统并未提供相应的支撑能力。
|
||||
|
||||
为了应对上述挑战,人们早期围绕两种思路展开了探索。一是以Amobea\cite{Tanenbaum:1990:EAD:96267.96281}等分布式操作系统为代表的方法,核心是将单机操作系统的概念放大到网络环境,实现对网络软硬件资源的严格管控,例如文献\cite{Tanenbaum:1985:DOS:6041.6074}指出“分布式操作系统对用户而言与单机操作系统无二,只是运行在多个独立处理器上。它的核心概念是透明性”。但是,网络资源具有分布自治、高度异构、持续演化等特点,其软件很难通过严格的以自顶向下的方法精确设计出来,而更多的是通过互联互通方式成长式构造出来的。后一种思路在1976年的ARPANET RFC707中即以“允许调用远程进程所实现的任意命令或函数”的“请求-响应”协议形式出现\footnote{IETF, "RFC 707 - High-level framework for network-based resource sharing," 1977}。Birrel和Nelson等于1984年实现了首个远程过程调用(Remote Procedure Call,RPC)\index{远程过程调用}框架\cite{Birrell:1984:IRP:2080.357392},标志着现代意义中间件的诞生。
|
||||
为了应对上述挑战,人们早期围绕两种思路展开了探索。一是以Amobea\cite{Tanenbaum:1990:EAD:96267.96281}等分布式操作系统为代表的方法,核心是将单机操作系统的概念放大到网络环境,实现对网络软硬件资源的严格管控,例如文献\cite{Tanenbaum:1985:DOS:6041.6074}指出“分布式操作系统对用户而言与单机操作系统无二,只是运行在多个独立处理器上。它的核心概念是透明性”。但是,网络资源具有分布自治、高度异构、持续演化等特点,其软件很难通过严格的以自顶向下的方法精确设计出来,而更多的是通过互联互通方式成长式构造出来的。后一种思路在1976年的ARPANET RFC707中即以“允许调用远程进程所实现的任意命令或函数”的“请求-响应”协议形式出现\footnote{IETF, ``RFC 707 - High-level framework for network-based resource sharing,'' 1977}。Birrel和Nelson等于1984年实现了首个远程过程调用(Remote Procedure Call,RPC)\index{远程过程调用}框架\cite{Birrell:1984:IRP:2080.357392},标志着现代意义中间件的诞生。
|
||||
|
||||
\subsection{企业计算时代的中间件(80年代-21世纪初)}
|
||||
如前所述,最早出现的中间件是面向过程中间件\index{面向过程中间件}。早期的Sun RPC、开源软件基金会的DCE(Distrbuted Computing Environment)等都是具有代表性的此类中间件,聚焦于尽量实现“调用远程过程像调用本地过程一样简单”。相对于过程,“对象”提供了更贴近现实世界的抽象。面向对象中间件\index{面向对象中间件}出现于上个世纪80年代初,例如华盛顿大学1980年启动的Eden项目\cite{Black:1985:SDA:323627.323646}即以在网络计算环境中应用面向对象技术为目标,提出了分布式Ejects(Eden objects)的概念、编程模型和相应支撑平台。OMG于1990年发布CORBA 1.0是具有里程碑意义的面向对象中间件标准,直接推动了面向对象中间件的成熟和高速发展,对后续SUN公司的Java/RMI、微软公司的DCOM等技术体系有着直接和深远的影响。
|
||||
|
|
|
@ -221,10 +221,10 @@
|
|||
由于需求工程的出发点是观察现实世界并进行问题识别,根据现实世界问题识别的不同角度,出现了不同的需求工程方法,主要的需求工程方法包括:面向目标的方法~\cite{van2009requirements}、面向主体和意图的方法 ~\cite{yu20101}、面向情景的方法~\cite{sutcliffe2003scenario}、问题框架方法~\cite{jackson2001problem}等。这些方法的特点和需求工程技术见表~\ref{table:chapter4-1}所列。
|
||||
\begin{table}
|
||||
\centering
|
||||
\footnotesize
|
||||
\scriptsize
|
||||
\caption{代表性需求工程方法}
|
||||
\label{table:chapter4-1}
|
||||
\begin{tabular}{|p{0.1\textwidth}<{\centering}|p{0.22\textwidth}<{\centering}|p{0.28\textwidth}<{\centering}|p{0.28\textwidth}<{\centering}|}%
|
||||
\begin{tabular}{|p{0.07\textwidth}<{\centering}|p{0.2\textwidth}<{\centering}|p{0.3\textwidth}<{\centering}|p{0.3\textwidth}<{\centering}|}%
|
||||
\hline
|
||||
方法& 问题视角& 需求建模原则& 软件需求获取手段\\
|
||||
\hline
|
||||
|
|
|
@ -1,110 +1,110 @@
|
|||
% !TEX root = main.tex
|
||||
\section{概述}
|
||||
软件产业是战略性新型产业的重要组成部分,在推动传统产业升级转型、促进经济结构调整和发展方式转变、拉动经济增长和扩大就业、变革人类生产生活方式等方面发挥着日益重要的作用。
|
||||
|
||||
随着软件从依附于计算机硬件的程序逐步发展为独立的产品,并且门类逐渐丰富,与软件产品、服务相关的组织和团体在协作和竞争中逐渐形成产业链、产业圈,其重要性已经国民经济中显现。2018年我国软件和信息技术服务企业数超过3.7万家,从业人数达到643万人,软件业务规模(包括软件产品、信息技术服务、嵌入式系统软件)达到6.3万亿元\cite{baobiao2019}。据预测,2019年全球信息技术产业规模将达5万亿美元,其中软件和信息技术服务业占比将达32\%,物联网软硬件、云计算、大数据等新兴领域将占17\%\cite{ITIndustryOutlook2019}。
|
||||
|
||||
软件学科与软件产业相互促进、共生共荣。软件产业的发展推动着软件学科的进步,软件产业的繁荣与分化对软件学科的演进与细化提出了更高的要求。同时,软件学科服务于软件产业,支撑软件产业的发展和壮大。软件学科从理论和实践上对软件产业的繁荣发挥着越来越重要的作用。
|
||||
|
||||
本章将概述软件产业概念以及软件产业的生态构成,回顾软件产业的形成、发展的历程,接着从软件技术与软件产业的互动的视角阐述软件产业生态不同阶段的特点和不同的侧面,分析软件产业随着应用场景和应用领域的细分所形成的不同产业生态格局,揭示软件学科在软件产业发展中的推动作用和软件产业对软件学科演进的需求牵引。通过软件产业生态不同阶段和侧面的讨论,揭示软件产业的发展趋势,以及软件学科对支撑软件产业和国民经济发展的重要作用,力图为软件学科更好地服务于产业和经济发展需求提供有用的信息。
|
||||
|
||||
\section{软件产业和软件产业生态}
|
||||
软件产业是为有效地利用计算机资源而从事计算机程序编制、信息系统开发和集成及从事相关服务的产业\cite{research1996}。软件产业\index{软件产业}通常分为软件产品业和软件服务业两大部分。因此也有学者将软件产业定义为“与软件产品和软件服务相关的一切经济活动与关系的总称”\cite{furonghui2017}。
|
||||
|
||||
软件产业这一概念的外延非常广泛。在工信部中国电子信息产业发展研究院编著的中国软件产业发展蓝皮书系列中,软件产业细分为基础软件产业、工业软件产业、信息技术服务产业、嵌入式软件产业、云计算产业、大数据产业、信息安全产业等。中国软件行业协会的软件产业研究报告中,将软件产业分为软件产品和软件服务,而软件产品进一步分为系统软件、支撑软件和应用软件,软件服务则涵盖了与软件相关的服务内容。国际数据公司(IDC)将软件产业细分为应用解决方案(Application Solutions)、应用开发及部署软件(Application Development and Deployment Software)和系统基础软件(System Infrastructure Software)。从更广泛的意义上来说,无处不在的软件产品和服务越来越深刻地影响着众多传统产业和新兴产业,并随着技术的发展和应用领域的扩展不断细化社会分工,软件在其他产业中的重要性也日益显现,并使得软件产业与其他产业呈现出融合的态势。
|
||||
|
||||
软件产业涵盖了软件企业、软件产品和服务、软件从业人员(特别是开发者)众多要素,他们之间相互影响、相互依存、相互竞争。在软件产业产生与发展过程中,软件企业及其所生产的产品、所提供的服务之间的供需关系形成了软件产业链,相关或者相似关系形成了软件产业的若干子领域,或产业圈。这些不同的产业链、产业圈以及相关的参与者之间或互补、或竞争,从而构建起了错综复杂的产业生态。
|
||||
|
||||
软件产业生态\index{软件产业生}是软件企业、软件从业人员以及各层次、多种类的软件产品与服务的共生体。软件产业生态,从软件产品和服务的相互依赖性来看,从上游到下游,基本可以分析为系统软件、支撑软件、应用软件等层次。应用软件中,又可进一步细分出工业软件(包括企业管理信息系统等软件)、个人软件(以个人使用为目的的软件)。软件产业链上不同种类的软件及其开发者、开发企业形成了相互关联的多个子产业圈。下游的软件子产业很大程度上受到上游软件子产业的制约,而另一方面又在一定程度上促进上游软件子产业的发展。例如,处于软件产业链上游的操作系统等系统软件是下游应用软件运行的基础,因此围绕操作系统等系统软件和各个业务领域的需求所研发的一系列应用软件,与所对应的操作系统形成相互依赖、相互促进、相互制约的产业生态圈;而随着应用软件的普及使用,基于特定操作系统的应用软件也可能由用户市场驱动发展出支持其他操作系统的版本,从而扩展原有的生态范围。由此可见,各类应用软件、操作系统等软件以及相应的开发商、用户共同构成了复杂且演化的生态系统。软件产业生态的主要参与方及其相互关系如图\ref{fig:fig1-5-1}所示。
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{fig1-5/fig1.png}
|
||||
\caption{软件产业构成}\label{fig:fig1-5-1}
|
||||
\end{figure}
|
||||
|
||||
\section{软件产业发展历程概览}
|
||||
软件产业脱胎于计算机产业的发展和进步,与软件技术相互影响、相互促进。软件产业的形成与发展遵循产业分化和进步的一般规律。图\ref{fig:fig1-5-2}展示了软件产业发展历程的概貌。
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\includegraphics[scale=0.8]{fig1-5/fig2.png}
|
||||
\caption{软件产业发展历史概览}\label{fig:fig1-5-2}
|
||||
\end{figure}
|
||||
|
||||
早期的计算机软件往往附属于计算机硬件。直到20世纪50年代,软件还主要以项目的形式进行定制化开发。这些软件开发项目往往由政府主导,并服务于国防等关键部门,并且只有少量大型服务企业研制。当时,计算机行业的大多数高管不相信软件产品会有重要的市场\cite{DBLP:journals/annals/Johnson98}。
|
||||
|
||||
20世纪60年代,随着计算机硬件能力的提升,软件的规模日益庞大,开发过程日益复杂,出现了软件危机。软件的重要性和独立性也开始逐渐显现。例如,1961年开始研发的OS/360操作系统软件耗费了超过5000人年的工作量,软件成本甚至超过了IBM System/360大型机硬件。60年代中期,出现了一些具有特定用途、可以被售卖给不止一个客户的程序,具有一些产品化的特性,但销售量小,仅能看作是软件产业的萌芽。而与此同时,软件开发和管理中的大量现实问题促使业界思考软件开发的独特之处。1968年软件工程概念提出,标志着对软件及其开发方法的研究进入了一个新的阶段,也预示着软件开发向工程化发展。1969年,计算机企业巨头IBM宣布了软件可作为独立于硬件单独售卖的商品而存在\cite{DBLP:journals/annals/Johnson98}。在此期间,出现了强大的企业解决方案提供商,例如专业的数据库公司,研发数据库等通用型软件以弥补计算机制造商自带软件的不足,但整体规模仍然不大。这种状态几乎持续到20世纪70年代末,绝大多数软件应用程序仍是在主机或微机上按需定制的。在这一阶段,软件厂商已经开始发展起来,并且开始认识到大规模复杂软件开发中的一些问题,推动了软件工程理论的发展。
|
||||
|
||||
20世纪80年代,随着微型计算机的大规模普及,大量软件得到了广泛的使用,软件企业以此为契机得以迅速发展,开启了以软件为销售对象的商业模式\cite{furonghui2017},也由此掀起了以数字化为主要特征的第一次信息化浪潮\cite{2018建设数字中国}。在这时期,软件真正开始形成一个独立的产业,不仅有大量的软件开发企业和开发者,还出现了更加广大的软件产品市场和用户,并且越来越独立于特定的计算机硬件,逐步形成独立的产业。
|
||||
|
||||
从20世纪90年代中期开始,以美国提出“信息高速公路”建设计划为重要标志,互联网逐渐实现了大规模商用,迎来了以网络化为主要特征的第二次信息化浪潮\cite{2018建设数字中国}。软件从以单机应用为主逐渐呈现出网络化交互特征。大量带有社会化特征的软件开始蓬勃发展,形成了以互联网为基础、以服务化为特征的产业生态。
|
||||
|
||||
当前,随着以智能化为主要特征第三次信息化浪潮\cite{2018建设数字中国}的到来,软件产业正在发生新的变化。新型的融合化应用场景越来越丰富,基于云计算、大数据的智能化应用软件和企业蓬勃发展,基于软件的产品和服务日益多样化精细化,逐渐向传统行业和新兴行业渗透,呈现出“软件定义一切”的融合化态势。
|
||||
在后续的论述中,我们将以软件产业与软件技术互动为主线,从不同阶段和视角回顾软件产业及其生态的发展,探讨软件产业对软件学科的需求以及软件学科对软件产业的支撑。
|
||||
|
||||
\section{不同阶段和视角的软件产业生态}
|
||||
\subsection{软件产业与软件技术的互动}
|
||||
由软件产业发展历程可以看到,软件产业的发展与软件技术的进步是相互影响、相互促进的。
|
||||
|
||||
当人们意识到软件可以是独立于硬件存在的单独产品时,针对不同目的、具有不同功能特点的软件也逐渐发展出专门化细分的软件技术领域,相应的软件产品也逐渐形成独立的门类。逐渐细化的各类软件产品,极大丰富了软件产业的内容结构。
|
||||
|
||||
随着互联网软硬件技术的发展和普及,软件产品从拷贝安装的应用模式,逐渐转向通过网络按需获得的服务模式。软件的应用场景和用户群体的多样化趋势,扩大了软件市场,催生了一批以在线软件服务为主要业务的软件企业。这些企业和各类新型应用需求,反过来又促进了服务化软件技术的创新和发展,使得软件产业显示出服务化特征。
|
||||
|
||||
随着软件在各个不同行业中的广泛使用,各类企业与软件相关的投入与产出都普遍增加。无处不在的软件在各个业务领域中的重要性日益显示,并正在迅速融入各个领域的核心业务中,推动着各个领域的技术创新和发展。
|
||||
|
||||
在软件产业和软件技术的发展过程中,软件的复杂性和软件开发的困难也越来越被人们所重视。在不同的产业阶段,如何高效地开发高质量软件成为永恒的话题,不断推动着软件技术的进步和软件产业的发展。从软件开发的角度而言,软件开发方法、工具和环境经历着不同的变化。软件开发者,以及以软件开发工具和环境为主要业务的软件企业,一起构建了独特的产业生态,与软件技术的共同发展。
|
||||
|
||||
可见,软件产业从早期由产品化构建起产业生态,到后期逐渐发展为以服务化为特征的产业生态,以及近年来以融合化为特征的产业生态,软件技术的发展和变革无所不在。由软件开发方法、环境和工具推动的软件开发产业生态是软件技术发展的重要推动要素。本节回顾具体的软件产业发展历史,以及以开发者视角所见的软件产业生态,分析软件产业与软件技术的互动与演变,并揭示软件产业与传统产业的融合化发展新趋势。
|
||||
\subsection{以产品化为特征的软件产业生态}
|
||||
正如传统工业部门在生产力发展过程中不断分化一样,软件也经历了产品门类不断细分的过程。软件从硬件中剥离出来之初,并没有具体的门类细分,从硬件资源管理到具体应用功能都包括在一个混沌的整体中。随着软件需求的不断增长,软件应用的数量不断增多,人们发现有一些共性功能是几乎所有软件的运行都必须具备的,因此就将这些共性分离出来,包装成早期的操作系统,而功能各异的应用功能则在操作系统之上开发运行,形成各类应用软件。后来,人们发现一些应用软件中仍然存在不少逻辑上高于操作系统、同时又存在于多种应用中的共性部分。这些共性部分又进一步被分离出来,有些被单独包装成产品,产生了数据库软件以及其他用于支撑软件运行交互的所谓中间件。而上层的应用软件也在实际应用中针对不同的业务需求不断细分,形成了各类不同的应用软件,孕育了各自的软件开发企业和应用市场。可见,随着软件技术的发展,软件产品经历了共性沉淀、结构细分的过程,而此过程中,每一个细分领域出现了专门的软件技术领域和产品,而产业结构也逐渐丰富。
|
||||
|
||||
本小节以操作系统产品、办公软件产品、中间件产品、工业软件产品为典型代表,概述以产品化为特征的软件产业生态产生与发展过程。
|
||||
|
||||
操作系统是构建现代软件产业生态的重要基石。20世纪60年代,操作系统软件开始逐渐从计算机硬件中独立出来,出现了产品化萌芽。例如,OS/360操作系统能运行在一系列用途与价位不同的IBM System/360大型机上,具有了现代操作系统的独立性和产品化的特征,但仍然依附于特定厂商,也并未形成产业。1969年,贝尔实验室开发开放源码的Unix操作系统,得到了广泛的应用。之后基于Unix的源代码,大量类Unix系统被研发出来,可用于多种计算机硬件。市场上形成了多种独立的操作系统软件产品。例如,加州大学伯克利分校研发的BSD,以及此后的FreeBSD、NetBSD、OpenBSD等衍生产品。20世纪70年代后期,IBM公司推出的个人电脑(PC)催生了面向个人的软件使用场景,为软件产业的发展提供了广阔的空间;80年代,微软通过与IBM公司的合作,成功研制了面向个人计算机的桌面操作系统MS-DOS,成为当时在IBM PC上最常用的操作系统,也带来了大量的软件应用场景,推动了第一波信息化浪潮,促进软件产业的发展和壮大。同期,MacOS在苹果公司Macintosh计算机上也得到了广泛的应用。1983年,嵌入式实时操作系统(RTOS)VxWorks由美国WindRiver公司研发,具有高性能的内核以及友好的用户开发环境,以其良好的可靠性和卓越的实时性,至今仍被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。20世纪90年代,微软公司自行研发新操作系统Windows,通过图形化界面来替换其原有的字符界面为主的DOS系列操作系统。同期,芬兰裔美国软件工程师Linus Torvalds基于Unix研发了Linux操作系统,由于其轻量级微内核的设计和良好的可移植性,目前已经发展为国际主流操作系统之一,并形成了多种变体版本。
|
||||
|
||||
当前,操作系统软件产业在不同操作系统领域呈现各自的发展特点。在服务器操作系统领域,Linux、Unix和Windows是最常见的操作系统软件产品,形成能力互补的同时也存在多个角度的竞争。在桌面操作系统领域,Windows占据最大的市场份额,但是近年来Mac OS和Linux的份额在不断增加,竞争态势显著。在移动智能终端操作系统领域,Android被华为、三星等众多手机和其他终端厂商使用,而iOS则在苹果公司经营下形成了相对封闭的发展模式,两者形成了各自的产品生态特色。在嵌入式操作系统领域,VxWorks、Windows Embedded、嵌入式Linux等系统软件产品广泛用于工业控制、终端设备等领域;我国国产工控实时操作系统SylixOS也在在国内关键系统市场逐步扩展份额,开始形成对VxWorks等国际产品的替代。云操作系统、智能穿戴操作系统等产品的软件产业规模总体较小,仍有很大的发展空间。各类操作系统具有不同的使用平台和应用场景,在某一细分的领域,往往存在几个产品共同形成市场竞争,同时也存在市场互补。产品的多样性以及标准化等特性为操作系统产业乃至整个软件产业的繁荣提供了重要的保障,对其他各个子产业建立了重要的平台支撑。操作系统与计算机硬件密切相关,在很长一段时间,操作系统软件与硬件往往共同销售并且预装在硬件上。随着操作系统产品的逐步成熟,以销售许可的方式对产品进行售卖逐渐形成另一种典型的软件产品商业模式。
|
||||
|
||||
办公软件是一种重要的服务于日常信息处理的共性应用软件产品\footnote{在我国,办公软件也被归入基础软件。}。由于办公软件产品的普及,各类信息的记录与处理有了便捷高效的平台。其中,最为知名的办公软件包括文字处理、电子表格、演示等。早期的办公软件国外有Word Prefect、Lotus123等,而国内则有WPS等,都具有广泛的部署和深刻的商业影响。随着信息处理的需求越来越大,人们对办公软件的易用性要求也日益提升,推动者各厂商对软件产品的设计不断改进。在操作系统进入图形化“视窗”时代后,相应的办公软件也开启了“所见即所得”(WYSIWYG)的新阶段,大大提升用户体验,并反过来对操作系统的效率和稳定性提出新的要求。办公软件与操作系统一样,也在产品逐渐成熟和商业模式逐步清晰的背景下,进入按许可进行销售的软件产品商业模式。
|
||||
|
||||
|
||||
中间件是一种重要的基础软件。中间件与操作系统、数据库系统并称为三大类系统软件,但相比于操作系统和数据库,中间件产品出现得更晚。一般认为,中间件是网络环境下处于操作系统等系统软件和应用软件之间的一种起连接作用的分布式软件。1968年出现的将应用软件与系统服务分离的IBM CICS交易事务控制系统可以看作是中间件产品的萌芽。它在面向最终用户的应用功能与面向机器的系统服务之间提供了中间层的封装,使得各个层次的关注点更加集中。到20世纪90年代,互联网的出现使网络应用和分布式应用登上历史舞台,而其中涉及通信、协同等源于异构性的大量共性问题,复杂性越来越高,需要专门的软件产品来处理。一般认为ATT公司贝尔实验室于1990年推出的用于解决分布式交易事务控制的Tuxedo系统是中间件产品诞生的标志,是一种交易中间件,也是最早的中间件。此后,消息中间件、应用服务器中间件、应用集成中间件(企业服务总线ESB等)、业务架构中间件(业务流程管理BPM等)等各类中间件产品迅速发展起来。典型的中间件厂商包括国外企业IBM、Oracle、BEA等,开源产品组织Apache、JBoss、JOnAs等,以及国内企业金蝶、东方通、中创、普元等,形成了相互竞争、相互补充的繁荣的生态格局。可见,中间件产品的发展过程也是软件技术相关领域日益复杂和细分的结果。
|
||||
|
||||
工业软件是一类典型的面向领域的应用软件,是支撑传统工业企业信息化、提升传统工业企业管理水平的重要软件产品簇。工业软件按涉及的工业业务领域可分为研发设计类软件和业务运营管理类软件。早在20世纪60年代,美国的大型企业就会采购昂贵的计算机设备进行商业信息的处理。但是由于当时计算机硬件和软件之间耦合紧密,软件往往是作为计算机售后的一种服务提供,因此无法形成独立的产业生态圈。60年代末70年代初,随着系统软件的出现,通用计算机系统开始普及,由此面向工业生产及其信息化的独立软件开发商开始逐渐出现。直至80年代,随着更便宜的个人电脑和通用操作系统的普及,企业信息化的门槛得以大幅降低,软件技术开始惠及更多的行业。随着工业生产和研发复杂性提升,研发领域如计算机辅助设计(CAD)、辅助分析(CAE)、辅助制造(CAM)、辅助工艺规划(CAPP)、产品数据管理(PDM)、产品全生命周期管理(PLM)等涌现了大量的商业化的软件产品,为相关业务领域带来了显著的生产力优势,很快在各个行业得到普及。在业务运营和管理领域,早期的软件更多集中于管理信息系统(MIS),重点在于以数字化的形式来记录企业管理过程中产生的原始数据以及简单的业务流程。为了更好利用以手工为主的企业既有流程,企业资源规划(ERP)等软件产品诞生,逐渐形成了以计算机软件为中心的企业级管理系统。它不仅仅是对既有业务流程的自动化,而是包含了诸如财务预测、生产能力、资源调度等更具有价值的软件功能,同时对企业经营管理方式产生了深刻的影响。大数据和智能化时代的到来,正在将业务运营管理方面的软件产业水平提升到一个新的高度。
|
||||
|
||||
由此可见,以产品化为特征的软件产业代表着早期桌面化的市场需求,软件企业通过软件销售的形式向各类用户提供商用的软件产品。由于软件产品复制的边际成本非常低以至于可被忽略这一完全不同于传统产业的特性,知识产权保护成为软件产业中的重要企业战略决策\cite{RePEc:unm:umamer:1995006},并且持续促进着软件技术的发展。同时,大量用户的特殊需求要求软件企业提供大量的定制功能,因此咨询与实施成为软件产品部署的重要方式,同时也促进企业采用支持可变性建模的开发方法开发面向特定领域的系列软件产品,使得产品化的软件生态更加丰富。随着云计算、移动计算等技术的发展和普及,一些以销售软件产品为主的软件企业开始向云化、服务化转型。软件产业逐步开启以服务化为特征的新阶段。
|
||||
|
||||
\subsection{以服务化为特征的软件产业生态}
|
||||
服务化是互联网技术的产物。互联网软硬件的发展,使得依赖于拷贝安装的软件产品转变为通过网络、按需索取成为可能。软件功能进一步细分为前端以人机交互为主和后端以业务逻辑处理为主两大部分。随着大量的业务逻辑迁移到后端,对后端的计算、存储能力提出了更高的技术要求,逐步发展出了云计算技术与平台;而互联网的广泛可达能力,带来了巨量的普通用户,形成了丰富的互联网应用。
|
||||
|
||||
在以服务化为特征的软件产业生态中,软件的核心价值主要以网络服务的形式呈现。作为产业生态的主体,软件企业大量采用云计算技术提升用户服务能力;同时,软件的用户能够在各类终端上通过网络按需访问所需要的服务。由于软件的服务化、远程化、轻量化带来了具有良好的伸缩性和互操作性,因此,服务化的软件极大地推动了软件产业生态的繁荣。从企业而言,软件的部署和运维得到良好的控制;从用户而言,轻量化的运行提升了使用体验。受限于篇幅,本节以社交类软件和云计算服务为例介绍具有典型服务特征的新型软件产业生态。
|
||||
|
||||
社交类软件体现了人和人之间的连接。这一天然的人际链接的需求,在互联网普及之前,只能通过传统的社交方式来完成。互联网的发展使得社交活动发展到一个完全不同的高度,这也催生了一大批以社交为主营业务的软件公司。社交类软件最早以即时消息服务(IM)的形式出现,例如国外的ICQ、AIM、Skype等,国内的QQ(早期称为OICQ)。由于和社交关系深度绑定,社交软件的盈利模式非常多样,同时这类软件也具有极强的粘性,一旦占据优势地位就非常难于被其他软件所替代。
|
||||
|
||||
互联网模式的变革也为新的社交软件形态的产生带来了新的机会,例如Web2.0时代的到来,在线交流变得更加便捷,也催生了诸如Facebook、Twitter、国内的微博等社交类网站的兴起。它们不再局限于通讯录中的固定的联系人,而是使得互不相识的人际互动变得更加频繁,甚至还出现了以陌生人社交为主要业务软件产品,以及面向职业人士的LinkedIn等软件产品。移动互联网的兴起是另一次变革的浪潮,由于智能手机的用户普及率高且便于随身携带等特点,通过智能手机随时在线使用社交媒体软件成为可能。这催生了新一代的社交类产品如微信、Telegram、Line、WhatsApp等的繁荣。围绕这些应用软件,形成了大量外围软件服务,涉及电子商务、在线支付、招聘择业、娱乐游戏、社会信息服务等众多领域,几乎涉及了社会生活的方方面面。可以说,在新型软件技术的支撑下,相关软件产业生态已经影响到当今社会的主要生活方式。
|
||||
|
||||
云计算服务是新型服务化软件背后的重要技术支撑,提供了大规模并行化定制化的服务能力。其中大规模和并行化处理能力往往来自以虚拟化技术(Virtualization)为基础的云计算服务,而定制化能力则更多依赖于21世纪初发展起来的平台即服务(PaaS概念)。就虚拟化软件而言,其本身以产品化形式出现,但对外提供服务化能力,将计算机的各种实体资源(如CPU、内存、磁盘空间、网络适配器等)进行抽象、转换后,以虚拟设备的方式呈现出来并可供分割、组合为一个或多个计算机环境。自20世纪60年代以来,虚拟化能力随着桌面计算和服务器架构的日益发展不断发展完善,面向不同的底层硬件资源和上层应用需求出现了以KVM、VirtualBox、VMware ESX、Xen等多种虚拟化软件产品,进而出现了用于虚拟环境管理的OpenStack、Amazon EC2等产品。基于虚拟化技术,许多厂商如Amazon、微软、Google、百度、阿里巴巴、华为等,提供了不同层次的在线服务,包括基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)。基础设施即服务提供在线计算资源和基础设施,比如Amazon、华为、阿里等厂商的服务器租赁等服务。平台即服务提供在线的应用开发和发布解决方案,提升应用开发和运行的灵活性,比如Google App Engine、微软Azure、Force.com等。软件即服务是在线化的软件形态,面向最终软件用户,以在线服务的形式提供面向领域的软件功能,比如SalesForce的CRM系统、Cisco的WebEx等。不同厂商在推出相应的云计算服务同时,往往会提供IaaS、PaaS、SaaS中的一层或多层服务,这也建立了围绕不同软件厂商的产业生态。而不同软件厂商之间的软件产品间形成竞争和补充关系,进而也形成了更加复杂的层次化软件产业生态。
|
||||
|
||||
在软件服务化的趋势下,不论是传统行业还是新兴行业,软件的随处可用、随需而变、按需提供的特性,大大扩张了软件产业的范围,使得软件与人们的生产、生活更加密切接触,成为社会经济生活各个环节中不可或缺的重要组成部分。进而,随着软件能力的提升和应用范围的扩大,小到日常生活、大到城市治理,多元融合的软件开启了以融合化为特征的软件产业阶段。
|
||||
|
||||
\subsection{以融合化为特征的软件产业生态}
|
||||
第三次信息化浪潮的推进,使得智能化、融合化逐渐成为软件产品和服务的新趋势。从无处不在的计算,到软件定义一切,以融合化为特征的软件产业生态已经开始渗透到社会生活的方方面面。在这新型的软件产业生态中,软件产业链已经不仅涵盖传统运行于计算机硬件上的软件,还进一步覆盖了智能感知设备甚至人。人、机(计算机)、物(智能感知设备)融合是新型软件产业生态中的典型场景。得益于小型微型终端设备、智能终端设备的普及,新型物联网应用促使软件开发商、硬件制造商、服务提供商、系统集成商等多种角色共享智能化、融合化的软件市场份额。例如,在智能家居场景中,各类智能家居设备通过软件定义的方式接入智能家居总控软件,用户能通过在智能手机中安装远控软件实现对家中设备的远程查看、管理和控制。与生活密切相关的空调、电视机、电饭煲、电灯等传统电器产业为软件产业提供了巨大的潜在发展空间。小米、华为等企业已经在相关领域做出了成果丰硕的探索和尝试。又如,近年来以国内饿了么、美团为代表的从线上到线下(O2O)的服务模式,以共享单车、共享汽车为代表的共享经济模式,无不体现了软件与各行业融合的全新产业生态。
|
||||
|
||||
灵活多变、快速定制、多源融合的产业生态对软件本身带来了新的挑战。快速开发灵活可伸缩的软件产品,确保提供高效稳定的软件服务,促使软件开发人员和研究人员对软件的技术架构进行不断的探索创新,也进一步丰富了软件产业生态中生产者和消费者的构成,给软件产业的持续发展带来蓬勃生机。
|
||||
|
||||
\subsection{开发者视角的软件产业生态}
|
||||
软件开发者是软件产业生态的重要参与者。围绕开发者,软件产业生态经历了从产品到服务、从单机到集群、从闭源到开源多个阶段。与产品视角和服务视角所见的软件产业不同,以开发者为中心的软件产业围绕软件开发工具、方法和服务,形成了一种推动软件产业本身发展的重要动力。软件开发工具软件既是软件产业中用于软件产品开发的工具,同时也是构成软件产业重要组成部分的一类软件产品,具有典型的两面性。因此,本节将从软件开发工具形成的软件产业生态的角度,回顾开发者视角的软件产业历史,分析不同阶段软件开发技术对软件产业发展的支撑。
|
||||
|
||||
软件开发环境\index{软件开发环境}经历了单机集成开发环境、支持协同的软件开发环境以及云开发环境等多个阶段,形成了单机集成开发环境\index{集成开发环境}和云协同开发环境\index{协同开发环境}融合的庞大产业。20世纪80年代以前,软件开发环境主要是针对特定的硬件平台,因此,此时开发工具相关的软件还没有形成固定的产业。随着高级编程语言的出现和普及,各类集成软件开发环境(IDE)逐渐发展起来,形成了具有领域特点的产业雏形。在高级编程语言和集成开发环境的支撑下,软件开发效率大大提升,促进了软件产品的繁荣。20世纪80-90年代,宝蓝(Borland)、微软(Microsoft)等公司推出了各自的开发工具软件,形成了多种开发工具软件竞争的产业局面。随着新的操作系统和中间件的变化,开发工具产业也在发生着适应性的变化。例如,以C和Pascal起家的宝蓝公司在20世纪90年代末到21世纪初,为了应对Java语言的广泛使用,推出了JBuilder系列开发环境;随着Linux的不断普及,推出了Kylix;随着.NET平台的广泛使用,推出了支持.NET的开发工具Delphi 8以及多个后继版本;直至2006年,由于对服务化编程模式支持不足、定价过高等多种原因,Delphi才在竞争中渐渐失去有利地位,被Embarcadero收购;继而由Embarcadero控制的Delphi开发环境工具为了满足服务化、跨平台的软件开发需求,仍然推出新的版本,通过面向移动开发和跨平台特点与微软Visual Studio .NET等工具软件竞争。可见,软件技术的进步推动着软件开发工具产业的持续发展,而开发工具产业生态的兴盛也支撑着软件技术的不断提升与改进。
|
||||
|
||||
与此同时,开源集成开发环境随着Java等语言的兴起而不断发展,形成以开源和协作为特色的软件产业生态,并派生出特有的商业模式。Eclipse是一个典型的例子。Eclipse最初由IBM公司主导开发,并于2001年开源,随后转由非盈利组织Eclipse基金会管理至今。Eclipse项目架构设计灵活,其开源引起了广泛的关注,并得到上百家大型软件企业的参与与贡献。围绕Eclipse这个开源集成开发环境,开源社区的开发者和参与开源社区贡献的软件企业纷纷为该产品开发插件,并得到集成和推广。在此基础上,Eclipse衍生出了MyEclipse等商用版本,以及IBM Rational Software Architect等多种工具软件。此类工具面向软件开发者的不同开发需求,提供不同层次的解决方案和开发环境。这类软件生态往往以开源为核心,通过良好设计的、具有可扩展性的软件体系结构构展现了软件的良好生命力,并且在开源环境下不断发展,同时采用合适的开源许可证允许衍生出商业产品,并通过商业产品的应用与开源版本实现协同的演进。
|
||||
|
||||
随着软件产品日益复杂,开发人员的协同工作更为重要。在协同开发环境下,涉及到不同的开发团队、不同的开发资源如何协调的问题。例如,对协同开发的软件代码,需要有相应的版本控制软件。在版本控制领域,除了经典的ClearCase、Perforce等商业工具之外,还产生了CVS、SubVersion等开源免费工具。由于软件开发的社会化协作程度越来越高,分布式版本管理系统逐渐替代中央控制的版本管理系统成为主流。其中的典型代表是git和mercurial。社会化编程的兴起,又对版本控制之外的社会化协作产生了新的需求,催生了一大批诸如GitHub、Gitlab、Bitbucket、Coding等国内外的开发者社区及协作服务提供商。持续集成需要自动化构建工具的支持,其中既有Bamboo等商业的持续集成工具,也有Jenkins等开源免费的工具,同时还存在以免费为主体、但具有某些收费高级功能,或是面向开源社区免费、但面向商业应用收费的产品,如Go、Travis等。此外,在配置管理、自动化构建和测试、容器和服务平台、日志管理及监控和告警等领域,都出现了许多具有竞争力的产品。
|
||||
|
||||
开发运维一体化(DevOps)运动的兴起,则是在前述实践基础上进一步引发的更为深刻的技术和文化变革。开发和运维不再彼此独立,而是建立了更流畅、更紧密的协作关系。从工具链角度,不仅仅是发布活动,配置、监控及最终用户反馈等环节也融入其中。因为持续集成、持续交付和开发运维一体化的工具链的端到端的特点,基本上囊括了软件开发中从开发到集成交付、从基础运行环境配置到软件配置管理等各个子领域的多种工具的集合,也促进了相关子领域的各工具软件产业的繁荣以及生态的兴盛。从开发者角度而言,大量的开发工具和开发模式为开发者提供了多种提升开发效率和质量的技术途径,同时也带来了更多的技术选择成本和学习成本。如何促进相关软件产业生态良性发展,辅助开发人员更专注于需求,提升开发效率和交付能力,降低学习成本,是一个重要的研究问题。
|
||||
|
||||
\section{结束语}
|
||||
软件产业生态的建立、发展和繁荣已经经历了超过半个世纪。回顾这五十多年的软件产业发展历程,软件产业生态的建立与软件技术的发展密不可分。随着技术的进步,各类软件产品、软件企业、软件从业人员之间的竞争与合作持续发展,逐步渗透入人类生活的方方面面。“软件定义一切”和“一切皆服务(XaaS)”为软件产业创新发展扩展了新的空间。新一代技术催生新的软件产业细分,促进软件产业向其他各个产业的渗透,形成基于软件的产业融合。同时,传统软件企业在云计算技术的推动下加快自身的服务化转型,全球软件即服务落地明显加快。软件产业的服务化、融合化特征日趋显著,成为软件产业的新增长点,也成为软件技术和软件学科发展的新契机。
|
||||
|
||||
随着越来越多行业对软件和软件技术需求的增长,软件产业将继续发展和细分,并进一步与人类社会生产生活紧密融合。软件产业的细分与服务化、融合化转型,给软件学科的研究带来了新的挑战,需要有符合产业可持续发展要求的研究内容和成果,认识并补足软件产业生态化发展的短板,从而支持和促进软件产业的持续健康发展。
|
||||
% !TEX root = main.tex
|
||||
\section{概述}
|
||||
软件产业是战略性新型产业的重要组成部分,在推动传统产业升级转型、促进经济结构调整和发展方式转变、拉动经济增长和扩大就业、变革人类生产生活方式等方面发挥着日益重要的作用。
|
||||
|
||||
随着软件从依附于计算机硬件的程序逐步发展为独立的产品,并且门类逐渐丰富,与软件产品、服务相关的组织和团体在协作和竞争中逐渐形成产业链、产业圈,其重要性已经国民经济中显现。2018年我国软件和信息技术服务企业数超过3.7万家,从业人数达到643万人,软件业务规模(包括软件产品、信息技术服务、嵌入式系统软件)达到6.3万亿元\cite{baobiao2019}。据预测,2019年全球信息技术产业规模将达5万亿美元,其中软件和信息技术服务业占比将达32\%,物联网软硬件、云计算、大数据等新兴领域将占17\%\cite{ITIndustryOutlook2019}。
|
||||
|
||||
软件学科与软件产业相互促进、共生共荣。软件产业的发展推动着软件学科的进步,软件产业的繁荣与分化对软件学科的演进与细化提出了更高的要求。同时,软件学科服务于软件产业,支撑软件产业的发展和壮大。软件学科从理论和实践上对软件产业的繁荣发挥着越来越重要的作用。
|
||||
|
||||
本章将概述软件产业概念以及软件产业的生态构成,回顾软件产业的形成、发展的历程,接着从软件技术与软件产业的互动的视角阐述软件产业生态不同阶段的特点和不同的侧面,分析软件产业随着应用场景和应用领域的细分所形成的不同产业生态格局,揭示软件学科在软件产业发展中的推动作用和软件产业对软件学科演进的需求牵引。通过软件产业生态不同阶段和侧面的讨论,揭示软件产业的发展趋势,以及软件学科对支撑软件产业和国民经济发展的重要作用,力图为软件学科更好地服务于产业和经济发展需求提供有用的信息。
|
||||
|
||||
\section{软件产业和软件产业生态}
|
||||
软件产业是为有效地利用计算机资源而从事计算机程序编制、信息系统开发和集成及从事相关服务的产业\cite{research1996}。软件产业\index{软件产业}通常分为软件产品业和软件服务业两大部分。因此也有学者将软件产业定义为“与软件产品和软件服务相关的一切经济活动与关系的总称”\cite{furonghui2017}。
|
||||
|
||||
软件产业这一概念的外延非常广泛。在工信部中国电子信息产业发展研究院编著的中国软件产业发展蓝皮书系列中,软件产业细分为基础软件产业、工业软件产业、信息技术服务产业、嵌入式软件产业、云计算产业、大数据产业、信息安全产业等。中国软件行业协会的软件产业研究报告中,将软件产业分为软件产品和软件服务,而软件产品进一步分为系统软件、支撑软件和应用软件,软件服务则涵盖了与软件相关的服务内容。国际数据公司(IDC)将软件产业细分为应用解决方案(Application Solutions)、应用开发及部署软件(Application Development and Deployment Software)和系统基础软件(System Infrastructure Software)。从更广泛的意义上来说,无处不在的软件产品和服务越来越深刻地影响着众多传统产业和新兴产业,并随着技术的发展和应用领域的扩展不断细化社会分工,软件在其他产业中的重要性也日益显现,并使得软件产业与其他产业呈现出融合的态势。
|
||||
|
||||
软件产业涵盖了软件企业、软件产品和服务、软件从业人员(特别是开发者)众多要素,他们之间相互影响、相互依存、相互竞争。在软件产业产生与发展过程中,软件企业及其所生产的产品、所提供的服务之间的供需关系形成了软件产业链,相关或者相似关系形成了软件产业的若干子领域,或产业圈。这些不同的产业链、产业圈以及相关的参与者之间或互补、或竞争,从而构建起了错综复杂的产业生态。
|
||||
|
||||
软件产业生态\index{软件产业生}是软件企业、软件从业人员以及各层次、多种类的软件产品与服务的共生体。软件产业生态,从软件产品和服务的相互依赖性来看,从上游到下游,基本可以分析为系统软件、支撑软件、应用软件等层次。应用软件中,又可进一步细分出工业软件(包括企业管理信息系统等软件)、个人软件(以个人使用为目的的软件)。软件产业链上不同种类的软件及其开发者、开发企业形成了相互关联的多个子产业圈。下游的软件子产业很大程度上受到上游软件子产业的制约,而另一方面又在一定程度上促进上游软件子产业的发展。例如,处于软件产业链上游的操作系统等系统软件是下游应用软件运行的基础,因此围绕操作系统等系统软件和各个业务领域的需求所研发的一系列应用软件,与所对应的操作系统形成相互依赖、相互促进、相互制约的产业生态圈;而随着应用软件的普及使用,基于特定操作系统的应用软件也可能由用户市场驱动发展出支持其他操作系统的版本,从而扩展原有的生态范围。由此可见,各类应用软件、操作系统等软件以及相应的开发商、用户共同构成了复杂且演化的生态系统。软件产业生态的主要参与方及其相互关系如图\ref{fig:fig1-5-1}所示。
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\includegraphics[scale=0.5]{fig1-5/fig1.png}
|
||||
\caption{软件产业构成}\label{fig:fig1-5-1}
|
||||
\end{figure}
|
||||
|
||||
\section{软件产业发展历程概览}
|
||||
软件产业脱胎于计算机产业的发展和进步,与软件技术相互影响、相互促进。软件产业的形成与发展遵循产业分化和进步的一般规律。图\ref{fig:fig1-5-2}展示了软件产业发展历程的概貌。
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\includegraphics[scale=0.8]{fig1-5/fig2.png}
|
||||
\caption{软件产业发展历史概览}\label{fig:fig1-5-2}
|
||||
\end{figure}
|
||||
|
||||
早期的计算机软件往往附属于计算机硬件。直到20世纪50年代,软件还主要以项目的形式进行定制化开发。这些软件开发项目往往由政府主导,并服务于国防等关键部门,并且只有少量大型服务企业研制。当时,计算机行业的大多数高管不相信软件产品会有重要的市场\cite{DBLP:journals/annals/Johnson98}。
|
||||
|
||||
20世纪60年代,随着计算机硬件能力的提升,软件的规模日益庞大,开发过程日益复杂,出现了软件危机。软件的重要性和独立性也开始逐渐显现。例如,1961年开始研发的OS/360操作系统软件耗费了超过5000人年的工作量,软件成本甚至超过了IBM System/360大型机硬件。60年代中期,出现了一些具有特定用途、可以被售卖给不止一个客户的程序,具有一些产品化的特性,但销售量小,仅能看作是软件产业的萌芽。而与此同时,软件开发和管理中的大量现实问题促使业界思考软件开发的独特之处。1968年软件工程概念提出,标志着对软件及其开发方法的研究进入了一个新的阶段,也预示着软件开发向工程化发展。1969年,计算机企业巨头IBM宣布了软件可作为独立于硬件单独售卖的商品而存在\cite{DBLP:journals/annals/Johnson98}。在此期间,出现了强大的企业解决方案提供商,例如专业的数据库公司,研发数据库等通用型软件以弥补计算机制造商自带软件的不足,但整体规模仍然不大。这种状态几乎持续到20世纪70年代末,绝大多数软件应用程序仍是在主机或微机上按需定制的。在这一阶段,软件厂商已经开始发展起来,并且开始认识到大规模复杂软件开发中的一些问题,推动了软件工程理论的发展。
|
||||
|
||||
20世纪80年代,随着微型计算机的大规模普及,大量软件得到了广泛的使用,软件企业以此为契机得以迅速发展,开启了以软件为销售对象的商业模式\cite{furonghui2017},也由此掀起了以数字化为主要特征的第一次信息化浪潮\cite{2018建设数字中国}。在这时期,软件真正开始形成一个独立的产业,不仅有大量的软件开发企业和开发者,还出现了更加广大的软件产品市场和用户,并且越来越独立于特定的计算机硬件,逐步形成独立的产业。
|
||||
|
||||
从20世纪90年代中期开始,以美国提出“信息高速公路”建设计划为重要标志,互联网逐渐实现了大规模商用,迎来了以网络化为主要特征的第二次信息化浪潮\cite{2018建设数字中国}。软件从以单机应用为主逐渐呈现出网络化交互特征。大量带有社会化特征的软件开始蓬勃发展,形成了以互联网为基础、以服务化为特征的产业生态。
|
||||
|
||||
当前,随着以智能化为主要特征第三次信息化浪潮\cite{2018建设数字中国}的到来,软件产业正在发生新的变化。新型的融合化应用场景越来越丰富,基于云计算、大数据的智能化应用软件和企业蓬勃发展,基于软件的产品和服务日益多样化精细化,逐渐向传统行业和新兴行业渗透,呈现出“软件定义一切”的融合化态势。
|
||||
在后续的论述中,我们将以软件产业与软件技术互动为主线,从不同阶段和视角回顾软件产业及其生态的发展,探讨软件产业对软件学科的需求以及软件学科对软件产业的支撑。
|
||||
|
||||
\section{不同阶段和视角的软件产业生态}
|
||||
\subsection{软件产业与软件技术的互动}
|
||||
由软件产业发展历程可以看到,软件产业的发展与软件技术的进步是相互影响、相互促进的。
|
||||
|
||||
当人们意识到软件可以是独立于硬件存在的单独产品时,针对不同目的、具有不同功能特点的软件也逐渐发展出专门化细分的软件技术领域,相应的软件产品也逐渐形成独立的门类。逐渐细化的各类软件产品,极大丰富了软件产业的内容结构。
|
||||
|
||||
随着互联网软硬件技术的发展和普及,软件产品从拷贝安装的应用模式,逐渐转向通过网络按需获得的服务模式。软件的应用场景和用户群体的多样化趋势,扩大了软件市场,催生了一批以在线软件服务为主要业务的软件企业。这些企业和各类新型应用需求,反过来又促进了服务化软件技术的创新和发展,使得软件产业显示出服务化特征。
|
||||
|
||||
随着软件在各个不同行业中的广泛使用,各类企业与软件相关的投入与产出都普遍增加。无处不在的软件在各个业务领域中的重要性日益显示,并正在迅速融入各个领域的核心业务中,推动着各个领域的技术创新和发展。
|
||||
|
||||
在软件产业和软件技术的发展过程中,软件的复杂性和软件开发的困难也越来越被人们所重视。在不同的产业阶段,如何高效地开发高质量软件成为永恒的话题,不断推动着软件技术的进步和软件产业的发展。从软件开发的角度而言,软件开发方法、工具和环境经历着不同的变化。软件开发者,以及以软件开发工具和环境为主要业务的软件企业,一起构建了独特的产业生态,与软件技术的共同发展。
|
||||
|
||||
可见,软件产业从早期由产品化构建起产业生态,到后期逐渐发展为以服务化为特征的产业生态,以及近年来以融合化为特征的产业生态,软件技术的发展和变革无所不在。由软件开发方法、环境和工具推动的软件开发产业生态是软件技术发展的重要推动要素。本节回顾具体的软件产业发展历史,以及以开发者视角所见的软件产业生态,分析软件产业与软件技术的互动与演变,并揭示软件产业与传统产业的融合化发展新趋势。
|
||||
\subsection{以产品化为特征的软件产业生态}
|
||||
正如传统工业部门在生产力发展过程中不断分化一样,软件也经历了产品门类不断细分的过程。软件从硬件中剥离出来之初,并没有具体的门类细分,从硬件资源管理到具体应用功能都包括在一个混沌的整体中。随着软件需求的不断增长,软件应用的数量不断增多,人们发现有一些共性功能是几乎所有软件的运行都必须具备的,因此就将这些共性分离出来,包装成早期的操作系统,而功能各异的应用功能则在操作系统之上开发运行,形成各类应用软件。后来,人们发现一些应用软件中仍然存在不少逻辑上高于操作系统、同时又存在于多种应用中的共性部分。这些共性部分又进一步被分离出来,有些被单独包装成产品,产生了数据库软件以及其他用于支撑软件运行交互的所谓中间件。而上层的应用软件也在实际应用中针对不同的业务需求不断细分,形成了各类不同的应用软件,孕育了各自的软件开发企业和应用市场。可见,随着软件技术的发展,软件产品经历了共性沉淀、结构细分的过程,而此过程中,每一个细分领域出现了专门的软件技术领域和产品,而产业结构也逐渐丰富。
|
||||
|
||||
本小节以操作系统产品、办公软件产品、中间件产品、工业软件产品为典型代表,概述以产品化为特征的软件产业生态产生与发展过程。
|
||||
|
||||
操作系统是构建现代软件产业生态的重要基石。20世纪60年代,操作系统软件开始逐渐从计算机硬件中独立出来,出现了产品化萌芽。例如,OS/360操作系统能运行在一系列用途与价位不同的IBM System/360大型机上,具有了现代操作系统的独立性和产品化的特征,但仍然依附于特定厂商,也并未形成产业。1969年,贝尔实验室开发开放源码的Unix操作系统,得到了广泛的应用。之后基于Unix的源代码,大量类Unix系统被研发出来,可用于多种计算机硬件。市场上形成了多种独立的操作系统软件产品。例如,加州大学伯克利分校研发的BSD,以及此后的FreeBSD、NetBSD、OpenBSD等衍生产品。20世纪70年代后期,IBM公司推出的个人电脑(PC)催生了面向个人的软件使用场景,为软件产业的发展提供了广阔的空间;80年代,微软通过与IBM公司的合作,成功研制了面向个人计算机的桌面操作系统MS-DOS,成为当时在IBM PC上最常用的操作系统,也带来了大量的软件应用场景,推动了第一波信息化浪潮,促进软件产业的发展和壮大。同期,MacOS在苹果公司Macintosh计算机上也得到了广泛的应用。1983年,嵌入式实时操作系统(RTOS)VxWorks由美国WindRiver公司研发,具有高性能的内核以及友好的用户开发环境,以其良好的可靠性和卓越的实时性,至今仍被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。20世纪90年代,微软公司自行研发新操作系统Windows,通过图形化界面来替换其原有的字符界面为主的DOS系列操作系统。同期,芬兰裔美国软件工程师Linus Torvalds基于Unix研发了Linux操作系统,由于其轻量级微内核的设计和良好的可移植性,目前已经发展为国际主流操作系统之一,并形成了多种变体版本。
|
||||
|
||||
当前,操作系统软件产业在不同操作系统领域呈现各自的发展特点。在服务器操作系统领域,Linux、Unix和Windows是最常见的操作系统软件产品,形成能力互补的同时也存在多个角度的竞争。在桌面操作系统领域,Windows占据最大的市场份额,但是近年来Mac OS和Linux的份额在不断增加,竞争态势显著。在移动智能终端操作系统领域,Android被华为、三星等众多手机和其他终端厂商使用,而iOS则在苹果公司经营下形成了相对封闭的发展模式,两者形成了各自的产品生态特色。在嵌入式操作系统领域,VxWorks、Windows Embedded、嵌入式Linux等系统软件产品广泛用于工业控制、终端设备等领域;我国国产工控实时操作系统SylixOS也在在国内关键系统市场逐步扩展份额,开始形成对VxWorks等国际产品的替代。云操作系统、智能穿戴操作系统等产品的软件产业规模总体较小,仍有很大的发展空间。各类操作系统具有不同的使用平台和应用场景,在某一细分的领域,往往存在几个产品共同形成市场竞争,同时也存在市场互补。产品的多样性以及标准化等特性为操作系统产业乃至整个软件产业的繁荣提供了重要的保障,对其他各个子产业建立了重要的平台支撑。操作系统与计算机硬件密切相关,在很长一段时间,操作系统软件与硬件往往共同销售并且预装在硬件上。随着操作系统产品的逐步成熟,以销售许可的方式对产品进行售卖逐渐形成另一种典型的软件产品商业模式。
|
||||
|
||||
办公软件是一种重要的服务于日常信息处理的共性应用软件产品\footnote{在我国,办公软件也被归入基础软件。}。由于办公软件产品的普及,各类信息的记录与处理有了便捷高效的平台。其中,最为知名的办公软件包括文字处理、电子表格、演示等。早期的办公软件国外有Word Prefect、Lotus123等,而国内则有WPS等,都具有广泛的部署和深刻的商业影响。随着信息处理的需求越来越大,人们对办公软件的易用性要求也日益提升,推动者各厂商对软件产品的设计不断改进。在操作系统进入图形化“视窗”时代后,相应的办公软件也开启了“所见即所得”(WYSIWYG)的新阶段,大大提升用户体验,并反过来对操作系统的效率和稳定性提出新的要求。办公软件与操作系统一样,也在产品逐渐成熟和商业模式逐步清晰的背景下,进入按许可进行销售的软件产品商业模式。
|
||||
|
||||
|
||||
中间件是一种重要的基础软件。中间件与操作系统、数据库系统并称为三大类系统软件,但相比于操作系统和数据库,中间件产品出现得更晚。一般认为,中间件是网络环境下处于操作系统等系统软件和应用软件之间的一种起连接作用的分布式软件。1968年出现的将应用软件与系统服务分离的IBM CICS交易事务控制系统可以看作是中间件产品的萌芽。它在面向最终用户的应用功能与面向机器的系统服务之间提供了中间层的封装,使得各个层次的关注点更加集中。到20世纪90年代,互联网的出现使网络应用和分布式应用登上历史舞台,而其中涉及通信、协同等源于异构性的大量共性问题,复杂性越来越高,需要专门的软件产品来处理。一般认为ATT公司贝尔实验室于1990年推出的用于解决分布式交易事务控制的Tuxedo系统是中间件产品诞生的标志,是一种交易中间件,也是最早的中间件。此后,消息中间件、应用服务器中间件、应用集成中间件(企业服务总线ESB等)、业务架构中间件(业务流程管理BPM等)等各类中间件产品迅速发展起来。典型的中间件厂商包括国外企业IBM、Oracle、BEA等,开源产品组织Apache、JBoss、JOnAs等,以及国内企业金蝶、东方通、中创、普元等,形成了相互竞争、相互补充的繁荣的生态格局。可见,中间件产品的发展过程也是软件技术相关领域日益复杂和细分的结果。
|
||||
|
||||
工业软件是一类典型的面向领域的应用软件,是支撑传统工业企业信息化、提升传统工业企业管理水平的重要软件产品簇。工业软件按涉及的工业业务领域可分为研发设计类软件和业务运营管理类软件。早在20世纪60年代,美国的大型企业就会采购昂贵的计算机设备进行商业信息的处理。但是由于当时计算机硬件和软件之间耦合紧密,软件往往是作为计算机售后的一种服务提供,因此无法形成独立的产业生态圈。60年代末70年代初,随着系统软件的出现,通用计算机系统开始普及,由此面向工业生产及其信息化的独立软件开发商开始逐渐出现。直至80年代,随着更便宜的个人电脑和通用操作系统的普及,企业信息化的门槛得以大幅降低,软件技术开始惠及更多的行业。随着工业生产和研发复杂性提升,研发领域如计算机辅助设计(CAD)、辅助分析(CAE)、辅助制造(CAM)、辅助工艺规划(CAPP)、产品数据管理(PDM)、产品全生命周期管理(PLM)等涌现了大量的商业化的软件产品,为相关业务领域带来了显著的生产力优势,很快在各个行业得到普及。在业务运营和管理领域,早期的软件更多集中于管理信息系统(MIS),重点在于以数字化的形式来记录企业管理过程中产生的原始数据以及简单的业务流程。为了更好利用以手工为主的企业既有流程,企业资源规划(ERP)等软件产品诞生,逐渐形成了以计算机软件为中心的企业级管理系统。它不仅仅是对既有业务流程的自动化,而是包含了诸如财务预测、生产能力、资源调度等更具有价值的软件功能,同时对企业经营管理方式产生了深刻的影响。大数据和智能化时代的到来,正在将业务运营管理方面的软件产业水平提升到一个新的高度。
|
||||
|
||||
由此可见,以产品化为特征的软件产业代表着早期桌面化的市场需求,软件企业通过软件销售的形式向各类用户提供商用的软件产品。由于软件产品复制的边际成本非常低以至于可被忽略这一完全不同于传统产业的特性,知识产权保护成为软件产业中的重要企业战略决策\cite{RePEc:unm:umamer:1995006},并且持续促进着软件技术的发展。同时,大量用户的特殊需求要求软件企业提供大量的定制功能,因此咨询与实施成为软件产品部署的重要方式,同时也促进企业采用支持可变性建模的开发方法开发面向特定领域的系列软件产品,使得产品化的软件生态更加丰富。随着云计算、移动计算等技术的发展和普及,一些以销售软件产品为主的软件企业开始向云化、服务化转型。软件产业逐步开启以服务化为特征的新阶段。
|
||||
|
||||
\subsection{以服务化为特征的软件产业生态}
|
||||
服务化是互联网技术的产物。互联网软硬件的发展,使得依赖于拷贝安装的软件产品转变为通过网络、按需索取成为可能。软件功能进一步细分为前端以人机交互为主和后端以业务逻辑处理为主两大部分。随着大量的业务逻辑迁移到后端,对后端的计算、存储能力提出了更高的技术要求,逐步发展出了云计算技术与平台;而互联网的广泛可达能力,带来了巨量的普通用户,形成了丰富的互联网应用。
|
||||
|
||||
在以服务化为特征的软件产业生态中,软件的核心价值主要以网络服务的形式呈现。作为产业生态的主体,软件企业大量采用云计算技术提升用户服务能力;同时,软件的用户能够在各类终端上通过网络按需访问所需要的服务。由于软件的服务化、远程化、轻量化带来了具有良好的伸缩性和互操作性,因此,服务化的软件极大地推动了软件产业生态的繁荣。从企业而言,软件的部署和运维得到良好的控制;从用户而言,轻量化的运行提升了使用体验。受限于篇幅,本节以社交类软件和云计算服务为例介绍具有典型服务特征的新型软件产业生态。
|
||||
|
||||
社交类软件体现了人和人之间的连接。这一天然的人际链接的需求,在互联网普及之前,只能通过传统的社交方式来完成。互联网的发展使得社交活动发展到一个完全不同的高度,这也催生了一大批以社交为主营业务的软件公司。社交类软件最早以即时消息服务(IM)的形式出现,例如国外的ICQ、AIM、Skype等,国内的QQ(早期称为OICQ)。由于和社交关系深度绑定,社交软件的盈利模式非常多样,同时这类软件也具有极强的粘性,一旦占据优势地位就非常难于被其他软件所替代。
|
||||
|
||||
互联网模式的变革也为新的社交软件形态的产生带来了新的机会,例如Web2.0时代的到来,在线交流变得更加便捷,也催生了诸如Facebook、Twitter、国内的微博等社交类网站的兴起。它们不再局限于通讯录中的固定的联系人,而是使得互不相识的人际互动变得更加频繁,甚至还出现了以陌生人社交为主要业务软件产品,以及面向职业人士的LinkedIn等软件产品。移动互联网的兴起是另一次变革的浪潮,由于智能手机的用户普及率高且便于随身携带等特点,通过智能手机随时在线使用社交媒体软件成为可能。这催生了新一代的社交类产品如微信、Telegram、Line、WhatsApp等的繁荣。围绕这些应用软件,形成了大量外围软件服务,涉及电子商务、在线支付、招聘择业、娱乐游戏、社会信息服务等众多领域,几乎涉及了社会生活的方方面面。可以说,在新型软件技术的支撑下,相关软件产业生态已经影响到当今社会的主要生活方式。
|
||||
|
||||
云计算服务是新型服务化软件背后的重要技术支撑,提供了大规模并行化定制化的服务能力。其中大规模和并行化处理能力往往来自以虚拟化技术(Virtualization)为基础的云计算服务,而定制化能力则更多依赖于21世纪初发展起来的平台即服务(PaaS概念)。就虚拟化软件而言,其本身以产品化形式出现,但对外提供服务化能力,将计算机的各种实体资源(如CPU、内存、磁盘空间、网络适配器等)进行抽象、转换后,以虚拟设备的方式呈现出来并可供分割、组合为一个或多个计算机环境。自20世纪60年代以来,虚拟化能力随着桌面计算和服务器架构的日益发展不断发展完善,面向不同的底层硬件资源和上层应用需求出现了以KVM、VirtualBox、VMware ESX、Xen等多种虚拟化软件产品,进而出现了用于虚拟环境管理的OpenStack、Amazon EC2等产品。基于虚拟化技术,许多厂商如Amazon、微软、Google、百度、阿里巴巴、华为等,提供了不同层次的在线服务,包括基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)。基础设施即服务提供在线计算资源和基础设施,比如Amazon、华为、阿里等厂商的服务器租赁等服务。平台即服务提供在线的应用开发和发布解决方案,提升应用开发和运行的灵活性,比如Google App Engine、微软Azure、Force.com等。软件即服务是在线化的软件形态,面向最终软件用户,以在线服务的形式提供面向领域的软件功能,比如SalesForce的CRM系统、Cisco的WebEx等。不同厂商在推出相应的云计算服务同时,往往会提供IaaS、PaaS、SaaS中的一层或多层服务,这也建立了围绕不同软件厂商的产业生态。而不同软件厂商之间的软件产品间形成竞争和补充关系,进而也形成了更加复杂的层次化软件产业生态。
|
||||
|
||||
在软件服务化的趋势下,不论是传统行业还是新兴行业,软件的随处可用、随需而变、按需提供的特性,大大扩张了软件产业的范围,使得软件与人们的生产、生活更加密切接触,成为社会经济生活各个环节中不可或缺的重要组成部分。进而,随着软件能力的提升和应用范围的扩大,小到日常生活、大到城市治理,多元融合的软件开启了以融合化为特征的软件产业阶段。
|
||||
|
||||
\subsection{以融合化为特征的软件产业生态}
|
||||
第三次信息化浪潮的推进,使得智能化、融合化逐渐成为软件产品和服务的新趋势。从无处不在的计算,到软件定义一切,以融合化为特征的软件产业生态已经开始渗透到社会生活的方方面面。在这新型的软件产业生态中,软件产业链已经不仅涵盖传统运行于计算机硬件上的软件,还进一步覆盖了智能感知设备甚至人。人、机(计算机)、物(智能感知设备)融合是新型软件产业生态中的典型场景。得益于小型微型终端设备、智能终端设备的普及,新型物联网应用促使软件开发商、硬件制造商、服务提供商、系统集成商等多种角色共享智能化、融合化的软件市场份额。例如,在智能家居场景中,各类智能家居设备通过软件定义的方式接入智能家居总控软件,用户能通过在智能手机中安装远控软件实现对家中设备的远程查看、管理和控制。与生活密切相关的空调、电视机、电饭煲、电灯等传统电器产业为软件产业提供了巨大的潜在发展空间。小米、华为等企业已经在相关领域做出了成果丰硕的探索和尝试。又如,近年来以国内饿了么、美团为代表的从线上到线下(O2O)的服务模式,以共享单车、共享汽车为代表的共享经济模式,无不体现了软件与各行业融合的全新产业生态。
|
||||
|
||||
灵活多变、快速定制、多源融合的产业生态对软件本身带来了新的挑战。快速开发灵活可伸缩的软件产品,确保提供高效稳定的软件服务,促使软件开发人员和研究人员对软件的技术架构进行不断的探索创新,也进一步丰富了软件产业生态中生产者和消费者的构成,给软件产业的持续发展带来蓬勃生机。
|
||||
|
||||
\subsection{开发者视角的软件产业生态}
|
||||
软件开发者是软件产业生态的重要参与者。围绕开发者,软件产业生态经历了从产品到服务、从单机到集群、从闭源到开源多个阶段。与产品视角和服务视角所见的软件产业不同,以开发者为中心的软件产业围绕软件开发工具、方法和服务,形成了一种推动软件产业本身发展的重要动力。软件开发工具软件既是软件产业中用于软件产品开发的工具,同时也是构成软件产业重要组成部分的一类软件产品,具有典型的两面性。因此,本节将从软件开发工具形成的软件产业生态的角度,回顾开发者视角的软件产业历史,分析不同阶段软件开发技术对软件产业发展的支撑。
|
||||
|
||||
软件开发环境\index{软件开发环境}经历了单机集成开发环境、支持协同的软件开发环境以及云开发环境等多个阶段,形成了单机集成开发环境\index{集成开发环境}和云协同开发环境\index{协同开发环境}融合的庞大产业。20世纪80年代以前,软件开发环境主要是针对特定的硬件平台,因此,此时开发工具相关的软件还没有形成固定的产业。随着高级编程语言的出现和普及,各类集成软件开发环境(IDE)逐渐发展起来,形成了具有领域特点的产业雏形。在高级编程语言和集成开发环境的支撑下,软件开发效率大大提升,促进了软件产品的繁荣。20世纪80-90年代,宝蓝(Borland)、微软(Microsoft)等公司推出了各自的开发工具软件,形成了多种开发工具软件竞争的产业局面。随着新的操作系统和中间件的变化,开发工具产业也在发生着适应性的变化。例如,以C和Pascal起家的宝蓝公司在20世纪90年代末到21世纪初,为了应对Java语言的广泛使用,推出了JBuilder系列开发环境;随着Linux的不断普及,推出了Kylix;随着.NET平台的广泛使用,推出了支持.NET的开发工具Delphi 8以及多个后继版本;直至2006年,由于对服务化编程模式支持不足、定价过高等多种原因,Delphi才在竞争中渐渐失去有利地位,被Embarcadero收购;继而由Embarcadero控制的Delphi开发环境工具为了满足服务化、跨平台的软件开发需求,仍然推出新的版本,通过面向移动开发和跨平台特点与微软Visual Studio .NET等工具软件竞争。可见,软件技术的进步推动着软件开发工具产业的持续发展,而开发工具产业生态的兴盛也支撑着软件技术的不断提升与改进。
|
||||
|
||||
与此同时,开源集成开发环境随着Java等语言的兴起而不断发展,形成以开源和协作为特色的软件产业生态,并派生出特有的商业模式。Eclipse是一个典型的例子。Eclipse最初由IBM公司主导开发,并于2001年开源,随后转由非盈利组织Eclipse基金会管理至今。Eclipse项目架构设计灵活,其开源引起了广泛的关注,并得到上百家大型软件企业的参与与贡献。围绕Eclipse这个开源集成开发环境,开源社区的开发者和参与开源社区贡献的软件企业纷纷为该产品开发插件,并得到集成和推广。在此基础上,Eclipse衍生出了MyEclipse等商用版本,以及IBM Rational Software Architect等多种工具软件。此类工具面向软件开发者的不同开发需求,提供不同层次的解决方案和开发环境。这类软件生态往往以开源为核心,通过良好设计的、具有可扩展性的软件体系结构构展现了软件的良好生命力,并且在开源环境下不断发展,同时采用合适的开源许可证允许衍生出商业产品,并通过商业产品的应用与开源版本实现协同的演进。
|
||||
|
||||
随着软件产品日益复杂,开发人员的协同工作更为重要。在协同开发环境下,涉及到不同的开发团队、不同的开发资源如何协调的问题。例如,对协同开发的软件代码,需要有相应的版本控制软件。在版本控制领域,除了经典的ClearCase、Perforce等商业工具之外,还产生了CVS、SubVersion等开源免费工具。由于软件开发的社会化协作程度越来越高,分布式版本管理系统逐渐替代中央控制的版本管理系统成为主流。其中的典型代表是git和mercurial。社会化编程的兴起,又对版本控制之外的社会化协作产生了新的需求,催生了一大批诸如GitHub、Gitlab、Bitbucket、Coding等国内外的开发者社区及协作服务提供商。持续集成需要自动化构建工具的支持,其中既有Bamboo等商业的持续集成工具,也有Jenkins等开源免费的工具,同时还存在以免费为主体、但具有某些收费高级功能,或是面向开源社区免费、但面向商业应用收费的产品,如Go、Travis等。此外,在配置管理、自动化构建和测试、容器和服务平台、日志管理及监控和告警等领域,都出现了许多具有竞争力的产品。
|
||||
|
||||
开发运维一体化(DevOps)运动的兴起,则是在前述实践基础上进一步引发的更为深刻的技术和文化变革。开发和运维不再彼此独立,而是建立了更流畅、更紧密的协作关系。从工具链角度,不仅仅是发布活动,配置、监控及最终用户反馈等环节也融入其中。因为持续集成、持续交付和开发运维一体化的工具链的端到端的特点,基本上囊括了软件开发中从开发到集成交付、从基础运行环境配置到软件配置管理等各个子领域的多种工具的集合,也促进了相关子领域的各工具软件产业的繁荣以及生态的兴盛。从开发者角度而言,大量的开发工具和开发模式为开发者提供了多种提升开发效率和质量的技术途径,同时也带来了更多的技术选择成本和学习成本。如何促进相关软件产业生态良性发展,辅助开发人员更专注于需求,提升开发效率和交付能力,降低学习成本,是一个重要的研究问题。
|
||||
|
||||
\section{结束语}
|
||||
软件产业生态的建立、发展和繁荣已经经历了超过半个世纪。回顾这五十多年的软件产业发展历程,软件产业生态的建立与软件技术的发展密不可分。随着技术的进步,各类软件产品、软件企业、软件从业人员之间的竞争与合作持续发展,逐步渗透入人类生活的方方面面。“软件定义一切”和“一切皆服务(XaaS)”为软件产业创新发展扩展了新的空间。新一代技术催生新的软件产业细分,促进软件产业向其他各个产业的渗透,形成基于软件的产业融合。同时,传统软件企业在云计算技术的推动下加快自身的服务化转型,全球软件即服务落地明显加快。软件产业的服务化、融合化特征日趋显著,成为软件产业的新增长点,也成为软件技术和软件学科发展的新契机。
|
||||
|
||||
随着越来越多行业对软件和软件技术需求的增长,软件产业将继续发展和细分,并进一步与人类社会生产生活紧密融合。软件产业的细分与服务化、融合化转型,给软件学科的研究带来了新的挑战,需要有符合产业可持续发展要求的研究内容和成果,认识并补足软件产业生态化发展的短板,从而支持和促进软件产业的持续健康发展。
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
\centerline{毛新军,魏峻,孙艳春,邓水光}
|
||||
%\centerline{毛新军,魏峻,孙艳春,邓水光}
|
||||
|
||||
~\\
|
||||
|
||||
|
@ -199,13 +199,13 @@
|
|||
经过几十年的积累,尤其是近年来开源软件、群智软件开发等的发展,软件学科积累了大量、多样、极有价值的软件资源,如以开源社区为载体的开源代码、知识问答、软件开发历史数据等。软件学科教育需要深入挖掘和利用软件学科资源在教育中的价值,系统研究如何在课程教学、实践教学和人才培养过程中有效地应用这些资源,如何将抽象的知识与具体的资源相结合来促进知识的理解和掌握、推动实践教学、培养能力和素养。
|
||||
|
||||
\begin{itemize}
|
||||
\item[$\bullet$] \textbf{\index{群体化学习}}
|
||||
\item[$\bullet$] \textbf{群体化学习\index{群体化学习}}
|
||||
\end{itemize}
|
||||
|
||||
借助互联网平台,通过吸引、汇聚和管理大规模的学习者,使得他们以竞争和合作等多种自主协同方式来开展学习将是未来的重要学习方式,我们称之为群体化学习。软件学科教育需要充分借助于互联网大众的智慧和理念,施行群体化学习的思想,以促进软件学科人才的大规模、高质量、普及化的培养。为此,基于群智理论和方法的指导,借助于互联网上的大数据分析,需要研究支持群体化学习的组织结构和协同模型,分析和设计群体化学习的激励机制,探究不同组织结构、协同模型和激励机制对群体化学习成效、质量和受益面等产生的影响及涌现结果。
|
||||
|
||||
\begin{itemize}
|
||||
\item[$\bullet$] \textbf{\index{大规模在线开放实践MOOP}}
|
||||
\item[$\bullet$] \textbf{大规模在线开放实践MOOP\index{大规模在线开放实践MOOP}}
|
||||
\end{itemize}
|
||||
|
||||
能力和素质培养是软件学科教育的一项主要任务。针对软件学科的发展特点,需要研究软件学科人才的能力和素质模型,建立不同能力和素质之间的关系,分析普及教育、专业教育、跨学科教育等分别需要达到什么样的水平和层次,探究软件学科内涵的拓展如何影响能力和素质。实践是支撑能力和素质培养的主要教学途径。依托大规模人群的在线开放实践(称为MOOP)将成为能力和素质培养的重要趋势,也是对MOOC在该方面存在欠缺的有效弥补。为此,需要研究支撑能力和素质培养的实践体系建设;探究如何将诸如游戏化机制等引入到MOOP之中,以激励大众参与和贡献;分析针对MOOP的量化表示与评测方法,建立起针对能力和素质培养的\index{评价体系}与评价指标。
|
||||
|
@ -231,12 +231,12 @@
|
|||
加快研发软件伦理合规检测和监督技术,尤其是自动化技术,例如面向软件版权保护的代码溯源技术、软件许可证违规使用检测技术,软件及软件使用者恶意、危险行为检测技术等,形成覆盖全面、导向明确、规范有序、协调一致的检测和监督技术体系,辅助软件行业从业者、用户和监管机构快速发现和修正违背伦理的问题,使法律法规、伦理制度得到严格执行。同时,研究和建立完善的软件伦理教育机制,针对不同教育阶段和年龄层次的人群普及软件伦理的教育,搭建创新与伦理之间高效对话机制和沟通平台,制定并落实全民软件素养培养计划。
|
||||
|
||||
\section{本章小结}
|
||||
在人机物融合时代,随着软件辐射面和影响面的扩大,软件学科的发展和进步,软件学科教育的内涵和外延也在发生改变,它涉及普及教育、专业教育、跨专业教育、教育理念与方法改革等多个方面,面临着一系列重大的问题的挑战,包括:如何针对具有不同认知水平的受众对象开展普及教育?如何根据人机物融合时代特点来深化专业教育?如何加强软件学科与其他学科的融合来实现跨专业的教育?以及如何改革软件学科的教育理念和方法来满足日增长的人才培养需求、如何应对软件伦理问题等等。
|
||||
在人机物融合时代,随着软件辐射面和影响面的扩大,软件学科的发展和进步,软件学科教育的内涵和外延也在发生改变,它涉及普及教育、专业教育、跨专业教育、教育理念与方法改革等多个方面,面临着一系列重大的问题的挑战,包括:如何针对具有不同认知水平的受众对象开展普及教育?如何根据人机物融合时代特点来深化专业教育?如何加强软件学科与其他学科的融合来实现跨专业的教育?以及如何改革软件学科的教育理念和方法来满足日益增长的人才培养需求、如何应对软件伦理问题等等。
|
||||
|
||||
为了迎接上述挑战,软件学科教育需开展一系列研究,内容包括:(1)以“计算思维 + 创新思维”为核心的普及教育,(2)以“知识体系+能力培养”为核心的专业教育,(3)以“复合型 + 创新型”为目标的跨学科教育;(4)以“探究规律 + 方法创新”为主体的教育理念和方法改革;(5)以“健全制度 + 加强监督”为核心的软件伦理建设、治理和教育。
|
||||
|
||||
|
||||
%\bibliographystyle{acm}
|
||||
%\bibliogaphystyle{acm}
|
||||
%\bibliography{references_2_10}
|
||||
%\bibliography{IEEEabrv,ref}
|
||||
%\section{参考文献}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
其次,除了功能数量和规模的提升,对软件分析和建模方法的挑战还来自于软件与硬件、软件与人的交互的紧密性和持续性。首先,软硬件协同\index{软硬件协同}分析和建模成为必须,这类系统的发展大部分是由先进硬件技术驱动的,集成电路的成本、尺寸和能耗的显著降低,和各类嵌入集成电路的、带计算能力的设备的不断增加,使得能通过像调用软件一样灵活地调用设备。另一方面,在硬件设备中嵌入的软件能力,又为许多设备提供了新颖的功能,例如家用电器的网络连接等。这种趋势和挑战要求采用系统的方法来设计具有大量计算节点的大型网络化系统。通过网络将大量物理设备连接起来,这些数量庞大的设备进行实时数据采集,产生了大量的数据,这些数据呈指数级增长,并进行彼此间的信息交互,形成了复杂的网络。这些数据的处理促进了新软件的诞生,系统规模日益增大。在这样一个广泛嵌入各种感知与控制智能设备后的物理世界场景下,系统能够全面地感知环境信息,并智能地为人类提供各种便捷的服务。
|
||||
|
||||
第三,在系统分析和建模中,纳入人的行为分析和建模也成为必须,因为人的日常生活将和这些大型网络化系统紧密地联系在一起,比如,目前,全球已经大约40亿人连入互联网,每个人都在智能终端、个人电脑上使用各种各样的软件,发微博、发微信、全球每天会有2.88万小时的视频上传到Youtube,会有上千万条信息上传到Twitter,会在亚马逊产生上百万笔订单,…。这些数据都是由人和系统的持续交互产生的结果,人的行为和意图将成为系统分析和建模的重要关注点。
|
||||
第三,在系统分析和建模中,纳入人的行为分析和建模也成为必须,因为人的日常生活将和这些大型网络化系统紧密地联系在一起,比如,目前,全球已经大约40亿人连入互联网,每个人都在智能终端、个人电脑上使用各种各样的软件,发微博、发微信、全球每天会有2.88万小时的视频上传到Youtube,会有上千万条信息上传到Twitter,会在亚马逊产生上百万笔订单,……这些数据都是由人和系统的持续交互产生的结果,人的行为和意图将成为系统分析和建模的重要关注点。
|
||||
|
||||
\subsubsection{开放和不确定环境}
|
||||
|
||||
|
@ -61,7 +61,7 @@
|
|||
与人工编程相比,机器编程的优势在于机器编程可以利用计算机的强大计算能力,劣势在于机器编程主要从已有代码中学习,缺乏有效处理边角信息的能力,因此高效的人机协作将能更好地发挥两者的优势。支持高效人机互动的开发环境\index{开发环境}一直是软件工程关注的重点之一,最早的开发环境只是一系列工具的简单堆叠,真正意义上的开发环境是在上世纪八十年代以后发展起来的,这类开发环境的主要特点在于,开发者是整个开发环境的主导,开发环境是开发者的操控台和延伸,进入到新世纪开发环境有两个新的发展趋势:1、开发环境中开始出现一些智能服务(如代码推荐等),虽然能够进入主流开发环境的智能服务仍十分有限,但学术界研究的智能工具多以开发环境的插件形式展现;2、开发环境开始支持开发者间的交互,虽然这与开发者间远程协作需求的增长有关(短程协作中开发者可以进行面对面的交流),但却为探索多开发者协同提供了有益尝试。为了满足人机协作编程的需要,开发环境需要应对以下两方面的挑战:1、建立开发者对机器编程的信任关系:在开发者主导的环境中开发者更多依赖自己的主观判断,但在人机协作环境中开发者完全可控的范围缩小将更依赖机器编程,如果开发者不能确信机器编程能否完成特定任务,就会严重影响开发效率;2、实现人机多渠道交互:现有开发环境中的人机交互以及开发者间的交互方式主要以文本方式进行,而人类通常习惯同时以多种方式进行交流,这样才能更好激发开发者的创造力。
|
||||
|
||||
\subsection{开发运维一体化}
|
||||
软件开发是人类的一项高复杂度的集体智力活动,其现实问题的复杂度反映到开发中主要表现为架构、过程、技术和组织四个维度上的复杂度,它们往往紧密地交织纠缠在一起并相互转化。软件工程在这四个维度上发展趋势,即架构逐渐去中心化,技术趋于平台化、自动化和虚拟化,过程趋于增量和迭代,组织趋于小而自治,开发运维一体化(DevOps)集中体现了这些发展趋势的高阶形态。随着互联网化和服务化的高度发展和走向成熟使得未来的软件更加需要具备持续(continuous)的特征。这种持续性将覆盖从商业策划、开发到运维以及演化的所有环节,使得未来软件系统像具有生命一般:在持续稳定提供服务的同时,软件系统的边界、发展走向等不再固化,而是始终处在不断变化和适应之中。持续性与上述的架构、过程、技术与组织四个维度的复杂性交织在一起,再叠加性能、安全等质量要求和实效性要求等,使得未来的软件系统的开发和运维面临诸多的挑战,这就需要我们在原则、方法、实践以及工具层面都做要充分的应对。
|
||||
软件开发是人类的一项高复杂度的集体智力活动,其现实问题的复杂度反映到开发中主要表现为架构、过程、技术和组织四个维度上的复杂度,它们往往紧密地交织纠缠在一起并相互转化。软件工程在这四个维度上发展趋势,即架构逐渐去中心化,技术趋于平台化、自动化和虚拟化,过程趋于增量和迭代,组织趋于小而自治,开发运维一体化(DevOps)集中体现了这些发展趋势的高阶形态。随着互联网化和服务化的高度发展和走向成熟使得未来的软件更加需要具备持续(Continuous)的特征。这种持续性将覆盖从商业策划、开发到运维以及演化的所有环节,使得未来软件系统像具有生命一般:在持续稳定提供服务的同时,软件系统的边界、发展走向等不再固化,而是始终处在不断变化和适应之中。持续性与上述的架构、过程、技术与组织四个维度的复杂性交织在一起,再叠加性能、安全等质量要求和实效性要求等,使得未来的软件系统的开发和运维面临诸多的挑战,这就需要我们在原则、方法、实践以及工具层面都做要充分的应对。
|
||||
|
||||
\subsubsection{构建按需(On-Demand)的基础设施}
|
||||
作为DevOps产生的技术和平台基础,基础设施(Infrastructure)可能是未来DevOps能够发挥更大作用的关键环节。然而,如何匹配软件系统运行需求(或者企业需求)来构建适用的基础设施一直是需要重点关注的话题。值得关注的几个挑战包括:1)混合云\index{混合云},即为了更好的适应各种业务场景,混合云是一种合理的选择,但是由此带来的异构、安全、可扩展等方面的挑战不容忽视;2)边缘计算,即为了尽可能减少数据传输代价,就近提供计算服务是一种选择,但是,这会大大增加基础设施的复杂程度,带来软件系统部署和维护方面的巨大挑战。3)基础设施自动化和智能化,即提供自动化和智能化类的处理流程来进行基础设施的管理和维护。现有IT基础设施和环境往往已经足够复杂,同时也缺乏跨系统、平台以及流程的可见性,叠加基础设施、运行其上的软件系统和业务往往都是紧耦合的,这些因素都给自动化和智能化带来了巨大挑战。此外,为基础设施注入内建安全机制等也都是未来支撑DevOps发展的IT基础设施亟待解决的挑战。
|
||||
|
@ -78,7 +78,7 @@ DevOps 持续高效高质量的交付有赖于高度自动化支持工具的支
|
|||
\subsubsection{智能化运维}
|
||||
作为DevOps中的Ops一端,运维的重要性越来越突显。工业界目前已经开始实践智能化运维(AIOps)技术以有效降低运维成本、提高运维效率和质量。我们注意到,随着各类AI技术和方法的迅速发展,智能化运维尽管已经有了较为坚实的基础,但是其有效实施却直接依赖于软件系统或者服务的运行时产生的各类数据和信息的质量。目前智能化运维主要提供一些相对简单的标准化日志信息的捕获、分析和决策;同时,当前的AIOps主要关注在运维一侧,尚未有效形成运维-开发的反馈闭环,以支持开发团队高效应对运维变化的新需求。此外,智能化运维依赖的各类数据和信息也都有各自缺点:日志数据的产生主要依赖程序员的个人经验,实践中往往日志实践开展的质量很差,导致大部分日志文件中充斥着毫无价值的垃圾信息,难以支持对软件行为的有效捕获;指标数据则是一种隔靴搔痒的环境数据,对错误定位的支持非常有限;跟踪路径数据会在瞬间产生巨量数据,导致完全无法分析。因此,如何充分使用这三类数据,在更加精细的力度上捕获软件应用或者服务的行为,进而提供更加准确的信息供分析,这是智能化运维需要解决的关键问题。
|
||||
\subsubsection{支撑DevOps规模化的组织与管理}
|
||||
DevOps整合了开发团队与运维团队,使其成为一个整体,这使得团队的组织、文化和软件过程都与单纯的开发团队和运维团队有所不同。同时,团队的规模也不可避免的有所增加,降低了团队面对面沟通的效率。DevOps是受到敏捷软件开发的影响而产生的,天然带有敏捷基因并植根于精益思想。然而,敏捷方法的很多理念和实践并不能天然应用于DevOps。例如,常规敏捷方式鼓励着眼当前问题同时通过承担一定程度的技术负债来应对未来的多种可能变化。这种寻求局部最优解的思维方式并不利于打破各个部门之间的壁垒。又如,在敏捷宣言鼓励之下的“重代码轻文档”工作方式对于持续性的维持还是弊大于利,毕竟我们不会轻易终止一款软件系统。另一方面,随着开发和维护的软件系统越来越复杂,其规模也越来越大,在开发运维团队合并后,必然要求团队规模也相应扩大,团队之间的协作和交流也会更加复杂。敏捷社区提出了SAFe(Scaled Agile Framework来支持更大规模的团队,目前已经列入DevOps相关内容。然而,也有很多人批评SAFe过于复杂,违背了敏捷的基本价值观。从这个意义上说,如何在大规模团队中实施DevOps仍将成为未来一段时间研究者和实践者需要解决的问题。
|
||||
DevOps整合了开发团队与运维团队,使其成为一个整体,这使得团队的组织、文化和软件过程都与单纯的开发团队和运维团队有所不同。同时,团队的规模也不可避免的有所增加,降低了团队面对面沟通的效率。DevOps是受到敏捷软件开发的影响而产生的,天然带有敏捷基因并植根于精益思想。然而,敏捷方法的很多理念和实践并不能天然应用于DevOps。例如,常规敏捷方式鼓励着眼当前问题同时通过承担一定程度的技术负债来应对未来的多种可能变化。这种寻求局部最优解的思维方式并不利于打破各个部门之间的壁垒。又如,在敏捷宣言鼓励之下的“重代码轻文档”工作方式对于持续性的维持还是弊大于利,毕竟我们不会轻易终止一款软件系统。另一方面,随着开发和维护的软件系统越来越复杂,其规模也越来越大,在开发运维团队合并后,必然要求团队规模也相应扩大,团队之间的协作和交流也会更加复杂。敏捷社区提出了SAFe(Scaled Agile Framework)来支持更大规模的团队,目前已经列入DevOps相关内容。然而,也有很多人批评SAFe过于复杂,违背了敏捷的基本价值观。从这个意义上说,如何在大规模团队中实施DevOps仍将成为未来一段时间研究者和实践者需要解决的问题。
|
||||
|
||||
\section{主要研究内容}
|
||||
面向高效、高质量、低成本开发和演化软件系统的总体目标,软件开发方法和技术的研究范围涵盖新型程序设计与软件方法学\index{软件方法学}、软件自动化技术、软件复用\index{软件复用}技术、软件自适应与生长\index{软件自适应与生长}技术、复杂软件分析与建模、智能软件开发方法、嵌入式软件\index{嵌入式软件}开发方法与技术、复杂系统需求分析方法与技术、\index{软件服务}化方法与技术等各个方面。结合应对以上重大挑战问题,主要研究内容将集中在人机物融合场景建模、系统自适应需求分析、系统内生安全规约获取、群智软件生态、群智开发方法、群智协同演化、群智软件支撑环境、面向机器编程的代码生成、面向人机协同的智能开发环境、开发过程建模与优化、软件系统运行数据管理、安全可信的开发运维一体化、开发运维一体化的组织与管理、微服务软件体系结构等。
|
||||
|
@ -123,7 +123,7 @@ DevOps整合了开发团队与运维团队,使其成为一个整体,这使
|
|||
为了缩短软件从产品设计到呈现给最终用户的时间,DevOps整合了软件开发和运维团队,这使得DevOps团队的组织、文化和过程都与单纯开发、运维团队不同。从组织与管理角度,DevOps需要解决以下问题:(1)使用经验软件工程的方法,探寻适合DevOps的组织结构和过程实践,并进行验证;(2)如何既能通过团队自组织工作方式提升效率,同时又能够避免由于具体人员技能缺失或管理人员与DevOps团队缺乏信任关系造成的失败,在敏捷与规范之间取得平衡;(3)在大型项目中,使用怎样的组织方式和软件过程,能够使得DevOps项目具有敏捷应对变更的优势以及工作效率。
|
||||
|
||||
\subsection{微服务软件体系结构}
|
||||
围绕微服务架构有如下几类研究值得关注:(1)实现合适粒度的微服务划分方法,主要研究内容包括:基于领域驱动设计方法识别限界上下文以实现高内聚、低耦合的服务;利用遗留系统的现有构件信息识别候选微服务;综合利用多种划分策略实现复杂系统的服务划分等。(2)基于微服务架构的快速故障定位和消除,主要研究内容包括:构建更加完善的监控系统,除了基础指标监控功能,实现分布式服务链路追踪和日志聚合分析等高级功能来帮助故障排查和定位;基于AIOps实现智能告警运维,通过已经构建的监控系统平台对多种类型数据进行不同形式的采集(有代理和无代理)、处理、存储,使用并改进机器学习算法对运维数据进行分析预测,实现多种场景的智能告警运维;微服务架构评估,即提出面向微服务系统的一般化架构质量评价方法,为微服务系统架构质量的评估过程提供指南,总结供架构评估使用的核查表(checklist)以支持开发和运维中的微服务架构实践。
|
||||
围绕微服务架构有如下几类研究值得关注:(1)实现合适粒度的微服务划分方法,主要研究内容包括:基于领域驱动设计方法识别限界上下文以实现高内聚、低耦合的服务;利用遗留系统的现有构件信息识别候选微服务;综合利用多种划分策略实现复杂系统的服务划分等。(2)基于微服务架构的快速故障定位和消除,主要研究内容包括:构建更加完善的监控系统,除了基础指标监控功能,实现分布式服务链路追踪和日志聚合分析等高级功能来帮助故障排查和定位;基于AIOps实现智能告警运维,通过已经构建的监控系统平台对多种类型数据进行不同形式的采集(有代理和无代理)、处理、存储,使用并改进机器学习算法对运维数据进行分析预测,实现多种场景的智能告警运维;微服务架构评估,即提出面向微服务系统的一般化架构质量评价方法,为微服务系统架构质量的评估过程提供指南,总结供架构评估使用的核查表(Checklist)以支持开发和运维中的微服务架构实践。
|
||||
|
||||
\section{本章小结}
|
||||
高效、高质量、低成本地开发和演化软件系统是软件开发方法和技术研究追求的总体目标。本章分析了在这个总体目标指引下,面对人机物融合应用场景需求软件开发方法和技术研究将面临的重大挑战,并在此基础上阐述了相关的主要研究内容。
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
在建立价值观的基础上要进一步建立各类软件质量保障措施,也即围绕各类软件质量关注点提供解决问题的方法和技术。从系统观与生态观的角度看,软件质量的考虑涉及更宽广的范畴。例如,从系统工程的角度看,如何在经济可行条件约束下通过综合集成的方法,用可担负质量的部件实现高质量的系统。又如,如何认识在软件生态系统中质量的依赖与传播规律;考虑到软件生态中各类利益相关者的价值差异和冲突,软件及其服务的质量如何取舍权衡等等。以上内容相关的质量保障措施值得进一步研究,但由于篇幅有限,本章主要关注以下更加迫切、更具挑战性的软件质量与安全保障问题。
|
||||
|
||||
随着软件质量的核心价值观从“绝对正确”转变为“相对可信”,度量与评估软件符合预期的程度成为软件质量保障的基础性挑战问题。随着人机物融合程度的加深,实时混成、云端融合、复杂异构、动态聚合、智能适应等非经典需求与应用场景层出不穷,软件系统设计、实现和运行过程中需要采用更具针对性的质量保障措施。大规模复杂系统的安全保障变得更重要但又更困难,迫切需要新的技术突破;确保物联网软件安全上升到了国家安全高度,亟需系统深入的研究工作。特别地,数据驱动的智能软件日益成为一类重要的软件形态,不同于传统软件,这类软件基于概率化的归纳推理来实现智能行为,对各类不确定性的驾驭是其内在的要求,如何有效评估和保障这类智能化软件系统与服务的质量也是亟待研究的问题。
|
||||
随着软件质量的核心价值观从“绝对正确”转变为“相对可信”,度量与评估软件符合预期的程度成为软件质量保障的基础性挑战问题。随着人机物融合程度的加深,实时混成、云端融合、复杂异构、动态聚合、智能适应等非经典需求与应用场景层出不穷,软件系统设计、实现和运行过程中需要采用更具针对性的质量保障措施。大规模复杂系统的安全保障变得更重要但又更困难,迫切需要新的技术突破;确保物联网软件安全上升到了国家安全高度,亟需系统深入的研究工作。特别地,数据驱动的智能软件日益成为一类重要的软件形态,不同于传统软件,这类软件基于概率化的归纳推理来实现智能行为,对各类不确定性的驾驭是其内在的要求,如何有效评估和保障这类智能软件系统与服务的质量也是亟待研究的问题。
|
||||
|
||||
\section{重大挑战问题}
|
||||
|
||||
软件质量与安全保障面临的重大挑战问题主要集中以下几个方面:一是在人工智能时代,数据驱动的智能软件系统高度复杂的数据依赖、软件行为不确定性、计算结果鲁棒性方面,对软件质量提出了新的挑战;二是可信增强,人机物融合场景下的规模化、定义化的软件系统,如何才能将针对传统静态、封闭、开发阶段的可信度量、评估和增强技术,支持动态、开放、演化的软件;三是软件与系统安全,现阶段遇到的挑战主要在于如何针对大规模复杂软件系统和无处不在的物联网软件,有效检测漏洞或恶意软件等安全缺陷,并通过构建准确、高效的缺陷修复技术及漏洞防御机制保障安全。
|
||||
软件质量与安全保障面临的重大挑战问题主要集中以下几个方面:一是在人工智能时代,数据驱动的智能软件系统高度复杂的数据依赖、软件行为不确定性、计算结果鲁棒性方面,对软件质量提出了新的挑战;二是针对人机物融合场景下的规模化、定义化的软件系统,如何应对传统静态、封闭、开发阶段的可信度量、评估和增强带来的挑战,以支持软件系统的动态、开放、演化;三是如何针对大规模复杂软件系统和无处不在的物联网软件,有效检测漏洞或恶意软件等安全缺陷,并通过构建准确、高效的缺陷修复技术及漏洞防御机制保障安全。
|
||||
|
||||
\subsection{数据驱动的智能软件系统质量保障}
|
||||
|
||||
|
@ -23,22 +23,22 @@
|
|||
(3) 智能系统需具备运行时故障诊断、预测及自愈的能力。智能系统常常需要融合多种硬件设施、软件组件,实时完成大规模数据的采集、综合、分析等处理,实现智能感知和智能决策。系统应用场景多样,功能组合繁多,输入空间难以穷尽,条件组合数量巨大;在实际运行中,软硬件环境等因素复杂多变,各种情况叠加在一起综合作用。离线测试阶段难以覆盖各种可能的场景。另一方面,系统常需要集成大量第三方的数据和软件,如深度学习与机器学习框架。在实际应用中,第三方服务的稳定性、可靠性、安全性以及不同来源的服务之间的兼容性、互操作性等问题,都给系统集成带来了巨大的挑战。因此,运行过程中及时发现和诊断乃至预测系统故障、及时修复故障或通过容错等机制保持系统正常运行,对于保证业务安全和系统高可用性至关重要。
|
||||
|
||||
\subsection{人机物融合场景下的软件系统可信增强}
|
||||
与传统系统不同,人机物融合场景下的软件系统将计算部件与物理环境进行一体化整合,将大量独立的异构设备(及其数据)进行智能化的连接,并针对当前系统、场景等的实时变化根据任务需求对计算逻辑,乃至系统架构进行自动调整与配置。这样,计算设备可以更精确的获取外界信息并做出针对性、智能化的实时反映,从而提高计算的性能与质量,给出及时、精确并且安全可靠的服务,实现物理世界与信息系统的整合统一\cite{lee2006cyber}。显然,列车、电网、航天等典型安全攸关系统均具有鲜明的人机物融合特质。如何对相关系统的可信性进行保障对相关系统的正确运行具有重要意义。然而,在人机物融合的场景下,相关异构、组合、动态等特性也给系统行为可信保障带来了新的挑战与需求。
|
||||
与传统系统不同,人机物融合场景下的软件系统将计算部件与物理环境进行一体化整合,将大量独立的异构设备(及其数据)进行智能化的连接,并针对当前系统、场景等的实时变化根据任务需求对计算逻辑,乃至软件体系结构进行自动调整与配置。这样,计算设备可以更精确的获取外界信息并做出针对性、智能化的实时反映,从而提高计算的性能与质量,给出及时、精确并且安全可靠的服务,实现物理世界与信息系统的整合统一\cite{lee2006cyber}。显然,列车、电网、航天等典型安全攸关系统均具有鲜明的人机物融合特质。如何对相关系统的可信性进行保障对相关系统的正确运行具有重要意义。然而,在人机物融合的场景下,相关异构、组合、动态等特性也给系统行为可信保障带来了新的挑战与需求。
|
||||
|
||||
(1) 人机物融合场景下组件间将进行频繁的通信、合作与协同,去完成复杂的任务。因此,相关系统是一个典型的组合系统。长期以来,对大规模组合系统进行分析、测试、验证一直是相关领域难点所在。此外,由于在人机物融合场景下不确定性、概率性行为、实时连续行为越来越常见。如何在建模阶段对随机、不确定、连续行为进行描述,并在分析中对相关行为进行研究,也是对相关复杂不确定系统进行可信增强的一个重要挑战。
|
||||
|
||||
(2) 相较于一般静态可预测系统,人机物融合场景下系统行为更加强调于实时捕获、采集环境或者其他协作成员的运行时参数,从而进行自身策略,乃至组件间拓扑结构的智能化调整。在开放环境下,相关外界参数取值随时间变化,难以准确离线刻画。因此,从传统的静态测试、分析、验证等角度出发,难以遍历枚举相关开放动态行为中可能出现的所有场景,无法给出完整状态空间描述与安全保障。在此情况下,如何从运行时监控角度应对开放环境带来的连续动态行为是相关领域重要关注问题。
|
||||
(2) 相较于一般静态可预测系统,人机物融合场景下系统行为更加强调于实时捕获、采集环境或者其他协作成员的运行时参数,从而进行自身策略,乃至组件间拓扑结构的智能调整。在开放环境下,相关外界参数取值随时间变化,难以准确离线刻画。因此,从传统的静态测试、分析、验证等角度出发,难以遍历枚举相关开放动态行为中可能出现的所有场景,无法给出完整状态空间描述与安全保障。在此情况下,如何从运行时监控角度应对开放环境带来的连续动态行为是相关领域重要关注问题。
|
||||
|
||||
(3) 从系统观来认识人机物融合系统,我们会发现在人机物融合场景下,相关系统的多组件行为呈现出典型的分布式、异构式特征。在组件内部行为难以描述,组件间相互规格和工作方式差异巨大,难以整体把控的情况下,如何从体系结构角度对系统可信增强进行考虑,设计面向容错的新型协同设计方式及异构系统体系结构,为相关软件设计提出了新的挑战。
|
||||
|
||||
\subsection{大规模复杂系统安全缺陷检测}
|
||||
现代软件系统因需求的快速迭代而增量构建、经过频繁重构和演化、规模庞大、复杂度高,都是典型的大规模复杂系统,在企业应用、城市交通、航空航天、智能电网、医疗、指挥控制等重要领域已经成为了不可或缺的一部分,但其实现中存在漏洞或恶意代码等安全缺陷,是导致大规模复杂系统安全性问题的主要根源,而要想保障其安全,需要即时检测并排除安全缺陷,但随着软件的规模和复杂性的不断增大,现有软件安全保障技术与工具的有效性和可扩展性受到了严重制约,软件安全缺陷检测和排除尚未改变以人为中心、侧重经验的实践现状,尚未能形成自动化、客观化的解决方案\cite{cousot2018program, zhang2019recent}。综上所述,软件安全保障所面临的新挑战主要包括:
|
||||
现代软件系统因需求的快速迭代而增量构建、经过频繁重构和演化、规模庞大、复杂度高,都是典型的大规模复杂系统。他们在企业应用、城市交通、航空航天、智能电网、医疗、指挥控制等重要领域已经成为了不可或缺的一部分,但其实现中存在漏洞或恶意代码等安全缺陷,是导致大规模复杂系统安全性问题的主要根源;而要想保障其安全,需要即时检测并排除安全缺陷。但随着软件的规模和复杂性的不断增大,现有软件安全保障技术与工具的有效性和可扩展性受到了严重制约,软件安全缺陷检测和排除尚未改变以人为中心、侧重经验的实践现状,尚未能形成自动化、客观化的解决方案\cite{cousot2018program, zhang2019recent}。综上所述,软件安全保障所面临的新挑战主要包括:
|
||||
|
||||
(1) 安全缺陷统一建模。安全缺陷中,漏洞属于实现中存在遗漏,而恶意代码属于多余的实现,经过几十年的发展,已经公开了大量的安全缺陷,软件安全缺陷具有程序设计语言依赖、系统依赖等特征,有时还依赖于特定的硬件平台与体系结构,安全缺陷形态、机理各异。针对特定的安全缺陷,研究相应的检测方法进行精准制约化检测,虽在特定场景下可行,但已不能满足实际的安全需求。面临的挑战主要在于如何统一表达安全缺陷的语法、语义特征、触发规则、行为特征等问题,使得能够通过相关检测算法高效、精准识别安全缺陷;在此基础上,解决安全缺陷检测方法的平台化、引擎化、定制化,以便检测已有的重要安全缺陷,并具备扩展能力,检测新的安全缺陷。
|
||||
(1) 安全缺陷统一建模。安全缺陷中,漏洞属于实现中存在遗漏,而恶意代码属于多余的实现。经过几十年的发展,已经公开了大量的安全缺陷,软件安全缺陷具有程序设计语言依赖、系统依赖等特征,有时还依赖于特定的硬件平台与体系结构,安全缺陷形态、机理各异。针对特定的安全缺陷,研究相应的检测方法进行精准制约化检测,虽在特定场景下可行,但已不能满足实际的安全需求。面临的挑战主要在于如何统一表达安全缺陷的语法、语义特征、触发规则、行为特征等问题,使得能够通过相关检测算法高效、精准识别安全缺陷;在此基础上,解决安全缺陷检测方法的平台化、引擎化、定制化,以便检测已有的重要安全缺陷,并具备扩展能力,检测新的安全缺陷。
|
||||
|
||||
(2) 大规模复杂系统安全缺陷检测方法的效率和资源有效协同。根据已公开的安全缺陷特征,通过静态分析、测试和验证等方法检测潜在安全缺陷,是目前被普遍采用的技术。但随着软件系统规模越来越大、系统功能日趋复杂,公开安全缺陷的数量也急剧上升,安全缺陷检测方法的精准性和规模化能力是难点问题。面临的挑战主要包括:1)需要平衡在处理大规模程序时在精度和可扩展性之间取舍。高精度的检测方法需要更多的资源开销,并且受到程序规模的制约,而为了适应大规模程序的安全缺陷检测,采用保守的策略,会导致大量的误报,且需要人工进一步确认,从而降低了检测方法的可用性; 2)需要平衡协同计算资源的消耗与检测效率。安全缺陷检测方法可以提升精度但增加复杂度且需要更高的计算资源,可以利用大数据处理、硬件加速、并行化等技术优化检测算法,依据特定的规则将大规模代码进行切分,将检测任务并行化处理、并将其分配到不同的计算资源上完成检测工作。
|
||||
(2) 大规模复杂系统安全缺陷检测方法的效率和资源有效协同。根据已公开的安全缺陷特征,通过静态分析、测试和验证等方法检测潜在安全缺陷,是目前被普遍采用的技术。但随着软件系统规模越来越大、系统功能日趋复杂,公开安全缺陷的数量也急剧上升,安全缺陷检测方法的精准性和规模化能力是难点问题。面临的挑战主要包括:1)需要在处理大规模程序时平衡精度和可扩展性。高精度的检测方法需要更多的资源开销,并且受到程序规模的制约,而为了适应大规模程序的安全缺陷检测,采用保守的策略,会导致大量的误报,且需要人工进一步确认,从而降低了检测方法的可用性; 2)需要平衡协同计算资源的消耗与检测效率。安全缺陷检测方法可以提升精度但增加复杂度且需要更高的计算资源,可以利用大数据处理、硬件加速、并行化等技术优化检测算法,依据特定的规则将大规模代码进行切分,将检测任务并行化处理、并将其分配到不同的计算资源上完成检测工作。
|
||||
|
||||
(3) 安全缺陷检测过程中大规模状态空间的充分探索。在安全缺陷检测过程,需要尽快探索到目标程序的状态空间,以检测潜在的安全缺陷,由于复杂软件系统的程序状态空间十分庞大,如何有效地探索程序的状态空间是需要解决的关键问题,具体包括以下几个方面:1)程序分支和循环结构的深度覆盖:通过探索程序状态空间过程中历史覆盖、缺陷检测、冗余等信息,有效地制导探索过程,尽早覆盖关键的程序状态空间;2)多元信息制导的模糊测试输入生成:利用程序结构、安全缺陷特征、执行结果反馈等信息,有效地制导模糊测试,使其能够产生覆盖多样性目标的输入空间,从而快速覆盖程序状态空间,到达能够触发安全缺陷的程序行为路径。
|
||||
(3) 安全缺陷检测过程中大规模状态空间的充分探索。在安全缺陷检测过程,需要尽快探索到目标程序的状态空间,以检测潜在的安全缺陷,由于复杂软件系统的程序状态空间十分庞大,如何有效地探索程序的状态空间是需要解决的关键问题,具体包括以下几个方面:1)程序分支和循环结构的深度覆盖:通过探索程序状态空间过程中历史覆盖、缺陷检测、冗余等信息,有效地制导探索过程,尽早覆盖关键的程序状态空间;2)多维信息制导的模糊测试输入生成:利用程序结构、安全缺陷特征、执行结果反馈等信息,有效地制导模糊测试,使其能够产生覆盖多样性目标的输入空间,从而快速覆盖程序状态空间,到达能够触发安全缺陷的程序行为路径。
|
||||
(4) 历史漏洞机理和安全专家经验难以复用。在现有安全缺陷检测的分析和测试过程中,多个环节存在不确定性,仍需要安全专家人工进行决策。这些安全专家经验以及历史漏洞的机理信息对后续漏洞分析、检测、利用和修复工作能够起到很大作用。但遗憾的是,这些经验在现阶段难以实现高准确度的复用。然而,机器学习、深度学习等人工智能技术现已在文本翻译、图像处理、语音识别等方面得到广泛应用,使其具备人的智能而实现自主决策。因此,如何在安全缺陷检测和预警的各个环节中引入智能化技术,是现阶段所面临的重要挑战,具体包括以下两个方面:1)安全缺陷检测历史信息的智能化:将安全缺陷检测历史信息及其统计特征知识化,以便在安全缺陷检测过程中进行智能化预测;将深度学习技术应用到安全缺陷检测样本代码相似度映射中以便实现同源安全缺陷检测和挖掘的智能化,应用到输入域、程序结构的映射中实现模糊测试中输入生成的智能化;2)安全专家经验的知识化和智能化利用:分析安全缺陷检测过程中的专家经验,进而抽象其为安全缺陷检测的启发式规则,以便在安全缺陷检测过程中根据自动搜索经验知识空间实现安全缺陷检测的智能化。
|
||||
|
||||
(5) 面向安全保障的缺陷自动修复与验证。及时修复软件中存在的安全缺陷,是保障软件安全的主要手段,现阶段主要依靠人工修复软件安全缺陷需要花费大量的时间精力阅读理解程序代码、定位安全缺陷并修复,非常耗时耗力。面临的挑战主要在于:1)如何针对安全缺陷实现自动修复。基于遗传算法、程序搜索、程序合成等手段的软件缺陷的自动修复方法面临在实际系统中应用的可扩展性、可用性等方面的挑战。2)如何自动验证修复。目前存在一些修复方法在某些实验途径上可以证实有效性,但缺少理论基础,无法保障其完备性,需要有手段保证安全缺陷修复措施符合预期。
|
||||
|
@ -50,14 +50,14 @@
|
|||
|
||||
(2) 面向完整物联网软件系统的模糊测试\index{模糊测试}。物联网边界模糊、设备异构,物联网软件实现了控制、计算与通信的集成,使其在处理能力不断强大的同时,内部结构也变得愈加庞杂且与外部世界的交互变得愈加频繁,而现有的模糊测试方法主要针对物联网软件系统自身故障进行安全检测,面临的挑战在于如何针对物联网系统与环境,探索使用基于人工智能技术、深度学习方法,构建智能化模糊测试方法,将物联网状态空间中搜索安全缺陷的问题转化为目标制导模糊测试与优化问题。
|
||||
|
||||
(3) 面向动态安全检测的物联网软件仿真\index{软件仿真}与虚拟化技术。现有物联网软件测试需要互联网环境支撑、动态执行设备,并依据获取的运行时反馈信息进行分析,使得运行时安全检测面临驱动设备运行困难、捕获设备反馈困难、识别安全缺陷困难等问题,具体包括:1)物联网软件仿真技术。由于物联网软件依赖的终端硬件、体系架构、指令集、部署配置的多样性,如何在支持相应固件体系结构、指令集的模拟器的基础上构建通用仿真执行支撑环境;如何针对基于特定外设,基于适配接口构建物理设备运行驱动环境,从而实现能对典型设备进行运行驱动的支撑;如何利用通用仿真环境和物理环境的支撑,捕获运行时的物理设备的状态、仿真环境下覆盖等反馈信息,便于安全缺陷检测过程。 2)物联网系统环境建模与虚拟化技术,物联网软件需要通过外设、互联网接口与外界交互,如何基于各类网络协议,对多类交互输入接口进行虚拟化和数字化的基础上统一建模,对物联网运行依赖的系统软件平台进行虚拟化建模与支撑。
|
||||
(3) 面向动态安全检测的物联网软件仿真\index{软件仿真}与虚拟化技术。现有物联网软件测试需要互联网环境支撑、动态执行设备,并依据获取的运行时反馈信息进行分析,使得运行时安全检测面临驱动设备运行困难、捕获设备反馈困难、识别安全缺陷困难等问题,具体包括:1)物联网软件仿真技术。由于物联网软件依赖的终端硬件、体系结构、指令集、部署配置的多样性,如何在支持相应固件体系结构、指令集的模拟器的基础上构建通用仿真执行支撑环境;如何针对基于特定外设,基于适配接口构建物理设备运行驱动环境,从而实现能对典型设备进行运行驱动的支撑;如何利用通用仿真环境和物理环境的支撑,捕获运行时的物理设备的状态、仿真环境下覆盖等反馈信息,便于安全缺陷检测过程。 2)物联网系统环境建模与虚拟化技术,物联网软件需要通过外设、互联网接口与外界交互,如何基于各类网络协议,对多类交互输入接口进行虚拟化和数字化的基础上统一建模,对物联网运行依赖的系统软件平台进行虚拟化建模与支撑。
|
||||
|
||||
\section{主要研究内容}
|
||||
软件系统质量和安全保障的重点,仍然是通过相关技术手段和管理手段来检测、度量和评估软件制品符合预期的程度,并排除或容忍软件制品中不符合预期的因素,从而实现保障软件系统的实现和行为符合预期。但由于软件在社会生活中的作用发生根本性变化,我们需要从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面的研究内容,整体框架如图\ref{fig8}所示。具体而言,需要研究软件伦理、软件公平性、软件授权、软件立法等非技术因素扩展软件预期外延的方法,以及相应的检测、度量和评估技术;由于软件自身的发展、开源软件的大量使用,软件系统的规模和复杂度大幅度提升,运行软件的平台不断变迁、软件自身的形态不断变化,面向缺陷检测,需要研究分析、测试、验证、监控等检测与度量技术的能力提升和可扩展性途径;对现有的检测、度量、保障和评估技术不能满足实际需求时,需要研究相应的形式化方法\index{形式化方法}、模型驱动方法\index{模型驱动方法}、符号执行技术、人工智能技术、抽象解释技术、虚拟化技术、并行化技术等支撑技术;随着软件的运行环境动态开放、系统的行为存在不确定性,需要研究软件系统动态行为的建模、监控、预测和容错;随着数据驱动的智能化软件大量应用于重要领域,需要研究作为软件制品的组成部分的数据和智能模型的质量保障;经过一段时间的安全检测与保障,已在全球构建各类公开的漏洞库/恶意软件库,需要研究已知漏洞、恶意软件的检测、定位、修复,并探索未知漏洞、恶意软件的检测与报告;随着支持软件运行的平台已经从经典的计算机,转向端边云融合的泛在物联网计算设备,软件的形态已经成为驱动物联网设备的固件,需要研究物联网固件的分析、模糊测试、仿真等安全保障方法,以及相应的虚拟化支撑技术;软件自身的构建和维护、软件运行和提供服务过程中,软件质量和安全保障活动产生了大量数据,需要给予软件质量和安全的历史数据,从管理角度对研究在软件开发构建、运行维护过程中约束、规范人的行为,改进软件过程,从预防不符合预期制品的构建角度保障软件的质量和安全。
|
||||
软件系统质量和安全保障的重点,仍然是通过相关技术手段和管理手段来检测、度量和评估软件制品符合预期的程度,并排除或容忍软件制品中不符合预期的因素,从而实现保障软件系统的实现和行为符合预期。但由于软件在社会生活中的作用发生根本性变化,我们需要从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面的研究内容,整体框架如图\ref{fig8}所示。具体而言,需要研究软件伦理、软件公平性、软件授权、软件立法等非技术因素扩展软件预期外延的方法,以及相应的检测、度量和评估技术;由于软件自身的发展、开源软件的大量使用,软件系统的规模和复杂度大幅度提升,运行软件的平台不断变迁、软件自身的形态不断变化,面向缺陷检测,需要研究分析、测试、验证、监控等检测与度量技术的能力提升和可扩展性途径;对现有的检测、度量、保障和评估技术不能满足实际需求时,需要研究相应的形式化方法\index{形式化方法}、模型驱动方法\index{模型驱动方法}、符号执行技术、人工智能技术、抽象解释技术、虚拟化技术、并行化技术等支撑技术;随着软件的运行环境动态开放、系统的行为存在不确定性,需要研究软件系统动态行为的建模、监控、预测和容错;随着数据驱动的智能软件大量应用于重要领域,需要研究作为软件制品的组成部分的数据和智能模型的质量保障;经过一段时间的安全检测与保障,已在全球构建各类公开的漏洞库/恶意软件库,需要研究已知漏洞、恶意软件的检测、定位、修复,并探索未知漏洞、恶意软件的检测与报告;随着支持软件运行的平台已经从经典的计算机,转向端边云融合的泛在物联网计算设备,软件的形态已经成为驱动物联网设备的固件,需要研究物联网固件的分析、模糊测试、仿真等安全保障方法,以及相应的虚拟化支撑技术;软件自身的构建和维护、软件运行和提供服务过程中,软件质量和安全保障活动产生了大量数据,需要给予软件质量和安全的历史数据,从管理角度对研究在软件开发构建、运行维护过程中约束、规范人的行为,改进软件过程,从预防不符合预期制品的构建角度保障软件的质量和安全。
|
||||
|
||||
\begin{figure*}[!t]
|
||||
\centering
|
||||
\includegraphics[width=0.8\textwidth]{fig2-8/fig0801}
|
||||
\includegraphics[width=1.0\textwidth]{fig2-8/fig0801}
|
||||
%\vspace*{-15pt}
|
||||
\caption{\small 软件质量与安全保障研究内容框架}\label{fig8}
|
||||
\label{fig_sim}
|
||||
|
@ -91,11 +91,11 @@
|
|||
|
||||
\subsection{物联网软件的测试技术}
|
||||
|
||||
物联网软件存在的安全缺陷可能存在潜在的风险,其自身结构特性和环境依赖给软件测试带来新的问题。需要研究物联网软件建模、模型驱动测试与验证方法;研究针对物联网软件的静态分析和符号执行技术,支持典型安全缺陷的检测检测;研究面向物联网的智能模糊测试技术,用物联网软件结构、行为模型有效制导模糊测试,生成能够覆盖物联网软件输入域、结构和行为场景的测试输入,利用机器学习、深度学习等人工智能技术,基于对物联网软件结构与行为、物联网软件安全缺陷、模糊测试历史等知识和经验的学习,构建并训练映射模型,预测输入域与状态空间区域的映射关系,通过使用遗传算法、人为指定漏洞关联重点区域,优化模糊测试制导算法,避免无效、冗余的测试用例生成,在资源有限的情况下充分有效地遍历重要的状态空间尽早发现漏洞。
|
||||
物联网软件存在的安全缺陷可能存在潜在的风险,其自身结构特性和环境依赖给软件测试带来新的问题。需要研究物联网软件建模、模型驱动测试与验证方法;研究针对物联网软件的静态分析和符号执行技术,支持典型安全缺陷的检测;研究面向物联网的智能模糊测试技术,用物联网软件结构、行为模型有效制导模糊测试,生成能够覆盖物联网软件输入域、结构和行为场景的测试输入,利用机器学习、深度学习等人工智能技术,基于对物联网软件结构与行为、物联网软件安全缺陷、模糊测试历史等知识和经验的学习,构建并训练映射模型,预测输入域与状态空间区域的映射关系,通过使用遗传算法、人为指定漏洞关联重点区域,优化模糊测试制导算法,避免无效、冗余的测试用例生成,在资源有限的情况下充分有效地遍历重要的状态空间尽早发现漏洞。
|
||||
|
||||
\subsection{过程改进与预防式软件质量保障}
|
||||
|
||||
在DevOps、持续集成(Continuous Integration)、持续测试(Continuous Testing)、持续交付(Continuous Delivery)、智能运维(AIOps)等软件开发、集成和动态运行维护框架下,研究开发、集成、部署、运维流程中持续迭代的故障检测和质量评价等环节质量历史数据的分析方法,确定质量问题、追溯问题来源并评估质量风险,从管理角度对研究在软件开发构建、运行维护过程中约束、规范人的行为,从改进软件过程、预防不符合预期制品的构建角度保障软件的质量和安全。
|
||||
在DevOps、持续集成(Continuous Integration)、持续测试(Continuous Testing)、持续交付(Continuous Delivery)、智能运维(AIOps)等软件开发、集成和动态运行维护框架下,研究开发、集成、部署、运维流程中持续迭代的故障检测和质量评价等环节质量历史数据的分析方法,确定质量问题、追溯问题来源并评估质量风险,从管理角度在软件开发构建、运行维护过程中约束、规范人的行为,从改进软件过程、预防不符合预期制品的构建角度保障软件的质量和安全。
|
||||
|
||||
\section{本章小节}
|
||||
在“软件成为基础设施、软件定义一切”的背景下,本章基于软件的复杂加剧化、形态服务化、质量价值化、协作生态化的视角,从具有数据驱动、智能化、大规模、高复杂度、人机物融合等特征的角度分析了软件面临的质量和安全保障的重大挑战问题,在此基础上,从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面未来仍需研究的方向和内容。
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
随着软件技术的不断发展和软件应用领域的不断深入,软件项目越来越多样化和复杂化。一些大型项目(例如Linux内核项目)的代码规模几乎呈现指数级的增长。与此同时,软件项目之间的依赖关系多种多样,而这种依赖关系也在不断复杂化。
|
||||
|
||||
例如,一个软件项目可能同时依赖数千个其它软件项目。图\ref{fig:fig2}展示了CRAN(Comprehensive R Archive Network)复杂庞大的运行时依赖关系,其中节点是软件包(package),连线是软件包之间的运行时依赖关系。不同于围绕同一软件项目形成的生态系统,这种由于项目之间的互相依赖(例如软件的构建或运行时依赖、开发者同时参与多个软件项目、软件代码的复制粘贴、软件项目的定制化等)形成的复杂关系网络被称为软件供应链\cite{Mockus2019Keynote}。
|
||||
例如,一个软件项目可能同时依赖数千个其它软件项目。图\ref{fig:fig2}展示了CRAN(Comprehensive R Archive Network)复杂庞大的运行时依赖关系,其中节点是软件包(Package),连线是软件包之间的运行时依赖关系。不同于围绕同一软件项目形成的生态系统,这种由于项目之间的互相依赖(例如软件的构建或运行时依赖、开发者同时参与多个软件项目、软件代码的复制粘贴、软件项目的定制化等)形成的复杂关系网络被称为软件供应链\cite{Mockus2019Keynote}。
|
||||
|
||||
例如,一个企业可能将开源平台当作上游,对其进行定制化形成企业自研平台(例如很多企业将OpenStack作为上游定制了自有云平台、将Android作为上游定制了自有手机操作系统等),并在此基础上开发各类应用。与此同时,开源构件在开源平台、企业自研平台、以及各类应用中被广泛使用。开源平台、企业自研平台、各类应用、以及开源构件之间存在着互相依赖,但又可以独立演化。
|
||||
|
||||
|
@ -48,7 +48,7 @@
|
|||
\label{sec:se-difficulty}
|
||||
个体(主要包括开发者、维护者等)作为软件生态中的参与者,是影响软件质量和效率的关键因素,是软件生态中最核心的角色之一。近年来涌现的一些软件趋势及现象,诸如软件开发全球化、越来越多的高层次认知任务外包、互联网新媒体将软件活动改造成了社会化活动等,正在改变人们思考、学习、工作、以及协作的方式。同时,软件生态系统的复杂性不断增强,使得新人加入生态非常困难。因此,个体如何学习和加入复杂软件生态系统成为了一个亟待解决的问题。另外,以互联网为媒介的各种应用蓬勃发展,各种新的技术和新的应用方式层出不穷,这也给开发者如何快速学习并适应变化带来了很大的挑战。这方面问题都引起了工业界和学术界的广泛关注。。
|
||||
|
||||
“个体学习”包含了两层含义。第一,学习什么?一些复杂的大型软件项目,除了要求个体掌握必要的编程技能,项目所涉及的领域知识也需要开发者理解。除此之外,他们还需要学习如何与社区沟通(根据研究\cite{Astromskis2017Patterns},开发者近乎一半的工作时间都花费在沟通上),需要熟悉使用各种开发支持工具——这些工具及其积累的数据也是分布式环境下传播知识和学习项目的重要媒介\cite{Manikas2013Software}。第二,如何学习?一个开发者如何从初学新手成长为专业行家,如何从初进社区的新手角色变为核心团队成员,他怎么获取各种知识和信息,又是以一种什么顺序掌握等,这些都是理解个体学习的关键挑战。特别是在开源项目中,并无层级组织、训练计划、集中式的环境给予初学者必要的熏陶和培育,更多的是“边干边学”(learning by doing)。研究那些高产的开发者的学习轨迹,看他们如何获得技能、解决关键而复杂的任务,了解是什么激励了他们,也许能够将他们获得技能的方法具体化,并进一步地用于训练其他人;同时,高手和新手解决问题的心理模型不一样,因而在其指导新手时可能会出现失配问题(zone of proximal development,认知科学的一个重要发现\cite{Vygotsky1978Interaction})。如何理解项目中失配问题的本质,并建立相应技术和工具来更好适配新手的需求和高手的指导不仅能帮助个体成长,也将帮助软件项目和社区的发展;另外,对于要处理各种复杂编程任务的程序员,如何应对人类本身的认知局限性,例如工作记忆系统容量有限,认知负荷等问题,也是软件工程领域要考虑的问题。总的来说,我们需要对个体如何学习一个软件项目、如何使项目更具可读性(更容易被理解和学习)、如何创造革命性的资源和工具来提高新人的学习能力和生产力有更深入的理解。
|
||||
“个体学习”包含了两层含义。第一,学习什么?一些复杂的大型软件项目,除了要求个体掌握必要的编程技能,项目所涉及的领域知识也需要开发者理解。除此之外,他们还需要学习如何与社区沟通(根据研究\cite{Astromskis2017Patterns},开发者近乎一半的工作时间都花费在沟通上),需要熟悉使用各种开发支持工具——这些工具及其积累的数据也是分布式环境下传播知识和学习项目的重要媒介\cite{Manikas2013Software}。第二,如何学习?一个开发者如何从初学新手成长为专业行家,如何从初进社区的新手角色变为核心团队成员,他怎么获取各种知识和信息,又是以一种什么顺序掌握等,这些都是理解个体学习的关键挑战。特别是在开源项目中,并无层级组织、训练计划、集中式的环境给予初学者必要的熏陶和培育,更多的是“边干边学”(Learning by Doing)。研究那些高产的开发者的学习轨迹,看他们如何获得技能、解决关键而复杂的任务,了解是什么激励了他们,也许能够将他们获得技能的方法具体化,并进一步地用于训练其他人;同时,高手和新手解决问题的心理模型不一样,因而在其指导新手时可能会出现失配问题(Zone of Proximal Development,认知科学的一个重要发现\cite{Vygotsky1978Interaction})。如何理解项目中失配问题的本质,并建立相应技术和工具来更好适配新手的需求和高手的指导不仅能帮助个体成长,也将帮助软件项目和社区的发展;另外,对于要处理各种复杂编程任务的程序员,如何应对人类本身的认知局限性,例如工作记忆系统容量有限,认知负荷等问题,也是软件工程领域要考虑的问题。总的来说,我们需要对个体如何学习一个软件项目、如何使项目更具可读性(更容易被理解和学习)、如何创造革命性的资源和工具来提高新人的学习能力和生产力有更深入的理解。
|
||||
|
||||
\subsection{群体协作的不可控性}
|
||||
\label{sec:se-control}
|
||||
|
@ -77,10 +77,10 @@
|
|||
\subsubsection{数据的收集}
|
||||
构建数据基础设施的第一步是数据的收集工作。研究者所面临的基本挑战是数据的可得性问题。随着开源运动的不断发展,网络上累积了越来越多的公共开放的软件活动数据,这使得大规模的数据的收集成为可能。然而,长时间、高频率的数据访问将产生类似DoS攻击的不良影响,妨碍项目的正常运转。因此,很多开源项目的组织都对数据的访问频率做出了限制。因此,大量数据的收集通常需要消耗大量的时间才能完成。如果研究者各自重复地进行收集,这不仅会给项目带来成倍的数据访问负担,而且还造成了时间、人力、物力的浪费,这也是建立数据基础设施的必要性之一。目前,由于越来越多的研究兴趣投向一些组织所拥有的数据,这些组织也开始与学术界进行接触和合作,开放他们的数据。例如Stack Exchange公司已经若干次公开发布其问答网站的数据存档\footnote{https://archive.org/details/stackexchange} ,Mozilla社区也在北京大学软件研究所的数据分析小组的请求下发布了其Bugzilla Dump\cite{Zhou2015Who}。如今,数据可得性的问题已经得到了极大的缓解。
|
||||
|
||||
在数据可得的前提下,开发和采用对应于不同数据源的数据收集技术是收集过程的核心研究问题,这其中包括数据源的定位和数据的处理及下载。在数据源的定位上,收集的范围决定其难度。对于单一项目,数据源的定位较为简单,通过项目的wiki提供的各种在线工具的URL链接人工定位即可;对于单一组织管理的项目集合,通常会有项目列表,其中包含了每个项目各类资源的URL链接;对于没有特定的目标,要进行普查式的收集,需要借助人的知识与经验,从一些经典及大型的组织入手,按照单一组织下项目的数据源的定位方式进行检索,其次利用检索工具进行更大范围的检索,例如Mockus在全面收集开源项目版本控制数据的工作中便先从SourceForge、GoogleCode、Savannah、Tigris等知名的软件项目门户、以及Linux kernel、FreeBSD、NetBSD等社区入手,之后借助文献、Google代码检索工具等进行补充\cite{mockus2009amassing}。对于数据的下载,不同类型的访问方式决定了不同的下载方式。对于问题追踪等来自web应用的数据,通常可以通过网络爬虫技术对页面进行检索和下载,如果该应用提供了数据访问的API,可以直接通过API来下载。这两种下载方式的缺陷包括两个方面,一方面是下载的伸缩性受到应用本身对数据访问频率的限制,对于大规模的数据,需要投入更多的IP地址及下载时间;另一方面是无论用户接口还是编程接口会发生版本的迭代,数据下载的逻辑可能需要变更,所下载的数据格式可能改变。对于版本控制等可以直接克隆或者镜像后台数据库的系统的数据,使用相应的工具或者命令进行下载。对于官方提供工具后台数据库dump的情况,研究者只要简单地进行下载即可,但数据的提供方需要做一定的处理工作,包括去除隐私、安全及其他敏感数据,才能对数据进行公开。未来研究的重点将是针对不同应用场景,如何高效高质量的定制数据集。
|
||||
在数据可得的前提下,开发和采用对应于不同数据源的数据收集技术是收集过程的核心研究问题,这其中包括数据源的定位和数据的处理及下载。在数据源的定位上,收集的范围决定其难度。对于单一项目,数据源的定位较为简单,通过项目的wiki提供的各种在线工具的URL链接人工定位即可;对于单一组织管理的项目集合,通常会有项目列表,其中包含了每个项目各类资源的URL链接;对于没有特定的目标,要进行普查式的收集,需要借助人的知识与经验,从一些经典及大型的组织入手,按照单一组织下项目的数据源的定位方式进行检索,其次利用检索工具进行更大范围的检索,例如Mockus在全面收集开源项目版本控制数据的工作中便先从SourceForge、GoogleCode、Savannah、Tigris等知名的软件项目门户、以及Linux kernel、FreeBSD、NetBSD等社区入手,之后借助文献、Google代码检索工具等进行补充\cite{mockus2009amassing}。对于数据的下载,不同类型的访问方式决定了不同的下载方式。对于问题追踪等来自Web应用的数据,通常可以通过网络爬虫技术对页面进行检索和下载,如果该应用提供了数据访问的API,可以直接通过API来下载。这两种下载方式的缺陷包括两个方面,一方面是下载的伸缩性受到应用本身对数据访问频率的限制,对于大规模的数据,需要投入更多的IP地址及下载时间;另一方面是无论用户接口还是编程接口会发生版本的迭代,数据下载的逻辑可能需要变更,所下载的数据格式可能改变。对于版本控制等可以直接克隆或者镜像后台数据库的系统的数据,使用相应的工具或者命令进行下载。对于官方提供工具后台数据库dump的情况,研究者只要简单地进行下载即可,但数据的提供方需要做一定的处理工作,包括去除隐私、安全及其他敏感数据,才能对数据进行公开。未来研究的重点将是针对不同应用场景,如何高效高质量的定制数据集。
|
||||
|
||||
\subsubsection{数据的组织与存储}
|
||||
数据的组织与存储主要服务于后续的数据访问与分享。数据组织通常包括两个方面,数据格式的转换和数据模型的建立。一方面,某些原始数据的格式,例如web页面、版本控制库等,需要较为复杂的解析程序来进行数据的解析从而提取相应的信息。可以先将此类特殊格式的数据转换为较为通用、解析容易的格式,如CSV、JSON、XML等,然后进行存储。另一方面,为了便于数据的检索和分析,有些数据基础设施会对数据进行建模,抽象出其中的实体与实体间的关系,按照定义的模型进行存储,例如Gousios\cite{gousios2013ghtorent}将通过GitHub API所收集到的非关系型的数据,按照其定义的关系模型存储在MySQL数据库中。根据数据组织方式的不同,数据一般会采用文件系统、数据库系统或者其他工具特定的方式,如版本控制系统,来进行存储。采用何种方式进行数据的存储取决于原始数据的类型和数据收集者所设计的应用场景。此外,多源异构数据的存在使得如何建立不同数据源间的联系成为了其中的重要研究问题之一。
|
||||
数据的组织与存储主要服务于后续的数据访问与分享。数据组织通常包括两个方面,数据格式的转换和数据模型的建立。一方面,某些原始数据的格式,例如Web页面、版本控制库等,需要较为复杂的解析程序来进行数据的解析从而提取相应的信息。可以先将此类特殊格式的数据转换为较为通用、解析容易的格式,如CSV、JSON、XML等,然后进行存储。另一方面,为了便于数据的检索和分析,有些数据基础设施会对数据进行建模,抽象出其中的实体与实体间的关系,按照定义的模型进行存储,例如Gousios\cite{gousios2013ghtorent}将通过GitHub API所收集到的非关系型的数据,按照其定义的关系模型存储在MySQL数据库中。根据数据组织方式的不同,数据一般会采用文件系统、数据库系统或者其他工具特定的方式,如版本控制系统,来进行存储。采用何种方式进行数据的存储取决于原始数据的类型和数据收集者所设计的应用场景。此外,多源异构数据的存在使得如何建立不同数据源间的联系成为了其中的重要研究问题之一。
|
||||
|
||||
\subsubsection{数据的质量}
|
||||
高质量的数据是对软件活动进行分析、预测、推荐的基础。确保软件数据质量主要从两个角度出发。首先是数据清洗。数据清洗的目的在于去除影响数据分析结果的“脏数据”。例如,在问题追踪系统中,某个问题报告的评论中可能含有广告等无关软件开发活动的数据,他们会影响基于评论数量、评论时间等度量的准确性从而威胁到分析得出的结论。一般而言,去除“脏数据”的过程更多地体现在具体的数据分析中,在目前大多数数据基础设施的建立过程中,由于没有针对特定的研究问题,数据清洗的工作涉及较少。其次,应该关注数据与上下文是否相匹配\cite{tu18fse}。如果不匹配,可能使得基于问题数据的方法、软件产生的结果存在偏差,甚至无效。例如,在许多利用问题追踪数据智能化预测任务完成时间的工作中,将问题报告被标记为“已解决”的时间点视为该任务完成的时刻,然而任务完成的时间存在问题——开发者在完成任务后可能并不会及时将问题报告标记为“已解决”,而是在之后清理问题追踪系统时,通过脚本进行批量处理,即“任务完成时间”并不能真正代表任务被解决的时刻。鉴于软件生态相关研究对于数据的依赖,随着人们对软件生态的认识逐渐深入,数据质量问题会得到越来越多的关注。同时,需要研究人员构建出可靠的数据集、或者构建相应的方法来产生可靠的数据集。此外,用自动化的方法来检测和修正问题数据也应是未来研究应关注的重点内容之一。
|
||||
|
@ -116,8 +116,8 @@
|
|||
\end{figure}
|
||||
|
||||
\subsubsection{群体协作}
|
||||
群体协作在软件活动中主要体现为各种微过程,微过程是项目在完成各项特定任务(例如解决缺陷、提交代码、沟通需求、指导新手等)时所采用的方式方法或活动流程,对微过程的度量是获取细粒度可复制最佳实践的关键。从大规模数据挖掘细粒度的微过程,是找到可复现群体协作活动的可能途径。具体来说,对群体协作的研究可以从广度和深度两个方面来开展,如图4所示。
|
||||
广度研究是指,从尽可能广阔的视角上(例如覆盖尽可能多的项目)去探索问题。例如,对拥有大量开发人员和项目的大型在线社区SourceForge.net进行分析,发现开发者群体协作关系呈现无尺度网络(scale-free network)特征\cite{ohira2005supporting}。例如以GitHub中海量软件项目为样本研究项目中文件目录的使用模式及其对项目流行度的影响等。通过对开发者社交网络的构建,有助于帮助开发者定位沟通对象,识别有经验的开发者,从而提高群体协作的效率和质量。深度研究是指以典型案例为研究对象进行深入探索。例如,针对软件项目缺陷追踪工作流中的一个微过程:产品定位,设计工具用于预测缺陷报告是否被准确定位,或者以某个项目为例来定位错误或修正错误。
|
||||
群体协作在软件活动中主要体现为各种微过程,微过程是项目在完成各项特定任务(例如解决缺陷、提交代码、沟通需求、指导新手等)时所采用的方式方法或活动流程,对微过程的度量是获取细粒度可复制最佳实践的关键。从大规模数据挖掘细粒度的微过程,是找到可复现群体协作活动的可能途径。具体来说,对群体协作的研究可以从广度和深度两个方面来开展,如图\ref{fig2-9/fig4.png}所示。
|
||||
广度研究是指,从尽可能广阔的视角上(例如覆盖尽可能多的项目)去探索问题。例如,对拥有大量开发人员和项目的大型在线社区SourceForge.net进行分析,发现开发者群体协作关系呈现无尺度网络(Scale-free Network)特征\cite{ohira2005supporting}。例如以GitHub中海量软件项目为样本研究项目中文件目录的使用模式及其对项目流行度的影响等。通过对开发者社交网络的构建,有助于帮助开发者定位沟通对象,识别有经验的开发者,从而提高群体协作的效率和质量。深度研究是指以典型案例为研究对象进行深入探索。例如,针对软件项目缺陷追踪工作流中的一个微过程:产品定位,设计工具用于预测缺陷报告是否被准确定位,或者以某个项目为例来定位错误或修正错误。
|
||||
总的来说,需要围绕软件生态中的各种相关活动,从深度和广度,并从多个特征维度对群体协作进行度量,以期为复杂的群体社会化软件活动提供相关技术支撑和建议。
|
||||
|
||||
\begin{figure}[ht]
|
||||
|
@ -132,7 +132,7 @@
|
|||
探究生态系统构建及其持续发展的理论、方法与技术是未来软件领域的一项关键研究内容。软件生态在近十多年的发展中得到了学术界和产业界的广泛关注,取得了一定进展,需要研究的内容主要包含以下三个方面。
|
||||
|
||||
\subsubsection{软件生态系统的形成和可持续性}
|
||||
此类研究的主要目的是通过分析生态系统的历史数据度量生态的健康状态并建立可持续发展机制机理等。需要研究软件生态系统健康度的评价指标;研究软件生态系统的形成机制;研究软件生态系统的成熟理论,用来评估软件的进化,例如生存能力,增长潜力等;研究核心社区的工作负载与协同工作机制;研究生态多样性对演化的影响等。总之,寻找降低软件生态管理复杂度的解决方案将是未来工作的一个重点。
|
||||
此类研究的主要目的是通过分析生态系统的历史数据、度量生态的健康状态,并建立可持续发展机制机理等。需要研究软件生态系统健康度的评价指标;研究软件生态系统的形成机制;研究软件生态系统的成熟理论,用来评估软件的进化,例如生存能力,增长潜力等;研究核心社区的工作负载与协同工作机制;研究生态多样性对演化的影响等。总之,寻找降低软件生态管理复杂度的解决方案将是未来工作的一个重点。
|
||||
|
||||
\subsubsection{软件生态系统中的商业参与}
|
||||
商业公司在软件生态中扮演越来越重要的角色,但其对各种生态的各个维度的影响尚不可评估。此类研究的主要目的是探究商业参与模式及其对软件生态的影响并寻找可能的有效实践。具体内容涉及:研究商业主持或参与软件生态的动机(例如,在开源生态中的盈利模式),不同的商业组织参与到同一个生态中彼此的竞争和协作模式,商业参与的程度对生态中其他角色的影响、对生态效率和质量的影响等。特别地,很多研究案例折射出了目前开源生态系统在商业与开源混合时的困局,这其中各种利益如何综合、生态如何可持续发展,需要综合多领域知识予以回答。未来的挑战还在于从各个角度探索以深入并全面地刻画生态系统中的商业参与。
|
||||
|
|
62
Ch3-1.tex
62
Ch3-1.tex
|
@ -1,31 +1,31 @@
|
|||
% !TEX root = main.tex
|
||||
%\chapter{政策建议}
|
||||
|
||||
|
||||
\section{学科发展政策建议}
|
||||
\begin{enumerate}
|
||||
\item 加强软件理论、程序设计语言、系统软件等基础领域的研究。加强面向泛在计算的程序设计语言的基础性研究,以领域特定的程序设计语言的设计原理与高效实现为核心,以程序设计语言的演化和互操作性机理为重点,通过程序设计语言的基础研究,有效而深入地解决计算泛在和多样性,应用复杂性和安全性等带来的新挑战。推进对以“连接协调”为核心的新型架构下的新一代操作系统模型和机理的研究。研究如何为各类新型异构资源建立适当抽象,并按照应用需求进行灵活调度。研究操作系统和运行平台如何充分发挥其“元层”支撑作用,有效驱动和实现“信息-物理-社会”空间的协同持续演化。
|
||||
\item 加强面向国家重大新型领域的全栈软件系统和工具环境的研究。国家重大新型领域涉及物联网,生命健康,军事国防等,需要加大面向领域需求的程序语言、开发方法、支撑运行环境和工具链的研究与开发。
|
||||
\item 加强面向生态持续的复杂系统软件工程和价值保证研究。推进以人为中心的软件价值的研究和规范。面向泛在计算场景下的软件价值,包括普适日常应用和安全攸关应用,研究各种社会因素带来的突破使用质量的新的软件价值,并建立相关约束和规范,包括提示用户可能存在的风险,制定智能软件的质量标准、检测方法和实施办法等。推进对大规模代码和项目的供应链和生态行为的研究和分析。研究个体如何认知复杂项目和生态,群体如何高效高质地协作完成各类软件活动相关的任务,涵盖公司、个体开发者及用户在内的广泛社会力量如何围绕软件构建可持续性演化的生态系统等。
|
||||
\item 加强学科交叉和综合,加强跨领域研究和应用。加强各个领域、各种形态、各种应用场景下的软件技术知识产权保护方法和措施的研究,建立公平、公正的环境,持续推动软件技术创新进程。
|
||||
\item 改变唯论文、唯引用的评价机制,强调软件系统和工具研发的创新贡献.
|
||||
\end{enumerate}
|
||||
|
||||
\section{软件教育政策建议}
|
||||
\begin{enumerate}
|
||||
\item 推行以“计算思维 + 创新思维”为核心的普及教育,包括软件学科核心认知能力的成长模型和规律及其知识体系、以计算思维为核心,融合创新思维的系统化认知能力培养方法和适应不同认知水平且贯穿终生的软件学科普及教育方法。
|
||||
%
|
||||
\item 推行以“多学科交叉融合知识体系+系统能力和解决复杂工程 问题能力培养”为核心的专业教育,包括建立面向多学科交叉融合的软件学科专业教育的知识体系和软件学科专业教育核心能力的培养方法。
|
||||
%
|
||||
\item 推行以“专业学科知识 + 软件学科知识”为基础,实现复合型、创新型和跨界人才培养的其他学科专业教育,建立基于“专业学科知识 + 软件学科知识”的其他学科专业教育知识体系和具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法。
|
||||
%
|
||||
\item 开展以“探究成才规律 + 寻求理念创新 + 开发支撑软件”为 核心的教育方法改革,探索软件学科人才培养模型及规律、研究软件学科资源在人才培养中的应用,推进群体化学习和大规模在线开放实践 MOOP,研发软件学科教育的支撑软件。
|
||||
\end{enumerate}
|
||||
|
||||
\section{软件产业政策建议}
|
||||
\begin{enumerate}
|
||||
\item 鼓励面向行业的共性软件技术创新和研发,以纵带横,促进领域特定共性软件平台和工具环境的发展。
|
||||
\item 建立以开源生态为核心、具有针对性的知识产权保护的群智化软件创新环境,培育健康发展的软件产业生态。
|
||||
\item 建立数据开放机制和平台,鼓励围绕大数据聚集、管理、分析和应用的大规模协作制定数据开放的相关政策,开放地理、气候、统计、环境、交通等政府数据,并建立基于互联网的大数据开放共享平台,以及开放的数据分析工具库,鼓励不同的组织和个人基于此平台开展数据聚集、管理、分析和应用的大规模协作,挖掘数据蕴含的价值,提供高附加值的数据类软件产品和服务。
|
||||
\item 面向智慧城市、移动互联网应用等热点领域加大投入,支持高附加值的新型网络计算操作系统和应用支撑工具平台的技术创新和产品推广。针对智慧城市、移动互联网应用等当前需求迫切且应用价值高的热点领域,加大投入力度,把握互联网、移动互联网、物联网等平台深度普及所带来的发展契机,支持产学研用相结合的技术创新和成果转化,建立自主可控的新型网络计算操作系统和应用支撑工具平台,打造针对热点应用领域的高附加值基础软件产品。
|
||||
\end{enumerate}
|
||||
% !TEX root = main.tex
|
||||
%\chapter{政策建议}
|
||||
|
||||
|
||||
\section{学科发展政策建议}
|
||||
\begin{enumerate}
|
||||
\item 加强软件理论、程序设计语言、系统软件等基础领域的研究。加强面向泛在计算的程序设计语言的基础性研究,以领域特定的程序设计语言的设计原理与高效实现为核心,以程序设计语言的演化和互操作性机理为重点,通过程序设计语言的基础研究,有效而深入地解决计算泛在和多样性,应用复杂性和安全性等带来的新挑战。推进对以“连接协调”为核心的新型体系结构下的新一代操作系统模型和机理的研究。研究如何为各类新型异构资源建立适当抽象,并按照应用需求进行灵活调度。研究操作系统和运行平台如何充分发挥其“元层”支撑作用,有效驱动和实现“信息-物理-社会”空间的协同持续演化。
|
||||
\item 加强面向国家重大新型领域的全栈软件系统和工具环境的研究。国家重大新型领域涉及物联网,生命健康,军事国防等,需要加大面向领域需求的程序语言、开发方法、支撑运行环境和工具链的研究与开发。
|
||||
\item 加强面向生态持续的复杂系统软件工程和价值保证研究。推进以人为中心的软件价值的研究和规范。面向泛在计算场景下的软件价值,包括普适日常应用和安全攸关应用,研究各种社会因素带来的突破使用质量的新的软件价值,并建立相关约束和规范,包括提示用户可能存在的风险,制定智能软件的质量标准、检测方法和实施办法等。推进对大规模代码和项目的供应链和生态行为的研究和分析。研究个体如何认知复杂项目和生态,群体如何高效高质地协作完成各类软件活动相关的任务,涵盖公司、个体开发者及用户在内的广泛社会力量如何围绕软件构建可持续性演化的生态系统等。
|
||||
\item 加强学科交叉和综合,加强跨领域研究和应用。加强各个领域、各种形态、各种应用场景下的软件技术知识产权保护方法和措施的研究,建立公平、公正的环境,持续推动软件技术创新进程。
|
||||
\item 改变唯论文、唯引用的评价机制,强调软件系统和工具研发的创新贡献。
|
||||
\end{enumerate}
|
||||
|
||||
\section{软件教育政策建议}
|
||||
\begin{enumerate}
|
||||
\item 推行以“计算思维 + 创新思维”为核心的普及教育,包括软件学科核心认知能力的成长模型和规律及其知识体系、以计算思维为核心,融合创新思维的系统化认知能力培养方法和适应不同认知水平且贯穿终生的软件学科普及教育方法。
|
||||
%
|
||||
\item 推行以“多学科交叉融合知识体系+系统能力和解决复杂工程 问题能力培养”为核心的专业教育,包括建立面向多学科交叉融合的软件学科专业教育的知识体系和软件学科专业教育核心能力的培养方法。
|
||||
%
|
||||
\item 推行以“专业学科知识 + 软件学科知识”为基础,实现复合型、创新型和跨界人才培养的其他学科专业教育,建立基于“专业学科知识 + 软件学科知识”的其他学科专业教育知识体系和具有软件学科知识和能力的复合型、创新型和跨界专业人才培养方法。
|
||||
%
|
||||
\item 开展以“探究成才规律 + 寻求理念创新 + 开发支撑软件”为 核心的教育方法改革,探索软件学科人才培养模型及规律、研究软件学科资源在人才培养中的应用,推进群体化学习和大规模在线开放实践 MOOP,研发软件学科教育的支撑软件。
|
||||
\end{enumerate}
|
||||
|
||||
\section{软件产业政策建议}
|
||||
\begin{enumerate}
|
||||
\item 鼓励面向行业的共性软件技术创新和研发,以纵带横,促进领域特定共性软件平台和工具环境的发展。
|
||||
\item 建立以开源生态为核心、具有针对性的知识产权保护的群智化软件创新环境,培育健康发展的软件产业生态。
|
||||
\item 建立数据开放机制和平台,鼓励围绕大数据聚集、管理、分析和应用的大规模协作制定数据开放的相关政策,开放地理、气候、统计、环境、交通等政府数据,并建立基于互联网的大数据开放共享平台,以及开放的数据分析工具库,鼓励不同的组织和个人基于此平台开展数据聚集、管理、分析和应用的大规模协作,挖掘数据蕴含的价值,提供高附加值的数据类软件产品和服务。
|
||||
\item 面向智慧城市、移动互联网应用等热点领域加大投入,支持高附加值的新型网络计算操作系统和应用支撑工具平台的技术创新和产品推广。针对智慧城市、移动互联网应用等当前需求迫切且应用价值高的热点领域,加大投入力度,把握互联网、移动互联网、物联网等平台深度普及所带来的发展契机,支持产学研用相结合的技术创新和成果转化,建立自主可控的新型网络计算操作系统和应用支撑工具平台,打造针对热点应用领域的高附加值基础软件产品。
|
||||
\end{enumerate}
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 92 KiB |
Binary file not shown.
After Width: | Height: | Size: 659 KiB |
7
main.tex
7
main.tex
|
@ -40,8 +40,8 @@
|
|||
\tableofcontents
|
||||
|
||||
|
||||
\chapter*{ 软件科学与工程学科\\发展战略(摘要) }
|
||||
\addcontentsline{toc}{chapter}{软件科学与工程学科发展战略(摘要)}
|
||||
\chapter*{引言}
|
||||
\addcontentsline{toc}{chapter}{引言}
|
||||
\input{Ch0-1-Abstract}
|
||||
|
||||
\mainmatter
|
||||
|
@ -98,7 +98,8 @@
|
|||
\input{Ch2-10-Education}
|
||||
|
||||
\part{软件学科发展建议}
|
||||
and so on
|
||||
\chapter{学科发展建议}
|
||||
\input{Ch3-1}
|
||||
|
||||
|
||||
\printbibliography[heading=bibintoc,title=参考文献]
|
||||
|
|
|
@ -480,12 +480,13 @@
|
|||
|
||||
@Article{Deutsch99,
|
||||
author = {L. Peter Deutsch, Ronald B. Finkbine},
|
||||
title = {{ACM} {Fellow} profile},
|
||||
journal = {ACM SIGSOFT Software Engineering Notes},
|
||||
year = {1999},
|
||||
volume = {24},
|
||||
number = {1},
|
||||
publisher = {ACM},
|
||||
}
|
||||
}
|
||||
|
||||
@book{Herlihy2008,
|
||||
author = {Herlihy, Maurice and Shavit, Nir},
|
||||
|
|
Loading…
Reference in New Issue