需求优先级的相关研究主要集中于评估需求的价值和实现成本。并在限制可用资源的条件下确定优先级的方法,对风险因素和需求相关性的影响均未作过多考虑。然而,风险不仅影响需求实现的成本,在资源约束下也影响需求的价值,因此在对需求进行优先级排序时还需考虑风险因素。同时,由于需求间存在广泛的相关性,该影响还会波及到其他间接相关的需求,这进一步加深了风险对需求优先级的影响,单个风险不仅影响其直接关联的需求,同时影响其他相关的需求。因此,在需求优先级排序中,使用风险因素对需求价值和实现成本进行估算,将有助于提高排序结果的有效性。
1、相关研究
需求选取时需要考虑的主要因素有需求价值的评估、需求成本的估算、需求相关性、资源约束和风险。需求选取问题一般可作如下描述:在确定可用资源等约束条件之后,选取出高价值、低成本的需求,优先予以实现,以更好地满足用户需要和提高收益。其中,价值一般是需求对用户的价值,通常使用需求的相对重要性来表示;成本是指实现需求所需要的工作量;约束条件包括阶段内可投入的资源、进度要求等;风险是指“可以对项目目标造成负面或正面影响的不确定因素”,在需求选取时考虑有可能对实现需求所需的成本、进度等造成影响的不确定因素。
早期研究主要集中于需求价值和成本的评估方法。提出了层次分析法(analytic
hierarchy process,AHP)来确定需求的相对价值,以相对价值和成本的比值确定需求的优先级。层次分析法的基础是涉众对需求相对重要性获得一致的评价。质量功能部署(quality
function deployment,QFD),利用质量屋的关系矩阵,评估用户需求、技术需求特征、目标价值等因素的关系,进行优先级排序。上述及其后续扩展构成的这一类方法,将单个需求作为独立变量,关注需求之间的相对重要性,没有包括风险因素的直接计算。
需求优先级问题,在需求价值和成本的量化评估值的基础上,也可以描述为约束下目标最优化问题:在给定的约束下,选取价值最大的需求组合。这种描述下的需求选取问题,通常有指数增长的解空间,为NP难问题,因此研究的另一个方向是对问题计算方法的优化。若需求选取为一个背包问题,提出了双优化目标的解决算法。Evolve+方法中采用遗传算法来解决计算的难度,该方法考虑了多涉众的价值评估和目标差异。
现有研究中风险一般被间接使用,风险作为一个评价因素,作为对需求组合进行评价的参考。Evolve+方法中也考虑了风险,但仅将风险作为约束条件,每个需求有一个风险评估值,限定所选中需求组合的风险评估累计值。以上研究主要立足于在需求阶段进行需求优先级的评价,但实际中,项目开发计划制定的完成,在需求选取之外还需要任务拆分、资源分配等,使用后续开发过程中能够获得的信息来辅助需求的选取,有助于提高结果的有效性。OPTIMIZERA-SORP方法[8]从资源调度的角度考虑需求选取问题,确定资源分配结果,使得完成的需求能够取得最大价值。在确定资源调度的同时也确定了要实现的需求,即完成了需求选取。方法中也没有包含对风险的考虑,同时由于需要调度资源,计算复杂度进一步提高。
笔者在软件项目管理、基于风险的需求管理和项目计划制定等领域作了广泛而深入的研究。在项目开发计划的制定中,需求选取和任务拆分是两个连续的过程,通常需求选取先于任务拆分。如果首先将需求拆分为任务之后再进行需求选取,利用任务拆分获得的信息,有助于提高需求优先级选取的有效性。任务的具体拆分结果因开发方式的不同而不同,一个需求可以对应一个或多个任务。软件开发项目由多个需求构成,每个需求关联一组开发任务,风险被描述为任务的直接影响因素之一。
本文提出一种基于风险的需求优先级排序方法,建立需求一任务双层模型,模型对需求的价值、成本、约束关系和风险因素进行了定义和描述,结合风险因素和需求间的关联关系,计算需求的成本和价值,以成本价值比为依据进行需求优先级排序。同时,开发了基于风险的项目执行模拟工具对方法进行了验证。实验结果表明,方法有助于提高项目取得的价值,给出的需求优先级排序结果符合费效比原则,依据方法排序结果进行计划的项目实现了在早期尽快获取价值的目标。该方法和工具可为项目经理确定合适的需求开发优先级提供决策支持。
2、基于风险的需求优先级排序方法
2.1研究的主要结构
研究工作的整体框架如图1所示。框架分为应用层、工具层和模型层。在应用层,项目经理首先整理分析项目信息和风险信息,通过工具得出需求选取结果,依照需求选取结果制定项目计划并进行模拟执行。项目经理最终根据模拟执行的结果做出相关决策。在工具层,基于风险的需求优先级排序方法提供的自动需求选取计算给出需求优先级结果,基于风险的项目模拟执行工具则提供项目模拟执行和数据统计分析功能。在模型层中,软件项目模型和风险模型提供方法和工具执行的描述基础。
图1研究工作的整体框架图
2.2风险模型
本文将风险R定义为如下的三元组:R(risk)={RID,IS,P}
RID(risk ID)为风险编号标志;
IS(impact-schedule)为风险发生时对相关任务所需工作量造成的影响,以百分比描述;
P(probability)为风险可能发生的概率,以百分比描述。
风险将直接与任务关联在一起,仅考虑风险对任务工作量的影响。这里采用了一个简化的风险模型,但简化后的模型仍具有普遍意义:
a)原子性。每个风险要么发生一次要么不发生。对于可能发生N次的风险,将其表达为N个单独的风险。
b)独立性。只考虑独立的风险,风险之间的相关关系暂时不考虑。
c)叠加性。发生在同一个任务上的多个风险对任务进度所产生的影响是叠加进行的。
d)无时效性。某个任务的风险在任务执行过程中任意时间发生,对任务进度所造成的影响是相同的。
风险影响的定量计算从需求的成本和价值两方面进行。风险对成本的影响,即以任务在风险下的期望成本作为计算中使用的成本估算值。需求描述为原子需求,也就是说要么全部完成得到价值v,其他部分完成的情况均认为需求未实现,得到价值是0。在一个指定的资源约束下,由于风险的影响,某个需求的价值或者全部取得或者为0。使用一个规约函数来逼近风险对需求价值造成的影响。风险对价值影响的规约函数(θ函数)的具体描述见后。需求的成本价值比计算中,不仅考虑单个需求的成本价值比,同时对相关需求的成本和价值进行了计算,即计算中包括由于关联需求带来的成本和价值变动,风险影响沿着需求相关关系的扩散,也被包括在计算中。
2.3项目模型
项目模型由项目、需求、任务三个部分构成。本文将软件项目P定义为如下的三元组:P(project)={PID,PIW,RES}
PID(project ID):项目编号标志;
PIW(project investing workload):项目计划投入工作量;
RES(requirement set):项目包含的需求集合,RES={RE1,RE2,RE3,……,REi}。其中RE为需求,定义见后。
项目模型中需求、任务和风向元素的关系如图2所示。
图2 项目模型元素和风险关系图
2.3.1 需求定义
需求RE的定义如下:
RE(requirement)={REID,V,IF,PI,PRES,CTS,TS}
这里的需求描述了软件功能或者非功能上某一方面的特征,需求的实现因为满足了用户某方面的需要而带来一定量的价值收益。一个需求的实现需要完成这个需求所要求的所有任务。
REID(requirement ID):需求编号标志;
V(value):需求的价值;
IF(is finished):需求被选取标记,值为true或false,用于计算中的标记;
PI(priority level):需求优先级,为排序结果;
PRES(pre—requirement set):前置需求集合,当前需求如果要开始,那么其前置需求集合中的所有需求必须已经被实现;
CTS(connected task set):关联任务集合,用于计算中的辅助量,表示完成当前需求时,必定已经完成的任务集合(包括自身所需任务以及由于需求前置约柬和任务前置约束引入的关联任务);
TS(task set):需求所要求任务的集合,TS={T1,T2,T3,……,Ti}。其中T为任务,定义见后。
2.3.2任务定义
任务T的定义如下:
T(task)={TID,IW,PTS,EW,IF,CTS,PTS,RS}
这里,任务中成本、工作量、工作产品和资源需求等属性是较为明确的。在模型中,任务是进行成本估算的基本单位,也是进行风险分析的基本单位。
TID(task ID):任务编号标志;
IW(ideal workload):理想情况下(不考虑风险)完成该需求的工作量;
EW(expected workload):考虑风险因素后,完成该需求的期望工作量;
WW(worst workload):风险全部发生,即最坏情况下完成该需求的工作量;
IF(is finished):任务已完成标记,值为true或false,用于方法计算中的标记;
CTS(connected task set):关联任务集合,用于计算中的辅助量,表示当前任务完成时,必定已经完成的任务集合(包括自身,以及由于任务前置约束引入的关联任务);
PTS(pre—task set):前置任务集合,当前任务如果要开始,那么其前置任务集合中的所有任务必须已经完成。
RS(risk set):对任务工作量产生影响的风险集合,RS={R1,R2,R3,……,Ri},R即风险模型中定义的风险。
2.3.3模型要素问关系
需求之间存在的关系,是需求选取中需要考虑的重要因素。有三类需求相关关系可以直接输入,在模型中加以呈现:
AND:需求间的AND关系,两个需求仅当都被实现时,才具有价值。AND关系为等价关系,具有AND关系的两个或多个需求,可以聚合为一个需求。
REQUIRE:需求间的REQUIRES关系,即一个需求依赖于另一个需求,只有被依赖的需求已被实现时自身才有价值。在模型中,RE.PRES即描述了需求间的REQUIRES关系。
CVALUE:需求间的CVALUE关系,即一个需求的实现,将引发另一个需求价值的变动。CVALUE关系可以有另一种表述,两个需求都被实现时,将引发一个价值变动,这个价值变动为一个额外的价值增加或减少。假设有需求RE1和RE2具有CVALUE关系,当RE1已实现后,RE2的价值发生变化,变动量为VX。在模型中,可以加入虚拟需求RE3,RE3.V=VX,RE3.TS=REI.TS∪RE2.TS。RE3描述了REl和RE2问的CVALUE关系,而不影响其他因素。
需求与任务之间的关系,这里假定实现需求的工作量被拆分至一个或多个任务,这组任务的全部完成,即达成需求的实现,这取决于需求和任务描述的粒度,以及任务的拆分方式。需求之间可以共享任务,也即一个任务可以被多个需求的任务集合包含。
需求之间存在任务的共享,即隐式地包含了需求问的ICOST关系。ICOST关系指一个需求的实现,使另一个需求实现所需要的投入发生变化。两个共享任务的需求,任何一个先实现。另一个所需要的剩余工作量都将减少。这种1COST关系在模型中已不需要显式地定量输入,在将任务分配至需求,以及确定任务工作量时,已经自然完成了关系的建立和定量描述。
任务之间的关系,考虑任务之间的进度约束关系,主要为完成一开始(finish-start,FS)型约束关系。该约束的具体表现是一个任务必须当其他某些任务完成后才可以开始,造成这种约束的常见原因如工作产品约束:一个任务以另一个任务的输出为输入(如相继的设计和编码两个任务之间存在的约束)。模型中T.PTS描述任务之间的完成一开始型约束。
2.4需求选取计算
计算中,首先建立模型,之后对需求的成本价值比进行计算,以成本价值比的排序结果作为需求选取的依据。计算分为以下五个步骤:
a)信息输入。用户输人项目信息、需求信息、任务信息、风险信息。
b)项目模型建立。系统根据输入信息建立模型。
c)规约风险影响,计算任务期望工作量。任务工作量在风险发生时的期望值,作为考虑了风险因素之后成本估算的基本值,具体计算如下:
T1.EW=T1.IW×
任务最坏情形下的工作量,即所有风险都发生时的工作量,具体计算如下:
TI.WW=TI.IW×
d)需求优先级排序。软件开发所遵循的首要原则是费效比原则,即用尽可能少的成本实现高价值产品。针对需求优先级决策来说,应该把高用户价值和低成本的需求安排在早期阶段实现,这样可以尽快地带来用户价值。因此,需求优先级排序主要基于成本价值比排序。
需求的价值由RE.V来确定,需求实现的成本以相关任务的工作量来计算。由于涉及到需求之间和任务之间的前后置约束关系,单个需求的成本价值比将难以独立计算。计算方法中,将关联的需求之间聚合之后,进行成本价值比计算。同时,计算中需要考虑风险因素的影响,具体如下:
设置所有任务(T)的IF为false,设置所有需求(RE)的IF为false。定义剩余投入工作量(RW)为当前阶段尚余的待分配工作量,设置其初始值为P.PW。
遍历需求集合,计算RE的关联任务集合(CTS)递归的定义为REa.CTS=REa.TS
T的关联任务集合(CTS)递归的定义为Ta.CTS={Ta}
如果在递归计算中,出现了环(即REa.CTS的计算过程中需要REa.CTS或者Ta.CTS的计算中需要Ta.CTS)。这表明,模型的输入中,模块或者任务的前置关系在设置时引入了环,即存在两个需求或任务,在前置约束的依赖路径上彼此包含。这种输入非法,应当从发现环的位置出发,检查模型输入并去除环。
逐轮计算尚未选定需求的成本价值比,选取高成本价值比的需求设定优先级,并标记为已选定,直至所有需求的优先级确定。单轮计算过程如下:
定义需求当前关注任务集合CFTS:RE.CFTS={Ti∈REa.CTS,且Ti.IF=false}
定义需求当前关联需求集合CRES:RE.CRES={REi|REi.TS
REa.CTS,且REi.IF=false}
需求的成本价值比CVR(cost-value rate)则为
其中:为三角分布函数,表示一个最小值为min、最佳值为best、最大值为max的三角分布在x的值。
上述计算中的风险影响规约函数(θ函数)用于衡量在指定投入工作量约束下,风险因素对成本价值比计算的影响。RE.CFTS中所有任务的累计工作量,有这样的一个概率密度函数μ(w)=P,其表示累计工作量为w时的概率为P。对REa..CVR的理想计算方式应当如下:
当需求所需的任务不能全部完成时,就未被实现,不应计入任何价值收益。在上述积分中μ(w)是由REa.CFTS中任务关联的所有风险变量共同决定,其本身以及上述的积分式计算过于复杂或者本身不可积分,因此使用xθ函数来进行近似计算。θ函数使用三角分布来逼近上述分布值,需求的理想工作量也即风险全不发生时的工作量,为三角分布的最小值;需求的期望工作量作为三角分布的最可能值;需求的最坏情形工作量作为三角分布的最大值。
如计算出的所有CVR值均为O,结束计算跳转步骤e);否则进行如下计算:根据计算出的CVR值对需求进行降序排序,如当前CVR值最大的需求为REa,当前最小可用优先级标号为j,则REa.PI=k=j+|REa.CRES|(其中|A|=集合A的元素个数)。REa.CRES中需求以CVR值降序排序,优先级分配依次从J至k-1。标记REa和REa.CRES中需求的IF为true,标记REa.CFTS中所有任务的IF为true。修改j为k+1,跳转步骤c)开始下一轮计算。
e)输出需求选取结果。分配有PI值的需求,即为选定的需求集合。根据PI的升序排列,即建议的需求实现顺序。
2.5模拟工具
RunRiskVl.0是本文为方法开发的支撑工具。通过该工具可以很方便地进行项目信息的输入和修改、需求选取结果及优先级的生成和查看、项目的仿真模拟。用户输入项目信息后,工具自动建立模型,计算需求选取结果,并进行项目仿真模拟,采集生成仿真结果的数据和图表。
3、案例分析
3.1案例介绍
本文以一个开发富文本编辑器产品的项目作为实验案例。项目的开发内容由表1中描述的八个需求组成,Re1~Re7分别为七个独立需求。Re8为其前置需求对应的更高一级水平。
表1项目需求信息
项目包括了20个task来完成所有需求的开发,如表2所示。项目的开发模型为增量开发,单次迭代基本遵循分析设计、编码、测试的过程。属于同一需求的任务,通常有前后置关系。
表2项目任务信息
项目的风险信息如表3所示。
表3项日风险信息
这里设定项目计划投入为25个人月,分别以基于风险和不考虑风险的方法对需求优先级进行排序。不考虑风险的方法采用价值与工作量比值作为排序标准,每轮选取当前前置条件皆已满足且价值与工作量比值最高的需求,需求的工作量为其所有任务理想工作量之和。
需求优先级排序结果和任务优先级排序结果分别如表4、5所示。需求的优先级最高为0,最低为7。同时.任务的优先级最高为0,最低为19。
表4需求优先级排序结果
表5任务优先级排序结果
3.2模拟执行结果分析
项目模拟执行中,假定投入15个人,0~50天记录每天取得的价值(50天即投入了25个人月)。项目模拟执行10
000次,以每天取得的价值的平均值为结果,如图3所示。图中的实线为基于风险的方法,虚线为未考虑风险的方法。
图3中的横轴作为项目的进行时间,代表了项目已发生的工作量即成本,纵轴代表项目当天取得的价值,因此图中曲线的斜率等于价值与成本的比值,即费效比。图中的曲线呈现出一定的阶梯状,这是因为仅当需求包含的全部任务完成时,才能计入取得的价值,所以价值的取得是离散的,而投入的工作量是连续增加的,从而使得曲线呈现阶梯状。项目在无风险条件下执行,曲线应为阶跃状,每次跳跃发生在某个任务完成后使得某个需求被完整完成时。由于项目执行中风险的影响,跳跃点的位置有一定的左右随机扰动,最终曲线呈现出缓和的阶梯上升趋势。
从图中可见,当第50天项目结束时,实线取得约781的价值,而虚线为682,即基于风险方法的需求优先级排序获得了更好的项目价值。同时从图中可见,实线始终位于虚线上方,对同样的价值,实线总早于虚线达到,即基于风险方法的需求优先级排序结果使项目在更早期取得了更大的价值,更满足费效比原则。
进一步验证基于风险方法的需求优先级排序能够取得更优的项目价值,对项目计划投入0~36个人月(36个人月已能保证在最坏情况下,项目的所有需求都被完成)分别进行需求优先级排序。依照排序结果,分别将项目模拟执行10
000次,记录最终取得的项目价值的平均值为结果,如图4所示。
图4中的横轴为项目投入的人月数量,代表了项目的工作量投入即成本,纵轴代表项目最终取得的价值。从图上可见,实线位于虚线之上,这表明基于风险方法的需求优先级排序不同投人水平上都获得了更好的项目价值。从图中可见,实线与虚线的差值在20个人月的投入水平附近时最大,差值往曲线的两端递减。在较低投入水平下,由于能取得的项目价值较小,差值较小。在较高投入水平下,由于项目的大部分需求都能够被实现,未能取得的价值较小,方法间的差值也较小。从图中可见,当投入达到36个人月时,由于所有需求一定都可实现,项目取得价值一定为1
000。这也说明,基于风险的需求选取方法在投入资源是关键限制因素的项目中,能够帮助项目尽可能地获取最优价值。
4、结束语
本文提出一种基于风险的需求优先级排序方法,建立了需求一任务双层模型,模型对需求的价值、成本、约束关系和风险因素进行了定义和描述,需求的成本及价值计算中包括了风险因素和需求间的关联关系,以费效比为依据进行需求优先级排序。方法的模拟仿真工具支持需求优先级的自动排序,支持项目的模拟执行,支持在指定约束下估算项目投入成本和产出价值的关系。模拟实验的结果表明该方法能够更好地获取价值,同时给出的需求优先级排序符合费效比原则,适用于强进度约束,开发自主性高、市场驱动的商业软件项目。该方法及其工具能协助项目经理迸行项目开发内容的裁减和项目任务的计划,提高项目的价值和成功率。
目前,该方法的风险模型中,风险的可变因子只有发生概率和影响,因此无法描述如风险在不同时间点发生的影响差异,无法描述任务在项目尾期启动和项目早期启动的风险差异等,这在一定程度限制了实际风险情形向模型的转换。未来的工作将改进风险的描述,放宽假设条件,以更好地符合实际情形,提高方法在实际运用中的有效性。
|