你正准备穿越十字路口,身旁的警察先生说:「要过马路?没问题,但我先警告你,根据统计,顺利通过这条马路的机率是 24% ,也就是说,你有 76% 横死街头的可能。」
怎么会有如此可怕的马路?!然而在真实世界里,有个领域正是如此 -- 那就是「软件开发」。根据 Standish Group CHAOS 2000 的统计,软件开发项目的成功机率为 24 %,剩下的 76 %都以失败告终。换句话说,在这个令人咋舌的专业世界里,烈士们一直用大量的鲜血换取少数的成功。
软件开发真的这么惊心动魄、死亡枕藉吗?是的,许多投入这个领域的人都有很多失败故事,以及少数极为珍贵的成功案例。这些存活下来的英雄们都已锻炼成可以随时分泌肾上腺素,与培养出视死如归的涅盘精神。
事实上,软件开发并不像起义那么可怕;不过两者间倒有个微妙的共通点 -- 都在「推翻不良旧体制,建立美好新体制」。革命烈士们都知道自己正在创造历史,但很多投身软件开发领域的勇士们并不了解自己也正走在这条路上;幸好已经有成功部队把康庄大道展示在大家面前了。
瀑布与水车
软件开发之所以常常失败,最大症结在于「体制」,也就是「开发流程的设计与推动」。这个关键往往没有受到重视,等到最后问题爆发出来时,代价就是浪费大量的人力与金钱成本。
按照常态,软件开发项目的流程大致可区分为「需求」、「分析」、「程序撰写」、「整合」、「测试」等阶段,整个开发团队也是按照这个流程组合而成,所有工作循序进行。这种最常见的模式被称为「瀑布式 (Waterfall) 」流程法,也就是前一个步骤完成后,再把结果导入下一个步骤,依此类推直到产生最后结果。
这种传统方法的特色是职责分明、各行其事,但同时也是缺点所在。因为这种单向流动模式少了各阶层间的沟通与回馈设计,也缺少弹性应变机制,一旦发生失误、需求临时改变或流程出现问题时,就会使整个流程大乱,轻则成员彼此指责,重则重起炉灶。这就是软件开发成功率只有 24% 的最大关键,结果导致人力资源浪费、成本膨胀及客户关系恶化。
既然传统的软件开发体制漏洞百出,那该如何改进?我建议颠覆惯用的单向式流程,把瀑布的最终结果导回源头,成为一个往复式的圆圈( Cycle ),使整个流程具备回馈与检验机制。当然,仅将瀑布改成循环水车,不代表革命已经成功,还需要配合各阶层的革新作法。
我们将这种革新的循环式流程,以及藉此发展出的一整套完整作业模式,称为 RUP ( Rational Unified Process )。 RUP 是一份包含四百万字、累积多年实际经验所提炼出来的最大共识(或公约数)、由上千位软件开发人员所共同完成的标准化作业准则,堪称为「最佳典范」( Best Practice )。 RUP 的目标是希望藉由一套最佳化的软件开发作业流程,提升投资报酬率( ROI )。
RUP 观念
以下提出一些革命性的观念,因为观念是行动的原始推力。
观念一:重心往前移
以往的开发流程中,重心大多放在中后期的「程序撰写」阶段,投入最多的人力、物力与时间。不过在 RUP 准则里,则将重心往前挪移到最开头的需求与分析阶段。举例来说,如果一个开发项目的总预估时间是三个月,那么前面阶段所配置的时间可能超过一个半月。因为根据统计,同样一个问题,当它发生在前面阶段与后面阶段时,所需要投入的解决成本平均比例大约是一比两百,这就是促使重心往前移的主要动力。
观念二:可视化模块分析与组件组合
这是上一个观念的延伸,主要目的是让「结果」可以在整个流程中被拆解与不断产出。以往结果都是在开发流程的结尾才出现,于是当客户惊觉事实与想象不符时,大家也只能泪眼以对。所以在 RUP 流程里,当需求经过分析之后,就会开始进行组件拆解,并针对高风险或特定需求者予以可视化的组合,让它们成为一种可以被开发人员及客户体验的组件形产品,这样才能确保成果与整个流程不至于南辕北辙、全军覆没。
观念三:测试先行
同样是为降低风险与提高获利率所产生的观念。「测试」是质量良窳的试炼场,但在传统流程中总排在最后,当发现测试结果不堪入目时,常常为时已晚。因此在 RUP 流程准则里,不仅强调测试是需要的,而且必须在整个流程的起始阶段就进行( Testing in Beginning ),以便坚持产出的质量。
观念四:完备的后端机制
上述几个观念不仅一开始就同时进行,而且是贯穿在整个开发流程中,也会不断地重复出现并接受追踪与检验,这就是它被称为「反复式开发流程」( Iteration )的原因。要确保整个绵密流程可以完美无瑕地进行,当然不能单单依靠「大家必须努力配合」这种高调,必须有一整套的管理机制作后盾。所以在 RUP 里,将整个开发流程称为「前端」,而另一套同样贯穿整个流程的管理机制则被称为「后端」。后端负责确保前端的流程细节完全吻合共通的作业准则,并让整个流程去除人为犯错因素,达到自动化要求。
基本的观念分享暂且到此,从下一篇开始,我将拆解整个流程的各个关键阶段,并进行「可视化模块结合」,实际与大家分析该如何进行软件开发流程。