在敏捷环境下为大型项目提供估算

54

我们公司刚收到第一个大型开发项目的询价,我想使用敏捷开发流程。客户对应用程序有一个愿景,但坦承自己缺乏很少的需求,并认识到我们将按小时计费。因此,我已几乎让他接受了敏捷方法。

问题在于他希望有一个固定预算。我读过一些文章,基本上都不建议提供估算,因为客户会根据这个数字制定预算。即使需求发生变化,他们心中和账簿中的数字也不会改变。

我读到有许多方法可以在合同中考虑价格,但几乎所有方法(除了一个)都包含一个前期固定数字。这似乎违背了敏捷开发的全部原则。

因此,我的问题是,如果您是一个敏捷团队,您如何避免敏捷开发的这种进退两难情况?


很好的问题。我很想听听更有敏捷咨询经验的人怎么说。我猜除了采用“时间和材料”模式外,没有其他选择,但显然你的客户希望不同。 - Bill Karwin
不错的问题。我一直在问自己同样的问题。如果没有事先进行详细分析,很难给出一个现实的估计,因此向客户提供价格。通常有几家公司竞标给定的项目,客户在考虑最低价格等其他因素时会选择。 - AlejandroR
你是否确保你和客户对时间和预算之间的关系有共识呢?我们都知道,“时间就是金钱”,因为项目中每个人都需要得到报酬。因此,将交付时间和预算分开考虑是不合适的。客户需要意识到,如果你比(预算)/(小时费率)花费更多时间,那么这意味着是他们在做工作,而你则在等待他们的某些东西。否则,如果预算固定,那么额外的时间是如何得到支付的呢? - Tom W
12个回答

41

这是一个基本的问题。

客户何时认为他们完成了?

如果他们认为在六月份完成,那么您需要建立一个敏捷团队。这是4-6人的团队,工作时间为6个月。这就是预算。基本上,您要为他们进行乘法计算。团队*费率*6个月。

如果他们认为在六月份大部分完成,但之后还有更多的工作要做,那么您可能需要9个月的工作时间。同样,您只需进行一次乘法运算,他们也可以自己计算出来。团队*费率*9个月。

如果他们认为您将成为他们可预见未来的开发团队,请给他们一个能够让项目延续到年底的价格。团队*费率*12个月。

由于每个发布都是重新设置优先级的机会,因此您应该根据每个发布中将完成的事项,将每个发布的价格定为单独的工作成果。由于这是他们的优先方案,他们控制您构建的内容,他们控制预算,逐步实施。

通常,您的客户真的想知道特定功能集的成本。但是他们问总预算(这很愚蠢)。在第一个发布中花费大量时间,展示他们能得到什么以及第一个发布将花费多少。

最终,他们会看到一个基本的真理。

他们正在按重要性从高到低购买功能。如果他们正确地设置优先级,他们可以随时停止花钱,并拥有有用的东西。

"完成"是一个相对的术语。有些项目已经“完成”,因为没有更多的资金了。其他项目已完成,因为没有更多的时间了。很少有项目(至少在软件开发中)是因为我们没有事可做而做完的。


牛逼的想法,但是我的情况不允许我这样简单地进行乘法运算。不过,如果我们将冲刺分成时间段,然后估计冲刺数量,就可以通过这种方式给出一个估计。 - Chance
此外,我从未想过优先级的重要性。我认为应该/可以先进行至少一个低优先级的冲刺,以建立信任并提供对流程的一般理解。总的来说,这些是很好的建议。 - Chance
@Chance,你可以假装进行更详细的估算。但是,除非你对特定实现细节有合同承诺,否则你所做的一切只是预算可能需要的时间。这让经理们感到高兴,因为他们认为你正在思考。即使你只是猜测。 - S.Lott

13

针对这种情况,我们提供了第一块工作的估算,并让客户根据需要购买更多的迭代周期来完成所需的工作。

随着系统的开发和客户反馈的融入迭代交付成果中,您会更好地了解涉及的工作量和相关成本。

编辑:太棒了!从你已经成功地说服他们采用敏捷方法的事实来看,机会是,你可以向他们推荐采用敏捷视角来实现要求的功能。也许你可以听一下这个“Scrum介绍”播客节目。你可以向他们推销这样一个观点:他们现在可能不需要所有他们认为需要的高级功能。

希望这能有所帮助。

祝好,

罗布


没错 - 这就是我试图向客户推销的方法,但我感觉他们正在试图预算应用程序的总成本。 - Chance

11

看,这里有一个核心事实。您将被要求估计成本,为特定的交付日期签订合同,并承诺提供一整套的交付功能。

你不能做到所有三件事。

不是“你不应该”或“最好不要”; 你(在所有实际情况下)是做不到的。我的意思是说成功同时完成所有三个目标的概率极小。

最好的答案是承诺一个成本和进度,采用快速迭代和定期反馈的迭代过程,然后编写协议,使得在固定的成本和进度下完成的内容就是将要交付的内容。也就是说,您会不断提供新功能(和修改),直到时间和资金用尽。

事实上,即使您确实签署了所有三项,您能够达成的最好结果也只有其中的两项。还不如坦诚地说出来。


1
这是一个非常有趣的方法,虽然我很想实施它,但我感觉需要客户非常信任才行。因此,在我考虑使用它之前,可能需要完成几个更大的项目。 - Chance
1
机会,问题在于,这不是一个有趣的方法,而是一种自然法则。无论你告诉你的客户什么,你都将面临现实。 - Charlie Martin
1
这是最真实的日常工作观点。我完全同意这一点,相信相反的观点,要么你在欺骗自己,要么你在欺骗客户。此外,如果要求您签署承诺履行这三个方面的协议,您应该非常小心,因为很可能会失败。 - MasterKitano

11

以下是我知道的一个年代久远的政府承包商的说法:“正如妓女所说,首先你得把他们领到楼上。”

这并没有回答你的问题,但值得记住。如果他们不提前看到数字就不愿意上楼(他们不会的),那么你必须给他们一个数字。

任何赞助软件项目的人都需要知道他们将在投资方面获得什么样的回报,以便评估是否值得进行投资。如果一个项目成本为100万美元,需要12个月的时间,则可能值得做。而如果它的成本为200万美元,需要24个月的时间,则可能不值得做。

真正的问题是:您能否在时间范围和预算内完成该项目,从而使客户能够实现适当的投资回报?如果您对这个问题的回答不是“是”,那么他们不应该聘请您来做这个项目。否则,他们只是在花钱和冒险。

如果您当前对这个问题的答案是“我们还不知道”,那么他们不应该聘请您来做这个项目。但这并不意味着他们不应该聘请您来找出该项目是否值得做。这个过程可以用“初步范围定义”这个好的咨询公司术语来形容。

敏捷开发是管理三个维度曲线:花费、时间和功能集。如果预算和进度已经确定,那么功能集必须是可变的。在这些限制下,您无法知道最终的功能集将是什么样子。但是,您可以知道在这些限制内,您将能够产生的功能集是否在您的客户可接受的范围内。

您可以知道这一点,并找出答案。找到这个答案是您的公司可以做而您的客户不能做到的。这是您可以为他们提供并应该收费的服务。避免诱惑去免费完成并称其为销售成本。项目范围定义与软件开发一样重要。您这样做不是为了完成销售;而是为了帮助您的客户做出他们还没有足够信息做出的商业决策。

但首先你得把他们领到楼上。


1
非常出色的回答,我认为您在各个方面都是完全正确的。第一次阅读时,我以为这是一个“如果”我们能够实际编写代码,但更多的是“如果我们能够在X时间内以Y价格生产代码”,这使得更有意义。 - Chance
你说的关于让他们上楼的做法是正确的——一旦他们“上楼了”,或者说进入了项目并且客户意识到数字出现错误是由于他们的规格说明,他们可以选择终止合同。不过有一个问题,如果他们选择不进行销售,你是否仍需开具发票? - Chance
敏捷开发的目的是避免任何人心中都会有“你还开发票吗?”这样的问题。如果项目成功,客户将获得回报;风险也应该由他来承担。你的工作是减轻你能够减轻的风险,并告知他你无法做到的事情。 - Robert Rossney

6
这些答案非常棒。我没有太多经验可以分享,但我想到了一个类比:去年我和我的妻子重新装修了我们的厨房。承包商建议按时间和材料计费,而不是给出估算,因为我们不知道在水暖、地板损坏等方面会发现什么问题。我们同意了,因为我在家工作,可以随时回答问题。承包商和我关系很好,所以当有事情发生时,他可以自由敲我的办公室门,我们会讨论一下。决策迅速做出,工作也按照我想要的方式完成。这似乎类似于敏捷开发中频繁客户审查的重点。
相比之下,我妻子的表兄也正在装修他的房子。他是一名急诊医生,在装修期间不能在现场。所以他描述说,承包商经常在没有咨询他的情况下做出重大决策(“什么?我不想要那个画面窗口被堵住!拆掉墙壁,重新框架窗户!”)。这显然非常昂贵,并且打乱了时间表。绝对不是敏捷开发。
所以,说服客户采用时间和材料模式的一种方法可能是向他们保证您会经常进行进展报告,以获得他们的反馈。我相信这已经成为大多数敏捷方法的核心推荐。当然,首先需要客户将信任交给顾问。
作为一个独立的资源,我搜索并找到了一本关于这个主题的书:"敏捷估算与规划",作者是Mike Cohn。请查阅该页面上来自一组令人印象深刻的敏捷专家的赞誉引语。

3
首先,我想说你已经成功向他推销了敏捷方法和按小时计价,这非常不容易。
关于你的困境,我认为你应该向客户提供一个大致的价格估算以及包括的功能/范围。在开发过程中,如果你发现有重要的事情出现会改变范围/成本,你可以告诉客户“停下来-这很好,但请理解它改变了我们之前讨论的原始范围。”
此时,客户有权同意,知道他将支付比最初预计的更多,或者暂停新的开发。许多敏捷项目都是在许多小阶段内建立的-其中你可以给出相当准确的价格/时间估算。在任何新的小阶段开始之前,重要的是你和客户达成一致,了解接下来会发生什么以及将花费多少时间/费用。

问题在于,尽管客户可能知道他想要什么,但如何实现并不清楚。缺乏一个坚实的计划使我无法提前给出准确的报价 - 但他仍然希望得到一个。 - Chance
1
你必须要给他一些东西。你应该有一个好的想法,至少知道如何开始,因此给他一个粗略的估计,包含合理的范围/特性说明,作为第一阶段的成果。永远只估算短期内的成本,这样至少可以让他对成本有一定的了解。 - Eran Galperin
抱歉,这并不是真正的敏捷开发。它是固定范围,变更成本最小化的开发方式。 - Mark Levison

2

像往常一样,质量、功能和时间(=资源)是您的主要参数。我们不再折腾质量,所以只剩下功能和资源。相当多的时候,您可以通过说服某个特定数量的资源至少达到某个功能集来逃避问题。只要您能找到一个提供合理功能集的资源数量,我相信这对于相当多的客户来说已经足够了。好处在于他们可以控制进展,并且总有撤退的选择。


如果我理解正确的话,我认为这与我的想法类似。我正在试图说服他允许我在每个迭代中提供一个估计值,因为我对所需完成的工作有一个牢固的掌握,但是像很多客户一样,他希望有一个总体的估计值。 - Chance
你可以问他要“6个迭代。我们可以在4个迭代中完成所有的P1工作。” - krosenvold

2
我做这件事的方法是使用我的当前速度,并根据复杂性(故事数量)的粗略估计来估算范围。您可以在开始规划应用程序时更新此内容,以便范围估计逐渐变得更好。
例如,给出从6个月到2年的估计时间(如果您确信需要的时间不到2年)。当您将其分解为特征并计划这些特征时,您会得出越来越好的估计结果,因此在6个月后,您可以可靠地说(除非有其他变化),我们将在另外2-3个月内完成(总共8-9个月)。最终,您会达到这样的程度:我们将在下一个迭代之后完成(2周至1个月)。
您需要将此与让客户知道添加功能将增加完成时间相结合,然后让他们决定如何进行--要么放弃该功能,要么增加时间。对于任何给定的项目,范围和时间实际上是您可以有效更改的唯一变量。质量和资源基本上是固定的。实际上,您可以添加资源,但通常您会看到时间增加和质量降低,因此只有在您的时间跨度较长时才起作用。

这似乎是一个不错的技巧,但他对时间相当灵活,他关心的是预算。 - Chance

1

这是一个非常棘手的问题。请看罗伯特·格拉斯在他的书 "软件工程的事实与谬误" 中对此主题的看法。(请注意,亚马逊有新书可用,价格低于二手书![截至2009-01-05 12:20 -08:00];也可以在Google图书中找到。


1
一个方法是给客户一个你认为相对接近的大概估计,同时给出一个百分比。这个百分比将是由于需求变化而造成的预算增加或减少的额度。
例如:$10,000美元的大概估计,但由于要求模糊且项目容易改变方向,因此有+/- 30%的价格调整选项。
这样客户就可以大致了解预算,而你在收费上也有一些灵活性。

我已经阅读过,即使采用这种方法,你仍然会因为客户将低/高转换为报价而陷入死锁状态。但在最坏的情况下,这可能是理想的。 - Chance
你说得非常正确,只是想提出一些想法。感谢您的反馈。 - Berek Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接