第 3 章 根据功能特性可以指导得更好

第 3 章 根据功能特性可以指导得更好

对于任何一个项目,我们知道的第一件事情都是项目的截止日期,至少看起来总是这样。下图用底部标有三角形的竖线来表示该日期。

在截止日期到来之前,我们想要实现哪些功能特性呢?毫无疑问,当然想要实现所有的功能特性,也就是图中的横线。五角星则代表我们的计划:在截止日期到来时,我们希望拥有所有的功能特性。这一切都毫无疑问。

然而,由于某些缘故,结果并非我们所希望的那样。通常,最终的结果是:要么少发布了一些功能特性,要么结束的时间比截止日期要晚,甚至是上面两种情况同时发生,也就是下面第二幅图中带问号的线所表示的情形。我们所得到的肯定要少于我们想要的。毕竟,我们想要实现所有的功能特性!

事实是,我们并不能够实现所有的功能特性。我们需要正视这一事实,并进行相应的管理,而不是置之不理;同时需要对项目的运行进行引导,而不是任由它发展。

在你最近的一个项目中,有哪些重要的功能特性没能实现?又有哪些虽然实现了却被证明是毫无用处的功能特性?你发现得太迟或者几乎太迟的情况有哪些?

传统的软件项目分阶段进行。

很多软件项目都根据活动来进行阶段规划,项目通常会被划分为四个阶段:分析、设计、编码,最后是测试。上图中带箭头的线表示的就是我们对这样一个项目的计划,看起来十分不错。然而,即使按时完成了分析阶段的活动,我们也并不能据此知道设计或者编码阶段会完成得如何。

直到我们看到软件,才能够真正知道自己做得如何。当我们拿到代码并开始测试时,又会发生什么情况呢?通常,等待我们的并不是什么好的结果!

在你经历的项目中,是否有过当问题产生时你却很少有时间去应对的情况?你认为能够更早地知道实际所发生的情况有价值吗?你曾经是否希望所付出的努力至少能够带来一些价值?

更糟糕的是,事情很少会按照计划发展。

最后,我们开始检查并测试代码,然而现实却并不能让人满意。结果必然是,项目的进度比我们认为的要落后,完成的功能特性也比我们认为的要少。我们已经完成的那部分功能特性并不尽如人意。

我们知道,自己的要求超出了力所能及的范围,目标设定的本质如此。但当我们发现自己的处境时,为时已晚,这导致我们无能为力。

如果警告信息多一些,或许我们还有希望按时发布部分功能特性。现在,我们只有两种选择:一是结束项目,然而这意味着自我放弃事业;还有就是继续勇敢地前进,希望在自己被放弃之前能够发布一些东西。

无论是哪一种选择,情况看起来都很糟糕。这两种选择都很糟糕!

你是否曾经不得不在很糟糕的情况下发布产品?是否软件在发布时仍有很多缺陷?是否软件当时已经很难改变?是否缺失重要的功能特性?是否有过想要加入重要的新想法却为时已晚的情况?

基于活动的产品就像是一块巨石。

在像巨石一般庞大的项目中,我们在后期并没有太多办法来节省成本。对于那些永远得不到的功能特性,我们都已经写好了需求;对于那些永远不能完成的功能特性,我们也都进行了设计甚至编写了一部分代码。所有这些工作都只能付诸东流了。

如果了解真实的情况,我们本可以将其中一部分工作推迟。

我们以要么全有、要么全无的心态为这个项目制订了计划:分析并设计了所有的功能特性,还尝试着实现所有的功能特性。最后我们却发现无法完成计划,然而为时已晚。

试图去计划并实现所有的功能特性,这使我们处于不利的境地。我们完全没有时间去改变,而且即使有时间,也不可能理清哪些事情不该做,哪些事情应该做。

相反,我们可以从一开始就计划多次发布版本。多次发版更容易管理,也能够更早交付价值。以这种方式构建软件更容易,同时所有人都能够共赢。

分析、设计、编码、测试,这样的阶段规划真的有助于管理软件项目吗?还是从一开始就关注功能特性,并根据你需要的顺序每隔一段时间就实现一些功能特性这种方法更容易管理呢?下面,我们就来看看这种方法。

根据功能特性交付项目更具有可预见性。

我们已经看到,逐个发布版本和功能特性,可以更早地交付价值。那么我们管理和指导这种实践的能力又怎么样呢?

图中,曲线所代表的传统项目一直不停地在进行着,但传达的信息很少,而且传达的时间也很晚;而直线所代表的项目却能够频繁、定期地向我们展示真正有价值的功能特性,同时我们也能够看到正在发生的事情,并看到正在形成中的软件!

你能够看出可见的功能特性流怎样更易于管理吗?你知道怎样做可以使项目的价值最大化吗?

风险方面又如何呢?你知道怎样通过构建可见的事物来评估或者降低项目的风险吗?你能够看出怎样用小的试验性功能特性来应对市场的风险吗?

根据功能特性交付项目能够提供更好的信息和指导,同时也会产生更好的结果。

当以逐个实现功能特性的方式构建软件时,情况会好很多。我们能够看到任务完成了多少,也会知道项目进展的速度有多快。这样,我们就能够很好地预测在任意一个给定的日期到来前有多少任务是可以完成的。

我们会选择余下的功能特性中最重要的那个作为下一步的目标。这样,对于任意的交付日期要求,即使要比一开始要求的日期早,我们也都能够构建出最佳的功能特性组合。在有更好的想法或者用户的需求发生变化时,我们甚至能够变更或者增加新的功能特性。

当项目随着一个接一个的功能特性的完成而逐渐完善时,我们就可以应对真实发生的状况了。同时,我们也能够应对需求以及商业与管理方面的变化。

那么,需要具备哪些条件才能使这样的工作方式成为可能呢?在甚至都不知道最终想要什么的时候,我们又怎么能够对项目进行规划呢?

进阶阅读:

  • 第 14 章 组建强大的团队

  • 第 16 章 自然软件开发的管理之道

目录