不确定性就是风险
人在做事情时,往往面临着不确定性。比如,不确定周日是否有空,不确定团队的工作进展怎么样了,不确定什么时候可以回家一趟……
对于一个有着目标的人或者事,不确定实际上就是一种风险。这里要提一下,有目标才有风险。一个没有目标的人或者事,风险是不存在的。风险是指对目标的达成有着不可估量的因素。
举例来讲,比如,一个大学生要出门去自己谋生,他的基本目标就是要能够生存下来。如果他不确定自己能找到工作,不确定自己能够结交朋友,那么可以断定,他的风险是相对比较大的。同样一个大学生,在出校门之前就已经被一家公司录用了,那么他谋生的目标是没有什么风险的了。
并不是指百分之百地肯定或者否定一个因素。不确定的根本在于没有办法将因素以数学的方式表达出来。
比如,从1、2、3……37总共37个数中选中6个数,这6个数刚好跟随机选出的6个数完全符合。一般来讲,是不确定能不能选中的。但从数学的角度,选出6个数的所有可能数为:
37*36*35*34*33*32 = 1673844480
所有的可能中,与随机数相同的可能数为:
6*5*4*3*2*1 = 720
由此可以得到,选出完全符合的数字的可能性为:
1/2324784
经过数学处理之后,不确定性能不能选中就可以表达为:选中的概率为 1/2324784。
所以, 对于一个目标,没有达到用数学来表达不确定性因素,就是风险
项目就是确定化
一个项目为达到目标而做的一切行动。项目的目标往往需要经过复杂的行动步骤才能达到。并不是简单的求1+1等于几这样简单。正因为如此,项目的目标能不能达到,存在很大的不确定性。
而项目又是为了达到目标而做的一切行动。达到目标是一定确定的状态。换而言之,做项目,本质就是努力地消除达到目标的不确定性,保证目标能够确定达到的过程。
我们可能会常常听说一个软件项目会有需求分析,概要设计,详细设计,实现,测试,维护等过程。这一系列过程,如需求分析,是为了搞清楚目标是什么,不要连目标都没有搞清楚,就开始实施了,这就是为了消除目标不明确这一不确定性。设计,是为了消除目标在概念上是不是可以实现这一不确定性。实现,是为了消除在实际上是不是可以实现这一不确定性,测试是为了消除是不是已经实现目标这一不确定性,维护是为了消除目标实现可能的不完善这一不确定性。也就是说,所有的项目过程,都是为了消除不确定性。
对于一个目标,不确定的因素是非常多的,比如,有时候因为人的技能上的不确定性,导致项目能不能达到目标成为不确定。这跟项目的五个过程没有一点点关系。所以,做一个项目,要考虑的不确定性远非五个项目过程就算是考虑完了。
根据以上的描述,可以认为 做一个项目,就是消除达成项目目标的任何不确定性因素。
如何确定化
一个项目的不确定性因素相当多。本博在这里并不打算把所有的不确定性因素都列举出来让大家一一消除。而是提出如何做将减少不确定性因素。
首先,要明确任何一个事情完成与没有完成的界限是什么。比如,需求做完与没有做完,界限是什么?是项目经理认可了就算是做完,还是产生了需求文档就算是做完了。如果没有明确的界限,过了界限还是没有过界限,就一直不确定,从而也就没有办法确定是否已经达到目标。达到目标都没有办法确定,那所谓的消除确定性就纯粹是空谈了。
其次,尽可能将大的目标分解为相互独立的小目标。分解成小目标,会更加容易做到。同时,分解的目标具有独立性,可以使得各个子目标可以并行实施。
从这里,可以看到消除不确定性的根本就是划分。一个是从时间的先后上划分出一个目标完成与没有完成之间的界限(测试标准)。一个是在空间上将目标划分为各个小的目标。
在项目中,有些管理者会用里程碑作为完成目标的一个阶段。定义一个里程碑,实际上是定义一个跨越与否的界限标准或者说测试标准。测试通过了,就过了里程碑,测试没有通过,就没有过里程碑。而大多数项目管理者都把里程碑当作一个时间点,时间到了,里程碑就到了。把一套测试标准搞成了一个时间点,这样太扯了。
还有些项目管理者说是要模块划分,其实划分之后跟没有划分是一样的,根本没有办法进行并行开发。开发的时候硬是要将划分的几个模块绑起来才能够运行。这多半是由于管理者没有明白为什么要划分模块。划分模块是为了并行,而并行就要求各个模块有着自己的目标,而不是在划分模块之后,还要用整体目标去衡量模块是否完成。
所以,要真正做一个划分,可以是如下的步骤:
- 对一个目标,给出测试,通过测试能够明确知道目标是否达到
- 将目标分解成独立(从而可以并行)的小目标,针对每个小目标,重复第一个步骤
以上步骤中,在目标无法再分解为可以并行的目标时可以停止。