马 赞,王 鹏,崔明山
(1.中国民航大学 适航学院,天津 300300;2.北京畅研汇明科技有限公司,北京 100107)
功能需求(functional requirement)是系统设计的关键输入,但有效的获取方法一直是需求分析的难点[1]。目前,系统越来越复杂,功能需求越来越多,充分获取功能需求也越来越困难。
对于获取功能需求的具体要求,CMMI 中给出了明确的说明[2],但并没有给出如何获取需求的具体方法。
实际工程应用中,最常用的方法是“基于调研和访谈的需求分析方法”[3]、“基于知识的需求获取方法”[4]和“基于场景的需求获取方法”[5]。这3 种需求分析方法,都要求参与需求分析的人员具有非常丰富的系统开发经验,非常熟悉系统,如果经验不足,很容易遗漏某些需求方面,从而造成需求识别不充分,在没有其他技术手段保障的情况下,充分准确的识别系统需求将越来越困难。
从实际工程中应用的技术手段看,需求获取的常用技术方法主要有“面向对象的需求获取方法”[6]、“基于特征的需求分析法”[7]、“基于本体的需求获取法”[8-9]、“基于质量功能展开法”[10-11]等。这些方法重点关注的是采用“用例图”“活动图”“顺序图”“状态机”“质量功能展开图”等来表示需求,识别需求之间的依赖和关联关系,没有关注需求的获取及功能需求完整性问题。
最新的需求获取研究领域有2 个方面,一方面是“从需求文档对需求建模,通过模型仿真来验证需求是否完整充分”[12-13],另一方面是“基于用例的面向方面的需求建模”[14]。前者属于从需求文档来验证需求完整性,有一定的意义,但难度很大,效果不明显;后者从状态空间角度进行了系统划分,但分类不完善,还有很大的改进空间。
从检索的文献看,功能需求的获取依然存在问题,主要归结为以下3 类。
(1)主观性过强:文[3—5]的需求分析方法重点是靠“人的知识和经验”为主,由于人的经验、知识存在局限性,人本身也随着情绪状态的变化而不稳定,因此,虽然方法简单,却最容易造成主观性过强,需求分析结果不完整或受到主观影响而发生偏差。
(2)完整性不足:文[6—11]则重点是从需求的某个侧面或某种表示形式上入手,例如,需求特征、需求本体、质量功能展开、面向对象方法,虽然对特定的某些需求可能有效,但不能有效的获取相对完整的功能需求。
(3)结构化程度不高:文献中所提到的功能需求分析方法,普遍结构化程度不高,这就容易造成难以普及使用,实际工作中效率低的问题。
本文以EDFA 为基础,建立一种“相对客观”“关注完整性”“结构化程度高”的功能需求获取方法,能提高功能需求分析的快速性、准确性和有效性。
本文提出了一种扩展确定有限自动机(EDFA),并在此基础上,提出了基于EDFA 的结构化的功能需求分析方法和流程,并结合自适应巡航系统(ACC)实例进行了验证。与传统的需求分析方法相比,本方法在充分研究系统状态特征的基础上,依托DFA 表征系统内在特性的优势,从系统状态空间、输入空间、输出空间完整划分的角度出发,以结构化的分析流程和方法为指引,对系统功能需求进行充分分析,降低对需求分析人员经验的依赖,提高系统需求分析的完整性。
确定有限自动机(determine finite automata,DFA)是具有离散输入输出系统的抽象数学模型,目前已经被软件开发人员所重视,用于计算机控制系统开发、编译程序以及应用软件开发、自动控制软件开发等。
DFA 定义如下[15]:
其中:M 是确定有限自动机;Σ是一个有穷字母表,它的每一个元素称为一个输入激励;S 是一个有限状态集合,它的每一个元素称为一个状态;f 是转移函数,定义了从S×Σ→S 上的一个单值映射,即 f(p,a)=q ∈S,指明当前的状态为p,当输入激励为a 时,则转移到下一个状态q,q 称为p 的后继状态;在状态转移的每一步,根据有限自动机当前所处的状态和所面临的输入激励,便能唯一地确定有限自动机的下一个状态;0s ∈S 是一个唯一的初始状态;Z ⊆S 是一个终止状态集。
为了使用DFA 进行系统需求识别分析,有必要对DFA 进行扩展。为了更好地说明有限自动机的扩展原理,假设温度控制系统可以用图1 表示。
1.2.1 输入-输出关系扩展
考虑到DFA 只是描述了系统内部状态之间的关系,并没有与系统输入和输出关联起来,因此,无法直接通过DFA 识别系统的需求,需要对标准DFA 进行输入、 输出扩展,以便与系统的输入和输出关联起来。
图1 温度控制系统模型
图1 可以看出,输入激励a 与输入温度T 有关,输出H 和C 与当前所处状态p 和输入激励a 有关,因此,有如下映射关系:
其中:h 是当前状态p 下,在a 输入激励的作用下,对外部输出H 的映射函数;c 是当前状态p 下,在a 输入激励的作用下,对外部输出C 的映射函数。
考虑更一般的情况,有如下映射关系:其中:U 是系统的外部输入(包含外部信号的输入、时钟的输入等);K 是从系统外部输入U 到Σ的映射函数(从单一输入激励a 推广到Σ集合);Y 是系统外部输出集合;G 是系统在状态S 下,在Σ输入激励下,对外部输出的映射函数(从单一输出H 和C 推广到所有输出Y 集合)。
经过公式(3)的扩展,EDFA 将系统的输入U、确定有限自动机M、系统的输出Y 有机结合起来。
1.2.2 系统外部输入信号等价集合
对DFA,Σ是一个有穷字母表,而对于一般的系统来说,外部输入U 的每一个信号,都可能具有无穷多的数值,这些数值无法一一映射到Σ中的输入符号,因此必须对外部输入信号进行预处理,以满足Σ的条件要求。为此,引入外部输入信号等价集合的定义。
系统外部输入信号等价集合的定义:系统外部输入信号的完整空间中,Σ中输入激励对DFA 中状态的触发效果一致的信号空间集合。
以上述温度控制系统为例,则Σ={a1,a2,a3,a4},其中:1a 代表大于-5℃,a2代表小于-10℃,3a 代表大于40℃,a4代表小于35℃。
如果T 的输入范围是[-100℃,+100℃],那么,T ∈( -5,100]为外部输入信号T 的一个等价集合,该范围内所有T 的数值对应Σ中的输入激励 a1,处于“加热”状态时是“等价”的。
T ∈[ -1 00,- 10)为外部输入信号T 的一个等价集合,该范围内所有T 的数值对应Σ中的输入激励 a2,处于“不加热不制冷”状态时是“等价”的。
T ∈ (40,100]为外部输入信号T 的一个等价集合,该范围内所有T 的数值对应Σ中的输入激励 a3,处于“不加热不制冷”状态时是“等价”的。
T ∈[ -1 00,35)为外部输入信号T 的一个等价集合,该范围内所有T 的数值对应Σ中的输入激励 a4,处于“制冷”状态时是“等价”的。
经过对系统外部输入信号进行等价集合的划分,可以避免在识别系统需求时,因为无法穷举所有外部输入的数值,而无法充分识别系统输入的所有组合。
1.2.3 输入激励集Σ划分
系统需求分析过程中,由于系统复杂、系统的状态较多,因此系统的输入激励集合Σ的元素很多,一次性识别系统输入符号集合Σ有一定难度。
实际系统需求分析时,往往都是根据系统状态集合中的独立状态,逐个分析系统的需求,根据独立状态分别识别对应的输入激励集合则相对容易。因此,引入符号标记Σsi。
假设DFA 状态集合S 中包含n 个状态,分别为s1,s2,…,sn,那么,每个状态对应的输入激励子集合标记为Σsi,其中 i=1,2,…,n,并且
1.2.4 转移函数f 划分
由于系统一般都比较复杂,并且系统的状态比较多,因此状态转移函数的数量也比较庞大。实际系统需求分析时,往往都是根据系统状态集合中的独立状态,逐个分析系统的需求,根据独立状态分别识别对应的转移函数则相对容易。因此,引入符号标记fsi。
假设DFA 状态集合S 中包含n 个状态,分别为s1,s2,…,sn,那么,每个状态对应的转移函数标记为fsi,其中 i=1,2,…,n,并且
功能需求即在不考虑物理约束的情况下,用户希望系统所能够执行的活动,这些活动可以帮助用户完成任务。功能需求主要表现为系统和环境之间的行为交互。实际上,功能需求主要指当外界有输入信息进入时,系统对外界的响应和交互。
根据EDFA 的要求,基于EDFA 的功能需求分析过程,将从以下几个方面进行分析。
(1)DFA 系统状态集S 的识别。
状态集S 的识别是基于EDFA 分析法的关键步骤之一。 因为识别了状态集S,就可以根据状态集中的n 个状态( s1,s2,…,sn),分别识别不同状态下系统在外界输入的情况下,对外界的响应和交互。
基于状态集S 识别系统需求的优势有:
①对系统需求的全空间进行划分,按照状态集S中的状态依次识别不同状态下的功能需求,缩小每次需求识别的空间大小和复杂度,减低了识别难度,有利于准确、高效、尽可能完整的识别需求;
②由于DFA 的特点,状态集S 中的所有状态一般都是“独立”的,因此,基于状态集S 所识别的系统功能需求也是彼此独立的,共同构成系统需求。
(2)和外部系统信号接口(输入/输出)的识别。
系统输入/输出的识别,可以借助SysML/UML 中的用例图识别,用例从外部参与者获得的信号作为系统输入信号,系统向外部参与者输出的信号作为系统输出信号。
一般的系统,输入/输出信号可能较多,考虑基于不同系统状态逐个识别每个状态对应的输入/输出信号种类;也可以一次性识别系统的所有输入/输出信号种类;针对系统的所有输入/输出信号,不同信号的有效范围是不同的,因此,需要针对每个信号独立识别其有效范围。
(3)DFA 输入激励集Σ的识别。
输入激励集Σ的识别,对于识别系统功能需求是非常重要的。输入激励集Σ是触发当前状态跳转到下一状态的关键因素,而系统处于当前状态下,会完成基于当前状态下的系统功能,如果跳转到下一状态,则开始完成下一状态下的功能;因此,输入激励集Σ是完成“一类功能需求”切换到“另一类功能需求”的关键因素。
根据前述分析,对于整个系统DFA 来说,输入激励集Σ过于庞大,因此,根据系统当前所处的状态is,识别对应的输入激励集Σ的子集Σsi将会比较容易,而最终系统的输入激励集Σ是所有Σsi的并集
(4)DFA 转移函数f 的识别。
转移函数f 代表了在当前状态下,在输入激励集Σ激励下,系统对应的下一状态。根据前述分析,由于整个功能需求是基于状态集子状态以此进行识别的,因此,转移函数也依照不同子状态进行识别(is 状态下的转移函数记为fis),最后统一汇总称为DFA 的转移函数
(5)系统输入U 向输入激励集Σ的映射K 的识别。通过系统外部输入信号等价集合来识别系统输入信号与激励集合Σ的映射关系。
由于系统输入U 在不同的信号范围内对激励集Σ的映射可能是不同的,因此,需要识别不同的输入信号范围与激励集中激励信号的对应关系。一般来说,这种对应关系是基于不同的状态is 得出的,因此,这里建议基于子状态逐个识别输入信号向激励集Σ的映射关系Kis,最后统一合并为(类似输入激励集的划分模式)。
(6)系统状态S 和输入激励集Σ向系统输出Y 的映射G 的识别。
系统状态S 和输入激励集Σ向系统输出Y 的映射G 实际上就是代表系统的功能需求(因为这里的Y 就是系统对外界的响应)。
参照前述内容,对系统状态集S 中的每个状态 si,依次识别在输入激励集Σ(也可以是输入激励集Σ的子集Σsi)的激励下,系统的输出映射 Gsi,从而得到系统的输出 Ysi,最后综合系统的输出映射 Gsi,得到系统的总映射G,综合所有输出 Ysi,得到系统的总输出Y。
(7)DFA 初始状态 s0的识别。
初始状态 s0代表了系统初次运行时所处的第一个状态,一般根据系统的实际情况,在状态集S 中进行识别,并进行标记。
(8)功能需求的整理模板。
经过前面的分析初步获得了分析结果,可以按照下面的模板整理功能需求。
<当前状态>下,当<系统输入U 向Σ映射K>时,系统跳转到<转移函数f 的目标状态>,同时,<向系统输出Y 的映射G>。
(9)整理/补充系统功能需求。
按照(1)-(8)的步骤,逐个分析系统状态,获得所有状态下的功能需求,然后,将所有的需求综合整理,就得到了系统的完整的功能需求。
系统功能需求分析方法流程参见图2,将来可以考虑程序化处理。
图2 基于EDFA 功能需求分析流程
(1)依托DFA,表征系统需求内在特性:DFA 的状态集合、输入激励、转换函数,既体现了系统不同运行模式,也体现不同模式之间的转换和转换条件要求,从本质上抓住了系统的关键特征要素,对提升功能需求分析的有效性和完整性非常重要。
(2)从系统状态空间、输入空间完整划分的角度出发充分识别系统功能需求:状态空间对系统的运行模式和关键特征进行了划分,通过状态空间确保系统的运行模式可以识别完整;通过输入空间的完整划分,可以确保在不同的运行模式下,对完整输入空间的响应是完全避免功能需求识别过程中,遗漏特殊输入组合的情况。
(3)具有结构化的分析流程和方法,易于自动化处理。
(4)通过将输入激励集、转移函数划分,不但可以表示简单的系统,也可以表示复杂的系统。
为简化起见,仅以自动巡航系统(ACC)的“跟车模式”状态为例,验证EDFA 功能需求分析流程及适用性,分析步骤参见图2。
(1)识别系统状态。
根据ACC 系统的特点,经过分析ACC 系统一共有4 个状态:
①速度控制模式(SpeedCtrl):主要是维持当前车速为设定的巡航速度不变,适用于前方没有车辆的情况。
②跟车模式(FollowMode):主要是前方有车并且车速低于设定的巡航速度时的控制策略。策略上,本车保持与前车车速一致,进行跟随。
③设置速度模式(SetSpeed):在没有启动巡航模式情况下,驾驶员设置巡航速度,并可以启动巡航。
④待机模式(Standby):系统上电后,处在待机状态,等待输入指令。
因此,EDFA 的状态集合为
(2)识别和外部系统的信号接口。
识别的外部相关对象一共有 4 个:驾驶员(Driver)、发动机(Engine)、刹车系统(Brake)、雷达(Radar)。
系统用例图参见图3。
图3 ACC 系统用例图
识别在跟车模式FollowMode 下,外部的所有输入/输出信号接口,参见表1 和表2。
表1 跟车模式下所有输入信号接口
表2 跟车模式下所有输出信号接口
(3)识别输入激励集。
在跟车模式(FollowMode)下,识别输入激励集Σs1,参见表3。
(4)识别转移函数f。
在系统的4 个状态中,根据实际系统的要求,可以在跟车模式和速度控制模式之间进行切换,另外,当退出跟车模式时会进入到待机模式。
根据输入激励集以及当前所处的跟车模式,识别在当前状态下EDFA 的转移函数f1s,参见表4。
(5)识别“跟车模式”下输入U 向激励集Σ的映射K。
根据ACC 系统特点,“跟车模式”下识别的输入U 对激励Σ的映射关系K1s,参见表5(未提到的输入信号表示无影响)。
表3 跟车模式下输入激励集Σs1
表4 跟车模式下转移函数f1s
表5 跟车模式下输入U 与激励集Σ的映射关系K1s
表6 跟车模式下识别向系统输出Y 的映射G 关系
(6)识别向系统输出Y 的映射G。
根据ACC 系统的特点,“跟车模式”下识别的向系统输出Y 的映射G 关系参见表6。
(7)识别初始状态s0。
根据ACC 系统的特点,系统上电后处于Standby模式,因此,s0=Standby。
(8)定义当前状态下功能需求。
根据前述分析原理,参考“功能需求整理模板”(<当前状态>下,当<系统输入U 向Σ的映射K>时,系统跳转到<转移函数f 的目标状态>,同时,<向系统输出Y 的映射G>),整理得到如下的“跟车模式”的功能需求:
①跟车模式下,当本车车速在[25,120] km/h 之间,并且与前车距离大于100 m、没有刹车、没有加油、取消巡航按钮没有按下,系统进入速度控制模式、本车车速大于前车车速时,系统跳转到速度控制模式;
②跟车模式下,当刹车踏板踩下或者油门踏板踩下,或者收到结束巡航信号,或者车速大于120 km/h,或者车速小于25 km/h,系统退出跟车模式进入Standby模式,同时向驾驶员提示警告信息;
③跟车模式下,当前车速度小于本车速度,且本车车速大于25 km/h,小于120 km/h、前车距离本车小于100 m、取消按钮没有按下、没有刹车、没有加油,系统保持跟车模式。
(9)整理/补充系统功能需求。
前述基于状态的需求分析过程中,已经可以识别出若干系统总体的功能需求,补充如下。
①ACC 系统一共有4 种运行模式:速度控制模式SpeedCtrl,跟车模式FollowMode,待机模式Standby和设置速度模式SetSpeed;
②ACC 系统上电后的初始状态为待机模式Standby。
根据功能需求分析流程,逐个对其他3 个状态的功能需求进行分析,然后综合所有状态下的需求和系统的总体功能需求,就可以得到ACC 系统的功能需求。
在上述分析中,只对“跟车模式”进行了功能需求分析,从分析可以看出,通过状态空间划分,将系统分解为4 种独立运行状态(减小分析空间的大小),然后每种状态独立分析其功能需求,最后综合称为系统的整体功能需求。
每种状态功能需求分析过程中,首先识别从该状态向外部和自身状态转移的可能输入激励和转移函数,这样就可以从整体上识别4 种运行状态之间的工作模式切换(实际上是从整体上识别了系统的整体运行需求)。
在获得输入激励后,将系统的外部输入映射到输入激励上,也就是说,外部输入会直接影响系统内部的输入激励,从而识别在不同的外部输入下,哪些输入组合条件会造成系统在不同的工作模式之间切换,从而将外部输入信号组合与输入激励联系起来。
根据转移函数,识别在每次转移的时候,在当前状态和输入信号组合情况下,所对应的系统外部输出信号要求,从而将系统状态、输入激励、转移函数、输入信号组合与系统输出关联起来。
综合来看,通过该结构化方法可以按步骤、有条理地分析出系统的功能需求。在系统比较复杂的情况下,通过识别系统的状态集合,再按照不同的状态分析系统功能需求,可以减小需求分析的复杂度和难度,同时,由于其分析过程的结构化特性,更易于掌握并且流程化,有利于使用和推广。
系统功能需求是后续设计开发的基础,具有重要作用。本文基于EFDA 提出了一种需求获取的结构化方法。
基于EFDA 的功能需求获取法,从系统状态入手,通过识别不同状态下的输入激励集合、转移函数、初始状态、外部输入信号与输入激励集合的关系、外部输入信号与转移函数和外部输出信号之间的关系,分析得到对应状态下的功能需求;通过综合不同状态下的功能需求,得到系统的整体功能需求。
基于EDFA 的功能需求分析法,具有结构化、条理化等优点,面向大型系统需求获取时,可以通过分解状态激励、转移函数、每个状态下功能需求等几个子部分进行分析,从而简化大系统需求分析难度,降低分析复杂度,提升功能需求分析的完整性。