From a97721c67dab083479e23baa5b69b9b5f066ad57 Mon Sep 17 00:00:00 2001 From: LInzhang Wang Date: Sat, 12 Oct 2019 14:24:43 +0800 Subject: [PATCH] update chapter 4 & 8 of part 2. --- Ch2-4-DevelopmentMethodology.tex | 145 ++++++++++---------------- Ch2-8-Quality&Security.tex | 171 +++++++++++-------------------- fig2-8/fig0801.pdf | Bin 0 -> 133686 bytes 3 files changed, 113 insertions(+), 203 deletions(-) create mode 100755 fig2-8/fig0801.pdf diff --git a/Ch2-4-DevelopmentMethodology.tex b/Ch2-4-DevelopmentMethodology.tex index a932bf3..a4b6ceb 100644 --- a/Ch2-4-DevelopmentMethodology.tex +++ b/Ch2-4-DevelopmentMethodology.tex @@ -1,134 +1,87 @@ +% !TEX root = main.tex 软件开发方法与技术是软件学科的核心关注点之一,从宏观上看,其目标一方面是在计算平台上给出满足用户需求的解决方案,另一方面是达到开发效率、质量、成本的最佳平衡。在通常的软件及信息技术体系中,软件开发包括了技术、管理、工具等多个方面:技术上包括软件分析、设计、构造、维护和质量保证,关注于如何完成具体的软件开发活动并产出相应的软件制品;管理上包括软件过程模型、开发团队组织和最佳实践,关注于软件开发活动的流程和协作管理以及包括人在内的各类资源的组织和运筹等;不论是技术还是管理方面,在解决大规模复杂软件开发问题时都离不开工具的支持和帮助。高效、高质量、低成本地开发和演化软件系统是软件开发方法和技术研究追求的总体目标,在这个总体目标指引下,在不断出现的、新的应用需求的牵引下,软件开发方法和技术研究不断面临新的挑战。 - 在“软件定义一切”的时代背景下,尽管软件开发方法与技术的目标宏观上依然不变,但是软件的需求空间被进一步大幅度扩展,人机物融合的需求场景和运行环境更进一步增大了软件系统的规模和复杂性,导致软件开发和演化的成本随之急剧上升,从而产生了对软件自动化方法与技术的迫切需求;另一方面,软件开发和演化的外在条件随着需求和技术发展不断发生变化,新的问题不断涌现,不断扩展了软件自动化方法和技术的研究空间。 - 人是软件开发成败的决定因素,认知空间中人们长期的积累与计算平台的发展,使得软件开发的社会化和智能化成为必然方向,也为软件开发中人与计算/机器平台的新型关系的建立提出了挑战。网络化、数据化、可视化、虚拟化将改变人在软件开发中的工作方式、合作方式和组织方式,催生出软件开发的各种新方式,包括软件开发终端化和普及化、群智化开发与生态化平台等等。建立新的开发方式以有效适应人机融合的软件生态发展,将是软件开发和平台的未来机遇。 - 软件作为智力和人工制品,软件开发属于认知空间范畴,介于应用空间(问题空间)与平台空间(解空间)之间。应用空间和平台空间的泛在化和持续变化决定了未来软件形态的泛在性、适应性、演化性。复杂多样的不确定性成为软件的固有本质特征,控制而不是消除不确定性使得软件的持续演化和成长成为必然挑战。与传统软件开发相比较,软件的不确定性控制和处理难以在设计时完成,除了面向应用空间,软件开发的设计时与运行时融合要求认知空间与平台空间的协作乃至一体化成为一个趋势。近来的开发运维一体化已经有了一个良好的开端。 - 面向动态变化场景的人机物融合复杂系统,软件开发面临的首要挑战是融合人机物三元资源、以建模为核心的软件定义方法和技术。我们需要构建人机物三元资源及其行为的抽象、观察和度量的新模型和方法,研究基于软件定义方法的元级控制和数据赋能机理,使得软件开发方式(包括设计、构造和保证)从实体建模为主走向实体加链接,从分而治之走向群智聚合,从而有效驾驭各类软件复杂性。 \section{重大挑战问题} -在人机物融合应用场景需求牵引下,软件开发方法和技术研究面临的重大挑战问题主要包括复杂场景分析与建模(§4.1.1)、群智开发(§4.1.2)、人机协作编程(§4.1.3)和开发运维一体化(§4.1.4)。 +在人机物融合应用场景需求牵引下,软件开发方法和技术研究面临的重大挑战问题主要包括复杂场景分析与建模、群智开发、人机协作编程和开发运维一体化。 \subsection{复杂场景分析与建模} 人机物融合计算场景的需求在我们的日常生活中已经存在,大到智慧国家、智慧城市,小到网络家电、汽车引擎智能网络控制系统,对这类计算场景的分析和建模存在许多挑战,其中最重要的挑战包括如下四个方面。 +\subsubsection{与日俱增的规模与复杂度} +首先,从已经出现的支撑人机物融合计算场景的系统来看,其系统的大小和复杂性显著增加。例如,现代汽车中基于软件的功能在不断地持续增加[1],比如,2007年经典高端轿车包含大约270个与驾驶员互动的软件实现的功能,而最新的高端轿车包含超过500个这样的功能。轿车软件的规模也在大幅增长。2007年高端轿车的二进制代码量约为66兆字节,而现在这类轿车则含超过1千兆字节的二进制代码。随着软件支持的功能的数量和规模的增加,复杂性也随之增加。这些基于软件的功能要求各个子系统,例如刹车系统、发动机管理系统、驾驶辅助系统等,具备更细粒度的功能,以及子系统之间密集的交互,因而整个系统的复杂性大大增加,对系统的分析和建模需要从方法和技术上得到全面提升。 -(1)与日俱增的规模与复杂度 +其次,除了功能数量和规模的提升,对软件分析和建模方法的挑战还来自于软件与硬件、软件与人的交互的紧密性和持续性。首先,软硬件协同分析和建模成为必须,这类系统的发展大部分是由先进硬件技术驱动的,集成电路的成本、尺寸和能耗的显著降低,和各类嵌入集成电路的、带计算能力的设备的不断增加,使得能通过像调用软件一样灵活地调用设备。另一方面,在硬件设备中嵌入的软件能力,又为许多设备提供了新颖的功能,例如家用电器的网络连接等。这种趋势和挑战要求采用系统的方法来设计具有大量计算节点的大型网络化系统。通过网络将大量物理设备连接起来,这些数量庞大的设备进行实时数据采集,产生了大量的数据,这些数据呈指数级增长,并进行彼此间的信息交互,形成了复杂的网络。这些数据的处理促进了新软件的诞生,系统规模日益增大。在这样一个广泛嵌入各种感知与控制智能设备后的物理世界场景下,系统能够全面地感知环境信息,并智能地为人类提供各种便捷的服务。 +第三,在系统分析和建模中,纳入人的行为分析和建模也成为必须,因为人的日常生活将和这些大型网络化系统紧密地联系在一起,比如,目前,全球已经大约40亿人连入互联网,每个人都在智能终端、个人电脑上使用各种各样的软件,发微博、发微信、全球每天会有2.88万小时的视频上传到Youtube,会有上千万条信息上传到Twitter,会在亚马逊产生上百万笔订单,…。这些数据都是由人和系统的持续交互产生的结果,人的行为和意图将成为系统分析和建模的重要关注点。 -从已经出现的支撑人机物融合计算场景的系统来看,其系统的大小和复杂性显著增加。例如,现代汽车中基于软件的功能在不断地持续增加[1],比如,2007年经典高端轿车包含大约270个与驾驶员互动的软件实现的功能,而最新的高端轿车包含超过500个这样的功能。轿车软件的规模也在大幅增长。2007年高端轿车的二进制代码量约为66兆字节,而现在这类轿车则含超过1千兆字节的二进制代码。随着软件支持的功能的数量和规模的增加,复杂性也随之增加。这些基于软件的功能要求各个组件子系统,例如刹车系统、发动机管理系统、驾驶辅助系统等,具备更细粒度的功能,以及子系统之间密集的交互,因而整个系统的复杂性大大增加,对系统的分析和建模需要从方法和技术上得到全面提升。 +\subsubsection{开放和不确定环境} +传统软件分析和建模方法通常假设软件的工作环境就是设计环境。但人机物融合计算场景与其不同,软件系统将运行在开放和不确定环境中。例如,在未来的大规模无处不在的城市计算系统中,系统将能获取到大量的异构数据,这些异构数据由城市空间中的各类数据采集器从各种数据源中获得,这些异构数据需要集成到软件系统设计中进行统一分析,并构建有趣的应用。例如,通过气象传感器收集温度、湿度和风向等信息,软件系统可以预测热岛效应并给出应对措施。软件系统可以帮助维护旧的高速公路或道路,并通过部署在旧建筑中的传感器检测旧建筑的安全参数,预测危险。软件系统还可以通过感知人类的生命体征,帮助提供紧急医疗服务和监测慢性病。在所有这些人机物融合计算场景下,软件的交互环境都是动态的,并且可以观察到其不确定性。 +有很多证据表明,在人机物融合计算场景中,软件的交互环境也是开放的。例如,许多移动电话、掌上电脑、个人电脑、配备RFID的商品等都通过不同规模的网络联网,并自主进行动态加入或者移除。可用设备的不断更新,又促使系统提供新服务或移除不再有效或已被取代的服务,利用网络环境提供新的服务。这些更新后的服务是软件系统设计时不可能预见到的。因此,建立在不断变化的服务空间上的人机物融合系统的环境永远不会是封闭的,而是开放的。总之,运行环境的开放性、变化性和不确定性,需要从方法学和技术层面进行支撑。 -除了功能数量和规模的提升,对软件分析和建模方法的挑战还来自于软件与硬件、软件与人的交互的紧密性和持续性。首先,软硬件协同分析和建模成为必须,这类系统的发展大部分是由先进硬件技术的改进而驱动的,集成电路的成本、尺寸和能耗的显著降低以及基于新原理的计算元件的可用都是技术改进的例子。这种改进使得软件有可能控制设备,而且在经济上也成为可行。另一方面,软件在硬件设备中的广泛集成又为许多设备提供了更加新颖的功能,例如家用电器的网络连接,集成了数万到数千个内核的多核处理器的单个芯片的开发,意味着即使是单芯片系统也必须被视为由大量单个节点组成。这种趋势和挑战要求采用系统的方法来设计具有大量计算节点的大型网络化系统。通过网络将数亿或者数十亿个物理设备、智能设备连接起来,这些数量庞大的智能设备进行实时数据采集和彼此之间信息交互,形成了复杂的网络,产生了大量的数据,这些数据呈指数级增长。这些数据的处理促进了新软件的诞生,系统规模日益增大。这描绘了一个物理世界被广泛嵌入各种感知与控制智能设备后的场景,在这个场景下能够全面地感知环境信息,智能地为人类提供各种便捷的服务。 +\subsubsection{情境感知和适应性} +除了复杂度和不确定性带来的挑战外,新算法新技术引入的系统能力,也是人机物融合计算场景对软件系统的分析和建模的挑战。例如,与手机与全球定位系统位置设备耦合的电子导航系统,以及执行从交通冲突检测到自动间隔和车道跟踪任务的自动装置,正逐步被辅助驾驶软件系统所采用,这些新的能力使软件系统与物理环境能更加融合,使软件系统能够了解周围的整体情况,从而做出更好的在线决策。新技术和新能力的引入使得软件系统常常要在与其设计时明显不同的条件下运行。 +执行时,交互和运行情境的动态变化是一个重要特征,软件系统不仅要能够适应各种交互和运行环境的变化,还应能够在遇到变化时继续可靠地执行,需要广泛的适应性。软件系统的分析和建模需要考虑在线决策的能力,这种能力所要求的不仅是简单地认识环境状态,还高度依赖于情境感知能力,支持对环境状态的不断演变的认识。 -其次,将人的行为分析和建模纳入到系统分析和建模的范畴中也成为必须。在这些人机物融合计算场景中,人的日常生活和这些大型网络化系统将紧密地联系在一起,比如,目前,全球已经大约30亿人连入互联网,每个人都在智能终端、个人电脑上使用各种各样的软件,发微博、发微信、全球每天会有2.88万小时的视频上传到Youtube,会有5000万条信息上传到Twitter,会在亚马逊产生630万笔订单,…。这些数据都是由人和系统的持续交互产生的结果,人的行为和意图将成为系统分析和建模的重要关注点。 +\subsubsection{创新使能的需求演化性} - -(2)开放和不确定环境 - - -在传统软件分析和建模方法中,通常假设软件的工作环境就是当前设计的环境。与其不同,在人机物融合计算场景中,软件系统将运行在开放和不确定环境中。例如,在未来的大规模无处不在的城市计算系统中,系统将能获取到大量的异构数据,这些异构数据由城市空间中的各种数据源和数据采集器(如传感器、设备、车辆、建筑物和人类等)产生,需要集成到软件系统中进行统一分析,并在收集的数据上构建许多有趣的应用。例如,通过气象传感器收集温度、湿度和风向等信息后,软件系统可以预测热岛效应并给出应对措施。软件系统还可以帮助维护旧的高速公路或道路,并通过部署在旧建筑中的传感器检测旧建筑的安全参数,预测危险。软件系统还可以通过感知人类的生命体征,帮助提供紧急医疗服务和监测慢性病。在所有这些人机物融合计算场景下,软件的交互环境都是动态的,并且可以观察到其不确定性。 - - -有很多证据表明,在人机物融合计算场景中,软件的交互环境也是开放的。例如,许多移动电话、掌上电脑、个人电脑甚至是配备RFID的商品都通过不同规模的网络联网,它们可以自主的动态加入或者移除。可用设备的不断更新,又促使服务提供商提供新服务或删除不再有校或已被取代的服务,更换不再提供类似功能的其他服务,利用网络环境提供新的服务,而这些更新后的服务是软件系统设计时不可能预见到的。因此,建立在不断变化的服务空间上的人机物融合系统的环境永远不会是封闭的,而是开放的,所以需要从方法学和技术层面支撑分析和建模能容忍环境的开放性、变化性和不确定性。 - - -(3)情境感知和适应性 - - -除了复杂度和不确定性带来的挑战之外,人机物融合计算场景中,对软件系统的分析和建模还受到来自由于新算法新技术引入的系统能力的挑战。例如,目前可以看到的,手机与全球定位系统位置设备耦合的电子导航系统,以及执行从交通冲突检测到自动间隔和车道跟踪任务的自动装置,正在被辅助驾驶软件系统采用,这些新的能力使软件系统更加深入地嵌入到可变和开放的环境中,也使系统能够了解系统周围的整体情况,从而做出更好的在线决策。新技术和新能力的引入使得软件系统常常要在与其设计时明显不同的条件下运行。 - - -在执行时,软件系统它们不仅应该能够适应各种交互和运行环境(比如,网络环境)的变化,还应该能够在遇到变化时继续可靠地执行。未来的人机物融合计算场景中,软件系统将更普遍、更分散,并且在其运行期间将需要更广泛的适应性。交互和运行情境的动态变化(事物在环境中变化的程度和速度)是一个重要特征。软件系统的分析和建模需要考虑在线决策的能力。在人机物融合复杂计算场景下进行动态决策,所要求的绝不仅仅是简单地认识环境状态,具备良好的情境意识,整合对情境的理解,它高度依赖于情境感知能力,支持对环境状态的不断演变的认识。 - - -(4)创新使能的需求模糊性 - - -人机物融合计算场景下,软件系统分析和建模的困难还来自于当前的需求相关者(即领域专家,最终用户和客户)无法提供完整和正确的能力要求。可以看到,许多创新应用,一些最受欢迎的应用程序,如微信、在线购物等,都是由技术的发展和产品设计师的创新思维驱动的,而不是最初的需求相关者所要求的。信息技术飞速发展的时代,领域专家和最终用户无法提出超出想象范围的技术发展,他们不了解现有技术的发展趋势,在软件系统分析和建模方法中支持未来创新需求的引入或提供对创新需求的包容手段是一个重要的挑战。 +人机物融合计算场景下,软件系统分析和建模的困难还来自于当前的需求相关者(即领域专家,最终用户和客户)无法提供完整和正确的能力要求。许多创新应用,如微信、在线购物等一些受欢迎的应用程序,都是由技术的发展和产品设计师的创新思维驱动的,而不是最初的需求相关者所要求的。信息技术飞速发展的时代,领域专家和最终用户无法提出超出想象的技术发展,不能预测技术的发展趋势,如何在软件系统分析和建模方法中,支持创新需求的引入,或提供对创新需求的包容手段是一个重要的挑战。 \subsection{群智开发} -互联网技术的发展,使得人类群体打破物理时空限制开展大规模协作成为可能,新型编程技术包括新型高级编程语言、智能化编程工具和技术的出现则降低了编程开发的参与门槛,软件开发活动从一个纯粹的生产性活动转变为一个涉及到多种要素紧密关联的社会性活动,软件也从相对独立的产品转变为多种元素相互依赖持续演化的生态。在软件生态系统中,作为软件开发活动中的关键要素,人在其中的角色发生了显著变化:参与者规模的变化,软件开发活动的参与者规模由过去的公司/组织内部封闭环境下的数百数千人转变为软件生态系统中通过互联网联接的开放环境的数万数十万人;参与者类型的变化,软件开发活动的参与者由过去的主要是开发者转变为软件生态系统中开发者、用户、管理者、投资人等多种不同类型的个体深度参与,共同驱动软件生态系统的发展演化;参与者角色的变化,每个软件开发活动的参与个体的角色从单纯的软件开发者或使用者等单一角色演变为软件生态系统的参与者和推动者等多重角色,每个参与个体都成为软件生态中的组成部分同软件生态共同成长演化。 +互联网技术的发展,使得人类群体打破物理时空限制开展大规模协作成为可能。新型编程技术(包括新型高级编程语言、智能化编程工具和技术等)的出现则降低了编程开发的参与门槛。软件开发从一个纯粹的生产性活动演变为一个涉及到多种要素紧密关联的社会性活动;软件也从相对独立的产品演变为多种元素相互依赖、持续演化的生态。在软件生态系统中,作为软件开发活动的关键要素,“人”在其中发生了显著变化:参与者规模的变化-软件开发活动的参与者规模由过去的公司/组织内部封闭环境下的数百至数万人,演变为软件生态系统中开放环境下通过互联网联接的数万数十万人;参与者群体多样类型的变化-软件开发活动的参与者由过去的主要是开发者,演变为软件生态系统中开发者、用户、管理者、投资人等多种不同类型的群体深度参与,共同驱动软件生态系统的发展演化;参与者个体多重角色的变化-软件开发活动中参与个体的角色从单纯的软件开发者或使用者等单一角色,演变为软件生态系统的参与者和推动者等多重角色,每个参与个体都成为软件生态中的组成部分,与软件生态共同成长演化[1]。 +群智开发是一种通过互联网联接和汇聚大规模群体智能、实现高效率高质量软件开发的群体化方法,主要包括:微观个体的激发、宏观群体的协作、全局群智的汇聚以及持续的成长演化等不同维度。在生态观下,软件开发的关注点从“人在系统外”的软件系统构建发展为“人在回路中”的软件生态构建。开源软件、软件众包以及应用市场等作为群智开发的原始形态快速发展,释放出不同于传统软件开发模式的强大生产力,展现了群智开发所蕴含的巨大潜力[2]。但是,如何高效激发和稳态汇聚大规模群体智能,确保群体智能在软件开发活动中可控形成和重复出现,构建持续健康演化的软件生态,是群智开发面临的核心挑战。 +\subsubsection{自主个体的持续激发和大规模群体的高效协作} -群智开发是一种通过互联网联接和汇聚大规模群体智能实现高效率高质量的群体化软件开发方法,主要包括微观个体的激发、宏观群体的协作、全局群智的汇聚以及持续的成长演化等不同的维度。在生态观下,软件开发的关注点从“人在系统外”的软件系统构建发展为“人在回路”的软件生态构建。开源软件、软件众包以及应用市场等快速发展,显示出超越传统软件开发的生产力,展现了群智开发所蕴含的巨大潜力。但是,如何高效激发和稳态汇聚大规模群体智能,确保群智智能在软件开发活动中可控形成和重复出现,构建持续健康演化的软件生态,是群智开发面临的核心挑战。 - - -(1)自主个体的持续激发和大规模群体的高效协作 - - -互联网技术的快速发展,打破了传统软件开发面临的时间和空间的局限,为大规模群体的联接和协作提供了坚实基础。在开源、众包和应用市场中,采用社区声誉、物质回报等多种机制来激励群体参与,并采用合作、竞争和对抗等模式开展群体协作,取得了一定的进展。但是,在互联网环境下的群智开发中,参与的每个个体都具有高度的行为自主性和不可预测性,基于人类群体智能的软件开发不仅仅是一种技术问题,而是一个涵盖心理、社会、经济等多种属性交织作用的复杂问题,如何有效激发每一个参与个体持续高质量贡献?另一方面,大规模多样化群体的开放参与带来巨大的沟通交互开销,如何有效组织大规模参与群体开展高效协作共同完成复杂软件开发任务,是群智开发面临的一大挑战。 - - -(2) 群智任务的度量分解与群智贡献的汇聚融合 +互联网技术的快速发展,打破了传统软件开发面临的时间和空间的局限,为大规模群体的联接和协作提供了坚实基础。在开源、众包和应用市场中,采用社区声誉、物质回报等多种机制来激励群体参与,并采用合作、竞争和对抗等模式开展群体协作,取得了一定的进展。但是,在互联网环境下的群智开发中,参与的每一个个体都具有高度的行为自主性和不可预测性。因此,基于人类群体智能的软件开发不仅仅是一种技术问题,更是一个心理、社会、经济等多种属性交织作用的复杂问题,如何有效激发每一个参与个体进行持续高质量的贡献成为一个重要的研究问题。另一方面,大规模多样化群体的开放参与带来巨大的沟通交互开销,如何有效组织大规模参与群体开展高效协作共同完成复杂软件开发任务,则是群智开发面临的另一个重大挑战。 +\subsubsection{群智任务的度量分解与群智贡献的汇聚融合} 软件开发本身是一项创作与生产深度融合的活动,具有很强的开放性和灵活性。在面对一个具有更强不确定性和差异性的大规模群体时,如何将一个复杂的软件开发任务分解成一组简单任务,并建立起开发任务与参与个体的最优适配,实现个体智能的最大释放?此外,开放参与下的软件开发具有群体贡献碎片化、群智结果不可预期性等特点,如何量化度量群智贡献的质量和价值、构建有效的群智贡献迭代精化闭环、实现多源碎片化群智贡献的可信传播与汇聚收敛,形成高效群智涌现? +\subsubsection{群智开发生态的认知度量和成长演化} -(3)群智开发生态的认知度量和成长演化 - - -在群智开发中,参与者群体、代码与社区等多样要素共同形成一个持续发展的生态,在个体激发和群智融合基础上,通过评估和反馈推动生态持续成长演化。在此环境下,软件开发关注点不再仅仅是孤立的、静止的参与者个体或者代码,更需要从“联系”的、“发展”的视角去分析和认识整个群智生态。面临以下两个方面的挑战:一是如何认知和计算软件开发中的群智。群智激发和汇聚是形成群智开发生态的关键,如何深入理解和认识群智激发汇聚和本质,并从激发和汇聚的角度建立群体智能的效能评估方法和评测指标,从而为群智开发的成长演化提供评价准则和度量体系?二是如何推动群智生态的持续成长演化。群智生态中各个要素相互依赖紧密交互,如何建立多元高效的主动反馈机制,在基于群智度量体系对群智过程开展量化度量的基础上对参与群体进行实时反馈和持续引导,驱动群智生态的正向演化? +在群智开发中,参与者群体、代码与社区等多种要素共同形成一个持续发展的生态,并在个体激发和群智融合基础上,通过评估和反馈推动生态持续成长演化。在此环境下,软件开发关注点不再仅仅是孤立的、静止的参与者个体或者代码,更需要从“联系”的、“发展”的视角去分析和认识整个群智生态。面临以下两个方面的挑战:一是如何认知和计算软件开发中的群智。群智激发和汇聚是形成群智开发生态的关键,如何深入理解和认识群智激发汇聚和本质,并从激发和汇聚的角度建立群体智能的效能评估方法和评测指标,从而为群智开发的成长演化提供评价准则和度量体系?二是如何推动群智生态的持续成长演化。群智生态中各个要素相互依赖、紧密交互,如何建立多元高效的主动反馈机制,在基于群智度量体系对群智过程开展量化度量的基础上对参与群体进行实时反馈和持续引导,驱动群智生态的正向演化? \subsection{人机协作编程} 在现有的软件开发活动中,几乎每一行程序(高级语言编写的代码)都需要人类程序员手工编写,随着对软件的需求进一步地增长,以及软件复杂度进一步地提升,这种几乎全手工的编程方式将成为制约计算机行业发展的瓶颈。只有大幅度提升机器编程的占比,并将程序员的主要工作更多地放在少数对创造性具有极高要求的活动上,才能够突破这一瓶颈。因此,需要将程序员统领开发环境完成编程任务的模式转变为程序员与机器各司其职又相互协作完成编程任务的模式。实现人机协作编程的挑战主要来自两个方面:1、如何提升机器编程的能力;2、如何实现人机无障碍协作。 - 提升机器编程的能力是实现人机协作编程的基础,软件自动化是提升机器编程能力的主要技术手段。人们对软件自动化的探索几乎是伴随着软件的出现而开始的,由于早期的软件开发(编程)是异常繁琐易错的工作,人们很早就开始考虑将编程中机械性的工作交给机器完成。然而,软件自动化也一直没有完全达到人们的期望,导致软件开发长期属于严重依赖开发人员个人能力的活动。传统的软件自动化技术以严格的规约作为输入,通过机器将规约翻译成程序代码或者通过搜索技术找到符合规约的程序代码:前者的典型代表是编译器,也是软件自动化方面到目前为止最为成功的尝试,但随着抽象层次的提高,人们发现很难通过固定的规则完成所有可能的翻译;后者的典型代表是程序合成,但由于程序空间过于庞大,目前能够通过搜索获得程序通常仅限于规模很小的程序。近年来,随着数据的广泛积累,数据驱动的方式在很多领域取得了前所未有的成功,类似地,长期累积的海量代码数据为软件自动化带来了新的可能性,为提升机器编程能力带来了新的希望。数据驱动的软件自动化可以利用已有代码数据中总结出来的规律指导搜索,从而提升程序合成的效率,同时这种不依赖严格推理的模式又易于处理半形式化甚至非形式化的规约,从而扩大软件自动化技术的适用范围。由于程序空间是无限空间,已有程序代码在整个空间里仍然很稀疏,而程序代码又受到问题领域、技术进步、开发者习惯的影响展现出很强的异质性,如何从已有程序代码总结规律存在巨大的挑战。 - 与人工编程相比,机器编程的优势在于机器编程可以利用计算机的强大计算能力,劣势在于机器编程主要从已有代码中学习,缺乏有效处理边角信息的能力,因此高效的人机协作将能更好地发挥两者的优势。支持高效人机互动的开发环境一直是软件工程关注的重点之一,最早的开发环境只是一系列工具的简单堆叠,真正意义上的开发环境是在上世纪八十年代以后发展起来的,这类开发环境的主要特点在于,开发者是整个开发环境的主导,开发环境是开发者的操控台和延伸,进入到新世纪开发环境有两个新的发展趋势:1、开发环境中开始出现一些智能服务(如代码推荐等),虽然能够进入主流开发环境的智能服务仍十分有限,但学术界研究的智能工具多以开发环境的插件形式展现;2、开发环境开始支持开发者间的交互,虽然这与开发者间远程协作需求的增长有关(短程协作中开发者可以进行面对面的交流),但却为探索多开发者协同提供了有益尝试。为了满足人机协作编程的需要,开发环境需要应对以下两方面的挑战:1、建立开发者对机器编程的信任关系:在开发者主导的环境中开发者更多依赖自己的主观判断,但在人机协作环境中开发者完全可控的范围缩小将更依赖机器编程,如果开发者不能确信机器编程能否完成特定任务,就会严重影响开发效率;2、实现人机多渠道交互:现有开发环境中的人机交互以及开发者间的交互方式主要以文本方式进行,而人类通常习惯同时以多种方式进行交流,这样才能更好激发开发者的创造力。 \subsection{开发运维一体化} 软件开发是人类的一项高复杂度的集体智力活动,其现实问题的复杂度反映到开发中主要表现为架构、过程、技术和组织四个维度上的复杂度,它们往往紧密地交织纠缠在一起并相互转化。软件工程在这四个维度上发展趋势,即架构逐渐去中心化,技术趋于平台化、自动化和虚拟化,过程趋于增量和迭代,组织趋于小而自治,开发运维一体化(DevOps)集中体现了这些发展趋势的高阶形态。随着互联网化和服务化的高度发展和走向成熟使得未来的软件更加需要具备持续(continuous)的特征。这种持续性将覆盖从商业策划、开发到运维以及演化的所有环节,使得未来软件系统像具有生命一般:在持续稳定提供服务的同时,软件系统的边界、发展走向等不再固化,而是始终处在不断变化和适应之中。持续性与上述的架构、过程、技术与组织四个维度的复杂性交织在一起,再叠加性能、安全等质量要求和实效性要求等,使得未来的软件系统的开发和运维面临诸多的挑战,这就需要我们在原则、方法、实践以及工具层面都做要充分的应对。 +\subsubsection{构建按需(On-Demand)的基础设施} +作为DevOps产生的技术和平台基础,基础设施(Infrastructure)可能是未来DevOps能够发挥更大作用的关键环节。然而,如何匹配软件系统运行需求(或者企业需求)来构建适用的基础设施一直是需要重点关注的话题。值得关注的几个挑战包括:1)混合云,即为了更好的适应各种业务场景,混合云是一种合理的选择,但是由此带来的异构、安全、可扩展等方面的挑战不容忽视;2)边缘计算,即为了尽可能减少数据传输代价,就近提供计算服务是一种选择,但是,这会大大增加基础设施的复杂程度,带来软件系统部署和维护方面的巨大挑战。3)基础设施自动化和智能化,即提供自动化和智能化类的处理流程来进行基础设施的管理和维护。现有IT基础设施和环境往往已经足够复杂,同时也缺乏跨系统、平台以及流程的可见性,叠加基础设施、运行其上的软件系统和业务往往都是紧耦合的,这些因素都给自动化和智能化带来了巨大挑战。此外,为基础设施注入内建安全机制等也都是未来支撑DevOps发展的IT基础设施亟待解决的挑战。 -(1) 构建按需(On-Demand)的基础设施 +\subsubsection{搭建智能化流水线} +DevOps 持续高效高质量的交付有赖于高度自动化支持工具的支持,自动化也是获得快速反馈的关键。鉴于DevOps自动化支持工具涉及多个阶段,种类繁多,数量上已达数千种,从诸多关系复杂的工具中理解和选择合适的工具集合来搭建流水线对 DevOps 实践者来讲至关重要,但也非常具有挑战性。未来,部分重要的基础性工具将向少数较成熟的工具收敛(如在持续构建、自动化部署、服务治理等方面),但是,更多的DevOps的自动化支持工具将向更加专业化发展。即构建的流水线往往面向特定应用领域(例如金融行业对安全性和合规性有着极高要求)或包含其他专业组建(例如,人工智能、大数据等),因而,如果提供开箱即用的工具链方案,帮助企业选择并定制适合其业务的DevOps工具链是一个巨大的挑战。此外,随着软件项目的持续进展,DevOps流水线会产生大量的数据,例如,工具链自身产生的数据,在研软件系统在验证过程中产生的数据以及DevOps项目执行产生的数据等等。如何从流程与数据两个维度打通,提供以DevOps流水线为基础的开发运维一体化协作平台,进而提升其智能化水平,在此基础上提升DevOps实践的效率和质量,同样也是为了支持前文所述的持续性,从工具链和生产环境角度需要需要解决的重大挑战之一。 +\subsubsection{微服务化架构演化策略和评估手段} +微服务化是支持前文提及的持续性要求的必备条件。软件系统的微服务化要求软件系统的各个模块或服务间的耦合进一步降低,从而在新版本发布或者部分服务出现问题时不会影响到系统其它部分。企业系统架构的微服务化以更好地支持DevOps已成为行业共识和趋势,然而在演化过程中却面临诸多挑战。首先,如何进行合理的服务划分,即将软件系统拆分成多个独立自治且协同合作的服务,是微服务应用实现敏捷、灵活和高可扩展的先决条件,也是微服务领域的一项严峻挑战。其次,虽然服务拆分为开发和维护提供诸多便利,但在另一方面,服务数量的增加也带来了系统整体测试复杂度的增长。例如,当采用微服务架构之后,系统对远程依赖项的依赖较多,而对进程内组件的依赖较少,因此测试策略和测试环境需要适应这种变化。微服务化的系统不仅需要保证组件内部的正确性,还需要通过契约测试等保证组件间通信和交互的正确性,使得众多微服务能够真正实现协同工作。相应地,微服务联调、日志分析与故障定位、自动化监控告警与治理策略等是当前以及未来较长时间内的研究中需要探索的迫切问题。此外,缺乏普遍适用的架构演化评估手段也是当前面临的挑战。微服务架构并不一定适合所有的企业情况,因此,在演化过程中,应该通过哪些角度去判断架构拆分的效果?如何建立这些角度与业务需求之间的对应关系?如何度量微服务拆分效果并及时给出建议(包括补充替代的架构形式)等都存在若干亟需解决的问题。 -作为DevOps产生的技术和平台基础,基础设施(Infrastructure)可能是未来DevOps能够发挥更大作用的关键环节。然而,如何匹配软件系统运行需求(或者企业需求)来构建适用的基础设施一直是需要重点关注的话题。值得关注的几个挑战包括:1)混合云,即为了更好的适应各种业务场景,混合云是一种合理的选择,但是由此带来的异构、安全、可扩展等方面的挑战不容忽视;2)边缘计算,即为了尽可能减少数据传输代价,就近提供计算服务是一种选择,但是,这会大大增加基础设施的复杂程度,带来软件系统部署和维护方面的巨大挑战。此外,支持Serverless架构的基础设施、内建安全的基础设施、RPA(Robotic Process Automation,机器人流程自动化)等等也都是未来支撑DevOps发展的IT基础设施相关的研究和实践热点。 +\subsubsection{DevOps高频交付带来的质量和安全问题} +质量和安全一直都不是新问题。然而,在DevOps语境下,在高水平自动化支持下的快速高频交付是维系持续性的基础,但同时也使得传统的质量和安全问题都有了新的含义和内容。例如,通过各类工具来实现自动化验证和确认是DevOps实践中的不二选择。然而,现有工具在发现并且消除缺陷和隐患的效率和效能方便并不完全令人满意,在快节奏和高度自动化的交付过程中,以往的交叉检验和人工分析等质量手段往往也被略去,不可避免地增加了很多质量风险。大量研究和实践表明,DevOps和Security合规往往在实践中处于天然对立关系,这种对立不是通过“构造”DevSecOps一个词汇能解决的。如何协调上述的对立是一个棘手问题。其次,现代软件系统的弱点(vulnerability)往往有多种来源和根本原因,例如来自上述基础设施的安全威胁、DevOps的快节奏所导致的各种妥协、质量缺陷、大量第三方组件的安全威胁、自动化运维中的安全隐患、企业文化(流程、人员技能和意识等)导致的安全疏漏等等。所谓百密一疏,尽管有一些工具、方法以及实践可以一定程度上缓解上述各种威胁带来的压力,但显然在效果和效率方面还有一些不足。从这个意义上说,退而求其次的方式是采取事后方式——通过监控系统运行过程尤其是通过分析系统异常来辅助发现安全风险。但是,这种方式还是有两大急需解决的难题,即1)如何产生可靠的高质量运行相关的数据(例如日志信息)以及2)如何应用先进的技术(例如大数据、AI技术等)提升对数据的利用效率和分析数据发现质量和安全性风险的能力。 - -(2) 搭建智能化流水线 - - -DevOps 持续高效高质量的交付有赖于高度自动化支持工具的支持,自动化也是获得快速反馈的关键。鉴于DevOps自动化支持工具涉及多个阶段,种类繁多,数量上已达数千种,从诸多关系复杂的工具中理解和选择合适的工具集合来搭建流水线对 DevOps 实践者来讲至关重要,但也非常具有挑战性。未来,部分重要的基础性工具将向少数较成熟的工具收敛(如在持续构建、自动化部署、服务治理等方面),但是,更多的DevOps的自动化支持工具将向更加专业化发展。即构建的流水线往往面向特定应用领域(例如金融行业对安全性和合规性有着极高要求)或包含其他专业组建(例如,人工智能、大数据等),因而,如果提供开箱即用的工具链方案,帮助企业选择并定制适合其业务的DevOps工具链是一个巨大的挑战。此外,随着软件项目的持续进展,DevOps流水线会产生大量的数据,例如,工具链自身产生的数据,在研软件系统在验证过程中产生的数据以及DevOps项目执行产生的数据等等。如何从流程与数据两个维度打通,提供以DevOps流水线为基础的开发运维一体化协作平台,进而提升其智能化水平,再次基础上提升DevOps实践的效率和质量,同样也是为了支持前文所述的持续性,从工具链和生产环境角度需要需要解决的重大挑战之一。 - - -(3) 探索可用的微服务化架构演化策略和评估手段 - - -微服务化是支持前文提及的软件系统持续性要求的必备条件。软件系统的微服务化要求软件系统的各个模块或服务间耦合进一步降低,从而在新版本发布和出现问题时不会影响到系统其它部分。企业系统架构向微服务架构演化以更好地支持DevOps已成为行业共识和趋势,然而在演化过程中却面临诸多挑战。首先,合理的服务划分,即将软件系统拆分成多个独立自治且协同合作的服务,是微服务应用实现敏捷、灵活和高可扩展的先决条件,也是微服务领域的一项严峻挑战。其次,虽然服务拆分为测试带来诸多便利,但在另一方面,服务数量的增加也带来了测试复杂度的指数增长。当采用微服务架构之后,系统对远程依赖项的依赖较多,而对进程内组件的依赖较少,因此测试策略和测试环境需要适应这种变化。微服务系统不仅需要保证组件内部的正确性,还需要通过契约测试等保证组件间通信和交互的正确性,使得众多微服务能够真正实现协同工作。相应地,微服务联调、日志分析与故障定位、自动化监控告警与治理策略等是当前以及未来较长时间内的研究中需要探索的迫切问题。此外,微服务架构并不一定适合所有的企业情况,因此,建立微服务架构行之有效的评估和决策支持方法,如在演化过程中,应该通过哪些角度去判断架构拆分的效果?这些角度与业务需求之间的对应关系?如何度量微服务拆分效果并及时给出建议(包括补充替代的架构形式)等都存在若干亟需解决的问题。 - - -(4) DevOps高频交付带来的质量和安全问题 - - -质量和安全一直都不是新问题,但是在当前以及未来,都是DevOps用以支撑未来软件系统开发和运维应当重点关注的点。在DevOps语境下,在高水平自动化支持下的快速高频交付是维系持续性的基础,但同时也使得传统的质量和安全问题都有了新的内容。例如,通过各类工具来实现自动化V\&V是DevOps实践中的不二选择。然而,现有工具在发现并且消除缺陷和隐患的效率和效能方便并不能如意。大量研究和实践表明,DevOps和Security合规往往在实践中具体天然的对立,这种对立不是通过“构造”DevSecOps一个词汇能解决的。如何协调上述的对立是一个棘手问题。其次,现代软件系统的缺陷(vulnerability)往往有多种来源和根本原因,例如来自上述基础设施的安全威胁、DevOps的快节奏所导致的各种妥协、质量缺陷、大量第三方组件的安全威胁、自动化运维中的安全隐患、企业文化(流程、人员技能和意识等)导致的安全疏漏等等。所谓百密一疏,尽管有一些工具、方法以及实践可以一定程度上缓解上述各种威胁带来的压力,但显然在效果和效率方面还有一些不足。从这个意义上述,退而求其次的方式是采取事后方式——通过监控系统运行过程尤其是通过分析系统异常来辅助发现安全风险。但是,这种方式还是有两大急需解决的难题,即如何产生可靠的高质量运行相关的数据(例如日志信息)以及如何应用先进的技术(例如大数据、AI技术等)提升对数据的利用效率和分析数据发现质量和安全性风险的能力。 - - -(5) 智能化运维 - - -作为DevOps中的Ops一端,运维的重要性越来越突显。工业界目前已经开始实践智能化运维(AIOps)技术以有效降低运维成本、提高运维效率和质量。随着各类AI技术和方法的迅速发展,智能化运维尽管已经有了较为坚实的基础,但是其有效实施却直接依赖于软件系统或者服务的运行时产生的各类信息的质量。目前智能化运维主要是提供一些相对简单的标准化日志信息的捕获、分析和决策,主要只关注在运维侧,在现阶段尚未有效形成运维-开发的反馈闭环,以支持开发高效应对运维变化。此外,智能化运维依赖的各类数据都有缺点:日志数据的产生主要依赖程序员的个人经验,实践中往往日志质量很差,难以支持对软件行为的有效捕获;指标数据则是一种隔靴搔痒的环境数据;跟踪路径数据会在瞬间产生巨量数据,导致完全无法分析。因此,如何充分使用这三类数据,在更加精细的力度上捕获软件应用或者服务的行为,进而提供更加准确的信息供分析,这是智能化运维需要解决的关键问题。 - - -(6) 支撑DevOps规模化的组织与管理 - - -DevOps整合了开发团队与运维团队,使其成为一个整体,这使得团队的组织、文化和软件过程都与单纯的开发团队和运维团队有所不同。同时,团队的规模也不可避免的有所增加,降低了团队面对面沟通的效率。DevOps是受到敏捷软件开发的影响而产生的,天然带有敏捷基因并植根于精益思想。然而,敏捷方法的很多理念和实践并不能天然应用于DevOps。例如,常规敏捷方式鼓励着眼当前问题同时通过承担一定程度的技术负债来应对未来的多种可能变化。这种寻求局部最优解的思维方式并不利于打破各个部门之间的壁垒。又如,在敏捷宣言鼓励之下的“重代码轻文档”方式在高频交付中也会面临挑战,等等。另一方面,随着开发和维护的软件系统越来越复杂,规模也越来越大,开发运维团队合并后,必然要求团队规模也相应扩大。一个DevOps团队由于包含了运维人员,安全团队等,整体人员规模会更大,工作和交流更加复杂。敏捷社区提出了SAFe(Scaled Agile Framework来支持更大规模的团队,目前已经列入DevOps相关内容。然而,也有很多人批评SAFe过于复杂,违背了敏捷的基本价值观。从这个意义上说,如何在大规模团队中实施DevOps仍将成为未来一段时间研究者和实践者需要解决的问题。 +\subsubsection{智能化运维} +作为DevOps中的Ops一端,运维的重要性越来越突显。工业界目前已经开始实践智能化运维(AIOps)技术以有效降低运维成本、提高运维效率和质量。我们注意到,随着各类AI技术和方法的迅速发展,智能化运维尽管已经有了较为坚实的基础,但是其有效实施却直接依赖于软件系统或者服务的运行时产生的各类数据和信息的质量。目前智能化运维主要提供一些相对简单的标准化日志信息的捕获、分析和决策;同时,当前的AIOps主要关注在运维一侧,尚未有效形成运维-开发的反馈闭环,以支持开发团队高效应对运维变化的新需求。此外,智能化运维依赖的各类数据和信息也都有各自缺点:日志数据的产生主要依赖程序员的个人经验,实践中往往日志实践开展的质量很差,导致大部分日志文件中充斥着毫无价值的垃圾信息,难以支持对软件行为的有效捕获;指标数据则是一种隔靴搔痒的环境数据,对错误定位的支持非常有限;跟踪路径数据会在瞬间产生巨量数据,导致完全无法分析。因此,如何充分使用这三类数据,在更加精细的力度上捕获软件应用或者服务的行为,进而提供更加准确的信息供分析,这是智能化运维需要解决的关键问题。 +\subsubsection{支撑DevOps规模化的组织与管理} +DevOps整合了开发团队与运维团队,使其成为一个整体,这使得团队的组织、文化和软件过程都与单纯的开发团队和运维团队有所不同。同时,团队的规模也不可避免的有所增加,降低了团队面对面沟通的效率。DevOps是受到敏捷软件开发的影响而产生的,天然带有敏捷基因并植根于精益思想。然而,敏捷方法的很多理念和实践并不能天然应用于DevOps。例如,常规敏捷方式鼓励着眼当前问题同时通过承担一定程度的技术负债来应对未来的多种可能变化。这种寻求局部最优解的思维方式并不利于打破各个部门之间的壁垒。又如,在敏捷宣言鼓励之下的“重代码轻文档”工作方式对于持续性的维持还是弊大于利,毕竟我们不会轻易终止一款软件系统。另一方面,随着开发和维护的软件系统越来越复杂,其规模也越来越大,在开发运维团队合并后,必然要求团队规模也相应扩大,团队之间的协作和交流也会更加复杂。敏捷社区提出了SAFe(Scaled Agile Framework来支持更大规模的团队,目前已经列入DevOps相关内容。然而,也有很多人批评SAFe过于复杂,违背了敏捷的基本价值观。从这个意义上说,如何在大规模团队中实施DevOps仍将成为未来一段时间研究者和实践者需要解决的问题。 \section{主要研究内容} -面向高效、高质量、低成本开发和演化软件系统的总体目标,软件开发方法和技术的研究范围涵盖新型程序设计与软件方法学、软件自动化技术、软件复用技术、软件自适应与生长技术、复杂软件分析与建模、智能软件开发方法、嵌入式软件开发方法与技术、复杂系统需求分析方法与技术、软件服务化方法与技术等各个方面。结合应对以上重大挑战问题,主要研究内容将集中在人机物融合场景建模(§4.2.1)、系统自适应需求分析(§4.2.2)、系统内生安全规约获取(§4.2.3)、群智软件生态(§4.2.4)、群智开发方法(§4.2.5)、群智协同演化(§4.2.6)、群智软件支撑环境(§4.2.7)、面向机器编程的代码生成(§4.2.8)、面向人机协同的智能开发环境(§4.2.9)、开发过程建模与优化(§4.2.10)、软件系统运行数据管理(§4.2.11)、安全可信的开发运维一体化(§4.2.12)、开发运维一体化的组织与管理(§4.2.13)、微服务软件架构(§4.2.14)等。 +面向高效、高质量、低成本开发和演化软件系统的总体目标,软件开发方法和技术的研究范围涵盖新型程序设计与软件方法学、软件自动化技术、软件复用技术、软件自适应与生长技术、复杂软件分析与建模、智能软件开发方法、嵌入式软件开发方法与技术、复杂系统需求分析方法与技术、软件服务化方法与技术等各个方面。结合应对以上重大挑战问题,主要研究内容将集中在人机物融合场景建模、系统自适应需求分析、系统内生安全规约获取、群智软件生态、群智开发方法、群智协同演化、群智软件支撑环境(、面向机器编程的代码生成、面向人机协同的智能开发环境、开发过程建模与优化、软件系统运行数据管理、安全可信的开发运维一体化、开发运维一体化的组织与管理、微服务软件架构等。 \subsection{人机物融合场景建模} 人机物融合的新型泛在系统,以实现人类社会、信息空间和物理世界的互联互通为目标。在这种应用场景中,计算资源高度泛化,系统能力拓展到包括连接、计算、控制、认知、协同和重构等在内的网络化、协同式和适应性的认知、计算和控制一体的综合能力范畴。需要研究人机物融合的计算环境的认知和建模,特别是对各种实现感知、计算、通信、执行、服务等能力的异构资源的认知的建模;系统研究交互环境的建模理论,包括交互环境静态属性特征和动态行为特征,以及行为约束等多个方面;需要对典型人机物融合场景下泛在应用的本质特征,分别予以有效的场景抽象,研究相应的软件定义方法,以凝练人机物融合应用场景的共性,更有效地管理资源,并适应动态多变的应用场景。 @@ -140,16 +93,16 @@ DevOps整合了开发团队与运维团队,使其成为一个整体,这使 人机物融合应用场景下,安全作为第一要务是不容置疑的,一方面需要保护人生安全,另一方面需要避免损失,避免破坏环境,安全防护,这些已成为系统强制执行的法律。系统内生安全的实现存在两个阶段,第一阶段是安全特征的构造,安全特性不同与系统的其它功能,需要研究:基于显式环境建模安全关注点分析,支持对安全隐患/环境风险/不合规问题等的识别;研究对系统运行时的时空间协同建模,支持混合的行为建模和认知建模以及人类行为模拟,支持从环境行为模型中发现隐含的风险隐患;研究离散模型和连续模型的融合方法,支持一体化系统验证,以及人在环路中/上系统,以及支持协作和共享的控制器综合。第二阶段是建立内置的安全规约,研究对系统级内置隐私保护和安全控制能力抽象,支持安全能力成为系统可管理的资源,研究面向应用场景的可定义的安全能力配置,系统功能和隐私/安全约束的协调,个性化、可动态配置的隐私/安全约束,以及可追溯可审计的隐私保护/安全控制。 \subsection{群智软件生态} -在群智开发中,参与者群体、开发环境、软件任务、软件制品等多种要素相互作用,是持久驱动软件生产力发展的重要引擎。然而,由于软件的复杂性持续增长、开发过程的开放性持续加大,软件生态的形成与演变具有很强的随机性,未能形成有效的生态构建机理与方法。为此需要重点研究:1)基于博弈论和社会经济学等理论研究开源生态形成与演化的动力学模型,形成“贡献激发、群智汇聚、人才涌现”的良性循环;2)研究面向软件生态的多模态持续激励机制,突破基于区块链等新型技术的群智激励方法;3)研究软件生态的大规模混源代码溯源技术和演化分析方法,突破软件开发供应链的分析识别技术,建立全谱系的群智软件生态供应链模型。通过上述研究,为软件生态构建和演化提供理论指导。 +在群智开发中,参与者群体、开发环境、软件任务、软件制品等多种要素相互作用,是持久驱动软件生产力发展的重要引擎。然而,由于软件的复杂性持续增长、开发过程的开放性持续加大,软件生态的形成与演变具有很强的随机性,未能形成有效的生态构建机理与方法。为此需要重点研究:1)基于博弈论和社会经济学等理论研究开源生态形成与演化的动力学模型,形成“贡献激发、群智汇聚、人才涌现”的良性循环;2)研究面向软件生态的多模态持续激励机制,突破基于区块链等新型技术的知识产权共享与群智激励方法;3)研究软件生态的大规模混源代码溯源技术和演化分析方法,突破软件开发供应链的分析识别技术,建立全谱系的群智软件生态供应链模型。通过上述研究,为软件生态构建和演化提供理论指导。 \subsection{群智开发方法} -在动态开放环境下,参与群体的高自主性、任务目标的高变化性,带来群智涌现的不确定性,严重制约了基于群智的软件开发效能。基于“人在回路中”的群智软件生态观,群智软件开发方法需重点关注:(1)研究大规模群体的高效协作机理和模型,突破面向复杂环境的群体协同增强方法;(2)研究碎片化贡献的高效共享与汇聚融合技术,建立群体贡献的高效可信传播体系;(3)突破群智贡献的多维量化评估与度量技术,形成多源群智贡献的高效汇聚与精化收敛方法 +在动态开放环境下,参与群体的高自主性、任务目标的高变化性等,带来群智涌现的不确定性,严重制约了基于群智的软件开发效能。基于“人在回路中”的群智软件生态观,群智软件开发方法需重点关注:(1)研究大规模群体的高效协作机理和模型,突破面向复杂开放环境的群体协同增强方法;(2)研究碎片化贡献的高效共享与汇聚融合技术,建立群智贡献的高效可信传播体系;(3)突破群智贡献的多维量化评估与度量技术,形成多源群智贡献的高效汇聚与精化收敛方法。 \subsection{群智协同演化} -群智软件开发是一种人类智能和机器智能协同融合推动软件系统持续迭代的新方法,如何充分激发人机群智的效能实现软件系统的快速演化,需要重点关注:(1)研究群体行为量化分析与建模方法,建立群智激发汇聚行为轨迹演进模型;(2)研究涵盖代码、开发者、开发社区、软件生态的群智软件开发多维度分析评估方法,突破面向软件开发演化的大数据分析和智能释放技术;(3)研究开发者群体智能与开发大数据机器智能的互补融合、协同演进机制,构建面向软件生态演化的人-机反馈回路。通过上述研究,为群智软件生态演化提供技术支撑。 +群智开发是一种人类智能和机器智能协同融合推动软件系统持续迭代的新方法,如何充分激发人机群智的效能,实现软件系统的快速演化,需要重点关注:(1)研究群体行为量化分析与建模方法,建立群智激发汇聚、行为轨迹演进等基本模型;(2)研究涵盖代码、开发者、开发社区、软件生态的群智软件开发多维度分析评估方法,突破面向软件开发演化的大数据分析和智能释放技术;(3)研究开发者群体智能与开发大数据机器智能的互补融合、协同演进机制,构建面向软件生态演化的人-机反馈回路。通过上述研究,为群智软件生态演化提供技术支撑。 \subsection{群智软件支撑环境} -以群智软件开发方法和技术为依托,以群智开发生态为理论指导,构建面向群智软件开发与演化的支撑环境,需要重点关注:(1)研究构建面向群智制品和大规模群体的管理、协作、共享与评估等群智开发支撑工具集,有效支持开放群体的高效协同和群智任务的有效管理;(2)研究动态开放环境的群体组织规则与环境协作流程,构建相应的支撑机制和工具,充分释放大规模人-机群体的效能;(3)突破面向新型软件的智能化开发运维一体化技术,构建人机混合智能软件开发与演化的支撑平台,建立针对群智软件开发生态中核心技术和关键节点的支撑和掌控机制,形成覆盖人-机-物的全新软件开发与技术创新生态网络。 +以群智软件开发方法和技术为依托,以群智开发生态为理论指导,构建面向群智软件开发与演化的支撑环境,需要重点关注:(1)研究构建面向群智制品和大规模群体的管理、协作、共享与评估等群智开发支撑工具集,有效支持开放群体的高效协同和群智任务的有效管理;(2)研究动态开放环境的群体组织规则与环境协作流程,构建相应的支撑机制和工具,充分释放大规模人-机混合群体效能;(3)突破面向新型软件的智能化开发运维一体化技术,构建基于人机混合群体智能的软件开发与演化支撑平台,建立针对群智软件开发生态中核心技术和关键节点的全面支撑和自主可控机制,形成覆盖人-机-物的全新软件开发与技术创新生态网络。 \subsection{面向机器编程的代码生成} 机器编程是人机协作编程的基础,而代码生成又是机器编程的核心。从软件的生命周期过程看,机器编程主要在以下场景中起作用:(1)以软件规约为出发点,自动生成满足规约的软件代码;(2)针对软件中存在的错误,自动生成修复代码。从软件规约生成代码本质上是一个搜索过程,即在在程序空间里搜索满足软件规约的程序,然而待搜索的程序空间规模巨大,搜索难以有效进行;同时,程序本身固有的复杂性使得验证代码是否满足规约也存在巨大的效率问题。与从软件规约生成代码相比,自动生成修复代码有明显的特殊性:修复时通常缺乏可以准确刻画正确程序性质的规约,但存在可运行的出错程序,此时代码生成更多地是在已有代码上的修改,而验证更多地通过对比运行修改前后的程序进行。这方面的主要研究内容包括:(1)如何利用海量代码数据加速程序合成中的代码搜索;(2)如何利用海量代码数据加速程序合成中的代码验证;(3)如何利用人类程序员的修复数据完成软件错误的自动修复。 @@ -158,16 +111,28 @@ DevOps整合了开发团队与运维团队,使其成为一个整体,这使 人机协作编程的另一个重要基础是高效的智能开发环境,智能开发环境是机器编程技术的集中承载者,也为开发人员提供各种智能服务,同时智能开发环境也是开发人员间交流的通道。在一个智能开发环境中,开发人员应该能够方便地获取各种所需的信息,从而减少对自身大脑信息记忆的依赖;同时,智能开发环境应该能够主动识别开发人员的需求,为开发人员推荐相关的信息或开发动作,比如推荐完成特定开发任务的代码;进一步,作为开发人员间交流的中介,智能开发环境应该保证开发人员间高效顺畅的交互,如果存在可以独立承担开发任务的机器程序员,智能开发环境也应保证人类程序员与机器程序员间的交互;传统的键盘和屏幕并不是人类最习惯的交互机制,更好的交互机制应该是一种综合运用多种感官的多通道交互,智能开发环境应该提供开发人员更习惯的交互机制。因此,这方面的主要研究内容包括:(1)如何帮助开发人员快速查找开发所需的信息;(2)如何针对具体的开发任务推荐可能的开发动作;(3)如何实现开发人员间以及与开发环境间的多通道交互。 \subsection{开发过程建模与优化} -丰富的工具是软件过程实现DevOps化的助推器与基石,工具在有效的优化过程的同时,会产生海量的过程数据。挖掘这些数据并构建模型,以实现过程改进和优化是目前热门的研究领域。早在DevOps出现之前,软件过程建模和优化就是一个研究热点,但数据的缺乏一直是过去相关研究面临的主要挑战。DevOps的盛行,尤其是随着各类工具的普及,问题已经转变为了如何有效挖掘并利用资源库中蕴含的海量数据。有两大类研究值得关注:一类是使用传统过程建模技术为理解、分析以及管控过程提供支持,更进一步的可以实现过程的改进与优化。另一类研究采用机器学习技术,着眼于过程中更具体的点,例如缺陷预测,持续集成结果预测,评审人员推荐等等,能够为提高过程质量、减少资源消耗和缩短交付周期等提供支持。 +丰富的工具是软件过程实现DevOps化的助推器与基石,工具在有效地优化过程的同时,会产生海量的过程数据。挖掘这些数据并构建模型,以实现过程改进和优化是目前热门的研究领域。早在DevOps出现之前,软件过程建模和优化就是一个研究热点,但数据的缺乏一直是过去相关研究的痛点。DevOps的盛行,尤其是随着各类工具的普及,问题已经转变为了如何有效挖掘并利用资源库中蕴含的海量数据。这方面,有两大类研究值得关注:一类是使用传统过程建模技术为理解、分析以及管控过程提供支持,更进一步的可以实现过程的改进与优化。另一类研究采用机器学习技术,着眼于过程中更具体的点,例如缺陷预测、持续集成结果预测、评审人员推荐等,能够为提高过程质量、减少资源消耗和缩短交付周期等提供支持。 \subsection{软件系统运行数据管理} -从指标信息、调用链信息以及日志信息入手,通过深入整合与挖掘这三种运维数据信息,来提供更丰富以及高质量的信息,进而提升AIOps的质量与效率,这应该是需要实现的目标。为了达成这个目标,需要开展如下研究。首先,需要研究提升运维数据的质量的方法。在这三类信息中,由于日志信息是非结构化的以及主观的,因此数据的质量并不理想。在日志的生命周期中,需要将日志决策和开发的阶段提前,融入需求开发阶段,并形成日志的开发-运维反馈闭环。辅以自动化日志工具,以此来提高日志的质量以及日志记录的效率。其次,应该提升调用链信息的捕获和存储效率。最后,需要提出一种深度整合三类运维数据的方法。指标信息、调用链信息以及指标信息应该通过特定的算法关联起来,从而提供多维度的运维信息。例如,调用链信息可以与指标信息结合,将各个时间节点的指标信息以调用关系的形式组织起来,进而促进根因分析等AIOps任务。 +从指标信息、调用链信息以及日志信息入手,通过深入整合与挖掘这三种运维相关的数据信息,来提供更丰富以及更高质量的信息,进而提升AIOps的质量与效率,这应该是需要实现的目标。为了达成这个目标,需要开展如下研究。首先,需要研究提升运维数据的质量的方法。在这三类信息中,由于日志信息是非结构化的,受到开发人员主观因素影响较大,因此大部分数据的质量并不理想。因此,在日志的生命周期中,需要将日志决策和日志开发的阶段左移,在需求开发和系统设计中充分考虑日志的需求,并形成日志本身的开发-运维反馈闭环。在此基础上,辅以自动化日志工具,以此来提高日志的质量以及日志记录的效率。其次,应该探索相应的方法和技术来提升调用链信息的捕获和存储效率。最后,需要提出一种深度整合三类运维数据的方法。日志信息、调用链信息以及指标信息应该通过特定的算法关联起来,从而提供多维度的运维信息。例如,调用链信息可以与指标信息结合,将各个时间节点的指标信息以调用关系的形式组织起来,进而促进根因分析等AIOps任务。 \subsection{安全和可信的开发运维一体化} -DevOps打破了软件开发与运维团队之间的隔阂,提高了软件部署的频率,但是当运维团队在维护过程中遇到安全问题时仍然需要通过求助安全团队,使用专业的安全工具检测问题来源,分析数据形成解决方案并提交给开发团队最终解决问题,这一过程通常需要较长的时间且伴随有问题扩散的风险。为实现安全且可信的运维,主要的研究内容包括:(1)通过自动化运维以及智能化运维减少运维工作中的一些人工操作,在提升效率的同时避免手工作业所可能产生的错误;(2)对运维过程的监控数据进行分析,及时检测异常的发生,并对问题进行追踪和溯源工作,快速解决问题、避免损失;(3)DevSecOps下的安全运维在持续监控和分析的同时需要建立持续的问题反馈循环,为产品安全性和可行度提供持续的保障。 +为实现安全且可信的运维,我们需要开展的主要研究内容包括:(1)通过自动化运维以及智能化运维减少运维工作中的一些人工操作,在提升效率的同时避免手工作业本身可能导致的错误;(2)对运维过程的监控数据进行分析,及时检测异常的发生,并对问题进行追踪和溯源工作,快速解决问题、避免损失;(3)DevSecOps下的安全运维在持续监控和分析的同时需要建立持续的问题反馈循环,为产品安全性和可行度提供持续的保障。 \subsection{开发运维一体化的组织与管理} -为了缩短软件从产品设计到呈现给最终用户的时间,DevOps整合了软件开发和运维团队,这使得DevOps团队的组织、文化和过程都与单纯开发、运维团队不同。基于DevOps的目标、基础设施变化、质量和安全的挑战、工具链发展现状,DevOps需要解决以下问题:(1)使用经验软件工程的方法,探寻适合DevOps的组织结构和过程实践,并进行验证;(2)如何既能通过团队自组织工作方式提升效率,同时又能够避免由于具体人员技能缺失或管理人员与DevOps团队缺乏信任关系造成的失败,在敏捷与规范之间取得平衡;(3)在大型项目中,使用怎样的组织方式和软件过程,能够使得DevOps项目具有敏捷应对变更的优势以及工作效率。 +为了缩短软件从产品设计到呈现给最终用户的时间,DevOps整合了软件开发和运维团队,这使得DevOps团队的组织、文化和过程都与单纯开发、运维团队不同。从组织与管理角度,DevOps需要解决以下问题:(1)使用经验软件工程的方法,探寻适合DevOps的组织结构和过程实践,并进行验证;(2)如何既能通过团队自组织工作方式提升效率,同时又能够避免由于具体人员技能缺失或管理人员与DevOps团队缺乏信任关系造成的失败,在敏捷与规范之间取得平衡;(3)在大型项目中,使用怎样的组织方式和软件过程,能够使得DevOps项目具有敏捷应对变更的优势以及工作效率。 \subsection{微服务软件架构} -围绕微服务架构有如下几类研究:第一,实现合适粒度的微服务划分方法,主要研究内容包括:(1)基于领域驱动设计方法识别限界上下文以实现高内聚、低耦合的服务;(2)利用遗留系统的现有构件信息识别候选微服务;以及(3)综合利用多种划分策略实现复杂系统的服务划分等。第二,基于微服务架构的快速故障定位和消除,主要研究内容包括:(1)构建更加完善的监控系统,除了基础指标监控功能,实现分布式服务链路追踪和日志聚合分析等高级功能来帮助故障排查和定位;(2)基于AIOps实现智能告警运维,具体来讲通过已经构建的监控系统平台对多种类型数据进行不同形式的采集(有代理和无代理)、处理、存储, 使用并改进机器学习算法对运维数据进行分析预测,实现多种场景的智能告警运维。第三,微服务架构评估,主要研究内容包括:(1)提出面向微服务系统的架构质量评价方法,为微服务系统架构质量的评估过程提供指南,总结供架构评估使用的核查表(checklist)以支持开发、运维微服务系统的实践;(2)初步实现一个微服务系统的验证平台,为软件开发、运维人员和软件组织提供有效的架构决策和实现支持。 +围绕微服务架构有如下几类研究值得关注:(1)实现合适粒度的微服务划分方法,主要研究内容包括:基于领域驱动设计方法识别限界上下文以实现高内聚、低耦合的服务;利用遗留系统的现有构件信息识别候选微服务;综合利用多种划分策略实现复杂系统的服务划分等。(2)基于微服务架构的快速故障定位和消除,主要研究内容包括:构建更加完善的监控系统,除了基础指标监控功能,实现分布式服务链路追踪和日志聚合分析等高级功能来帮助故障排查和定位;基于AIOps实现智能告警运维,通过已经构建的监控系统平台对多种类型数据进行不同形式的采集(有代理和无代理)、处理、存储,使用并改进机器学习算法对运维数据进行分析预测,实现多种场景的智能告警运维;微服务架构评估,即提出面向微服务系统的一般化架构质量评价方法,为微服务系统架构质量的评估过程提供指南,总结供架构评估使用的核查表(checklist)以支持开发和运维中的微服务架构实践。 + +\section{本章小结} +高效、高质量、低成本地开发和演化软件系统是软件开发方法和技术研究追求的总体目标。本章分析了在这个总体目标指引下,面对人机物融合应用场景需求软件开发方法和技术研究将面临的重大挑战,并在此基础上阐述了相关的主要研究内容。 + +\section{参考文献} +\ref{1}张伟, 梅宏. 基于互联网群体智能的软件开发:可行性、现状与挑战[J]. 中国科学:信息科学, 2017(12):5-26. + +\ref{2} Wang H. Harnessing the crowd wisdom for software trustworthiness. SIGSOFT Software Engineer Notes 2018, 43(1), 1-6. + + + + diff --git a/Ch2-8-Quality&Security.tex b/Ch2-8-Quality&Security.tex index 08e22bb..9025814 100644 --- a/Ch2-8-Quality&Security.tex +++ b/Ch2-8-Quality&Security.tex @@ -1,55 +1,52 @@ +% !TEX root = main.tex -软件学科是一门工程技术型学科,质量自从软件诞生之日起就是被关注的重点。经典的软件质量核心价值观强调“绝对正确”,涵盖了正确性、易用性、高效性、可靠性、鲁棒性、(易)理解性、维护性、复用性、移植性、测试性等一系列属性,强调在客观证明基础之上形成对软件质量的客观认识。 -在“软件定义一切”的时代,一方面人机物融合应用场景使得软件的使能空间被进一步大幅度扩展,导致软件系统的规模和复杂性进一步增大,软件开发和演化的成本进一步上升;另一方面动态开放的运行环境使得安全性成为十分重要的质量属性,专门针对性的保障措施成为迫切需求;进一步,由于软件日益成为实现应用价值的核心载体,各类利益相关者的价值实现被纳入软件质量属性的范围。由于受到可投入成本的限制,人们越来越清楚地认识到在客观证明基础之上形成对软件质量的客观认识是现实达不到的理想目标,因而软件质量的核心价值观转变为强调“相对可信”,即在客观证据(包括部分客观证明)的基础上形成对软件质量的主观判断。 +软件学科是一门工程技术型学科,质量自从软件诞生之日起就是被关注的重点。软件质量和安全保障是通过相关技术和管理手段来检测、度量和评估软件制品符合预期的程度,并排除或容忍软件制品中不符合预期的因素,从而保障软件的实现和行为符合预期。经典的软件质量核心价值观强调“绝对正确”,涵盖了正确性、易用性、高效性、可靠性、鲁棒性、(易)理解性、维护性、复用性、移植性、测试性等一系列属性\cite{1},强调在客观证明基础之上形成对软件质量的客观认识。 + +在“软件定义一切”的时代,一方面人机物融合应用场景使得软件的使能空间被进一步大幅度扩展,导致软件系统的规模和复杂性进一步增大,软件开发和演化的成本进一步上升;另一方面动态开放的运行环境使得安全性成为十分重要的质量属性,针对性的保障措施成为迫切需求;进一步,由于软件日益成为实现应用价值的核心载体,各类利益相关者的价值实现被纳入软件质量属性的范围,还需要考虑伦理、授权、法律等相关非技术因素。由于受到可投入成本的限制,人们越来越清楚地认识到在客观证明基础之上形成对软件质量的客观认识是现实达不到的理想目标,因而软件质量的核心价值观转变为强调“相对可信”,即在客观证据(包括部分客观证明)的基础上形成对软件质量的主观判断。 在建立价值观的基础上要进一步建立各类软件质量保障措施,也即围绕各类软件质量关注点提供解决问题的方法和技术。从系统观与生态观的角度看,软件质量的考虑涉及更宽广的范畴。例如,从系统工程的角度看,如何在经济可行条件约束下通过综合集成的方法,用可担负质量的部件实现高质量的系统。又如,如何认识在软件生态系统中质量的依赖与传播规律;考虑到软件生态中各类利益相关者的价值差异和冲突,软件及其服务的质量如何取舍权衡等等。以上内容相关的质量保障措施值得进一步研究,但由于篇幅有限,本章主要关注以下更加迫切、更具挑战性的软件质量与安全保障问题。 -随着软件质量的核心价值观从“绝对正确”转变为“相对可信”,可信软件的度量与评估成为软件质量保障的基础性挑战问题。随着人机物融合程度的加深,实时混成、云端融合、复杂异构、动态聚合、智能适应等非经典需求与应用场景层出不穷,软件系统设计、实现和运行过程中需要采用更具针对性的质量保障措施。大规模复杂系统的安全保障变得更重要但又更困难,迫切需要新的技术突破;确保物联网软件安全上升到了国家安全高度,亟需系统深入的研究工作。特别地,数据驱动的智能软件日益成为一类重要的软件形态,不同于传统软件,这类软件基于概率化的归纳推理来实现智能行为,对各类不确定性的驾驭是其内在的要求,如何有效评估和保障这类智能化软件系统与服务的质量也是亟待研究的问题。 +随着软件质量的核心价值观从“绝对正确”转变为“相对可信”,度量与评估软件符合预期的程度成为软件质量保障的基础性挑战问题。随着人机物融合程度的加深,实时混成、云端融合、复杂异构、动态聚合、智能适应等非经典需求与应用场景层出不穷,软件系统设计、实现和运行过程中需要采用更具针对性的质量保障措施。大规模复杂系统的安全保障变得更重要但又更困难,迫切需要新的技术突破;确保物联网软件安全上升到了国家安全高度,亟需系统深入的研究工作。特别地,数据驱动的智能软件日益成为一类重要的软件形态,不同于传统软件,这类软件基于概率化的归纳推理来实现智能行为,对各类不确定性的驾驭是其内在的要求,如何有效评估和保障这类智能化软件系统与服务的质量也是亟待研究的问题。 \section{重大挑战问题} -软件质量与安全保障面临的重大挑战问题主要集中以下几个方面:一是在人工智能时代,数据驱动的智能软件系统因为依赖于外部数据、内置模型等鲜明的新特性,如何才能有效保障其质量;二是可信增强,人机物融合场景下的规模化、定义化的软件系统,如何才能将针对传统静态、封闭、开发阶段的可信度量、评估和增强技术,支持动态、开放、演化的软件;三是软件与系统安全,现阶段遇到的挑战主要在于如何针对大规模复杂软件系统和无处不在的物联网软件,有效检测安全缺陷或漏洞,并通过构建准确、高效的缺陷修复技术及漏洞防御机制保障安全。 +软件质量与安全保障面临的重大挑战问题主要集中以下几个方面:一是在人工智能时代,数据驱动的智能软件系统高度复杂的数据依赖、软件行为不确定性、计算结果鲁棒性方面,对软件质量提出了新的挑战;二是可信增强,人机物融合场景下的规模化、定义化的软件系统,如何才能将针对传统静态、封闭、开发阶段的可信度量、评估和增强技术,支持动态、开放、演化的软件;三是软件与系统安全,现阶段遇到的挑战主要在于如何针对大规模复杂软件系统和无处不在的物联网软件,有效检测安全缺陷或漏洞,并通过构建准确、高效的缺陷修复技术及漏洞防御机制保障安全。 \subsection{数据驱动的智能软件系统质量保障} -越来越多的软件系统采用人工智能技术基于大规模数据分析进行计算、推理及决策,即综合利用统计分析算法、数据处理、并行计算等技术,从海量、多态的数据中,挖掘知识、实现数据价值的最大化。随着数据驱动的智能软件系统越来越广泛地应用在工业生产、社会生活、金融经济、行政管理的方方面面,其可靠性、鲁棒性、安全性等问题如不能有效地加以防范,将造成重大损失甚至灾难性后果。与传统软件相比,数据驱动的智能软件系统在高度复杂的数据依赖、软件行为不确定性、计算结果鲁棒性方面,对质量保证研究提出了新的挑战。 +越来越多的软件系统采用人工智能技术,基于大规模数据分析进行计算、推理及决策,即综合利用统计分析算法、数据处理、并行计算等技术,从海量、多态的数据中,挖掘知识、实现数据价值的最大化。与传统软件相比,数据驱动的智能软件系统在高度复杂的数据依赖、软件行为不确定性、计算结果鲁棒性方面,对质量保证研究提出了新的挑战\cite{2}。随着数据驱动的智能软件系统越来越广泛地应用在工业生产、社会生活、金融经济、行政管理的方方面面,其可靠性、鲁棒性、安全性等问题如不能有效地加以防范,将造成重大损失甚至灾难性后果。 (1) 数据和模型质量成为瓶颈。数据驱动的智能软件系统中,往往以数据为核心,围绕数据的处理、分析、挖掘、学习等各种任务设计算法,被称为“面向数据编程”的模式。因此,与传统软件侧重“逻辑正确”不同,数据和模型的质量是数据驱动的智能软件系统可信性的基础和关键。一方面,数据的质量难以保证,噪音会严重干扰模型的有效性;另一方面,鉴于认知系统和认知过程的复杂性,模型有可能不完整、不精确、模型假设存在偏差,算法应具备一定的鲁棒性,不受模型中噪音的干扰,给出可信的决策结果,在数据分布特征等方面,训练数据集与实际应用或是预期的数据集可能存在不一致性,即数据集偏差、歧视、或是样本迁移问题,直接影响模型的可靠性。数据和模型的错误和失效,将造成智能算法判断和决策错误、软件失效。 -(2) 数据依赖严重且依赖关系复杂、多变,软件行为难以预测。数据驱动的智能软件系统数据、模型之间存在着错综复杂的依赖关系,这些依赖关系可能是隐形的、间接的、动态多变的,数据、模型依赖及其与代码之间的相互关联难以分析和维护,错误难以定位和隔离。相比于代码分析,数据、模型和代码之间依赖和追踪关系的研究还非常有限,尚缺乏有效的技术和工具。由于程序逻辑高度依赖于数据,算法对数据、模型的变化敏感,基于概率分析和动态学习的决策过程,使得软件行为具有很大的不确定性。 +(2) 数据依赖严重且依赖关系复杂、多变,软件行为难以预测。数据驱动的智能软件系统数据、模型之间存在着错综复杂的依赖关系,这些依赖关系可能是隐形的、间接的、动态多变的。数据、模型依赖及其与代码之间的相互关联难以分析和维护,错误难以定位和隔离。相比于代码分析,数据、模型和代码之间依赖和追踪关系的研究还非常有限,尚缺乏有效的技术和工具。由于程序逻辑高度依赖于数据,并且算法对数据、模型的变化敏感,所以基于概率分析和动态学习的决策过程,使得软件行为具有很大的不确定性。 -(3) 数据驱动智能软件系统的异常监控和容错。运行在安全关键场景下的数据驱动的智能软件系统一旦出现质量问题,将会导致严重后果,例如,无人驾驶汽车的识别错误时将会导致事故。如何通过有效的手段,监控系统运行时的数据和行为,及时预判系统行为异常,以便采取有效措施,保障系统能够正常运行。进而,如何通过相关容错手段,确保数据驱动的智能软件系统在运行时出现故障的情况下,保障系统的行为符合预期。 +(3) 智能系统需具备运行时故障诊断、预测及自愈的能力。智能系统常常需要融合多种硬件设施、软件组件,实时完成大规模数据的采集、综合、分析等处理,实现智能感知和智能决策。系统应用场景多样,功能组合繁多,输入空间难以穷尽,条件组合数量巨大;在实际运行中,软硬件环境等因素复杂多变,各种情况叠加在一起综合作用。离线测试阶段难以覆盖各种可能的场景。另一方面,系统常需要集成大量第三方的数据和软件,如深度学习与机器学习框架。在实际应用中,第三方服务的稳定性、可靠性、安全性以及不同来源的服务之间的兼容性、互操作性等问题,都给系统集成带来了巨大的挑战。因此,运行过程中及时发现和诊断乃至预测系统故障、及时修复故障或通过容错等机制保持系统正常运行,对于保证业务安全和系统高可用性至关重要。 \subsection{人机物融合场景下的软件系统可信增强} -与传统系统不同,人机物融合场景下的软件系统将计算部件与物理环境进行一体化整合,将大量独立的异构设备(及其数据)进行智能化的连接,并针对当前系统、场景等的实时变化根据任务需求对计算逻辑,乃至系统架构进行自动调整与配置。这样,计算设备可以更精确的获取外界信息并做出针对性、智能化的实时反映,从而提高计算的性能与质量,给出及时、精确并且安全可靠的服务,实现物理世界与信息系统的整合统一[20]。显然,列车、电网、航天等典型安全攸关系统均具有鲜明的人机物融合特质。如何对相关系统的可信性进行保障对相关系统的正确运行具有重要意义。然而,在人机物融合的场景下,相关异构、组合、动态等特性也给系统行为可信保障带来了新的挑战与需求。 +与传统系统不同,人机物融合场景下的软件系统将计算部件与物理环境进行一体化整合,将大量独立的异构设备(及其数据)进行智能化的连接,并针对当前系统、场景等的实时变化根据任务需求对计算逻辑,乃至系统架构进行自动调整与配置。这样,计算设备可以更精确的获取外界信息并做出针对性、智能化的实时反映,从而提高计算的性能与质量,给出及时、精确并且安全可靠的服务,实现物理世界与信息系统的整合统一\cite{3}。显然,列车、电网、航天等典型安全攸关系统均具有鲜明的人机物融合特质。如何对相关系统的可信性进行保障对相关系统的正确运行具有重要意义。然而,在人机物融合的场景下,相关异构、组合、动态等特性也给系统行为可信保障带来了新的挑战与需求。 (1) 人机物融合场景下组件间将进行频繁的通信、合作与协同,去完成复杂的任务。因此,相关系统是一个典型的组合系统。长期以来,对大规模组合系统进行分析、测试、验证一直是相关领域难点所在。此外,由于在人机物融合场景下不确定性、概率性行为、实时连续行为越来越常见。如何在建模阶段对随机、不确定、连续行为进行描述,并在分析中对相关行为进行研究,也是对相关复杂不确定系统进行可信增强的一个重要挑战。 (2) 相较于一般静态可预测系统,人机物融合场景下系统行为更加强调于实时捕获、采集环境或者其他协作成员的运行时参数,从而进行自身策略,乃至组件间拓扑结构的智能化调整。在开放环境下,相关外界参数取值随时间变化,难以准确离线刻画。因此,从传统的静态测试、分析、验证等角度出发,难以遍历枚举相关开放动态行为中可能出现的所有场景,无法给出完整状态空间描述与安全保障。在此情况下,如何从运行时监控角度应对开放环境带来的连续动态行为是相关领域重要关注问题。 -(3) 从系统观来认识人机物融合系统,我们会发现在人机物融合场景下,相关系统的多组件行为呈现出典型的分布式、异构式特征。在组件内部行为难以描述,组件间相互规格和工作方式差异巨大,难以整体把控的情况下,如何从体系结构角度对系统可信增强进行考虑,设计面向容错的新型协同设计方式及异构系统体系结构[31],为相关软件设计提出了新的挑战。 +(3) 从系统观来认识人机物融合系统,我们会发现在人机物融合场景下,相关系统的多组件行为呈现出典型的分布式、异构式特征。在组件内部行为难以描述,组件间相互规格和工作方式差异巨大,难以整体把控的情况下,如何从体系结构角度对系统可信增强进行考虑,设计面向容错的新型协同设计方式及异构系统体系结构,为相关软件设计提出了新的挑战。 - -\subsection{大规模复杂系统安全缺陷检测与保障} -现代软件系统因需求的快速迭代而增量构建、经过频繁重构和演化、规模庞大、复杂度高,都是典型的大规模复杂系统,在企业应用、城市交通、航空航天、智能电网、医疗、指挥控制等重要领域已经成为了不可或缺的一部分,但其实现中存在漏洞或恶意代码等安全缺陷,是导致大规模复杂系统安全性问题的主要根源,而要想保障其安全,需要即时检测并排除安全缺陷,但随着软件的规模和复杂性的不断增大,现有软件安全保障技术与工具的有效性和可扩展性受到了严重制约,软件安全缺陷检测和排除以人为中心、侧重经验的实践现状尚未改变,尚未能形成自动化、客观化的解决方案。综上所述,软件安全保障所面临的新挑战主要包括: +\subsection{大规模复杂系统安全缺陷检测} +现代软件系统因需求的快速迭代而增量构建、经过频繁重构和演化、规模庞大、复杂度高,都是典型的大规模复杂系统,在企业应用、城市交通、航空航天、智能电网、医疗、指挥控制等重要领域已经成为了不可或缺的一部分,但其实现中存在漏洞或恶意代码等安全缺陷,是导致大规模复杂系统安全性问题的主要根源,而要想保障其安全,需要即时检测并排除安全缺陷,但随着软件的规模和复杂性的不断增大,现有软件安全保障技术与工具的有效性和可扩展性受到了严重制约,软件安全缺陷检测和排除尚未改变以人为中心、侧重经验的实践现状,尚未能形成自动化、客观化的解决方案\cite{4,5}。综上所述,软件安全保障所面临的新挑战主要包括: (1) 安全缺陷统一建模。安全缺陷中,漏洞属于实现中存在遗漏,而恶意代码属于多余的实现,经过几十年的发展,已经公开了大量的安全缺陷,软件安全缺陷具有程序设计语言依赖、系统依赖等特征,有时还依赖于特定的硬件平台与体系结构,安全缺陷形态、机理各异。针对特定的安全缺陷,研究相应的检测方法进行精准制约化检测,虽在特定场景下可行,但已不能满足实际的安全需求。面临的挑战主要在于如何统一表达安全缺陷的语法、语义特征、触发规则、行为特征等问题,使得能够通过相关检测算法高效、精准识别安全缺陷;在此基础上,解决安全缺陷检测方法的平台化、引擎化、定制化,以便检测已有的重要安全缺陷,并具备扩展能力,检测新的安全缺陷。 (2) 大规模复杂系统安全缺陷检测方法的效率和资源有效协同。根据已公开的安全缺陷特征,通过静态分析、测试和验证等方法检测潜在安全缺陷,是目前被普遍采用的技术。但随着软件系统规模越来越大、系统功能日趋复杂,公开安全缺陷的数量也急剧上升,安全缺陷检测方法的精准性和规模化能力是难点问题。面临的挑战主要包括:1)需要平衡在处理大规模程序时在精度和可扩展性之间取舍。高精度的检测方法需要更多的资源开销,并且受到程序规模的制约,而为了适应大规模程序的安全缺陷检测,采用保守的策略,会导致大量的误报,且需要人工进一步确认,从而降低了检测方法的可用性; 2)需要平衡协同计算资源的消耗与检测效率。安全缺陷检测方法可以提升精度但增加复杂度且需要更高的计算资源,可以利用大数据处理、硬件加速、并行化等技术优化检测算法,依据特定的规则将大规模代码进行切分,将检测任务并行化处理、并将其分配到不同的计算资源上完成检测工作。 (3) 安全缺陷检测过程中大规模状态空间的充分探索。在安全缺陷检测过程,需要尽快探索到目标程序的状态空间,以检测潜在的安全缺陷,由于复杂软件系统的程序状态空间十分庞大,如何有效地探索程序的状态空间是需要解决的关键问题,具体包括以下几个方面:1)程序分支和循环结构的深度覆盖:通过探索程序状态空间过程中历史覆盖、缺陷检测、冗余等信息,有效地制导探索过程,尽早覆盖关键的程序状态空间;2)多元信息制导的模糊测试输入生成:利用程序结构、安全缺陷特征、执行结果反馈等信息,有效地制导模糊测试,使其能够产生覆盖多样性目标的输入空间,从而快速覆盖程序状态空间,到达能够触发安全缺陷的程序行为路径。 +(4) 历史漏洞机理和安全专家经验难以复用。在现有安全缺陷检测的分析和测试过程中,多个环节存在不确定性,仍需要安全专家人工进行决策。这些安全专家经验以及历史漏洞的机理信息对后续漏洞分析、检测、利用和修复工作能够起到很大作用。但遗憾的是,这些经验在现阶段难以实现高准确度的复用。然而,机器学习、深度学习等人工智能技术现已在文本翻译、图像处理、语音识别等方面得到广泛应用,使其具备人的智能而实现自主决策。因此,如何在安全缺陷检测和预警的各个环节中引入智能化技术,是现阶段所面临的重要挑战,具体包括以下两个方面:1)安全缺陷检测历史信息的智能化:将安全缺陷检测历史信息及其统计特征知识化,以便在安全缺陷检测过程中进行智能化预测;将深度学习技术应用到安全缺陷检测样本代码相似度映射中以便实现同源安全缺陷检测和挖掘的智能化,应用到输入域、程序结构的映射中实现模糊测试中输入生成的智能化;2)安全专家经验的知识化和智能化利用:分析安全缺陷检测过程中的专家经验,进而抽象其为安全缺陷检测的启发式规则,以便在安全缺陷检测过程中根据自动搜索经验知识空间实现安全缺陷检测的智能化。 -(4) 历史漏洞机理和安全专家经验难以复用。在现有安全缺陷检测的分析和测试过程中,多个环节存在不确定性,需要人工决策,而机器学习、深度学习等人工智能技术。这些专家经验以及历史漏洞的机理分析对后续分析能够起到很大作用。但遗憾的是,这些经验在现阶段难以复用。另一方面,在文本、图像、语音等信息的处理方面已经具备人的智能而实现自主决策。因此,如何在安全缺陷检测和预警的各个环节中引入智能化技术,是现阶段所面临的重要挑战,具体包括以下两个方面:1)安全缺陷检测历史信息的智能化:将安全缺陷检测历史信息及其统计特征知识化,以便在安全缺陷检测过程中使用机器学习方法进行智能化预测,如何将深度学习技术应用到安全缺陷检测样本代码相似度映射中以便实现同源安全缺陷检测和挖掘的智能化,应用到输入域、程序结构的映射中实现模糊测试中输入生成的智能化;2)安全专家经验的知识化和智能化利用:利用安全缺陷检测过程中的安全专家经验,并抽象其为安全缺陷检测的启发式规则,以便在安全缺陷检测过程中根据自动搜索经验知识空间实现安全缺陷检测的智能化。 - -(5) 面向安全保障的缺陷自动修复与验证。及时修复软件中存在的安全缺陷,是保障软件安全的主要手段,先阶段主要依靠人工修复软件安全缺陷需要花费大量的时间精力阅读理解程序代码、定位安全缺陷并修复,非常耗时耗力。面临的挑战主要在于:1)如何针对安全缺陷实现自动修复。基于遗传算法、程序搜索、程序合成等手段的软件缺陷的自动修复方法面临在实际系统中应用的可扩展性、可用性等方面的挑战。2)如何自动验证修复。目前存在一些修复方法在某些实验途径上可以证实有效性,但缺少理论基础,无法保障其完备性,需要有手段保证安全缺陷修复措施符合预期。 - - +(5) 面向安全保障的缺陷自动修复与验证。及时修复软件中存在的安全缺陷,是保障软件安全的主要手段,现阶段主要依靠人工修复软件安全缺陷需要花费大量的时间精力阅读理解程序代码、定位安全缺陷并修复,非常耗时耗力。面临的挑战主要在于:1)如何针对安全缺陷实现自动修复。基于遗传算法、程序搜索、程序合成等手段的软件缺陷的自动修复方法面临在实际系统中应用的可扩展性、可用性等方面的挑战。2)如何自动验证修复。目前存在一些修复方法在某些实验途径上可以证实有效性,但缺少理论基础,无法保障其完备性,需要有手段保证安全缺陷修复措施符合预期。 \subsection{物联网软件安全保障} -物联网是移动互联网、云计算、大数据技术和人工智能等新一代信息技术,在人类社会的具体应用领域中,通过人机物融合实现计算、信息、通讯、控制等任务的一体化的产物。物联网软件是其核心使能组成部分,也是软件产业的一个新兴领域。物联网高速发展的同时,也带来新的问题,特别是物理设备实现移动互联后,导致所有物联网终端设备直接暴露在互联网上、处于不安全状态,使得设备自身安全、其拥有和传输的数据的机密性、完整性和可获得性,都面临安全挑战。任一物联网终端软件一旦遭受攻击,将会导致软件崩溃、设备失效、威胁用户隐私、冲击关键信息基础设施等安全事故,对整个物联网系统造成严重的破坏性。但现阶段,全面保障物联网软件与系统安全,需要检测物联网软件的所有潜在安全薄弱环节,实施有针对性的保障措施。但由于物联网软件的复杂性、异构性、人机物融合等特性,仍然需要重点解决如下重大挑战问题: - +物联网是移动互联网、云计算、大数据技术和人工智能等新一代信息技术,在人类社会的具体应用领域中,通过人机物融合实现计算、信息、通讯、控制等任务的一体化的产物。物联网软件是其核心使能组成部分,也是软件产业的一个新兴领域。物联网高速发展的同时,也带来新的问题,特别是物理设备实现移动互联后,导致所有物联网终端设备直接暴露在互联网上、处于不安全状态,使得设备自身安全、其拥有和传输的数据的机密性、完整性和可获得性,都面临安全挑战。任一物联网终端软件一旦遭受攻击,将会导致软件崩溃、设备失效、威胁用户隐私、冲击关键信息基础设施等安全事故,对整个物联网系统造成严重的破坏性\cite{6,7}。但现阶段,全面保障物联网软件与系统安全,需要检测物联网软件的所有潜在安全薄弱环节,实施有针对性的保障措施。但由于物联网软件的复杂性、异构性、人机物融合等特性,仍然需要重点解决如下重大挑战问题: (1) 面向复杂异构物联网终端控制软件的安全缺陷检测。在复杂物联网系统中,计算、通信和控制设备由于其各自所执行的任务不同,往往由完全不同的软硬件构成,同时不同设备间的相互协作关系也由于系统的庞大而变得十分复杂,有时还可能存在动态变化,这导致对复杂物联网系统中异构的终端设备控制软件进行安全性检测变得异常困难。如何改进现有的静态分析与动态测试技术以适应物联网软件依赖的芯片、硬件外设、操作系统、指令集、外部库、交互接口、外部输入等异构性,是面向复杂异构物联网终端软件进行安全缺陷检测亟需解决的关键问题。 (2) 面向完整物联网软件系统的模糊测试。物联网边界模糊、设备异构,物联网软件实现了控制、计算与通信的集成,使其在处理能力不断强大的同时,内部结构也变得愈加庞杂且与外部世界的交互变得愈加频繁,而现有的模糊测试方法主要针对物联网软件系统自身故障进行安全检测,面临的挑战在于如何针对物联网系统与环境,探索使用基于人工智能技术、深度学习方法,构建智能化模糊测试方法,将物联网状态空间中搜索安全缺陷的问题转化为目标制导模糊测试与优化问题。 @@ -57,113 +54,61 @@ (3) 面向动态安全检测的物联网软件仿真与虚拟化技术。现有物联网软件测试需要互联网环境支撑、动态执行设备,并依据获取的运行时反馈信息进行分析,使得运行时安全检测面临驱动设备运行困难、捕获设备反馈困难、识别安全缺陷困难等问题,具体包括:1)物联网软件仿真技术。由于物联网软件依赖的终端硬件、体系架构、指令集、部署配置的多样性,如何在支持相应固件体系结构、指令集的模拟器的基础上构建通用仿真执行支撑环境;如何针对基于特定外设,基于适配接口构建物理设备运行驱动环境,从而实现能对典型设备进行运行驱动的支撑;如何利用通用仿真环境和物理环境的支撑,捕获运行时的物理设备的状态、仿真环境下覆盖等反馈信息,便于安全缺陷检测过程。 2)物联网系统环境建模与虚拟化技术,物联网软件需要通过外设、互联网接口与外界交互,如何基于各类网络协议,对多类交互输入接口进行虚拟化和数字化的基础上统一建模,对物联网运行依赖的系统软件平台进行虚拟化建模与支撑。 \section{主要研究内容} -软件系统的质量和安全保障主要在于针对软件自身的构建和维护阶段、软件运行和提供服务阶段,未来应当研究以下几个方面:一是从发现缺陷角度,需要研究现有软件质量和安全保障的技术手段的能力提升;二是从适应新时代软件新的特征角度,需要研究的新的软件质量和安全保障的方法;三是从标准、伦理和法律符合性角度,研究在软件开发构建、运行维护过程中约束、规范人的行为以保障软件的质量和安全的技术手段。 +软件系统质量和安全保障的重点,仍然是通过相关技术手段和管理手段来检测、度量和评估软件制品符合预期的程度,并排除或容忍软件制品中不符合预期的因素,从而实现保障软件系统的实现和行为符合预期。但由于软件在社会生活中的作用发生根本性变化,我们需要从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面的研究内容,整体框架如图\ref{fig8}所示。具体而言,需要研究软件伦理、软件公平性、软件授权、软件立法等非技术因素扩展软件预期外延的方法,以及相应的检测、度量和评估技术;由于软件自身的发展、开源软件的大量使用,软件系统的规模和复杂度大幅度提升,运行软件的平台不断变迁、软件自身的形态不断变化,面向缺陷检测,需要研究分析、测试、验证、监控等检测与度量技术的能力提升和可扩展性途径;对现有的检测、度量、保障和评估技术不能满足实际需求时,需要研究相应的形式化方法、模型驱动方法、符号执行技术、人工智能技术、抽象解释技术、虚拟化技术、并行化技术等支撑技术;随着软件的运行环境动态开放、系统的行为存在不确定性,需要研究软件系统动态行为的建模、监控、预测和容错;随着数据驱动的智能化软件大量应用于重要领域,需要研究作为软件制品的组成部分的数据和智能模型的质量保障;经过一段时间的安全检测与保障,已在全球构建各类公开的漏洞库/恶意软件库,需要研究已知漏洞、恶意软件的检测、定位、修复,并探索未知漏洞、恶意软件的检测与报告;随着支持软件运行的平台已经从经典的计算机,转向端边云融合的泛在物联网计算设备,软件的形态已经成为驱动物联网设备的固件,需要研究物联网固件的分析、模糊测试、仿真等安全保障方法,以及相应的虚拟化支撑技术;软件自身的构建和维护、软件运行和提供服务过程中,软件质量和安全保障活动产生了大量数据,需要给予软件质量和安全的历史数据,从管理角度对研究在软件开发构建、运行维护过程中约束、规范人的行为,改进软件过程,从预防不符合预期制品的构建角度保障软件的质量和安全。 -\subsection{大规模复杂系统建模、分析、测试与验证} -人机物融合场景下,大规模复杂系统的行为存在多组件间交互、大量不确定、概率性行为,研究概率、组合建模机制对相关系统行为进行描述,并在此基础上研究大规模概率组合系统分析、测试、验证方法与技术以进行可信增强和质量保障具有重要意义。 +\begin{figure*}[!t] +\centering +\includegraphics[width=0.8\textwidth]{fig2-8/fig0801} +%\vspace*{-15pt} +\caption{\small 软件质量与安全保障研究内容框架}\label{fig8} +\label{fig_sim} +\end{figure*} -\subsection{开放动态系统行为监控、预测与容错} -传统静态手段难以应对开放动态系统,从监控的角度在运行时对系统行为进行可信增强具有重要意义。以监控属性和监控设计模型为基础,结合运行时验证、故障诊断与隔离等技术,研究相关系统主动监控理论,一方面能够有效监控系统当前出现的问题,另一方面可以基于运行状态对系统后续行为进行预测,在出现可能发生故障的趋势时,对系统运行进行干涉,以避免故障的发生。 +\subsection{软件预期的外延扩展和符合性评估} +由于软件在社会生活中的作用发生根本性变化,作为软件质量与安全保障的依据,软件预期不能局限于传统的用户需求和领域标准,需要分析国际、国家软件质量和安全相关的标准,针对软件体现的人类价值观,研究软件价值要素和反映软件价值要素的软件质量属性,在此基础上研究新型软件质量和安全模型,制定或更新基于软件价值的质量、安全和可信标准;研究软件价值的度量与评估,在此基础上研究质量评估、安全评估、可信评估、标准符合性评估手段;还需要考虑公开缺陷/漏洞库/恶意软件库、软件伦理、软件公平性、软件授权、软件立法等社会生活中的非技术因素,基于ACM/IEEE软件工程职业伦理规范,研究适合我国国情的软件从业人员的职业伦理规范,基于在国家法律法规及重要领域软件应用,研究特定领域软件立法;基于GPL、APL等国际通行的开源软件授权规定,研究适合我国软件产业发展状况的授权法则,在此基础上,需要研究相应的标准、伦理、授权法则、法律等符合性检测、度量和评估技术。 -\subsection{系统体系结构驱动的可信增强} -针对系统异构复杂性,从体系结构角度出发进行模块化设计将问题与影响进行局部隔离,增加与预留容错机制,减小单组件失效对整体带来的影响对于整体系统可信增强具有重要意义。另外,将上述相关技术进展纳入系统设计,从协同设计角度在设计阶段整体考虑进行监控、预测、容错,对于提升系统可信、性能等也具有显著意义。人机物融合场景下各系统分处不同物理空间,跨越不同知识领域,使用不同架构。为了保证最终整体系统的安全可靠,从系统工程的角度对相关系统进行整体分析是一个重要的方向。 +\subsection{开放空间下的缺陷分析与漏洞挖掘技术} -\subsection{数据质量治理} -数据质量是大数据分析正确和决策有效的根本保证。通过数据治理,采用高效的数据管理工具,保证数据在全生命周期内正确、规范、安全,符合系统要求,有助于高质量的知识挖掘和利用。与传统关系型数据相比,大数据具有数据量大、实时分析要求高、存在多种异构数据格式、噪音高、关键数据元素持续演变等特点,质量管理更加具有挑战性和迫切性。 +由于软件自身的发展、开源软件的大量使用,软件系统的规模和复杂度大幅度提升,运行软件的平台不断变迁、软件自身的形态不断变化,而且,互联网和移动互联网使得运行在封闭空间的软件系统暴露到开放空间,面向缺陷检测,需要研究分析、测试、验证、仿真、监控、审查等检测技术的能力提升和可扩展性途径。为提升大规模软件缺陷检测的精度,需要考虑研究采用符号执行技术、抽象解释技术等,提升缺陷检测的精度以减少误报或漏报;针对新型软件方法学、新的软件形态,需要基于形式化方法、模型驱动方法,研究相应的缺陷检测、修复和容错方法;需要研究如何利用人工智能技术、虚拟化技术、大数据处理技术、并行化技术等支撑技术,利用数据、硬件等资源,提升和优化软件质量和安全保障技术。 +针对基于开源软件和代码托管平台的复杂、开放、规模大和分布式软件生态系统,充分利用软件生态系统中多种形态的数据(如代码、代码提交日志、程序频谱、文档、历史缺陷数据和开发者数据等),多种形态数据的关联和影响、项目间的依赖关系和数据流动,研究跨项目缺陷检测。 + +\subsection{系统动态行为监控与容错} + +针对系统动态行为,以监控属性和监控设计模型为基础,对复杂状态空间进行快速、准确的计算和分析,结合运行时验证、故障诊断与隔离等技术,研究相关系统行为的实时、高效、主动监控方法。另一方面研究行为预测与控制生成技术,基于运行状态对系统后续状态空间进行预测,研究针对潜在故障的容错方法与技术,在可能发生故障前,进行实时控制生成,对系统运行进行干涉,以避免故障的发生,确保系统的行为符合预期。 + +\subsection{数据治理技术} + +与传统关系型数据相比,大数据具有数据量大、实时分析要求高、存在多种异构数据格式、噪音高、关键数据元素持续演变等特点,数据质量是大数据分析正确和决策有效的根本保证,数据质量管理更加具有挑战性和迫切性。因而,需要研究数据治理技术,形成高效的数据管理工具,保证数据在全生命周期内正确、规范、安全、符合系统要求,有助于高质量的知识挖掘和利用。 + +\subsection{智能模型的质量与安全保障} -\subsection{智能模型质量保障} 针对数据集偏差、歧视及样本迁移等问题,一方面需要提高机器学习算法设计的鲁棒性;另一方面更需要在系统层面上构建一套监测体系来时刻发现数据偏差、歧视和样本迁移问题。在构建这套检测体系时,需要考虑两个维度,一是需要保证检测的高效性和及时性;二是需要保证检测的有效性,要能很好的度量数据分布。分析智能学习算法及其开发框架设计,检测鲁棒性、安全性、稳定性等各方面问题,并评估其在智能应用中的风险。探索有效的智能软件测试和质量评估方法。当前对于智能软件的质量评估主要是机器学习算法精度的度量标准,评估并引导智能软件在人工标注的数据集上得到较好的结果,但是却无法评估智能软件在面对恶意攻击的稳定性。 -\subsection{全生存期软件质量运维} -在系统开发环境、集成环境、运行动态环境中,建立一体化的质量保证平台,对开发、集成、部署、运维流程中各个环节质量数据进行综合分析,支持持续迭代的故障检测和质量评价过程,构建软件质量的全景视图,以期更加准确有效地发现质量问题、追溯问题来源并评估质量风险。DevOps、持续集成(CI, Continuous Integration)、持续测试(CT, Continuous Testing)、持续交付(CD, Continuous Delivery)、智能运维(AIOps)等技术及其自动化工具支持,是DevOps提升软件质量保证的关键。在CI/CT/CD过程中,开发人员的每次代码更新提交后,都会触发构建、部署、以及测试脚本的自动执行,小规模代码、高频率测试有助于及时、快速地发现、定位和修复缺陷;在AIOps中,通过大数据分析等技术,自动、及时发现运行过程中的异常行为。开发运营一体化,还可以进一步构成质量反馈机制,将运营环节发现的异常分析报告反馈给开发环节,以加强CI/CT过程的故障检测和质量保证。 +\subsection{安全缺陷检测、定位、修复和预警} -\subsection{软件生态中缺陷检测与修复} -开源软件和代码托管平台的大量使用使得软件开发已经从独立的项目模式演变成社会技术性的软件生态系统模式,这也使得项目间形成错综复杂的依赖关系,促进了项目的共同发展和演化,同时也为软件的维护工作和质量保障带来了新的挑战,解决不好就破坏了软件生态系统的健康与发展。跨项目缺陷的检测和修复问题尤为突出。研究具有复杂、开放、规模大和分布式等特征软件生态系统中的跨项目缺陷的预测、定位和修复,充分利用软件生态系统中多种形态的数据(如代码、代码提交日志、程序频谱、文档、历史缺陷数据和开发者数据等),多种形态数据的关联和影响、项目间的依赖关系和数据流动,研究面向软件生态系统的多形态数据的语义模型、项目依赖网络的软件分析技术,实现跨项目缺陷检测;从缺陷产生的原因、缺陷的影响、缺陷的修复等多个角度研究软件生态系统中缺陷的特征和规律,以目前流行的开源软件生态系统作为对象,构建公共数据集,并进行大规模的实验验证分析,建立一套软件生态系统中缺陷的影响分析模型和方法、跨项目缺陷修复的方法和相应的支撑平台。 +关注软件漏洞和恶意软件等安全缺陷,认清漏洞作为不安全或遗漏的实现、恶意软件作为多余的实现这一本质,分析全球构建各类公开的安全缺陷库,研究安全缺陷产生的原因、结构和行为特征,需要研究典型安全缺陷的结构和行为特征的检测、定位方法,研究使用深度学习、并行化技术提升漏洞检测能力的方法,并探索基于安全缺陷的结构和行为特征未知安全缺陷预警方法。 +分析漏洞成因,基于人工进行漏洞修复经验和知识,研究漏洞代码的自动化定位、漏洞代码上下文智能切片和基于上下文的代码逻辑修正等技术,结合智能化方法,构建智能化漏洞修复技术,保障漏洞修复的准确性和及时性。 +基于恶意代码的静态结构和动态行为特征及其演化,通过在静态分析中引入人工智能技术,模拟安全专家“手工”检测和识别恶意代码的流程,构建恶意特征集作为训练集,训练智能化恶意代码检测模型,从而快速、准确地实现对恶意特征的识别和判断、对恶意行为的自动化验证。 -\subsection{大规模复杂软件的恶意代码智能检测} -基于恶意代码的静态结构和动态行为特征及其演化,通过在静态分析中引入人工智能技术,模拟安全专家“手工”检测和识别恶意代码的流程,研究和设计智能化恶意代码检测模型。将恶意特征库作为数据集,分析并生成其适合机器学习模型的特征描述,进行大规模训练,从而快速、准确地实现对恶意特征的识别和判断,为大规模复杂软件的恶意代码检测提供技术支撑。同理,恶意代码随时间演化,检测模型也需不断变化,因此如何训练出抗恶意代码演化的自改进模型是研究重点;研究通过对目标复杂软件(系统)的恶意特征进行自动化标记,使用智能化技术设计动态分析方法。标记出需要部分动态分析的含恶意特征的目标程序,对其进行运行态行为实时跟踪,实现对恶意行为的自动化验证。 +\subsection{物联网软件的测试技术} -\subsection{漏洞智能化检测} -通过从复杂系统内部和外部海量数据中收集、提取特征,基于深度学习等智能化方法对复杂系统内部逻辑建模,并以前期漏洞检测分析结果为数据基础,完成对复杂系统运行逻辑的预测,实现判别异常运行逻辑,从而有效提高漏洞检测的效率;研究基于深度学习技术构造软件输入域与代码结构、行为的映射模型,基于映射模型有效指导模糊测试生成过程中输入域修改位置与变异值,进而测试针对特定代码区域、触发特定行为,以有效检测漏洞;基于漏洞成因及触发机制,研究基于大数据处理的程序漏洞并行检测技术。 +物联网软件存在的安全缺陷可能存在潜在的风险,其自身结构特性和环境依赖给软件测试带来新的问题。需要研究物联网软件建模、模型驱动测试与验证方法;研究针对物联网软件的静态分析和符号执行技术,支持典型安全缺陷的检测检测;研究面向物联网的智能模糊测试技术,用物联网软件结构、行为模型有效制导模糊测试,生成能够覆盖物联网软件输入域、结构和行为场景的测试输入,利用机器学习、深度学习等人工智能技术,基于对物联网软件结构与行为、物联网软件安全缺陷、模糊测试历史等知识和经验的学习,构建并训练映射模型,预测输入域与状态空间区域的映射关系,通过使用遗传算法、人为指定漏洞关联重点区域,优化模糊测试制导算法,避免无效、冗余的测试用例生成,在资源有限的情况下充分有效地遍历重要的状态空间尽早发现漏洞。 -\subsection{漏洞智能化修复} -漏洞修复作为保护系统免受攻击的重要一环,往往需要精确地把控漏洞成因及漏洞危害。人工进行漏洞修复往往由于安全人员的知识水平和思维习惯等问题造成修复失败或者又引入新的漏洞[19]。通过研究漏洞代码的自动化定位、漏洞代码上下文智能切片和基于上下文的代码逻辑修正等技术,结合智能化方法,构建智能化漏洞修复技术,保障漏洞修复的准确性和及时性。如何表示数据、选取智能化模型是研究难点,因为将数据合理表达为智能模型适合处理的形式,并选用合适的模型,可使漏洞修复过程更加可靠。 +\subsection{过程改进与预防式软件质量保障} -\subsection{物联网软件安全保障} -研究针对物联网软件的静态分析和符号执行技术,支持典型安全缺陷的检测检测;研究物联网软件建模、模型驱动测试与验证方法;研究面向物联网的智能模糊测试技术,用物联网软件结构、行为模型有效制导模糊测试,生成能够覆盖物联网软件输入域、结构和行为场景的测试输入,利用机器学习、深度学习等人工智能技术,基于对物联网软件结构与行为、物联网软件安全缺陷、模糊测试历史等知识和经验的学习,构建并训练映射模型,预测输入域与状态空间区域的映射关系,通过使用遗传算法、人为指定漏洞关联重点区域,优化模糊测试制导算法,避免无效、冗余的测试生成,在资源有限的情况下充分有效地遍历重要的状态空间尽早发现漏洞;研究物联网软件虚拟化和仿真技术,对物联网运行依赖的系统软件平台进行虚拟化建模与支撑,针对物联网软件依赖的特定外设、体系架构、指令集等,研究仿真运行技术。 - -\subsection{软件质量与安全保障的外延扩展} -分析国际、国家软件质量和安全相关的标准,针对软件新的特征和应用,研究新型软件质量模型、标准的扩展、标准符合性评估手段;基于ACM/IEEE软件工程职业伦理规范,研究适合我国国情的软件从业人员的职业伦理规范;基于在国家重要领域软件应用的相关法律规定,研究法律法规符合性的软件的质量和安全保障技术手段,包括GPL、APL等软件授权规定,软件代码中违规行为和证据的获取等。 +在DevOps、持续集成(CI, Continuous Integration)、持续测试(CT, Continuous Testing)、持续交付(CD, Continuous Delivery)、智能运维(AIOps)等软件开发、集成和动态运行维护框架下,研究开发、集成、部署、运维流程中持续迭代的故障检测和质量评价等环节质量历史数据的分析方法,确定质量问题、追溯问题来源并评估质量风险,从管理角度对研究在软件开发构建、运行维护过程中约束、规范人的行为,从改进软件过程、预防不符合预期制品的构建角度保障软件的质量和安全。 \section{本章小节} -在“软件成为基础设施、软件定义一切”的背景下,本章基于软件的复杂加剧化、形态服务化、质量价值化、协作生态化的视角,从可信软件度量与评估、数据驱动的智能软件系统质量保障、人机物融合场景下的软件系统可信增强、大规模复杂软件系统安全、物联网软件安全等几个角度讨论了软件质量与安全保障面临的重大挑战问题,展望了未来仍需研究的方向和内容。 +在“软件成为基础设施、软件定义一切”的背景下,本章基于软件的复杂加剧化、形态服务化、质量价值化、协作生态化的视角,从具有数据驱动、智能化、大规模、高复杂度、人机物融合等特征的角度分析了软件面临的质量和安全保障的重大挑战问题,在此基础上,从尚未充分探索解决的经典问题和新的重大挑战问题等角度展望软件质量和安全保障方面未来仍需研究的方向和内容。 -\section{参考文献} -[1] xLe Goues C, Nguyen T V, Forrest S, et al. Genprog: A generic method for automatic software repair[J]. Ieee transactions on software engineering, 2011, 38(1): 54-72. - -[2] Kruger J, Schneider J, Westermann R. Clearview: An interactive context preserving hotspot visualization technique[J]. IEEE Transactions on Visualization and Computer Graphics, 2006, 12(5): 941-948. - -[3] Kim G, Humble J, Debois P, et al. The DevOps Handbook:: How to Create World-Class Agility, Reliability, and Security in Technology Organizations[M]. IT Revolution, 2016. - -[4] Ebert C, Gallardo G, Hernantes J, et al. DevOps[J]. Ieee Software, 2016, 33(3): 94-100. - -[5] Dang Y, Lin Q, Huang P. AIOps: real-world challenges and research innovations[C]//Proceedings of the 41st International Conference on Software Engineering: Companion Proceedings. IEEE Press, 2019: 4-5. - -[6] Li Z, Dang Y. AIOps: Challenges and Experiences in Azure[J]. 2019. - -[7] D. Sculley, T. Phillips, D. Ebner, et al. Machine learning: the high-interest credit card of technical debt[J]. 2014. http://citeseerx.ist.psu.edu/ -viewdoc/summary? doi=10.1.1.675.9675. - -[8] M. Jorge, C. Ismael, R. Bibiano, S. Manuel, P. Mario. A Data Quality in Use Model for Big Data. Future Generation Computer Systems, 63(2016): 123-130. - -[9] S. Soares, Big Data Governance: An Emerging Imperative, MC Press, 2012. - -[10] Li Y, Jin Z. An Android malware detection method based on feature codes[C]//2015 4th International Conference on Mechatronics, Materials, Chemistry and Computer Engineering. Atlantis Press, 2015. - -[11] Galal H S, Mahdy Y B, Atiea M A. Behavior-based features model for malware detection[J]. Journal of Computer Virology and Hacking Techniques, 2016, 12(2): 59-67. - -[12] Sogukpinar I. Analysis and Evaluation of Dynamic Feature-Based Malware Detection Methods[C]//Innovative Security Solutions for Information Technology and Communications: 11th International Conference, SecITC 2018, Bucharest, Romania, November 8 {u2013} 9, 2018, Revised Selected Papers. Springer, 2019, 11359: 247. - -[13] 李华, 刘智, 覃征, 等. 基于行为分析和特征码的恶意代码检测技术[J]. 计算机应用研究, 2011, 28(3): 1127-1129. - -[14] 宋文纳, 彭国军, 傅建明, 张焕国, 陈施旅 . 恶意代码演化与溯源技术研究. 软件学报,2019.http://www.jos.org.cn/1000-9825/5767.htm - -[15] Gosain A, Sharma G. A survey of dynamic program analysis techniques and tools[C]//Proceedings of the 3rd International Conference on Frontiers of Intelligent Computing: Theory and Applications (FICTA) 2014. Springer, Cham, 2015: 113-122. - -[16] Cousot P, Giacobazzi R, Ranzato F. Program analysis is harder than verification: A computability perspective. In: Proc. of the CAV.2018. 75-95. - -[17] 张健,张超,玄跻峰,熊英飞,王千祥,梁彬,李炼,窦文生,陈振邦,陈立前,蔡彦.程序分析研究进展.软件学报,2019, 30(1):80-109. http:// -www.jos.org.cn/1000-9825/5651.htm - -[18] 邹权臣, 张涛, 吴润浦, 马金鑫, 李美聪, 陈晨, 侯长玉. 从自动化到智能化:软件漏洞挖掘技术进展. 清华大学学报(自然科学版), 2018, 58(12): 1079-1094. - -[19] Lin Z, Jiang X, Xu D, et al. AutoPaG: towards automated software patch generation with source code root cause identification and repair[C]//Proceedings of the 2nd ACM symposium on Information, computer and communications security. ACM, 2007: 329-340. - -[20] Edward Lee. Cyber-physical systems - are computing foundations adequate? Position paper for NSF workshop on Cyber-Physical Systems: Research Motivation, Techniques and Roadmap. - -[21] Wang, Xiaofeng, Naira Hovakimyan, and Lui Sha. "L1Simplex: fault-tolerant control of cyber-physical systems." In 2013 ACM/IEEE International Conference on Cyber-Physical Systems (ICCPS), pp. 41-50. IEEE, 2013. - -[22] Ammar M, Russello G, Crispo B. Internet of Things: A survey on the security of IoT frameworks[J]. Journal of Information Security and Applications, 2018, 38: 8-27. - -[23] David Y, Partush N, Yahav E. Firmup: Precise static detection of common vulnerabilities in firmware[C]//ACM SIGPLAN Notices. ACM, 2018, 53(2): 392-404. - -[24] Davidson D, Moench B, Ristenpart T, et al. {FIE} on Firmware: Finding Vulnerabilities in Embedded Systems Using Symbolic - Execution[C] - //Presented as part of the 22nd {USENIX} Security Symposium ({USENIX} Security 13). 2013: 463-478. - -[25] Corteggiani N, Camurati G, Francillon A. Inception: System-wide security testing of real-world embedded systems -software[C]//27th {USENIX} Security Symposium ({USENIX} Security 18). 2018: 309-326. - -[26] Zheng Y, Davanian A, Yin H, et al. FIRM-AFL: high-throughput greybox fuzzing of iot firmware via augmented process emulation[C]//28th {USENIX} Security Symposium ({USENIX} Security 19). 2019: 1099-1114. - -[27] Sfar A R, Natalizio E, Challal Y, et al. A roadmap for security challenges in the Internet of Things[J]. Digital Communications and Networks, 2018, 4(2): 118-137. - -[28] Kolias C, Kambourakis G, Stavrou A, et al. DDoS in the IoT: Mirai and other botnets[J]. Computer, 2017, 50(7): 80-84. - -[29] Zhou W, Jia Y, Yao Y, et al. Discovering and understanding the security hazards in the interactions between IoT devices, -mobile apps, and clouds on smart home platforms[C]//28th {USENIX} Security Symposium ({USENIX} Security 19). 2019: 1133-1150. - -[30] Chen J, Diao W, Zhao Q, et al. IoTFuzzer: Discovering Memory Corruptions in IoT Through App-based Fuzzing[C]//NDSS. 2018. - -[31] Seto, Danbing, Bruce Krogh, Lui Sha, and Alongkrit Chutinan. "The Simplex architecture for safe online control system upgrades." In Proceedings of the 1998 American Control Conference. ACC (IEEE Cat. No. 98CH36207), vol. 6, pp. 3504-3508. IEEE, 1998. +%\section{参考文献} +\begin{thebibliography}{7} +\bibitem{1}ISO9126,http://www.sqa.net/iso9126.html. +\bibitem{2}D. Sculley, et al. Hidden Technical Debt in Machine Learning Systems [C].Advances in neural information processing systems. 2015: 2503-2511. +\bibitem{3}Edward Lee. Cyber-physical systems - are computing foundations adequate? Position paper for NSF workshop on Cyber-Physical Systems: Research Motivation, Techniques and Roadmap. +\bibitem{4}Cousot P, Giacobazzi R, Ranzato F. Program analysis is harder than verification: A computability perspective. In: Proc. of the CAV.2018. 75-95. +\bibitem{5}张健,张超,玄跻峰,熊英飞,王千祥,梁彬,李炼,窦文生,陈振邦,陈立前,蔡彦.程序分析研究进展.软件学报,2019, 30(1):80-109. +\bibitem{6}Ammar M, Russello G, Crispo B. Internet of Things: A survey on the security of IoT frameworks[J]. Journal of Information Security and Applications, 2018, 38: 8-27. +\bibitem{7}David Brumley, Pongsin Poosankam, Dawn Song, and Jiang Zheng. 2008. Automatic Patch-Based Exploit Generation is possible: Techniques and Implications. In Proceedings of the 29th IEEE Symposium on Security and Privacy (S\&P 2008). IEEE, 143--157. +\end{thebibliography} diff --git a/fig2-8/fig0801.pdf b/fig2-8/fig0801.pdf new file mode 100755 index 0000000000000000000000000000000000000000..fdad3068310c4e24d0d7dfb8a1498422387eaf59 GIT binary patch literal 133686 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 literal 0 HcmV?d00001