写点什么

敏捷合同

  • 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:005191
用户头像

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

关注

评论

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

Fork原项目新增分支的同步和推送

Skysper

git

Java字符串池、常量池、intern的爱恨纠葛

叫我阿柒啊

Java 常量池 intern 字符串常量池

【Flutter 专题】107 图解自定义 ACEPageMenu 滑动菜单 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

你真的很忙么?

escray

学习 极客时间 朱赟的技术管理课 6月日更

5000字 | 详解 Java 中的 21 种锁

悟空聊架构

Java 读写锁 锁升级 6月日更

平阴玫瑰×浪潮云洲:见证一朵玫瑰的绽放

云计算

Pandas之:深入理解Pandas的数据结构

程序那些事

Python 数据分析 pandas 程序那些事

一文说尽 Linux 系统的 swap 交换空间

看山

Linux 6月日更

读深入ES6记[四]

蛋先生DX

ES6 6月日更

技术干货 | 如何实现对动态PPT的云端录制?

ZEGO即构

音视频 WebRTC RTC 即构 动态PPT录制

常见词向量模型

Qien Z.

6月日更 词向量 SkipGram 矩阵分解 Glove

应对全场景AI框架部署挑战,MindSpore“四招”让你躺平

华为云开发者联盟

深度学习 AI mindspore 算子 ai框架

Java 并发编程—— Executors 分析应用

Antway

6月日更

技术实践丨体验量子神经网络在自然语言处理中的应用

华为云开发者联盟

自然语言处理 量子 量子神经网络 量子模拟

Python——列表元素的增删改

在即

6月日更

Kubernetes手记(7)- 控制器配置清单

雪雷

k8s 6月日更

缓存与数据库的双写一致性

leonsh

MySQL redis 缓存

联想积极参与CSMM标准制定和推广,推进中国软件产业高质量发展

科技热闻

如何解决回归任务数据不均衡的问题?

华为云开发者联盟

深度学习 模型 标签 数据不平衡 DIR

WorkPlus Lite 企业级移动平台

WorkPlus

关于 JavaScript 是否加分号的问题

KooFE

6月日更

来自 Apache APISIX committer 的经验分享 —— 编程之夏专访

API7.ai 技术团队

后端 技术人 API 网关

【Vue2.x 源码学习】第十篇 - 数组数据变化的观测情况

Brave

源码 vue2 6月日更

react源码解析11.生命周期调用顺序

全栈潇晨

react.js

产品策略闭环是个什么环?

万事ONES

项目管理 研发管理 ONES 产品策略

【21-3】PowerShell 环境

耳东@Erdong

PowerShell Windows Server 6月日更

只记得文件类型如何用EasyRecovery实现恢复?

淋雨

数据恢复 EasyRecovery 文件恢复 照片恢复

项目管理100问 | 研发团队如何实现无缝协作

万事ONES

项目管理 ONES Project 研发团队

GrowingIO 增长平台产研项目管理实践

GrowingIO技术专栏

项目管理 程序员 Jira growingio

ONES CTO 冯斌 | 大型团队敏捷项目管理实践与思考

万事ONES

项目管理 研发管理 团队协作 ONES 研发工具

跨域背后的故事(一)-----同源策略

卢卡多多

浏览器 同源策略 6月日更

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