设定优先顺序

作者:周思博(Joel Spolsky)
Wednesday, October 12, 2005
属于Joel on Software, http://www.joelonsoftware.com

我们之前刚出了一个大的service pack,解掉一大堆没有人会发现的小bug(也因而导致了几个没有人会发现的新的小bug)。现在该是结束 FogBugz 4.0,开始为FogBugz 5.0 加些新功能的时候了。

在开始动手前,我们想加的新功能多到可以让1700 个程式设计师做个几十年都没问题。不幸的是,我们总共才三个程式设计师,而且我们希望在下个秋天就能出货。所以我们必须排定优先顺序。

在我开始说该用什么方法为新功能排定顺序前,我得先告诉你两个不该 采用的方法。

sttropez1.jpg

方法一。若一项新功能的开发只为了已答应某个客户的话,哔!你的脑子里应该亮起红色警戒灯 。如果功能总是针对特定客户的话,不是销售员乱枪打鸟,就是你正冒着让产品往顾问软体(consultingware)走的危险。顾问软体本身没什么问题;你可以很安逸地往那个方向走,只是它没办法像套装软体(shrinkwrap software)赚那么多钱罢了。

套装软体这种开发模式的特性是要嘛就全要,要嘛就全不要。你把软体写完,用塑胶膜包起来之后,客户要嘛就买,要嘛就不买。他们不会说你要加了某个功能他们才会买,也不会打电话和你讨论他们需要哪些功能。就像你不会打电话给微软说:「喂!我爱死你们泰文版 Excel 里那个可以用来拼数字的BAHTTEXT 功能(译注:baht 是泰国的货币单位:泰铢),不过我只能用英文版的。如果你们能帮英文版加这个功能的话,我就买你们家的产品。」如果你真的打给微软的话,你大概会得到以下回覆:

「这里是微软,很高兴有机会为您服务。如果您有四位数促销码的话,请按1。产品技术支援请按2。大宗授权或相关资讯请按3。拨分机号码请按 4。要重听请按星号。」

看到没?没有一个选项是「需要讨论在购买微软产品前所需新加的功能请按5。」

客制化开发的世界是晦暗不明的。通常客户会告诉你要开发哪些功能,然后你问:「你确定要这么做吗?」之后,客户会说没错。之后你回去开一份漂亮的规格书,回来和客户确认:「这就是你想要的东西吗?」。客户再告诉你没错后,你就要他们在合约上白纸黑字签名,不,是以项上人头担保规格无误。最后你会很迅速地、分毫不差地把他们签字所要的产品开发出来。客户看到成品后会惊骇不已,然后你就得把这星期仅剩的时间拿来研究你的错误与疏漏保险(E&O insurance)是否足够付你的诉讼费或和解费了。或者,如果你的运气真的那么好的话,客户会脸色苍白地笑一笑,然后把你的心血收到抽屉里,再也不用你的产品或回你电话了。

开发软体时,有时候你会骗自己是在开发套装软体,实际上却是在做客制化开发的顾问软体。以下是顾问软体的开发流程:

sttropez2.jpg

  1. 为了一些微薄的薪水,你帮一家制鞋公司开发软体
  2. 这家制鞋公司现在需要一套擦鞋软体
  3. 所以你就用VB​​ 3.0 写了一套擦鞋软体。这个软体还用到了一些JavaScript、Franz Lisp、以及一个在老麦金塔上执行并用AppleScript 连上网路的的FileMaker 资料库。
  4. 由于用过的人都说好,你开始梦想开一家自己的软体公司,就算当不成Bill Gates 能作Larry Ellison 也不错。
  5. 因此你向前公司买下鞋亮亮1.0 并找创投筹些钱开了家「鞋亮亮有限责任公司」,开始卖擦鞋软体。
  6. 不幸的是这套软体没有一个beta 测试人员可以让它动起来,因为它和AppleScript 纠缠不清而且IP 位址又写死在原始码里,所以一个客户安装一套就要花上一个月的时间。
  7. 再来你在招揽客户上也碰上了麻烦。由于软体用到古董麦金塔IIci 的System 7,你只能到ebay 的电脑博物馆去搜刮。这些安装成本使产品贵到不行,投资你的创投也开始紧张起来。
  8. 创投开始把压力施加到销售人员上。
  9. 此时有个销售人员发现某个潜在客户并不需要擦鞋软体,但却有熨长裤的需求。
  10. 因为销售人员的工作就是销售东西,这位大哥就把熨长裤软体用美金十万卖给这位客户。
  11. 现在只为了这位客户,你得花上六个月开发「熨长裤模组」。
  12. 由于没有其他客户会用到这个模组,所以技术上来说,
  13. 你花了一年的时候从创投那里筹资,就只为了帮一家长裤公司开发程式并领一份微薄的薪水;回到步骤一。

就是这样,所以我强力建议要坚守在套装软体这边。原因是套装软体每增加一个客户并没有额外的成本,所以本质上可以用同样一套产品卖给不同的客户以赚取更多的利益。再者,由于可以将开发成本转嫁到更多的客户身上,价格也可以进一步调降。降价会让大家突然发现你的产品更价美物廉,而 吸引到更多客户 。从此你就过着幸福快乐的日子。

因此,如果你发现加入某项新功能只因为已答应了某个客户的话,表示你正在漂向顾问软体及客制化开发的小岛上。这也是一个不错可以作生意的世界,只是它的获利爆发性不如现成商业软体罢了。

别搞错了,我不是说你不该倾听客户的需求。我其实也认为微软该为我们这些还没加入全球经济圈去学习泰文,而且还在用其他货币签支票的人写个类似BAHTTEXT 的功能。不过事实上,如果你想说服自己分配有限资源的最好方式,是让几个最大的客户去_投票_ 决定该加入哪些功能的话,你也可以这么做。但你很快就会发现有钱的大客户要的功能和普罗大众是有出入的,所以加入处理泰铢的功能并无法真正帮助你将Excel 卖进亚利桑那州Scottsdale 的保健spa 去(译注:Scottsdale 是美国著名的观光胜地)。其实如果你真的这么干的话,结果只是让你的开发人员去帮销售人员赚进大笔的佣金罢了。

你要想当Bill Gates 的话,用这一招是办不到的。

现在我要开始讲第二个_不该_ 用来决定要加哪些功能的方法:不要只因为不得不做而做。不得不做这个标准不够高。请听我以下解释:

sttropez3.jpg

Fog Creek 第一年营运时,我在归档时发现蓝色资料夹用光了。

我现在的归档系统是这样的:蓝色资料夹放客户资料、淡绿色资料夹放员工资料、红色资料夹放收据,其他资料则放黄色资料夹。现在我要用蓝色资料夹但是却没有了。

所以我是这么想的:「搞什么!反正我总是得用到蓝色资料夹,不如现在去Staples(译注:Staples 是卖办公室用具的公司)买几个回来。」

当然,这又浪费了我一些时间。

当我事后回想起来,我发现长久以来我一直在做一些无聊的狗屎(这是个技术用语),原因是反正都得做不如现在去做。

我用这个借口去帮庭院除草、修补墙上的洞、整理MSDN 光碟(依颜色、语言及编号)等等,族繁不及备载,而当时我真正应该做的事是去写程式或卖程式,这是创业者唯二真正需要做的事。

换句话说,我发现自己假装所有必须做的事都一样重要。既然这些事早晚都得做,做的顺序也就不重要了!就是这样!

但说实在的,我只是在拖拖拉拉罢了。

那我该怎么做?嗯,一开始可以先从根除资料夹得有特定颜色的迷思做起,反正这没什么差别, 你又不用帮自己的档案加上颜色码才能用。

喔,那那些MSDN 光碟片呢?全部丢到同一个大盒子里就好了。赞!

更重要的一点是,与其说「重要性」是黑白分明的,不如说它是一种类比的东西。不同事物有不同的重要性,如果想大小通吃的话,最后只会落得一事无成。

因此,无论何时你想完成一些事情,必须得了解_当下_ 最重要是该先做哪件事。不这么做的话,事情就无法在最短的时间内完成。

我逐渐戒掉自己拖延的倾向。戒除的方法是把较不重要的事放着不做。有个保险公司的好脾气女士缠了我两个月,要拿一些用来更新我们保单的资料,可是一直到她第十五次索取,并且严厉警告我们的保险在三天内失效,我才真的把资料拿给她。而我认为这是件好事。我已经成熟到认为,保持桌面整洁实际上很可能是你无效力的表征。

这是多么使人羞愧的想法啊!(How's that for a mortifying thought!)

sttropez4.jpg

所以呢。不要去做那些业务不小心答应某个客户而衍生的功能,也不要因为「反正到最后总得完成」而先去做那些不重要或好玩的功能。

总而言之,回到FogBugz 5.0功能选择的主题。下面是我们定出初步优先顺序的方法。

首先我拿出一叠5x8的卡片,在每张卡片写上一个功能,然后召集整个团队。就我的经验来说,这个方法最多可以用于约二十人的团队,另外不同观点愈多愈好:程式师、设计师、面对客户沟通的人、业务、管理者、文件撰写人员和测试人员,甚至连客户也可以。

我要求每个人把自己想的功能列表带来开会。会议的第一阶段是非常快速地浏览每个人的功能,确保大家对每个功能本身有非常非常粗略的共同理解,另外也确定每个功能都有一张对应的卡片。

这个阶段的想法并不是要去争论各个功能的好坏,或是去进行功能的设计,甚至也不是要讨论功能,只是要对功能本身有个含糊粗略的想法。FogBugz 5.0的部份功能如下:

  • 个人化的首页
  • 无痛软体时程
  • 追踪可报帐时数
  • 复制一个问题(fork a bug)
  • (46个其他功能…)

非常含糊的东西。记住我们此刻并不要知道各个功能如何实作或牵涉什么,因为唯一的目标是要得到粗略的优先顺序,以作为开始开发的基础。这个过程会让我们得到一份约有50个大功能的列表。

第二阶段要对大家对每个功能逐一投票。只是很快速的「赞成」或「不赞成」,不要讨论,什么都不要做,只要对每个功能很快地表示赞不赞成。这个过程显示约有14个功能没什么人支持。我把只得到一或两票的功能拿掉,剩下36个可能的功能。

sttropez5.jpg

接下来我们为各个功能设定一个1到10的成本,1表示快速赶出来的功能,而10则是个庞大的怪物功能。在这个阶段必须要记住,目标并_不_ 是排定这些功能的时程,只不过是要把大中小的功能分开。我只是针对各个功能逐一询问开发者,要他们说出「小」、「中」或是「大」。即使不知道某个功能要做多久,还是能轻易看出复制一个问题是个「小」功能,而大而含糊的「个人化首页」是个大功能。我们基于这种对成本的共同估计和我自己的判断估算出各个功能的价格。

pri1.png

再一次强调,这方法的确很散乱而不精确,不过这无关紧要。你现在并不是要排时程,只不过是在理出优先顺序。唯一需要大致正确的事情就是粗略知道,在大约相同的时间能完二个中等功能或一个大功能还是十个小功能。 不需要很精确。

下一步是把这30个建议的功能和它们的「成本」列成一份菜单。把菜单发给团队里的每个人,并且给每个人50元来点菜。他们可以随意选择,不过只能花50元。如果想的话,可以只买半个功能,也可以买双倍功能。真的很喜欢「追踪可报帐时数」功能的人可以在这个项目花10元或15元;没有很喜欢的人可以只花1元,看看是否有别人投入足够的资金。

接下来把每个人花在各个功能上的钱加总起来:

pri2.png

最后我把所所花的钱除以成本:

pri3.png

然后照这个数字排序找出最受欢迎的功能:

pri4.png

完成了!一份列出所以可能想做功能的列表,而且是依照大家对最重要功能的最佳想法大致排列好。

现在你就可以开始仔细推敲了。举例来说,你可以把本来应该放在一起的功能集合起来,比如进行软体排程会让可报帐时数更容易完成,所以或许我们应该两个都做或是两个都不做。另外有时候顺着这个排好优先顺序的列表看下来,就会发现有些东西显然弄错了。有的话就修正吧!没什么东西是绝对不能动的。你在进行开发时甚至还可以改变优先顺序。

不过最令我惊讶的是,我们产出的最后列表对FogBugz 5.0来说确实是个非常好的优先次序,而且也的确反映了我们对各功能相对优先顺序的集体共识。

我们拿着这份优先顺序列表,大致上依序逐项进行到三月为止。我们计画届时不再增加新功能,然后开始整合与测试阶段。我们将会在各个(不是显而易见的)功能正要实作之前,替该功能撰写规格。

(唠叨的BDUF/Agile选美竞赛记分员现在大概完全迷糊了。「那表示BDUF拿到一票?还是投给Agile呢?他究竟_要_ 什么呢? _他不能就这么一次选好一边站吗?!_ 」)

整个规划过程用了三个小时。

如果你运气够好,有本事能比我们更频繁地发行软体新版(参考Picking a Ship Date),还是得依序遂项进行列表的功能,不过你可以更频繁地停下来做发行动作。频繁地发行的好处,是可以依据客户实际的回馈经常地重新安排功能列表的优先顺序,不过并不是每个产品都有这种福气。

Mike Conte在规划Excel 5时教导我这个系统,当时虽然在会议室里有二三十个人,也只用了两三个个小时就完成了。而酷的是,我们没时间做的功能中约有一半都是真正愚蠢的功能,Excel也因为没有这些功能而变得更好。

这方法并不完美,不过我会告诉你,这比到Staple买蓝色资料夹要好多了。

sttropez6.jpg

这些网页的内容为表达个人意见。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.