InfoQ

文章

什么是“成功项目”:谈谈软件的价值

作者 熊节 发布于 2007年3月26日 上午8时20分

社区
Agile
主题
交付价值
标签
敏捷介绍

在开始正文之前,我想先讲两个故事——关于软件项目的故事。

故事一

有两个软件项目(姑且称之为“项目 A”和“项目 B”),它们在开始时的预算都是 50 个人月,时间是 5 个月。

  • 项目 A 在 5 个月后完工,耗费成本 50 人月
  • 项目 B 在 6 个月后完工,耗费成本 70 人月

在软件圈子里摸爬滚打多年的读者们对这个故事一定有自己的判断——而且我可以大致猜出是什么样的判断。不过先别着急,我们还有另一个故事。

故事二

有两个软件项目(仍然姑且称之为“项目 A”和“项目 B”),它们在开始时的计划都是交付 200 项功能。

  • 项目 A 在项目结束时一次性交付了最初计划的 200 项功能,但客户发现其中大约 30 项功能没有太大用处,而另外 30 项有用的功能要等到下一个项目才能实现。
  • 项目 B 在第一个月结束时交付了第一个版本,此后每两周交付一个新的版本。在项目进行的过程中,客户进行了一次业务调整,加入了 90 项新的功能,并搁置了 50 项用处不大的功能。最终该项目交付了 240 项功能。

聪明的读者大概注意到了,前后两个故事讲的是同一回事,同样的两个项目。现在我的问题来了:请问哪个项目是更成功的项目?

这个问题并不容易回答——实际上它没有标准答案。站在很多软件企业的立场上,项目 A 是一个理想的成功项目:按时间、按成本完成预先约定的任务。请注意,我用了“理想的”这个词,稍后我还会解释这个有趣的词,因为实际上的软件项目往往没有那么理想。

而如果换一个角度,站在客户的立场上呢?也许付钱购买软件的客户会有一些不同的想法。项目 B 从开始之后一个月便交付了第一个可工作的版本,从那时起客户就开始使用这个软件的部分功能,并且不断地把自己使用的感受反馈给开发团队。在真实的业务运营过程中,客户甚至发现了一种新的盈利模式,并进行了一次大规模的业务调整,这次调整的结果也直观地体现在软件项目中。虽然项目B的整体交付速率低于项目 A,但它提供的所有功能都是客户真正需要的,它们为客户提供实实在在的价值——更不用说,客户提前好几个月就开始使用这个软件。

实际上,这是一篇关于软件价值的文章。和“成功项目”一样,对于“软件的价值”,不同的人也会有不同的定义。不过作为付钱购买软件的客户,他对于软件价值的定义是一目了然的:他能够从使用软件中创造多少价值,软件能够为他的业务提供多少价值,这就是软件的价值。或者说得更简明一点:

软件价值源自使用

这正是为什么很多客户青睐“项目 B”的原因——我并不打算声称所有客户都有同样的观点,稍后我也会举出反例,但至少支持这一观点的客户不在少数。因为他们处在一个残酷而快速变化的商业环境中:他们的供应商在变化,他们的客户在变化,他们所处的经济环境和政策环境也在变化。这一切的变化迫使他们的业务也要随之变化。更要命的是,今天这个经济全球化的时代是一个“快鱼吃慢鱼”的时代,客户迫切希望新的软件系统为他们带来竞争优势——哪怕这个软件系统尚未完成,只要能够投入使用。最后,客户对于新的软件系统究竟应该是什么样子并没有百分之百的把握,他们的想法往往要在真正使用软件之后才会浮现成型。几方面的因素加在一起,使得这些客户更愿意尽快开始使用软件、提出反馈、并不断完善软件,而不是提出一组需求、然后坐等几个月之后原封不动地拿到这些功能。

一个真实的案例

在 ThoughtWorks 的一个项目中,开发者们在项目开始之后一个月内就发布了第一个版本——只有一些简单的数据采集功能。在发布展示会上,发生了这样的对话……

  • 开发者:这是我们的第一个功能。我们从文本文件、Excel 数据表和遗留数据库采集数据,现在我们的数据库中有这些数据……(展示数据库结构)
  • 客户:唔……有意思。要是你能做这样一个查询(写出查询要求),得到的结果可能会有用。
  • 开发者:可是我们的界面上没有地方做这样的查询操作。
  • 客户:啊,我不需要操作界面,只要每天深夜做一次查询,把报表发到我的信箱就可以了。
  • 开发者:这样吗……另一个问题是,这需要花我们几天时间。
  • 客户:不要紧,把别的任务往后放几天好了,我很想看到这份报表。
  • 开发者:那好吧,下周我们就会开始提供这个报表。

猜猜结果怎么样?一周之后客户就开始每天接收这份报表,并根据报表内容做一些分析和决策。仅仅几个月之后,这份报表给客户带来的收益就已经超过了整个项目的投资——这时项目其他部分的开发甚至还没有完成。

想想这个客户会怎么定义一个“成功的软件项目”?好吧,也许这个项目超过了预期的时间,也许投入了更多的人力,但这些并不意味着“项目失败”——只是付出更高的成本。关键在于,他投入的这些成本能够带来多大的收益,他的投资回报率是否划算。对于这个客户而言,如果项目能够随时给他提供可用的、能够创造最大价值的软件,能够随时让——就像故事中提到的——这种有价值的想法得以实现,这就是一个成功的项目。

所以,亲爱的读者,请你忘记本文标题上出现的“敏捷”二字,我们在这里所说的不是别的,就是一种为客户创造最大化价值的软件开发方法。这样的方法有很多种,但它们有一个共同的特点:尽快、尽可能频繁地交付可以工作的软件,让客户尽快开始使用软件,从使用中创造价值、厘清思路、提出反馈。仍然以 ThoughtWorks 的项目为例,这些项目通常在启动开发阶段之后一个月内就会发布第一个版本,随后每一周或每两周发布一个新版本——每个版本都是一个可以工作的软件,每个版本都比前一个版本具有更丰富的功能,并且每个版本都包含客户认为迄今为止最有价值的那些功能。用软件开发的“黑话”,“开发下一个版本”的过程叫做“迭代”,这些开发方法最大的共同点就是“迭代式开发”——不是一股脑地交付全部功能,而是每次增加一点、渐进地交付最有价值的功能。

软件开发的梦想与真实

回到文章开始处的两个故事。我曾经说过,对于很多软件企业而言,项目 A 是一个“理想的”成功项目。那么,是什么让情况变得不那么理想?

答案是一个所有软件开发者耳熟能详的词:需求变更。在真实的项目中,客户通常不会等到最后一天再照单全收整个项目,因为他知道自己的业务正在发生变化。这时需求变更就出现了,伴随着来回的扯皮和讨价还价。更糟的是,大量的需求变更发生在项目晚期——因为直到这时客户才真正看到、使用到这个软件,他的很多想法才真正浮现成型。随着这种“最后一分钟的需求变更”,项目超期、超出预算也就成了家常便饭。能够像项目A这样完工交付的,实在是凤毛麟角的幸运儿。

为了对付需求变更这个噩梦,软件开发者们还发明了另一个词:变更控制。这个有趣的词暗示着:需求变更是一种“不好”的东西,是需要“控制”的东西。然而站在客户的角度上想想,他在亲身使用了软件之后提出的要求,难道不是最有价值的东西吗?把这种真正创造业务价值的要求“控制”起来,难道是合理的吗?

在前面我也暗示过,并非所有的客户都一定青睐迭代式开发。那么,哪些软件项目不一定需要迭代式开发呢?从整篇文章的内容不难看出,如果客户的业务绝对不会变化,如果客户的需求巨细靡遗非常明确,如果客户不需要尽快开始使用软件以便收回成本,那么迭代式开发对他的帮助就会小得多。不过,如果读者认真思考的话,这样的例子也许并不多——也许比你最初认为的要少得多。一个很好的例子是“神州六号”火箭使用的计算机控制系统。还有多少这样的例子?读者不妨试着自己想想。

如果我足够幸运的话,也许一些读者已经被这篇文章吊起了胃口:既然有这么好的软件开发方法,既然它能够为我们创造更大的价值,那还等什么呢,我们马上就动手吧。事情不会那么简单。为了让迭代式开发能够成为现实,为了确保尽快、尽可能频繁地交付,为了确保每次交付的都是最有价值的功能,我们——包括软件开发者、软件企业和客户——需要很多的改变。这里既有职责与权利的划分,也有开发过程和团队的重组,还有技术层面的实践指导。这些正是敏捷方法学所涵盖的内容。缺少了这些东西,“为客户创造最大价值”就只能成为一句空话。在后续的文章里,我们将结合 ThoughtWorks 的实践经验,逐步介绍敏捷方法的方方面面。

9 条回复

回复

果然 发表人 Cao Li 发表于 2007年3月28日 上午11时56分
软件价值源自使用 发表人 gem fox 发表于 2007年3月28日 下午7时15分
能否介绍一下,敏捷在产品研发中的经验? 发表人 BaoZhen Cao 发表于 2007年3月28日 下午10时39分
Re: 能否介绍一下,敏捷在产品研发中的经验? 发表人 Jeff Xiong 发表于 2007年3月29日 下午11时25分
交流最重要 发表人 zhang yong 发表于 2007年3月29日 上午4时54分
Good 发表人 Hailong Zhang 发表于 2007年3月29日 上午5时35分
有个问题想交流一下 发表人 df liu 发表于 2007年4月1日 上午1时2分
Re: 有个问题想交流一下 发表人 pan zhu 发表于 2007年4月1日 上午7时49分
商务上的问题 发表人 cake ke 发表于 2007年4月21日 下午7时31分
  1. 返回顶部

    果然

    2007年3月28日 上午11时56分 发表人 Cao Li

    成功的项目就是能赚到钱的项目——双赢

  2. 返回顶部

    软件价值源自使用

    2007年3月28日 下午7时15分 发表人 gem fox

    “软件价值源自使用”,这句话说得太好了。

  3. 返回顶部

    能否介绍一下,敏捷在产品研发中的经验?

    2007年3月28日 下午10时39分 发表人 BaoZhen Cao

    能否介绍一下,敏捷在产品研发中的经验? 产品研发的每个版本都用固定的需求,而敏捷需要的是变化。 敏捷中哪些地方可以引用到产品研发中呢?

  4. 返回顶部

    交流最重要

    2007年3月29日 上午4时54分 发表人 zhang yong

    写的不错,期待以后的文章~

  5. 返回顶部

    Good

    2007年3月29日 上午5时35分 发表人 Hailong Zhang

    挺不错的文章

  6. 返回顶部

    Re: 能否介绍一下,敏捷在产品研发中的经验?

    2007年3月29日 下午11时25分 发表人 Jeff Xiong

    能否介绍一下,敏捷在产品研发中的经验? 产品研发的每个版本都用固定的需求,而敏捷需要的是变化。 敏捷中哪些地方可以引用到产品研发中呢?
    关于产品研发中的敏捷经验,请看敏捷中国的相关讨论: http://groups.google.com/group/agilechina/browse_thread/thread/fee048f121acccdd/9df5c50bfa9d284d#9df5c50bfa9d284d

  7. 返回顶部

    有个问题想交流一下

    2007年4月1日 上午1时2分 发表人 df liu

    文章中提高的客户互动当然是理想的(针对客户的),但是忽略了一点:开发团队的利益。 从中国目前的项目实施上来说,基本上都是系统上线验收后才付费的。呵呵,这样看来,如果客户的需求不断变化,那么就始终无法验收了,那么开发团队的成本如何维持呢。希望能够就这个实际问题的解决方案探讨一下,否则话题就有些流于理想了。

  8. 返回顶部

    Re: 有个问题想交流一下

    2007年4月1日 上午7时49分 发表人 pan zhu

    这个我也想搞清楚,用户的需求变更可能是无尽的,但是money不可能无尽地给,什么时候结束迭代呢?

  9. 返回顶部

    商务上的问题

    2007年4月21日 下午7时31分 发表人 cake ke

    如果项目的需求频繁变更,企业如何保证能够从项目中盈利?商务合同该如何签?

独家内容

Tapestry for Nonbelievers

I. Drobiazko和R. Zubairov合作撰写了一篇文章,详细介绍Apache Tapestry 版本5——一个面向组件web框架。文章向读者展示了创建组件方法,并谈到了Tapestry中的IoC以及Ajax的相关特性。

ESB拓扑方案

在本文中,Adrien Louis讨论了两种基于ESB的SOA拓扑方案的优缺点:单个公司级ESB vs. 彼此互联的“部门级”ESB系统。Adrien讨论了每种方案对管理、业务监测、治理、可靠性和编配等问题的影响。

毛新生谈Project Zero和软件新发展

InfoQ中文站有幸与IBM中国开发中心Web 2.0首席架构师毛新生聊了聊Project Zero和软件新发展的相关话题,其中包括Project Zero的组织形式、支持的语言、以及未来发展方向等等。

Google图表及gchartrb初探

Google图表是一项用于生成图表的Web服务。这篇文章详细介绍了Google图表的接口以及可以允许Ruby方便创建图表的gchartrb库。

使用Erlang和Yaws开发REST式的服务

在这篇文章中,Steve Vinoski解释了如何用Erlang和Yaws Web服务器创建REST式Web服务。

Segundo Velasquez与客户眼中的敏捷

在某个软件产品设计的初始阶段,Segundo Velasquez曾以客户的身份与一个敏捷团队共同工作;Deborah Hartmann就这段经历对他进行了采访。

开放平台技术架构剖析

本视频从互联网的分类讲起,介绍了开放平台的类型、开放的价值以及开放平台对开发者的机会和挑战。然后以雅虎的NCP开放平台为例,讲解了NCP的特点、基本架构和具体的开发过程。

用UML做好系统分析

使用UML如何能让我们做好系统分析的工作呢?就让我们通过基金模拟项目,先睹为快,抢先体验一番。 本文节选自《系统分析师UML实务手册》的第二章。