摘要:在许多软件系统的开发运行阶段乃至整个生命周期中,软件可变性都是其设计开发者所要面对的基本问题。
本文分享自华为云社区《如何应对软件可变性?这4种常用的方法肯定要知道。》,作者: 陈星亮|华为云开天aPaaS专家。
软件可变性(Software Variability)是指在一定上下文中一个软件系统被有效改变(扩展、配置、调整)的能力。在许多软件系统的开发运行阶段乃至整个生命周期中,软件可变性都是其设计开发者所要面对的基本问题。
在大多数系统中,可变性表现为软件在某个或某些可变点处对变体的绑定。其中可变点是指软件中可以发生变化(绑定变体)的位置,而变体则是变化发生时,人或机器可以在相应位置做出的选择。
可以看出,在软件的运行实例中,变化发生的位置、变化发生的程度是在设计阶段预定义的。而这种定义又在很大程度上依赖于软件的需求分析以及在此基础上做出的种种假设。系统虽然具有变体绑定能力来满足既定的需求,但可变性模型(可变点、变体以及它们之间的关系)本身没有变化,导致软件在应对变化的需求或环境时存在一定限制。
在传统意义上,软件运行时可变性模型被认为是静态的。在许多研究工作中,模型被以只读的方式访问,以支持软件适应外部的环境。人们将注意力集中在可变性绑定方面(即为什么(重新)绑定变体、绑定什么变体、怎样绑定),而忽视了对运行时可变性模型本身蕴含的限制的突破。随着计算机技术的发展进步、用户需求的增多及变化的加快、系统驻留环境的开放、外界对系统灵活性和可伸缩性要求的提高,这种限制显得愈加突出。
针对软件可变性,开发者们根据软件实现要求和成本投入,采取软件预留配置点、动态软件产品线、运行时可变性动态绑定、多变非核心功能的快速开发等方法来应对。
软件预留配置点可以自动地根据环境的变化来调整自身。换言之,它可以收集和分析有关环境的信息,基于分析的结果决定是否改变自己的行为,如果是,再采取调整动作。
系统设计者指出或假设系统所面对环境变化等信息,确定系统所能够感知和收集的环境数据,进而以一定的数据结构将其表示在计算机内,而后才能设计相应的算法对这些信息进行分析并做出决策。
在执行环节对于自身的调整,实际上是软件在可变点处对于变体的动态绑定,这是其运行时可变性的表现。
1)设计者难以在系统部署运行之前设想所有的需求或环境的变化,当超过预期的变化出现时,已经成型的系统无法自动地收集与其相关的信息。
2)并未改变可变性要素的数量、属性或关系。只能在设计开发时预定的范围内,进行选择。
动态软件产品线包括一组核心资产和从资产开发而来的一系列具有共同特征的软件产品。与传统软件产品线对比,动态软件产品线更关注软件的运行时可变性,本质上是建立具备可配置能力的一系列软件。
1)产品线自身的设计者可以快速开发出具有运行时可变性的软件产品,并赋予其自主选择绑定变体的能力。
2)其关注的运行时可变性大部分都是封闭的而非开放的,这意味着运行时可变性应对的是开发者在设计期设想的环境变化,导致软件产品难以应对超过预期的环境变化。
运行时可变性动态绑定机制描述一个运行中的软件如何在一个可变点绑定相应的变体,是软件可变性实现的核心。绑定机制涉及对构件内部结构和行为的调整,包括对子构件的重配置和动态绑定。
1) 对构件行为的调整往往通过重新组织构件的工作流或是重新设置构件内部参数来实现。
2) 对于突破了原有设计范围内的变化,需要能被系统识别,并自动生成对应的逻辑。
为应对行业应用不断变化的情况,亦有思路是降低软件应用开发的难度,将软件的稳定的核心功能与多变的功能分开。对于多变非核心功能,以提供低码开发的方式,便于开发者能快速的根据诉求,进行近场快速开发并投入使用。
1) 软件设计者需要能识别出稳定的核心功能、多变的非核心功能。并且能够在两者之间建立好连接。
2) 提供便捷的工具,使得多变的非核心功能能够被近场开发者,甚至是使用者自己能快速实现。
如何提升软件的可变性,让软件能够从容应对业务的变化,一直都是软件工程领域的一个重要话题。针对上述4种在应对软件可变性经常用到的方法,各自都有其特点,分别在不同的场景下使用。