HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

敏捷合同

  • 2011-03-28
  • 本文字数:5559 字

    阅读完需:约 18 分钟

对于敏捷方法,人们常常提出这样的问题:“如果基于敏捷工作方式,应该如何签署合同?”

传统的瀑布式模型,与公司采购的方式完全契合:先整理出需求,一家供应商提供一个报价(基于他们对需求的阐释和对成本的估计),大家都签署一个法律上的捆绑协议。

一旦合同签署之后,接下来就是一段开发时间段,大家争论到底哪些功能在范围之内,哪些在范围之外,以及对于合同来说哪些构成变更请求。但是当工作最终完成后,激烈的讨论结束后,客户最终正式验收软件并且为之付款。客户这时得到繁重无比的软件,供应商得到自己的合同款项,所有人皆大欢喜,也许不是所有人吧。

如果供应商和客户都能从敏捷工作方法中得到最大的收益,就要重新思考传统方式工作合同的合理性。这是一个不断演化的领域,公司们在不断寻找适合敏捷合同的新模型。结果就是:扰乱了现状的创新思考着们得到更多机会。

本文检查了4 种不同的模型,供供应商和客户使用,以建立敏捷相关的合同。将来可能出现新的模型,但是现在大概也就这4 种。

揭穿固定合同

固定价格、固定时间、固定范围的合同继续成为IT 行业合同的标准方式。这种类型的合同基于如下想法:在项目一开始可以定义出工作范围;供应商可以从中判断需要什么——或者说多少人要工作多久——并据此计算出一个价格。一旦完成,合同就等于是用血来签署,执行起来也是如此。

这种模型背后的理念是:将软件看做有实体的东西予以提供,也就是说看成购买一定量的通用软件。然而,购买定制软件可不像从裁缝那里买一套西服,更像是购买财务建议。你所购买的,更像是服务,而不是商品或是货物。

我碰到过很多人和公司都希望以上述方式完成工作招标,然而我还没碰到谁能够在成功完成项目的同时,不放弃对于至少一个“固定”项目参数(范围、成本或日程)的控制。IT 行业阐述类似合同已经很多年了,而未能成功交付的情况也出现了这么多年。

这些失败发生的原因并不难找:项目范围变更、新的需求出现、已有需求忽略,错误解读(同样词汇对不同人的含义不同)引发的问题等等。要说明合同范围变更的各种情况,可以写出一整篇文章。不论原因如何,一旦“固定”合同种需求变化,其他所有东西都要跟着变化。先是时间和人员可能需要变动,接下来价格也必须改变。

退后一步好好想想,继续使用这种类型的合同实际上很令人感动。这么做充分展现了信仰和积极思考的力量,以及对于下一次事情将会有所不同的无望之希望。

也许这些合同存在的原因在于:它们能够在法庭上起到辩护作用。一边说合同没有完全兑现,另一半声称早已彻底完成,让法官去评判吧。但是考虑到固定价格合同模型的本质问题,我们可以说这种合同实际上增加了上法庭的风险。最后,应该指出:签订这样一个合同,需要所有相关参与方暂时认可所有需求已知而且不变,估算很准确,质量也可以接受。想想类似的合同过去的历史,这真是让人有点讶异呢。

不适用所有人

在进一步展示更多内容之前,我想指出:不是所有开发软件或是尝试敏捷的公司都会收到类似问题影响。创建并销售软件产品的公司,有时被称为ISV——独立软件开发商,比如Adobe 或是Intuit,他们只会受到一些边缘影响。他们绝大部分的客户只购买完成多产品,对产品功能没有多少直接决策权。

有些企业的IT 组织也开发软件,但是也能避开这个合同问题。他们直接购买已经完成的软件(比如SQL Server),或者开发供公司自己使用的定制软件。很多企业的IT 部门会把工作外包,然后需要创建合同,并就其达成一致。在这些情况下,IT 部门是第三方软件供应商的客户。

承接企业IT 部门转包合同的服务公司,有时被称为外部服务提供商(External Service Provider,简称ESP),它们最需要敏捷工作合同。

敏捷能够轻而易举地融入到ISV 的工作之中。实际上,很多敏捷实践都在这个领域内兴起。同样地,只要企业的政策和流程允许,敏捷也能够符合企业IT 领域的要求。

但是,ESP 与其客户们接受敏捷就有点困难,因为两者之间需要有一个法律合同。不过这个问题之中也孕育着机会。

因为客户(企业的IT 部门和政府部门)知道IT 项目会遇到问题,因此合同条款就已经变得更加严苛,财务方面的惩罚也更加高企。只有最大型的ESP 公司们才能考虑投标大型合同。小公司承担不起惩罚条款,因此无法与有钱负得起大额罚款的大企业竞争。

改变合同结构,也就可能改变大企业消费者购买定制软件的方式,并且提供公认的“双赢”结果。相对于市场领导者,能够打破固定价格、固定范围和固定时间合同的供应商就能获得更多竞争优势。客户也能够从提供更高产出的创新方法中获得收益。

选择1:隐藏起来(Hide it)

在交付合同中使用敏捷,将其隐藏起来是最简单、最没有破坏性的方式。不要告诉客户你的做法与通常做法的区别。以正常方法估算、规划工作,签署一个完全正常的合同,然后用敏捷技术来改进交付结果。

测试驱动开发、持续集成、定期重构和重新规划,这些敏捷实践都能帮你更好交付。想办法尽可能忽略最初的计划,因为它是“错误的”。如果可能,把它抛在一边。

问题在于,某些客户希望看到“按计划的进度”。你可以做一个假的出来。我听说某些团队会定期更新计划,就好像他们真得遵循了这个计划一样。不过这种方式不足以取信于人,如果客户相信我们虚构的进度,我们又怎么能指望建立与他们之间的信任呢?毫无疑问,我们不想对客户撒谎,我们希望建立信任,如果我们假装遵循某个计划,他们又怎么能相信我们?

当然,你可以说:相对于真正的交付,客户希望按照计划看到工作进展状况,这样的客户也没有表现出信任。可不管怎么说,我们作为承包商,让他们信任我们,这是我们的职责。

因此,要想让“隐藏起来”这个方法起效,必须要有类似于“你不问,我不说“这样的策略。如果你的客户愿意服从该“策略”,并且愿意根据真正的工作交付来衡量进度,而不是去看原来的计划,隐藏敏捷的方式也许可以生效。但是如果你的客户这么通情理,也许你就没有必要在一开始把敏捷藏起来了。

选择2:不起作用不收钱(No cure, No pay)

采取“不起作用不收钱”的方式需要一定的自信。这个方法很简单:如果客户不喜欢你交付的东西,那就不收费。不过,如果他们为你开发出来的东西付费,他们也不能保留下来。

虽然这个方法看起来很恐怖,但是却能增加收费的机会。使用这种方法,客户能够降低承包商带来的风险。这种重新平衡风险的方法收费也要更高。

这个方法使用起来,也许能让人们在智力层面(也许还有道德层面)站到比较高的位置,但是也引入了新的风险。因为客户的风险降低了,他们让项目成功的动力也就降低了。当决策难以制定时,就需要做出妥协;时间很宝贵,或是需要客户主动参与时,客户就没有多少动力去做必须要做的事情了。

客户没有切身利益牵涉其中,任何失败都将是承包方的失败,客户什么也不会失去。

如果供应商只选择与能够信守承诺的客户做生意,风险就可以缓解。前提是承包方能够拒绝他们认为有风险的工作,而且可以正确评估客户的承诺达成水平。

到今天为止,我只听说个人和小型承包商能够提供这种模式。有钱的公司要么很注意风险,要么觉得没有必要提供这种选择。

选择3:滚动合同(Rolling contracts)

如果我们希望保持客户的参与度,那么就需要一种机制,让他们参与进来,并不断让他们承诺相关的工作。滚动合同在此时就可以起到作用。客户与供应商之间不会去做“孤注一掷(all-or-nothing)”的工作,而是达成一个框架协议,完成一系列只需短期开发的小项目,根据个人喜好不同,可以把它们称作“情节(episode)”或迭代。

合同也许有某些整体目标,但是不包括所谓的“购物列表”,不需要列出特定的功能特性。发现需求是工作的一部分。我知道一个ESP 把所有需求文档都放在法律合同之外。每个迭代中都会交付一些东西,同样重要的是,对于需求的理解会不断增加。

伴随着每次交付,客户会付款给供应商,同时面临一个选择:继续下一个迭代,还是就此停止。重点在于供应商首先交付了有价值的工作,而且让人知道还有更多可以增加价值的工作可作。如果客户认为产生的价值还不如耗费的成本多,他们就可以在已完成工作的基础上就此停手。与之类似,如果供应商发现客户合作程度不苟,供应商也可以就此罢手。

某种程度上,这与传统的实践有类似之处,都是要在每个独特的阶段后停下来付款,双方重新承诺,这些阶段包括:需求收集、设计、开发、测试和部署。区别在于:传统模式中,在结束前离开,不会交付任何收益;在这种模式中,总是可以交付一些东西。

从供应商的角度来看:使用已完成功能的纵向切片来展示价值,这能起到明确的激励作用。这是一个常见的敏捷实践。

因为客户能够看到正在完成的工作、正在产生的价值和逐步显现出来的解决方案,他们应该对工作的继续推进充满热情;他们也知道:如果没能达成自己的承诺,他们可以选择离开;这也让他们有信心继续。

这种方式将法律框架从提供东西转移到了提供服务上。客户签订的是服务合同,而且可以思考他们购买的服务的数量。是4 个人月,还是200 个工作点数?

虽然这种方式听起来很激进,很多IT 部门和供应商已经在相关领域使用服务合同了。举个例子,IT 支持部门和软件维护合同一般都是采取服务合同的形式编写。

选择4:不劳而获,变更免费(Money for Nothing, Change for Free)

Scrum 的创始人 Jeff Sutherland 对“不劳而获,变更免费”有详细记述。这种合同没有采取迷你项目框架的形式,而是维护一个大合同,也就是说要完成一些概括的前期需求分析。但是,合同中加入了两个额外条款。

合同中第一个变化是:要确保总是在开发优先级最高的工作,而且允许加入新工作。客户同意定期与供应商碰面,调整剩余工作的优先级。这时,他们可以向 Backlog 中加入更多工作,同时要明白:这么做的话,有些工作就得丢掉,再也不会完成了。这有助于增加工作激励,对供应商有帮助,还能保证客户的参与。

与滚动合同类似,客户定期付款,可以按月支付,付款的增量对应交付出来的可工作的软件。这么做保证客户的参与,同时为将来的再次承诺奠定基础,并给后续的改变铺平道路。

“不劳而获”条款让客户在任何阶段都可以取消剩余的工作,并保留目前已经完成的工作。在这种情况下,客户要为未完成的工作支付 20% 款项。

假如有一个 1200 万美元、为期 12 个月的合同已经完成了一半,这时客户希望取消剩余的工作,除了必须要付的 600 万美元之外,他们还要多付出 120 万美元。这样相对于整个合同金额,客户还能省下 480 万美元。

初看上去,供应商可能不会喜欢这种方式,因为这样会让他们少收原来可能赚到的 480 万美元。然而,他们收到的 120 万美元却可算是无偿得到的,这应该足以缓解他们的顾虑。假定他们能够马上把人员分配到其他工作上,那么这 120 万美元就可以算是纯利润了。

因此,这种机制和激励措施能够让客户提高参与度,同时更早完成工作,节省资金。同样的是,供应商也有激励能够接受变化,把工作做好,得到免费的报酬。

目前,这种类型的合同在业界出现得还不多。

组合

基于上述四种选择,可以看到:以不同方式组合能够得到更多变更方案。比如:“变更免费”可以跟其他任何 3 种方式组合在一起,产生更有效的解决方案。类似,“不起作用不收钱”也可以应用到选择 3“滚动合同”的单次交付中。

从财务角度看,选择 3 和选择 4 大概没有很大区别。也许主要的区别在于:选择 3 打破了传统的模式,因为它假定人们在项目刚开始时知之甚少,而且让客户以积极方式反复交付。

与之相反,选择 4 契合现有模式,认可前期需求分析的必要性。“变更免费”条款提供的框架类似于滚动合同:初始需求作为估算工具,辅助判断所需时间和预算。一旦工作开始,前期需求就可以抛开了。“不劳而获”条款与滚动合同有共通之处:允许工作在任何时点停止,不过是以比较昂贵的方式。

无论敏捷团队采取哪种形式的合同,有两个必要因素需要考虑。首先,合同本身应该体现敏捷的迭代本质:完成一点,展示一点,再多完成一点。这在敏捷中反复出现:时间盒迭代、回顾、测试驱动开发,等等等等。这是现实版的 PDCA 循环。

其次,合同应该可以激励客户及其代表参与到项目的整个过程中。反复研究发现:客户的持续参与是确保 IT 项目成功的关键因素之一。不管你是否采用敏捷,你都需要客户持续参与。

最后,还有重要的一点……

没有接触过传统 IT 行业工作方式的客户可能觉得这些选择非常合理。过去曾与 IT 供应商一起工作的人员会觉得这些合同形式有些出人意料。我们的行业给客户造成伤害,就是因为我们总在宣扬:“只要你能写下来,我就能以预先确定的成本和时间完成。”

不可避免的是,有些客户会继续固守传统的合同模式。有些供应商会发现:可以在这样的客户身上赚到很多钱;而另外一些供应商则会发现这么做得不偿失。不管是哪种结果,人们都不会喜欢。

我有个客户,现在总是给他的客户两种选择:传统的“固定”合同,还有滚动式的敏捷合同。如果客户认为一切都可以在工作开始前固定下来,他们就可以使用传统方式。如果他们不确定,就可以试试看迭代式的、滚动敏捷合同。

随着时间推移,客户会更深入理解这些 IT 合同的新形式,还有可能采取的多种选择,大家都可以从中受益。现在,对于能够尽快在早期转向新合同模式的人,他们是有机会的。是,是有一些风险,但是同样也会有奖励。

关于作者

Alan Kelly 几乎从事过软件开发领域中的所有工作:系统管理员、测试人员、开发人员、架构师、产品经理和开发经理。他住在伦敦,擅长以培训、咨询和指导等形式,帮助软件公司采纳敏捷和精益实践,并加深对其理解。

除了给杂志撰写大量文章、做会议演讲之外,他还是《Changing Software Development: Learning to become Agile》一书的作者。

查看英文原文: Agile Contracts


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2011-03-28 00:005227
用户头像

发布了 479 篇内容, 共 158.1 次阅读, 收获喜欢 50 次。

关注

评论

发布
暂无评论
发现更多内容

第二次作业

朱月俊

做一个有原则的码农可好?

Dawn

极客大学架构师训练营

这也太拧巴了吧?结局意想不到

非著名程序员

程序员 程序人生 提升认知

第二周作业

武鹏

618你的系统顶住了么?系统发生重大灾难难道只能“删库跑路”?

punkboy

哪些框架是遵循依赖倒置原则的?

朱月俊

用接口隔离原则优化 Cache 类的设计

朱月俊

架构师训练营第二章课后作业

叮叮董董

品软件架构原则模式之美

老姜

产品视角看推荐算法

峰池

人工智能 算法 产品经理 推荐算法

架构师训练营第二周

小树林

千万不能让程序员给娃娃取名字

码农神说

程序员

第二周学习总结

武鹏

架构师训练营 - 第二周架构师实现自己架构的主要手段

zcj

极客大学架构师训练营

小师妹学JVM之:GC的垃圾回收算法

程序那些事

JVM 小师妹 JIT GC 签约计划第二季

一个包子铺看懂 I/O 模型演变

小眼睛聊技术

Java 程序员 架构 后端 nio

架构师训练营-第二章-依赖倒置原则&接口隔离原则

而立

极客大学架构师训练营

架构师训练营第2周学习总结

Season

极客大学架构师训练营

什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

朱月俊

第二次作业总结

朱月俊

依赖倒置原则

极客李

“麻烦”的处理流程

zhoo299

随笔杂谈

老大吩咐的可重入分布式锁,终于完美的实现了!!!

楼下小黑哥

Java redis 分布式锁

依赖倒置和案例

王锟

给行动找个理由

Neco.W

行动派 决策

架构师训练营二期作业

老姜

ARTS打卡Week 04

teoking

ios LeetCode ARTS 打卡计划

架构师训练营第二章总结

叮叮董董

基本的面向对象原则(Basic OO principles)

旭东(Frank)

编程思维 极客大学架构师训练营

为什么坐车会晕车呢

石云升

生活,随想 日常思考 晕车

数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……

墨天轮

数据库

敏捷合同_研发效能_Allan Kelly_InfoQ精选文章