许畅等:可成长软件理论方法和实现技术:从范型到跨越 适应 决策 可感知 能适应 场景 在线 重构 智能化 有数据 正常 会学习 运行 图2(网络版彩图)可成长网构软件运行机理图 Figure 2 (Color online)Runtime mechanism of growing software 开发者、用户驱动 开发侧面 的持续改进 ◆用户需要 决策 件 重构 软件持续演化 应行为 运行 感知 系统运行 V V31V4 基于环境互动反馈 运行侧面 的持续优化 图3(网络版彩图)可成长网构软件生命周期图 Figure 3 (Color online)Lifecycle of growing software 变环境的建模和理解:其三是“可演化的系统”,代表软件的协同和演化能力.这3部分联合一起,在 用户方面,实现用户应用价值导向的运行时需求模型:在环境方面,实现基于先验元级模型和规约的环 境感知;在系统方面,实现具有在线适应和演化能力的系统.由此,这3部分共同形成“人-机-物 三元融合的可成长软件的架构模型 自主适应的可成长软件的运行机理(图2).从运行机理上看,可成长软件的运行态表现为一个迭 代式的闭环适应圈,包括“感知环境-适应决策-在线重构-正常运行”这4个基本环节.在感知 方面,可成长软件主动感知环境、资源和用户需求的变化,以知晓“何时演化”;在决策方面,可成长软 件进行应用目标和场景数据导向的适应决策,以确定“演化什么”:在实施方面,可成长软件实现高效、 安全的运行时系统调整和更新,以回答“如何演化”.由此,这3方面共同形成自主适应的可成长软件 的运行机理, 持续演化的可成长软件的生命周期(图3).从生命周期上看,可成长软件逐步推进一个双维度弹 性的持续演化过程,一方面基于环境的反馈进行自主适应优化(在弹性限度之内),另一方面基于开发 者和使用者的驱动进行过程演进优化(在弹性限度之外).从生态方面看,可成长软件具备一个开放的 网络软件开发和运行生态环境:从动力方面看,可成长软件做到开发者、使用者反馈和主动感知并举: 从演进方面看,可成长软件无缝、透明地对软件持续改进和优化.由此,这3方面共同形成持续演化 的可成长软件的生命周期. 1600 https://engine.scichina.com/doi/10.1360/SSI-2020-0079
许畅等: 可成长软件理论方法和实现技术: 从范型到跨越 图 2 (网络版彩图) 可成长网构软件运行机理图 Figure 2 (Color online) Runtime mechanism of growing software 图 3 (网络版彩图) 可成长网构软件生命周期图 Figure 3 (Color online) Lifecycle of growing software 变环境的建模和理解; 其三是 “可演化的系统”, 代表软件的协同和演化能力. 这 3 部分联合一起, 在 用户方面, 实现用户应用价值导向的运行时需求模型; 在环境方面, 实现基于先验元级模型和规约的环 境感知; 在系统方面, 实现具有在线适应和演化能力的系统. 由此, 这 3 部分共同形成 “人 – 机 – 物” 三元融合的可成长软件的架构模型. 自主适应的可成长软件的运行机理 (图 2). 从运行机理上看, 可成长软件的运行态表现为一个迭 代式的闭环适应圈, 包括 “感知环境 – 适应决策 – 在线重构 – 正常运行” 这 4 个基本环节. 在感知 方面, 可成长软件主动感知环境、资源和用户需求的变化, 以知晓 “何时演化”; 在决策方面, 可成长软 件进行应用目标和场景数据导向的适应决策, 以确定 “演化什么”; 在实施方面, 可成长软件实现高效、 安全的运行时系统调整和更新, 以回答 “如何演化”. 由此, 这 3 方面共同形成自主适应的可成长软件 的运行机理. 持续演化的可成长软件的生命周期 (图 3). 从生命周期上看, 可成长软件逐步推进一个双维度弹 性的持续演化过程, 一方面基于环境的反馈进行自主适应优化 (在弹性限度之内), 另一方面基于开发 者和使用者的驱动进行过程演进优化 (在弹性限度之外). 从生态方面看, 可成长软件具备一个开放的 网络软件开发和运行生态环境; 从动力方面看, 可成长软件做到开发者、使用者反馈和主动感知并举; 从演进方面看, 可成长软件无缝、透明地对软件持续改进和优化. 由此, 这 3 方面共同形成持续演化 的可成长软件的生命周期. 1600 https://engine.scichina.com/doi/10.1360/SSI-2020-0079
中国科学:信息科学第50卷第11期 需要说明的是,在以上架构模型中,“人”一方面指模型中“可表征的用户”,因为可表征的用户代 表应用的价值体现,所以人作为应用需求的直接提出和要求变迁者,是架构模型中非常重要的一环,因 此建模为需要明确体现其相关应用价值的可表征用户.另一方面,“人”也可以隐式融入到架构模型 的“可感知的系统”和“可演化的系统”中,对于前者,比如人可提供知识、行为识别和隐私数据等,成 为环境上下文的一部分,对于后者,比如人可参与到软件动态更新安全点的选择和转换函数的合成与 审核中,成为演化环节的一部分.这两方面综合起来,“人”对于未来的软件系统,既可以是提出要求 的用户,也可以是解决问题的关键,因此他们是“人-机-物”融合应用整体系统不可或缺的一部分 此外,在以上运行机理和生命周期部分,我们介绍的适应和演化是两种重要的成长方式,前者是指基 于环境的反馈进行自主适应的优化,这是在运行态,主要指利用软件自身已实现的功能和做法应对环 境和资源的变迁,在弹性限度之内可以无需修改软件设计和代码,并依旧保持原先的服务质量和内容: 后者是指基于开发者和使用者的驱动进行过程演进的优化,这与开发态和运行态都有关,开发态包括 支持在弹性限度之外的新功能设计和故障修复等行为,运行态包括支持新版本软件进行动态更替等行 为.这两方面综合起来,我们说,适应和演化都是实现软件成长的重要途径 以上关于架构模型、运行机理和生命周期3个基本特征分别分析了可成长软件的静态结构、运 行机制和演进历程,回答“可成长软件是什么”这一问题,并给出理想的可成长软件的设计蓝图.对照 此蓝图,接下来的重要问题是,如何去构建这样的可成长软件,其中有何技术挑战.下面我们探讨并回 答“可成长软件怎么做”这一问题. 3.4可成长网构软件的构建思路和技术挑战 我们以元级化和定义化的思路来构建可成长软件,这着眼于复杂的环境开放性,其中包括应用场 景的多样性、环境和需求的多变性,以及系统内外开发者和用户的不确定性.我们以元级化提供可成 长能力,因为传统软件属于“目标级”,仅实现针对给定需求和环境的功能,而新增“元级”则使软件可 抽象可成长能力,以刻画感知、适应和演化行为.元级化有个重要的哲学问题,即认清“我是谁”.另一 方面,我们以定义化实现软件的成长,以“软件定义软件”的方式,克服“软件不软”的困难,支持软件 持续的适应和演化,以应对环境和需求变化.定义化也有个重要的哲学问题,即认清“我从哪里来,要 到哪里去” 相反.软件若直接实现应用功能.则可能表现脆弱.无论是应用需求有变迁,或是环境和资源不再 满足其功能实现的前提,都可能造成软件难以保持原先的服务质量和内容,从而不得不回归维护或重 新构建.而“元级化”概念的提出,要求软件在设计过程中明确考虑环境、资源和需求的变迁问题,以 软件定义的方式设计实现软件在运行时的自主适应和开发时的持续演进,也即要抽象软件的成长能力, 另外,以上关于“软件不软”是形象的说法,意思是软件若直接实现应用功能则表现“脆而硬”,容易被 环境、资源和需求的持续变迁所打倒,而“软件能软”的说法则是相反,是期望其能在应对环境、资源 和需求变迁方面游刃有余,表现出一定程度的韧性,这也是可成长软件的目标.根据以上元级化和定 义化的构建思路,我们提出面向自适应和持续演化的可成长软件体系结构(图4).基于此结构,可成长 软件通过基于先验元模型的环境需求建模和规约感知环境和需求变化.通过软件定义体系结构模型支 持软件系统的自适应和持续演化行为.从图中可以看出,这一结构分“静态构成”和“运行机制”上下 两层,从功能上又分“环境和需求的感知与理解”和“软件自适应与持续演进”左右两部分.从静态构 成上,软件对物理环境进行抽象,获得“先验”的环境和需求(即模型和规约),然后在运行机制上,以 环境处理中间件对物理环境进行感知,提炼出应用上下文.以静态规约和运行时上下文共同驱动可适 应的软件系统,以适应逻辑推动业务逻辑的优化,实现系统的适应和演化行为.这样的规划在整体上体 1601 https://engine.scichina.com/doi/10.1360/SSI-2020-0079
中国科学 : 信息科学 第 50 卷 第 11 期 需要说明的是, 在以上架构模型中, “人” 一方面指模型中 “可表征的用户”, 因为可表征的用户代 表应用的价值体现, 所以人作为应用需求的直接提出和要求变迁者, 是架构模型中非常重要的一环, 因 此建模为需要明确体现其相关应用价值的可表征用户. 另一方面, “人” 也可以隐式融入到架构模型 的 “可感知的系统” 和 “可演化的系统” 中, 对于前者, 比如人可提供知识、行为识别和隐私数据等, 成 为环境上下文的一部分, 对于后者, 比如人可参与到软件动态更新安全点的选择和转换函数的合成与 审核中, 成为演化环节的一部分. 这两方面综合起来, “人” 对于未来的软件系统, 既可以是提出要求 的用户, 也可以是解决问题的关键, 因此他们是 “人 – 机 – 物” 融合应用整体系统不可或缺的一部分. 此外, 在以上运行机理和生命周期部分, 我们介绍的适应和演化是两种重要的成长方式, 前者是指基 于环境的反馈进行自主适应的优化, 这是在运行态, 主要指利用软件自身已实现的功能和做法应对环 境和资源的变迁, 在弹性限度之内可以无需修改软件设计和代码, 并依旧保持原先的服务质量和内容; 后者是指基于开发者和使用者的驱动进行过程演进的优化, 这与开发态和运行态都有关, 开发态包括 支持在弹性限度之外的新功能设计和故障修复等行为, 运行态包括支持新版本软件进行动态更替等行 为. 这两方面综合起来, 我们说, 适应和演化都是实现软件成长的重要途径. 以上关于架构模型、运行机理和生命周期 3 个基本特征分别分析了可成长软件的静态结构、运 行机制和演进历程, 回答 “可成长软件是什么” 这一问题, 并给出理想的可成长软件的设计蓝图. 对照 此蓝图, 接下来的重要问题是, 如何去构建这样的可成长软件, 其中有何技术挑战. 下面我们探讨并回 答 “可成长软件怎么做” 这一问题. 3.4 可成长网构软件的构建思路和技术挑战 我们以元级化和定义化的思路来构建可成长软件, 这着眼于复杂的环境开放性, 其中包括应用场 景的多样性、环境和需求的多变性, 以及系统内外开发者和用户的不确定性. 我们以元级化提供可成 长能力, 因为传统软件属于 “目标级”, 仅实现针对给定需求和环境的功能, 而新增 “元级” 则使软件可 抽象可成长能力, 以刻画感知、适应和演化行为. 元级化有个重要的哲学问题, 即认清 “我是谁”. 另一 方面, 我们以定义化实现软件的成长, 以 “软件定义软件” 的方式, 克服 “软件不软” 的困难, 支持软件 持续的适应和演化, 以应对环境和需求变化. 定义化也有个重要的哲学问题, 即认清 “我从哪里来, 要 到哪里去”. 相反, 软件若直接实现应用功能, 则可能表现脆弱, 无论是应用需求有变迁, 或是环境和资源不再 满足其功能实现的前提, 都可能造成软件难以保持原先的服务质量和内容, 从而不得不回归维护或重 新构建. 而 “元级化” 概念的提出, 要求软件在设计过程中明确考虑环境、资源和需求的变迁问题, 以 软件定义的方式设计实现软件在运行时的自主适应和开发时的持续演进, 也即要抽象软件的成长能力. 另外, 以上关于 “软件不软” 是形象的说法, 意思是软件若直接实现应用功能则表现 “脆而硬”, 容易被 环境、资源和需求的持续变迁所打倒, 而 “软件能软” 的说法则是相反, 是期望其能在应对环境、资源 和需求变迁方面游刃有余, 表现出一定程度的韧性, 这也是可成长软件的目标. 根据以上元级化和定 义化的构建思路, 我们提出面向自适应和持续演化的可成长软件体系结构 (图 4). 基于此结构, 可成长 软件通过基于先验元模型的环境需求建模和规约感知环境和需求变化, 通过软件定义体系结构模型支 持软件系统的自适应和持续演化行为. 从图中可以看出, 这一结构分 “静态构成” 和 “运行机制” 上下 两层, 从功能上又分 “环境和需求的感知与理解” 和 “软件自适应与持续演进” 左右两部分. 从静态构 成上, 软件对物理环境进行抽象, 获得 “先验” 的环境和需求 (即模型和规约), 然后在运行机制上, 以 环境处理中间件对物理环境进行感知, 提炼出应用上下文. 以静态规约和运行时上下文共同驱动可适 应的软件系统, 以适应逻辑推动业务逻辑的优化, 实现系统的适应和演化行为. 这样的规划在整体上体 1601 https://engine.scichina.com/doi/10.1360/SSI-2020-0079