software-strategy-book/Ch2-4-DevelopmentMethodolog...

162 lines
50 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% !TEX root = main.tex
软件开发方法与技术\index{软件开发方法与技术}是软件学科\index{软件学科}的核心关注点之一。从宏观上看,其目标一方面是在计算平台上给出满足用户需求的解决方案,另一方面是达到开发效率、质量、成本的最佳平衡。在通常的软件及信息技术体系中,软件开发包括了技术、管理、工具等多个方面:技术上包括软件分析、设计、构造、维护和质量保证,关注于如何完成具体的软件开发活动并产出相应的软件制品;管理上包括软件过程模型\index{软件过程模型}、开发团队组织和最佳实践,关注于软件开发活动的流程和协作管理以及包括人在内的各类资源的组织和运筹等;不论是技术还是管理方面,在解决大规模复杂软件开发问题时都离不开工具的支持和帮助。高效、高质量、低成本地开发和演化软件系统是软件开发方法和技术研究追求的总体目标,在这个总体目标指引下,在不断出现的、新的应用需求的牵引下,软件开发方法和技术研究不断面临新的挑战。
在“软件定义一切”的时代背景下,尽管软件开发方法与技术的目标宏观上依然不变,但是软件的需求空间被进一步大幅度扩展,人机物融合的需求场景和运行环境更进一步增大了软件系统的规模和复杂性,导致软件开发和演化的成本随之急剧上升,从而产生了提高软件开发和演化自动化程度的迫切需求;另一方面,软件开发和演化\index{软件开发和演化}的外在条件随着需求和技术发展不断发生变化,新的问题不断涌现,不断扩展了软件自动化方法和技术的研究空间。
人是软件开发成败的决定因素,认知空间中人们长期的积累与计算平台的发展,使得软件开发的社会化和智能化成为必然方向,也为软件开发中人与计算/机器平台的新型关系的建立提出了挑战。网络化、数据化、可视化、虚拟化将改变人在软件开发中的工作方式、合作方式和组织方式,催生出软件开发的各种新方式,包括软件开发终端化和普及化、群智化开发\index{群智化开发}与生态化平台等等。建立新的开发方式以有效适应人机融合的软件生态发展,将是软件开发和平台的未来机遇。
软件作为人工逻辑制品,其开发属于认知空间范畴,本质上是问题空间、解空间和平台空间之间的转换和映射。随着问题空间和平台空间的泛在化和持续变化,未来软件形态也呈现出泛在性、适应性、演化性、不确定性。特别是复杂多样的不确定性成为软件的固有本质特征,控制而不是消除不确定性使得软件的持续演化和成长成为必然挑战。与传统软件开发相比较,软件的不确定性控制和处理难以在设计时完成,除了面向应用空间,软件开发的设计时与运行时融合要求认知空间与平台空间的协作乃至一体化成为一个趋势。近来的开发运维一体化\index{开发运维一体化}已经有了一个良好的开端。
面向动态变化场景的人机物融合复杂系统\index{人机物融合复杂系统},软件开发面临的首要挑战是融合人机物三元资源、以建模为核心的软件定义\index{软件定义}方法和技术。我们需要构建人机物三元资源及其行为的抽象、观察和度量的新模型和方法,研究基于软件定义方法的元级控制和数据赋能机理,使得软件开发方式(包括设计、构造和保障)从实体建模为主走向实体加链接,从分而治之走向群智聚合,从而有效驾驭各类软件复杂性。
\section{重大挑战问题}
在人机物融合应用场景需求牵引下,软件开发方法和技术研究面临的重大挑战问题主要包括复杂场景分析与建模、群智开发、人机协作编程\index{人机协作编程}和开发运维一体化。
\subsection{复杂场景分析与建模}
人机物融合计算场景的需求在我们的日常生活中已经存在,大到智慧国家、智慧城市,小到网络家电、汽车引擎智能网络控制系统,对这类计算场景的分析和建模存在许多挑战~\cite{jin2018environment, 10.5555/2208018, 10.1109/MC.2014.30},其中主要的挑战包括如下几个方面。
\subsubsection{与日俱增的规模与复杂度}
首先,从已经出现的支撑人机物融合计算场景的系统来看,其系统的大小和复杂性显著增加。例如,现代汽车中基于软件的功能在不断地持续增加\cite{zhang2017software}。2007年经典高端轿车包含大约270个与驾驶员互动的软件实现的功能而最新的高端轿车包含超过500个这样的功能。轿车软件的规模也在大幅增长。2007年高端轿车的二进制代码量约为66兆字节而现在这类轿车则含超过1千兆字节的二进制代码。随着软件支持的功能的数量和规模的增加复杂性也随之增加。这些基于软件的功能要求各个子系统例如刹车系统、发动机管理系统、驾驶辅助系统等具备更细粒度的功能以及子系统之间密集的交互因而整个系统的复杂性大大增加对系统的分析和建模需要从方法和技术上得到全面提升。
其次,除了功能数量和规模的提升,对软件分析和建模方法的挑战还来自于软件与硬件、软件与人的交互的紧密性和持续性。首先,软硬件协同\index{软硬件协同}分析和建模成为必须,这类系统的发展大部分是由先进硬件技术驱动的,集成电路的成本、尺寸和能耗的显著降低,和各类嵌入集成电路的、带计算能力的设备的不断增加,使得能通过像调用软件一样灵活地调用设备。另一方面,在硬件设备中嵌入的软件能力,又为许多设备提供了新颖的功能,例如家用电器的网络连接等。这种趋势和挑战要求采用系统的方法来设计具有大量计算节点的大型网络化系统。通过网络将大量物理设备连接起来,这些数量庞大的设备进行实时数据采集,产生了大量的数据,这些数据呈指数级增长,并进行彼此间的信息交互,形成了复杂的网络。这些数据的处理促进了新软件的诞生,系统规模日益增大。在这样一个广泛嵌入各种感知与控制智能设备后的物理世界场景下,系统能够全面地感知环境信息,并智能地为人类提供各种便捷的服务。
第三在系统分析和建模中纳入人的行为分析和建模也成为必须因为人的日常生活将和这些大型网络化系统紧密地联系在一起比如目前全球已经大约40亿人连入互联网每个人都在智能终端、个人电脑上使用各种各样的软件发微博、发微信、全球每天会有2.88万小时的视频上传到Youtube会有上千万条信息上传到Twitter会在亚马逊产生上百万笔订单……这些数据都是由人和系统的持续交互产生的结果人的行为和意图将成为系统分析和建模的重要关注点。
\subsubsection{开放和不确定环境}
传统软件分析和建模方法通常假设软件的工作环境就是设计环境。但人机物融合计算场景与其不同,软件系统将运行在开放和不确定环境中。例如,在未来的大规模无处不在的城市计算系统中,系统将能获取到大量的异构数据,这些异构数据由城市空间中的各类数据采集器从各种数据源中获得,这些异构数据需要集成到软件系统设计中进行统一分析,并构建有价值的应用。例如,通过气象传感器收集温度、湿度和风向等信息,软件系统可以预测热岛效应并给出应对措施。软件系统可以帮助维护旧的高速公路或道路,并通过部署在旧建筑中的传感器检测旧建筑的安全参数,预测危险。软件系统还可以通过感知人类的生命体征,帮助提供紧急医疗服务和监测慢性病。在所有这些人机物融合计算场景下,软件的交互环境都是动态的,并且可以观察到其不确定性。
有很多证据表明在人机物融合计算场景中软件的交互环境也是开放的。例如许多移动电话、掌上电脑、个人电脑、配备RFID的商品等都通过不同规模的网络联网并自主进行动态加入或者移除。可用设备的不断更新又促使系统提供新服务或移除不再有效或已被取代的服务利用网络环境提供新的服务。这些更新后的服务是软件系统设计时不可能预见到的。因此建立在不断变化的服务空间上的人机物融合系统的环境永远不会是封闭的而是开放的。总之运行环境的开放性、变化性和不确定性需要从方法学和技术层面进行支撑。
\subsubsection{情境感知和适应性}
除了复杂度和不确定性带来的挑战外,新算法新技术引入的系统能力,也是人机物融合计算场景对软件系统的分析和建模的挑战。例如,与手机与全球定位系统位置设备耦合的电子导航系统,以及执行从交通冲突检测到自动间隔和车道跟踪任务的自动装置,正逐步被辅助驾驶软件系统所采用,这些新的能力使软件系统与物理环境能更加融合,使软件系统能够了解周围的整体情况,从而做出更好的在线决策。新技术和新能力的引入使得软件系统常常要在与其设计时明显不同的条件下运行。
执行时,交互和运行情境的动态变化是一个重要特征,软件系统不仅要能够适应各种交互和运行环境的变化,还应能够在遇到变化时继续可靠地执行,需要广泛的适应性~\cite{Sifakis2019Auton}。软件系统的分析和建模需要考虑在线决策的能力,这种能力所要求的不仅是简单地认识环境状态,还高度依赖于情境感知能力,支持对环境状态的不断演变的认识。
\subsubsection{创新使能的需求演化性}
人机物融合计算场景下,软件系统分析和建模的困难还来自于当前的需求相关者(即领域专家,最终用户和客户)无法提供完整和正确的能力要求。许多创新应用,如微信、在线购物等一些受欢迎的应用程序,都是由技术的发展和产品设计师的创新思维驱动的,而不是最初的需求相关者所要求的。信息技术飞速发展的时代,领域专家和最终用户无法提出超出想象的技术发展,不能预测技术的发展趋势,如何在软件系统分析和建模方法中,支持创新需求的引入,或提供对创新需求的包容手段是一个重要的挑战。
\subsubsection{系统内生安全性Safety和Security}
对人机物融合系统而言,安全和隐私保护是第一要务,首先不容置疑的是系统安全性,系统在和人和物理环境直接交互的过程,需要保护人身安全,需要保护其交互环境,不施加具有破坏性的操作,避免交互环境受到损失;其次,由于其直接和人打交道,采集和分享人的信息,使得系统的隐私保护成为计算系统需要强制执行的法律,欧盟、美国等都出台了个人隐私数据或网络隐私保护法,中国也出台了个人信息保护法。与开发功能性需求是申明系统要做什么不同,使人机物融合系统具有内生的安全性和遵循隐私保护法,其系统需求开发的难点和挑战是回答以下几个问题:如何避免在系统操作回路中/上的人的安全隐患?如何避免系统可能对交互环境造成的伤害/破坏?如何避免不在系统操作回路上的人的安全隐患?如何避免泄露不在系统操作回路上的人的隐私?等。
\subsubsection{计算与控制的交互与融合}
人机物融合场景下,大量系统不再是单纯等待外界输入后做简单响应。在以轨道交通、航空航天、医疗卫生、工业控制等为代表的核心系统软件中,相关系统行为都包含了连续实时计算与离散决策控制之间的交互与融合。以列控系统为例,列车运行中相关运行参数物理量,如车速、位置、外界风速、轨道坡度等取值在连续变化。基于这些运行参数取值的实时监控与预测计算,列控系统会在各运行模式间切换,比如加速,减速等。然而列车不同的运行模式也会导致这些物理量变化规律发生改变。在这类情况下,系统的连续计算和离散控制两种行为相互依赖、相互影响、彼此互为依存、息息相关。因此,如何在开放环境下准确构建系统离散与连续交织行为模型成为重要挑战。
\subsection{群智开发}
互联网\index{互联网}技术的发展,使得人类群体打破物理时空限制开展大规模协作成为可能。新型编程技术(包括新型高级编程语言、智能化编程工具和技术等)的出现则降低了编程开发的参与门槛。软件开发从一个纯粹的生产性活动演变为一个涉及到多种要素紧密关联的社会性活动;软件也从相对独立的产品演变为多种元素相互依赖、持续演化的生态。在软件生态系统中,作为软件开发活动的关键要素,“人”在其中发生了显著变化:参与者规模的变化---软件开发活动的参与者规模由过去的公司/组织内部封闭环境下的数百至数万人,演变为软件生态系统\index{软件生态系统}中开放环境下通过互联网联接的数万数十万人;参与者群体多样类型的变化---软件开发活动的参与者由过去的主要是开发者,演变为软件生态系统中开发者、用户、管理者、投资人等多种不同类型的群体深度参与,共同驱动软件生态系统的发展演化;参与者个体多重角色的变化---软件开发活动中参与个体的角色从单纯的软件开发者或使用者等单一角色,演变为软件生态系统的参与者和推动者等多重角色,每个参与个体都成为软件生态中的组成部分,与软件生态共同成长演化\cite{zhang2017software}
群智开发是一种通过互联网联接和汇聚大规模群体智能\index{群体智能}、实现高效率高质量软件开发的群体化方法,主要包括:微观个体的激发、宏观群体的协作、全局群智的汇聚以及持续的成长演化等不同维度。在生态观下,软件开发的关注点从“人在系统外”的软件系统构建发展为“人在回路中”的软件生态构建。开源软件\index{开源软件}、软件众包\index{软件众包}以及应用市场等作为群智开发的原始形态快速发展,释放出不同于传统软件开发模式的强大生产力,展现了群智开发所蕴含的巨大潜力\cite{wang2018harnessing}。但是,如何高效激发和稳态汇聚大规模群体智能,确保群体智能在软件开发活动中可控形成和重复出现,构建持续健康演化的软件生态,是群智开发面临的核心挑战。
\subsubsection{自主个体的持续激发和大规模群体的高效协作}
互联网技术的快速发展,打破了传统软件开发面临的时间和空间的局限,为大规模群体的联接和协作提供了坚实基础。在开源、众包和应用市场中,采用社区声誉、物质回报等多种机制来激励群体参与,并采用合作、竞争和对抗等模式开展群体协作,取得了一定的进展。但是,在互联网环境下的群智开发中,参与的每一个个体都具有高度的行为自主性和不可预测性。因此,基于人类群体智能的软件开发不仅仅是一种技术问题,更是一个心理、社会、经济等多种属性交织作用的复杂问题,如何有效激发每一个参与个体进行持续高质量的贡献成为一个重要的研究问题。另一方面,大规模多样化群体的开放参与带来巨大的沟通交互开销,如何有效组织大规模参与群体开展高效协作共同完成复杂软件开发任务,则是群智开发面临的另一个重大挑战。
\subsubsection{群智任务的度量分解与群智贡献的汇聚融合}
软件开发本身是一项创作与生产深度融合的活动,具有很强的开放性和灵活性。在面对一个具有更强不确定性和差异性的大规模群体时,如何将一个复杂的软件开发任务分解成一组简单任务,并建立起开发任务与参与个体的最优适配,实现个体智能的最大释放?此外,开放参与下的软件开发具有群体贡献碎片化、群智结果不可预期性等特点,如何量化度量群智贡献的质量和价值、构建有效的群智贡献迭代精化闭环、实现多源碎片化群智贡献的可信传播与汇聚收敛,形成高效群智涌现?这些都是有待深入研究的问题。
\subsubsection{群智开发生态的认知度量和成长演化}
在群智开发中,参与者群体、代码与社区等多种要素共同形成一个持续发展的生态,并在个体激发和群智融合基础上,通过评估和反馈推动生态持续成长演化。在此环境下,软件开发关注点不再仅仅是孤立的、静止的参与者个体或者代码,更需要从“联系”的、“发展”的视角去分析和认识整个群智生态。这里面临以下两个方面的挑战:一是如何认知和计量软件开发中的群智。群智激发和汇聚是形成群智开发生态的关键,如何深入理解和认识群智激发汇聚和本质,并从激发和汇聚的角度建立群体智能的效能评估方法和评测指标,从而为群智开发的成长演化提供评价准则和度量体系?二是如何推动群智生态的持续成长演化。群智生态中各个要素相互依赖、紧密交互,如何建立多元高效的主动反馈机制,在基于群智度量体系对群智过程开展量化度量的基础上对参与群体进行实时反馈和持续引导,驱动群智生态的正向演化?
\subsection{人机协作编程}
在现有的软件开发活动中几乎每一行程序高级语言编写的代码都需要人类程序员手工编写随着对软件的需求进一步地增长以及软件复杂度进一步地提升这种几乎全手工的编程方式将成为制约计算机行业发展的瓶颈。只有大幅度提升机器编程的占比并将程序员的主要工作更多地放在少数对创造性具有极高要求的活动上才能够突破这一瓶颈。因此需要将程序员统领开发环境完成编程任务的模式转变为程序员与机器各司其职又相互协作完成编程任务的模式。实现人机协作编程的挑战主要来自两个方面1、如何提升机器编程的能力2、如何实现人机无障碍协作。
提升机器编程的能力是实现人机协作编程的基础,软件自动化是提升机器编程能力的主要技术手段。人们对软件自动化的探索几乎是伴随着软件的出现而开始的,由于早期的软件开发(编程)是异常繁琐易错的工作,人们很早就开始考虑将编程中机械性的工作交给机器完成。然而,软件自动化也一直没有完全达到人们的期望,导致软件开发长期属于严重依赖开发人员个人能力的活动。传统的软件自动化技术以严格的规约作为输入,通过机器将规约翻译成程序代码或者通过搜索技术找到符合规约的程序代码:前者的典型代表是编译器,也是软件自动化方面到目前为止最为成功的尝试,但随着抽象层次的提高,人们发现很难通过固定的规则完成所有可能的翻译;后者的典型代表是程序合成,但由于程序空间过于庞大,目前能够通过搜索获得程序通常仅限于规模很小的程序。近年来,随着数据的广泛积累,数据驱动的方式在很多领域取得了前所未有的成功,类似地,长期累积的海量代码数据为软件自动化带来了新的可能性,为提升机器编程能力带来了新的希望~\cite{mei2018can}。数据驱动的软件自动化可以利用已有代码数据中总结出来的规律指导搜索,从而提升程序合成的效率,同时这种不依赖严格推理的模式又易于处理半形式化甚至非形式化的规约,从而扩大软件自动化技术的适用范围。由于程序空间是无限空间,已有程序代码在整个空间里仍然很稀疏,而程序代码又受到问题领域、技术进步、开发者习惯的影响展现出很强的异质性,如何从已有程序代码总结规律存在巨大的挑战。
与人工编程相比,机器编程的优势在于机器编程可以利用计算机的强大计算能力,劣势在于机器编程主要从已有代码中学习,缺乏有效处理边角信息的能力,因此高效的人机协作将能更好地发挥两者的优势。支持高效人机互动的开发环境\index{开发环境}一直是软件工程关注的重点之一最早的开发环境只是一系列工具的简单堆叠真正意义上的开发环境是在上世纪八十年代以后发展起来的这类开发环境的主要特点在于开发者是整个开发环境的主导开发环境是开发者的操控台和延伸进入到新世纪开发环境有两个新的发展趋势1、开发环境中开始出现一些智能服务如代码推荐等虽然能够进入主流开发环境的智能服务仍十分有限但学术界研究的智能工具多以开发环境的插件形式展现2、开发环境开始支持开发者间的交互虽然这与开发者间远程协作需求的增长有关本地协作中开发者可以进行面对面的交流但却为探索多开发者协同提供了有益尝试。为了满足人机协作编程的需要开发环境需要应对以下两方面的挑战1、建立开发者对机器编程的信任关系在开发者主导的环境中开发者更多依赖自己的主观判断但在人机协作环境中开发者完全可控的范围缩小将更依赖机器编程如果开发者不能确信机器编程能否完成特定任务就会严重影响开发效率2、实现人机多渠道交互现有开发环境中的人机交互以及开发者间的交互方式主要以文本方式进行而人类通常习惯同时以多种方式进行交流这样才能更好激发开发者的创造力。
\subsection{开发运维一体化}
软件开发是人类的一项高复杂度的集体智力活动其现实问题的复杂度反映到开发中主要表现为架构、过程、技术和组织四个维度上的复杂度它们往往紧密地交织纠缠在一起并相互转化。软件工程在这四个维度上发展趋势即架构逐渐去中心化技术趋于平台化、自动化和虚拟化过程趋于增量和迭代组织趋于小而自治开发运维一体化DevOps集中体现了这些发展趋势的高阶形态。随着互联网化和服务化的高度发展和走向成熟使得未来的软件更加需要具备持续Continuous的特征~\cite{FITZGERALD2017176}。这种持续性将覆盖从商业策划、开发到运维以及演化的所有环节,使得未来软件系统像具有生命一般:在持续稳定提供服务的同时,软件系统的边界、发展走向等不再固化,而是始终处在不断变化和适应之中。持续性与上述的架构、过程、技术与组织四个维度的复杂性交织在一起,再叠加性能、安全等质量要求和实效性要求等,使得未来的软件系统的开发和运维面临诸多的挑战,这就需要我们在原则、方法、实践以及工具层面都做要充分的应对。
\subsubsection{构建按需On-Demand的基础设施}
作为DevOps产生的技术和平台基础基础设施(Infrastructure)可能是未来DevOps能够发挥更大作用的关键环节。然而如何匹配软件系统运行需求或者企业需求来构建适用的基础设施一直是需要重点关注的话题。值得关注的几个挑战包括1混合云\index{混合云}即为了更好的适应各种业务场景混合云是一种合理的选择但是由此带来的异构、安全、可扩展等方面的挑战不容忽视2边缘计算即为了尽可能减少数据传输代价就近提供计算服务是一种选择但是这会大大增加基础设施的复杂程度带来软件系统部署和维护方面的巨大挑战。3基础设施自动化和智能化即提供自动化和智能化类的处理流程来进行基础设施的管理和维护。现有IT基础设施和环境往往已经足够复杂同时也缺乏跨系统、平台以及流程的可见性叠加基础设施、运行其上的软件系统和业务往往都是紧耦合的这些因素都给自动化和智能化带来了巨大挑战。此外为基础设施注入内建安全机制等也都是未来支撑DevOps发展的IT基础设施亟待解决的挑战。
\subsubsection{搭建智能化流水线}
DevOps 持续高效高质量的交付有赖于高度自动化支持工具的支持自动化也是获得快速反馈的关键。鉴于DevOps自动化支持工具涉及多个阶段种类繁多数量上已达数千种从诸多关系复杂的工具中理解和选择合适的工具集合来搭建流水线对 DevOps 实践者来讲至关重要但也非常具有挑战性。未来部分重要的基础性工具将向少数较成熟的工具收敛如在持续构建、自动化部署、服务治理等方面但是更多的DevOps的自动化支持工具将向更加专业化发展。即构建的流水线往往面向特定应用领域例如金融行业对安全性和合规性有着极高要求或包含其他专业组建例如人工智能、大数据等因而如果提供开箱即用的工具链方案帮助企业选择并定制适合其业务的DevOps工具链是一个巨大的挑战。此外随着软件项目的持续进展DevOps流水线会产生大量的数据例如工具链自身产生的数据在研软件系统在验证过程中产生的数据以及DevOps项目执行产生的数据等等。如何将流程与数据两个维度打通提供以DevOps流水线为基础的开发运维一体化协作平台进而提升其智能化水平在此基础上提升DevOps实践的效率和质量同样也是为了支持前文所述的持续性从工具链和生产环境角度需要需要解决的重大挑战之一。
\subsubsection{微服务化架构演化策略和评估手段}
微服务\index{微服务}化是支持前文提及的持续性要求的必备条件。软件系统的微服务化要求软件系统的各个模块或服务间的耦合进一步降低从而在新版本发布或者部分服务出现问题时不会影响到系统其它部分。企业系统架构的微服务化以更好地支持DevOps已成为行业共识和趋势然而在演化过程中却面临诸多挑战~\cite{Microservices2017ICSA}。首先,如何进行合理的服务划分,即将软件系统拆分成多个独立自治且协同合作的服务,是微服务应用实现敏捷、灵活和高可扩展的先决条件,也是微服务领域的一项严峻挑战。其次,虽然服务拆分为开发和维护提供诸多便利,但在另一方面,服务数量的增加也带来了系统整体测试复杂度的增长。例如,当采用微服务架构之后,系统对远程依赖项的依赖较多,而对进程内组件的依赖较少,因此测试策略和测试环境需要适应这种变化。微服务化的系统不仅需要保证组件内部的正确性,还需要通过契约测试等保证组件间通信和交互的正确性,使得众多微服务能够真正实现协同工作。相应地,微服务联调、日志分析与故障定位、自动化监控告警与治理策略等是当前以及未来较长时间内的研究中需要探索的迫切问题。此外,缺乏普遍适用的架构演化评估手段也是当前面临的挑战。微服务架构并不一定适合所有的企业情况,因此,在演化过程中,应该通过哪些角度去判断架构拆分的效果?如何建立这些角度与业务需求之间的对应关系?如何度量微服务拆分效果并及时给出建议(包括补充替代的架构形式)等方面都存在若干亟需解决的问题。
\subsubsection{DevOps高频交付带来的质量和安全问题}
质量和安全一直都不是新问题。然而在DevOps语境下在高水平自动化支持下的快速高频交付是维系持续性的基础但同时也使得传统的质量和安全问题都有了新的含义和内容~\cite{DevSecOps2017Review}。例如通过各类工具来实现自动化验证和确认是DevOps实践中的不二选择。然而现有工具在发现并且消除缺陷和隐患的效率和效能方便并不完全令人满意在快节奏和高度自动化的交付过程中以往的交叉检验和人工分析等质量手段往往也被略去不可避免地增加了很多质量风险。大量研究和实践表明DevOps和Security合规往往在实践中处于天然对立关系这种对立不是通过“构造”DevSecOps一个词汇能解决的。如何协调上述的对立是一个棘手问题。其次现代软件系统的弱点Vulnerability往往有多种来源和根本原因例如来自上述基础设施的安全威胁、DevOps的快节奏所导致的各种妥协、质量缺陷、大量第三方组件的安全威胁、自动化运维中的安全隐患、企业文化流程、人员技能和意识等导致的安全疏漏等等。所谓百密一疏尽管有一些工具、方法以及实践可以一定程度上缓解上述各种威胁带来的压力但显然在效果和效率方面还有一些不足。从这个意义上说退而求其次的方式是采取事后方式——通过监控系统运行过程尤其是通过分析系统异常来辅助发现安全风险。但是这种方式还是有两大急需解决的难题即1如何产生可靠的高质量运行相关的数据例如日志信息以及2如何应用先进的技术例如大数据、AI技术等提升对数据的利用效率和分析数据发现质量和安全性风险的能力。
\subsubsection{智能化运维}
作为DevOps中的Ops一端运维的重要性越来越突显。工业界目前已经开始实践智能化运维AIOps技术以有效降低运维成本、提高运维效率和质量。我们注意到随着各类AI技术和方法的迅速发展智能化运维尽管已经有了较为坚实的基础但是其有效实施却直接依赖于软件系统或者服务的运行时产生的各类数据和信息的质量。目前智能化运维主要提供一些相对简单的标准化日志信息的捕获、分析和决策同时当前的AIOps主要关注在运维一侧尚未有效形成运维-开发的反馈闭环,以支持开发团队高效应对运维变化的新需求。此外,智能化运维依赖的各类数据和信息也都有各自缺点:日志数据的产生主要依赖程序员的个人经验,实践中往往日志实践开展的质量很差,导致大部分日志文件中充斥着毫无价值的垃圾信息,难以支持对软件行为的有效捕获;指标数据则是一种隔靴搔痒的环境数据,对错误定位的支持非常有限;跟踪路径数据会在瞬间产生巨量数据,导致完全无法分析。因此,如何充分使用这三类数据,在更加精细的力度上捕获软件应用或者服务的行为,进而提供更加准确的信息供分析,这是智能化运维需要解决的关键问题。
\subsubsection{支撑DevOps规模化的组织与管理}
DevOps整合了开发团队与运维团队使其成为一个整体这使得团队的组织、文化和软件过程都与单纯的开发团队和运维团队有所不同。同时团队的规模也不可避免的有所增加降低了团队面对面沟通的效率。DevOps是受到敏捷软件开发的影响而产生的天然带有敏捷基因并植根于精益思想。然而敏捷方法的很多理念和实践并不能天然应用于DevOps。例如常规敏捷方式鼓励着眼当前问题同时通过承担一定程度的技术负债来应对未来的多种可能变化。这种寻求局部最优解的思维方式并不利于打破各个部门之间的壁垒。又如在敏捷宣言鼓励之下的“重代码轻文档”工作方式对于持续性的维持还是弊大于利毕竟我们不会轻易终止一款软件系统。另一方面随着开发和维护的软件系统越来越复杂其规模也越来越大在开发运维团队合并后必然要求团队规模也相应扩大团队之间的协作和交流也会更加复杂。敏捷社区提出了SAFeScaled Agile Framework来支持更大规模的团队目前已经列入DevOps相关内容。然而也有很多人批评SAFe过于复杂违背了敏捷的基本价值观。从这个意义上说如何在大规模团队中实施DevOps仍将成为未来一段时间研究者和实践者需要解决的问题。
\section{主要研究内容}
面向高效、高质量、低成本开发和演化软件系统的总体目标,软件开发方法和技术的研究范围涵盖新型程序设计与软件方法学\index{软件方法学}、软件自动化技术、软件复用\index{软件复用}技术、软件自适应与生长\index{软件自适应与生长}技术、复杂软件分析与建模、智能软件开发方法、嵌入式软件\index{嵌入式软件}开发方法与技术、复杂系统需求分析方法与技术、\index{软件服务化方法与技术}等各个方面。结合应对以上重大挑战问题,主要研究内容将集中在人机物融合场景建模(§\ref{sec:ch2-4:model})、系统自适应需求分析(§\ref{sec:ch2-4:analysis})、系统内生安全规约获取(§\ref{sec:ch2-4:safety})、群智软件生态(§\ref{sec:ch2-4:eco})、群智开发方法(§\ref{sec:ch2-4:develop})、群智协同演化(§\ref{sec:ch2-4:evo})、群智软件支撑环境(§\ref{sec:ch2-4:environment})、面向机器编程的代码生成(§\ref{sec:ch2-4:generation})、面向人机协同的智能开发环境(§\ref{sec:ch2-4:intel})、开发过程建模与优化(§\ref{sec:ch2-4:opt})、软件系统运行数据管理(§\ref{sec:ch2-4:run})、安全可信的开发运维一体化(§\ref{sec:ch2-4:trust})、开发运维一体化的组织与管理(§\ref{sec:ch2-4:org})、微服务软件体系结构(§\ref{sec:ch2-4:micro})等。
\subsection{人机物融合场景建模}
\label{sec:ch2-4:model}
人机物融合的新型泛在系统,以实现人类社会、信息空间和物理世界的互联互通为目标。在这种应用场景中,计算资源高度泛化,系统能力拓展到包括连接、计算、控制、认知、协同和重构等在内的网络化、协同式和适应性的认知、计算和控制一体的综合能力范畴。需要研究人机物融合的计算环境的认知和建模,特别是对各种实现感知、计算、通信、执行、服务等能力的异构资源的认知的建模;系统研究交互环境的建模理论,包括交互环境静态属性特征和动态行为特征,以及行为约束等多个方面;针对系统离散、连续行为交织,系统外部运行环境、内部协作关系随时间、任务变化进行实时演变的特性,研究相关复杂行为建模与刻画方法,从而对系统行为进行描述,为后续分析、测试、验证提供基础;需要对典型人机物融合场景下泛在应用的本质特征,分别予以有效的场景抽象,研究相应的软件定义方法,以凝练人机物融合应用场景的共性,更有效地管理资源,并适应动态多变的应用场景。
\subsection{系统自适应需求分析}
\label{sec:ch2-4:analysis}
人机物融合应用场景下,需求以及交互环境的动态变化性和不确定性,使得系统的自适应性成为关键,软件系统的自适应性需求建模和管理成为热点研究课题,其中包括自适应需求的获取,自适应系统的建模,需求、系统模型和交互环境的在线检测和分析,系统能力在线规划和管理等。针对系统环境的开放性、动态变化性和不确定性等,需要对系统及其交互环境在建模和模型管理方面进行综合型研究,在系统环境建模方法,环境现象感知方法,环境事件推理技术,模型的追踪关系和基于追踪关系的协同演化策略,运行时目标驱动的在线优化和系统功能重配置方法,以及系统自适应性机制的度量和评估方法等方面进行深入研究。
\subsection{系统内生安全规约获取}
\label{sec:ch2-4:safety}
人机物融合应用场景下,安全作为第一要务是不容置疑的,一方面需要保护人身安全,另一方面需要避免损失,避免破坏环境,安全防护,这些已成为系统强制执行的法律。系统内生安全的实现存在两个阶段,第一阶段是安全特征的构造,安全特性不同与系统的其它功能,需要研究:基于显式环境建模安全关注点分析,支持对安全隐患/环境风险/不合规问题等的识别;研究对系统运行时的时空间协同建模,支持混合的行为建模和认知建模以及人类行为模拟,支持从环境行为模型中发现隐含的风险隐患;研究离散模型和连续模型的融合方法,支持一体化系统验证,以及人在环路中/上系统,以及支持协作和共享的控制器综合。第二阶段是建立内置的安全规约,研究对系统级内置隐私保护和安全控制能力抽象,支持安全能力成为系统可管理的资源,研究面向应用场景的可定义的安全能力配置,系统功能和隐私/安全约束的协调,个性化、可动态配置的隐私/安全约束,以及可追溯可审计的隐私保护/安全控制。
\subsection{群智软件生态}
\label{sec:ch2-4:eco}
在群智开发中参与者群体、开发环境、软件任务、软件制品等多种要素相互作用是持久驱动软件生产力发展的重要引擎。然而由于软件的复杂性持续增长、开发过程的开放性持续加大软件生态的形成与演变具有很强的随机性未能形成有效的生态构建机理与方法。为此需要重点研究1基于博弈论和社会经济学等理论研究开源生态形成与演化的动力学模型形成“贡献激发、群智汇聚、人才涌现”的良性循环2研究面向软件生态的多模态持续激励机制突破基于区块链等新型技术的知识产权共享与群智激励方法3研究软件生态的大规模混源代码溯源技术和演化分析方法突破软件开发供应链的分析识别技术建立全谱系的群智软件生态供应链模型。通过上述研究为软件生态构建和演化提供理论指导。
\subsection{群智开发方法}
\label{sec:ch2-4:develop}
在动态开放环境下参与群体的高自主性、任务目标的高变化性等带来群智涌现的不确定性严重制约了基于群智的软件开发效能。基于“人在回路中”的群智软件生态观群智软件开发方法需重点关注1研究大规模群体的高效协作机理和模型突破面向复杂开放环境的群体协同增强方法2研究碎片化贡献的高效共享与汇聚融合技术建立群智贡献的高效可信传播体系3突破群智贡献的多维量化评估与度量技术形成多源群智贡献的高效汇聚与精化收敛方法。
\subsection{群智协同演化}
\label{sec:ch2-4:evo}
群智开发是一种人类智能和机器智能协同融合推动软件系统持续迭代的新方法如何充分激发人机群智的效能实现软件系统的快速演化需要重点关注1研究群体行为量化分析与建模方法建立群智激发汇聚、行为轨迹演进等基本模型2研究涵盖代码、开发者、开发社区、软件生态的群智软件开发多维度分析评估方法突破面向软件开发演化的大数据分析和智能释放技术3研究开发者群体智能与开发大数据机器智能的互补融合、协同演进机制构建面向软件生态演化的人-机反馈回路。通过上述研究,为群智软件生态演化提供技术支撑。
\subsection{群智软件支撑环境}
\label{sec:ch2-4:environment}
以群智软件开发方法和技术为依托以群智开发生态为理论指导构建面向群智软件开发与演化的支撑环境需要重点关注1研究构建面向群智制品和大规模群体的管理、协作、共享与评估等群智开发支撑工具集有效支持开放群体的高效协同和群智任务的有效管理2研究动态开放环境的群体组织规则与环境协作流程构建相应的支撑机制和工具充分释放大规模人-机混合群体效能3突破面向新型软件的智能化开发运维一体化技术构建基于人机混合群体智能的软件开发与演化支撑平台建立针对群智软件开发生态中核心技术和关键节点的全面支撑和自主可控机制形成覆盖人-机-物的全新软件开发与技术创新生态网络。
\subsection{面向机器编程的代码生成}
\label{sec:ch2-4:generation}
机器编程是人机协作编程的基础而代码生成又是机器编程的核心。从软件的生命周期过程看机器编程主要在以下场景中起作用1以软件规约为出发点自动生成满足规约的软件代码2针对软件中存在的错误自动生成修复代码。从软件规约生成代码本质上是一个搜索过程即在在程序空间里搜索满足软件规约的程序然而待搜索的程序空间规模巨大搜索难以有效进行同时程序本身固有的复杂性使得验证代码是否满足规约也存在巨大的效率问题。与从软件规约生成代码相比自动生成修复代码有明显的特殊性修复时通常缺乏可以准确刻画正确程序性质的规约但存在可运行的出错程序此时代码生成更多地是在已有代码上的修改而验证更多地通过对比运行修改前后的程序进行。这方面的主要研究内容包括1如何利用海量代码数据加速程序合成中的代码搜索2如何利用海量代码数据加速程序合成中的代码验证3如何利用人类程序员的修复数据完成软件错误的自动修复。
\subsection{面向人机协作的智能开发环境}
\label{sec:ch2-4:intel}
人机协作编程的另一个重要基础是高效的智能开发环境智能开发环境是机器编程技术的集中承载者也为开发人员提供各种智能服务同时智能开发环境也是开发人员间交流的通道。在一个智能开发环境中开发人员应该能够方便地获取各种所需的信息从而减少对自身大脑信息记忆的依赖同时智能开发环境应该能够主动识别开发人员的需求为开发人员推荐相关的信息或开发动作比如推荐完成特定开发任务的代码进一步作为开发人员间交流的中介智能开发环境应该保证开发人员间高效顺畅的交互如果存在可以独立承担开发任务的机器程序员智能开发环境也应保证人类程序员与机器程序员间的交互传统的键盘和屏幕并不是人类最习惯的交互机制更好的交互机制应该是一种综合运用多种感官的多通道交互智能开发环境应该提供开发人员更习惯的交互机制。因此这方面的主要研究内容包括1如何帮助开发人员快速查找开发所需的信息2如何针对具体的开发任务推荐可能的开发动作3如何实现开发人员间以及与开发环境间的多通道交互。
\subsection{开发过程建模与优化}
\label{sec:ch2-4:opt}
丰富的工具是软件过程实现DevOps化的助推器与基石工具在有效地优化过程的同时会产生海量的过程数据。挖掘这些数据并构建模型以实现过程改进和优化是目前热门的研究领域。早在DevOps出现之前软件过程建模和优化就是一个研究热点但数据的缺乏一直是过去相关研究的痛点。DevOps的盛行尤其是随着各类工具的普及问题已经转变为了如何有效挖掘并利用资源库中蕴含的海量数据。这方面有两大类研究值得关注一类是使用传统过程建模技术为理解、分析以及管控过程提供支持更进一步的可以实现过程的改进与优化。另一类研究采用机器学习技术着眼于过程中更具体的点例如缺陷预测、持续集成结果预测、评审人员推荐等能够为提高过程质量、减少资源消耗和缩短交付周期等提供支持。
\subsection{软件系统运行数据管理}
\label{sec:ch2-4:run}
从指标信息、调用链信息以及日志信息入手通过深入整合与挖掘这三种运维相关的数据信息来提供更丰富以及更高质量的信息进而提升AIOps的质量与效率这应该是需要实现的目标。为了达成这个目标需要开展如下研究。首先需要研究提升运维数据的质量的方法。在这三类信息中由于日志信息是非结构化的受到开发人员主观因素影响较大因此大部分数据的质量并不理想。因此在日志的生命周期中需要将日志决策和日志开发的阶段左移在需求开发和系统设计中充分考虑日志的需求并形成日志本身的开发-运维反馈闭环。在此基础上辅以自动化日志工具以此来提高日志的质量以及日志记录的效率。其次应该探索相应的方法和技术来提升调用链信息的捕获和存储效率。最后需要提出一种深度整合三类运维数据的方法。日志信息、调用链信息以及指标信息应该通过特定的算法关联起来从而提供多维度的运维信息。例如调用链信息可以与指标信息结合将各个时间节点的指标信息以调用关系的形式组织起来进而促进根因分析等AIOps任务。
\subsection{安全和可信的开发运维一体化}
\label{sec:ch2-4:trust}
为实现安全且可信的运维我们需要开展的主要研究内容包括1通过自动化运维以及智能化运维减少运维工作中的一些人工操作在提升效率的同时避免手工作业本身可能导致的错误2对运维过程的监控数据进行分析及时检测异常的发生并对问题进行追踪和溯源工作快速解决问题、避免损失3DevSecOps下的安全运维在持续监控和分析的同时需要建立持续的问题反馈循环为产品安全性和可行度提供持续的保障。
\subsection{开发运维一体化的组织与管理}
\label{sec:ch2-4:org}
为了缩短软件从产品设计到呈现给最终用户的时间DevOps整合了软件开发和运维团队这使得DevOps团队的组织、文化和过程都与单纯开发、运维团队不同。从组织与管理角度DevOps需要解决以下问题1使用经验软件工程的方法探寻适合DevOps的组织结构和过程实践并进行验证2如何既能通过团队自组织工作方式提升效率同时又能够避免由于具体人员技能缺失或管理人员与DevOps团队缺乏信任关系造成的失败在敏捷与规范之间取得平衡3在大型项目中使用怎样的组织方式和软件过程能够使得DevOps项目具有敏捷应对变更的优势以及工作效率。
\subsection{微服务软件体系结构}
\label{sec:ch2-4:micro}
围绕微服务架构有如下几类研究值得关注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.
%