Family-oriented Abstraction ,Specification ,Translation方法理解

关键词:FAST
作者:BIce 创建时间:2011-12-24 20:00:00

 


         昨天有幸听到了David Weiss大叔的讲座,觉得真的很好,不愧是大师,之前看论文找资料想不明白的问题,大叔几句话就说得通通透透,遂想记下听完的总结,大体梳理下FAST过程的脉络

         学到的最重要的两点:

         Software Engineering  à 就是不停的Make Decisions

         Module             à 就是Work Assignment

一、FAST process是什么

1.1软件产品线(Software Product Line)

软件产品线:Software Product Line,其思想源于传统的产品线(Ford汽车的产品线),由于和传统工业类似,目前在软件方面也出现了需要大规模定制生产类似的(但又有所不同的)产品,Product Line的思想也就被借鉴过来,形成了软件产品线的思想,另外SPL也称为软件家族,Software Family,下面统一使用Family。目前关于Family的研究有很多,也形成了几个发展比较好的流派如FASTFODACOPA等等。而FAST方法源自工业界,作为Family的方法学级别工具有比较好的应用。关于Family介绍详见传送门:http://www.sei.cmu.edu/productlines/.软件产品线的目标是提高生产率,方式是通过实现除代码级别的更高级别复用reuse完成。具体形式是自动的生成产品部分代码和文档

建立一个产品线,最重要的一点是要实现工件(artifact)的复用,这里的工件不仅仅是指代码,也包含需求文档和参考架构等等。需要实现复用,就要有相当多的共同点才可以,而SPL中最重要的一点就是识别Family中的共同点Commonality和差异点Variability

1.2 FAST process

FASTFamily-Oriented Abstraction ,Specification ,Translation David Weiss在上个世纪末提出来的关于软件产品线(软件家族)的一种方法学。它的目标是提高重用,提升效率,形式是自动生成代码和文档。

FAST process中的:

1)     Family指的就是Software Product LineFamilySPL的意思是一样的

2)     Abstraction,抽象使我们描述一个物体最重要的工具,用来描述Family也是,我们通常使用抽象来发现Family中的CommonalityVariability

3)     Specification,我们通过上面的Abstraction已经得到了一个Family(或者SPL)的抽象描述,下面我们需要定义一种描述Family以及Family Member的方式,也就是给出Family & Family MemberSpecification

4)     Translation,有了上面的严格的Specification,我们就可以使用某种办法将Specification转换成实际的软件产品Family member

Fast is a process for defining families and developing environments for generating family members.

FAST方法定义了使用的一系列的活动Activities以及这些活动的产出工件Artifact等等

二、FAST process的主要内容

如下图主要给出了FAST process的主要流程,

FAST过程的主要流程

         FAST process一共分为以下两步:Domain Engineering Product Engineering(Application Engineering),其中Domain Engineering完成主要的领域分析工作,并且产生Product Engineering Environment(支持Application Engineering的一系列工具集、 Core Asset等等),然后由Product Engineering来使用Product Engineering Environment提供的工具完成对具体Family member的开发(即定义成员,然后自动生成成员的文档和代码等等)。其中Domain Engineering是两者中更重要的部分,我们这里只讨论Domain Engineering.

         下面给出FAST过程中需要产生的工件artifacts

根据此图,由上到下的一步一步产出,也就是一个FAST过程的典型过程。(另外Domain Engineering Application Engineering可以并行,在Domain Engineering 完成某部分工作的时候,Application Engineering就可以利用这部分产出进行产品的设计,其使用的结果也可以反过来反馈Domain Engineering部分,使其完善。)

2.1 Domain Engineering

         Domain Engineering是过程的开始,它负责对FamilyDomain需求进行分析,需要给出Domain Model。由上面的Artifact图可见,Domain Engineering主要的工作有两步:Domain Modeling Domain ImplementDomain Engineering的流程如下

首先通过对涉及的Domain进行分析,得到Domain Model,然后再由Domain Implement部分对Domain Model中需要实现的部分进行实现,得到Product Engineering Environment

下面对Domain Model中的一些工件进行说明。

2.1.1 Economical Model

Economical model :给出对此Domain使用Family方法之经济模型,判定使用SPL方法是否是经济可行的,是否真的能带来收益(一般当Family中的产品多于等于3个,进行SPL就是可行的)

2.1.2 Family Definition

1)   Commonalities and Variability Among Family members.Family进行分析,得到Family members的共同性和差异性

a)   对差异性进行参数化(量化,以参数Parameters的形式表示)

关于CommonalityVariability的分析,我们有比较重要的两种Abstraction Method术语共同点。通过对领域的术语的精确定义和对共同点(对所有Family成员都为True的假设)的分析是比较好的两个着手点.

 

2)   Decision Model

像昨天Weiss大叔说的,做软件工程,其实最重要的也是一直做的事就是决策,一直不停的Make Decision

在这里,我们需要做的就是给出每个Family member关于上面的Variability所做出的Decision,把它们组织起来形成一个表 Decision Model Table,其中不仅包括用户做的选择,也包括这些Decision可能对其他Decision的影响,Contrains,如选择一个Decision就必须进行另外一个Decision等等。

引用原话:“Decision Model is the set of decisions, the (partial) order in which they must be made to specify products, including the binding time ,and the mapping to modules.

2.1.3        FAST Product Line Architecture

一般也叫做参考架构或者框架,是整个Family中产品的程序基本框架,关系到整个产品线的扩展性和稳定性,是非常重要的部分。在定义了Family之后我们就应该给出这个Family的参考架构。

另外关于软件的架构,我们把它定义为modules,以及moduleinterfacemodules之间的关系的集合。

由于不同的人看架构要以不同的视角去看,所以FamilyArchitecture也提供了不同的Views,下面是FAST方法的Key Architecture Structures

1)   Module Structure

Module是什么:像昨天Weiss大叔说的,Module不是别的,它是 a work assignment ,分配者只负责给出工作的要求,其它的则由被分配到的个体完成。

这里就用到一个基本的概念:信息隐藏,原则上说我们需要将每个Secret都隐藏到模块中间,也就是我们需要将每个Variability都实现为一个模块。而在这个视图(或是Structure)下,我们不关心具体的工作,只关心这些工作是如何划分如何分配的,有多少个人来完成这个Module(更适合管理者查看)

原则上Module Structure要给出每个Module的组成关系(也就是系统的分解图,一般是个树型结构)

2)  Use Structure

在这个视图下,需要给出不同的Module之间的使用关系,侧重于Module的交互,Module直接的使用更像是一个树的结构

3)  Process Structure

在这个视图下,侧重于进程的并发、同步的方面,给出类似进程时序图的结构

4)  Module Interface Specification.

在这个视图下,主要给出每个Module的接口规范,给出对ModuleInterface要求和约束等等。需要有:module提供的服务、服务的语法结构、用到的数据类型、程序要达到的效果、测试用例、记录做出Decision和实现的信息。

         另外,在此处定义了Architecture之后,在对应的Domain Implementation部分要给出具体的Architecture实现,包括支持框架的类库,模版等等。

2.1.4 Application Modeling Languagekey of PE Environment

也叫做Domain Specification Language,主要是用来描述Family member的,FAST中的Sspecification 部分就由AML书写。其中AML的实现方式有两种

a)   Compose:使用组装的方式,将组件组装成Family member(自动生成文档和代码),实现起来比较容易。

b)   Compile:使用编译的方式,将AML编译成Family member,实现难度较大。、

 

根据此处AML的实现方式的选择不同,在具体的Domain Implementation部分要给出对应的AML实现方案,或者是Compositor或是Compiler

2.1.4        System Composition Mapping

Mapping From Parameters of Variation to Modules

 

由于分离关注点的思想,我们将每个Parameters of Variability都封装在一个具体的module,我们将定义一个从Decision Modules的映射,Decision Table。其内容包括

Variability Id/Variability Name/Value Set /Constrains/ Module,如图:

这样就可以将每个Decision对应到一些具体的Module上,根据这个对应关系,我们就可以在Application Domain进行了Decision之后,选择正确的Module进行组装或者编译使用,达到自动依靠参考架构和代码模版生成代码的功能。如图例,From Decisions To Implementation

有了AMLSystem Composition Mapping,我们就有了自动生成部分代码或文档的方法,响应的生成工具也要在Domain Implementation中给出

引用原话“Product generation consists of walking the decision graph , applying the constraints ,and retrieving the associated modules.

2.2 Domain Engineering work flow

下面以工件为主体,给出Domain Engineering的流程:

工件对应在Implementation部分工作

Analysis部分工件

工件的目的

 

1.Economical Model

确定使用SPL方法是否是否有效用,经济可行

 

2.Commonality Analysis

1)         得到术语表

2)         得到Commonality

3)         得到 Variability

4)         得到变化点的参数化值

5)         给出对于CommonVaria进行说明的情景

 

3.Decision Model

得到对于每个Family中产品

Decision Table,即根据Variability的参数值选择,以及其中的约束等等。

实现参考架构,代码、文档模版,library of templates等。

4.Family Design

得到参考架构,要给出module , use relation, interface ,process 等视图

用于生成产品的Generator

5.Composition Mapping

给出从DecisionModules的映射方式,即每个Decision所涉及Modules,为生产Family Member做准备

6.AML

给出定义Application(家族成员)的方式

7.Tool Set Design

给出AML,和Composition Mapping等工具的实现大体方式

 

8.Application Engineering Process

给出如何使用Tool Set进行Application Engineering的过程。

此外在完成了Domain Engineering 过程后,Application Engineering部分利用完成的Tool Set和定义好的Application Engineering Process完成对产品成员的定义,并利用Generator对产品代码和文档进行生成。

另外,产生的产品文档和代码需要与Core Asset保持可以追溯的性质,所以需要有Configuration Management Tool的介入,上面没有给出。而且在产出了产品之后,还需要分析其是否满足需求,这也用到了Analysis Tool 部分,这个在上面也没有讨论。

2.3其他

2.3.1 Binding time   

关于Binding time,即Make Decisions的时间。在我们实现产品的时候要将VariabilityParameter绑定到我们的Architecture中,即给出使用的Parameters,这个决定制定的时间是不一定的,根据Variability的不同,binding time 也会跟随实践情况而变,确定正确的Binding时间很重要,(决策顺序给出决策图,拓扑进行 )原则是尽量将绑定推迟,详见下面算法。

2.3.2架构

         关于软件架构的利益相关人:

         Product Management System EngineeringArchitectsSoftware DevelopmentSystem VerificationProject ManagementServices.

         不同的利益相关人希望关注的Concerns不同,所以不同的利益相关人需要不同的Views,这也就有了Architecture Views的出现

2.3.3 Decision Making Algorithm

         下面给出Make Decision的一般性算法:

1.         首先给出一个代表确定一个产品需要做出决定的所有决策的图

2.         找出有最大度、有最多约束的边的点

3.         在这个节点上对于可选的方案做出决策,标记本节点已经决策完毕

4.         找到与本节点有约束相关的节点,去除掉不相关或者不需做出的决策点。

5.         如果本节点的邻居的可选值集合为空,则报错或者回滚

6.         找到一个没有做出决策的、有最少可选项的邻居节点,作为当前节点,到第3

7.         如果素有邻居节点都已经决策完毕,使用DFS搜索来找到一个有没有做决策的邻居的节点,如果没有这样的节点就结束,否则转向第6

3.2.4领域相关

         关于domainwork hard。每个领域都有自己的特殊性质,它们的参考架构,应用模式也各不相同,学习相关Domain唯一的方法,David Weiss大叔给出的方案是Work Hard,通过自己的实践、向领域专家的请教、阅读领域书籍提升对领域的了解

3.3.5其他的SPL问题

1.         生成文档

2.         测试用例生成

3.         创建AML语言

4.         重新组织Architecture相关的软件开发者组织结构

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)