(一)

你叫Robert。日期是2001年3月。在假期中你和家人所度过的轻松时光使你恢复了精神,准备投入工作。你和你的开发团队坐在会议室中。部门的管理者召集了这次会议。

“我们有一些关于一个新项目的想法”,部门管理者(称为Russ)说,他是一个容易激动的英国人,他的精力比聚变反应堆还要旺盛。他雄心勃勃并具有紧迫感,但是他了解团队的价值所在

Russ描述了公司了解的新市场机遇的基本情况,并把你介绍给Jay,负责定义用来抓住这个机遇的产品的市场管理者。

和你打过招呼后,Jay说,“我们希望尽快开始定义我们首次要提供的产品,你和你的团队什么时候能和我谈谈呢?”

你回答道,“本周五我们会完成我们项目的当前一次迭代。在这之间,我们可以抽出几个小时和你谈谈。迭代完成后,我们会从团队中抽出一些人专门投入到你的项目。我们会立即开始招聘一些人接替他们并为你的团队招聘新人”

“好极了”Russ说,“但是我希望你明白,7月份我们要在产品展览会上拿出一些东西展示,这很重要,如果我们到时不能拿出一些有意义的东西,我们就会错失机会。”

“我明白”你回答道。“虽然我还不知道你打算做的是什么,但是到7月时肯定可以拿出一些东西来。我还不能马上告诉你那个东西是什么。无论如何,你和Jay将完全控制着开发人员的开发方向,所以你可以放心,到7月要去展示时,你会拿到可以完成的最重要的东西。”

Russ满意地点点头。他知道这种工作方式。你的团队总是能让他了解并把握开发情况。对于你的团队会首先着手最重要的工作并产生出高质量的产品这一点,他极有信心。

(二)

“那么 Robert, ”Jay在第一次会面时说,“你的团队被分开是怎么看的?”

我们会还念在一起工作的日子,“你回答道”,“但是,我们中一些人对于最近的一个项目相当厌倦了,并且期望有一些变化,你那边在做些什么呢?”

Jay微笑着说,“你知道我们的客户当前遇到了极大的麻烦......” 接着他用大约半个小时的时间描述了问题以及可能的解决方案。

“好,稍等一会儿”你说到,“我需要把这搞清楚。”因此,你和Jay讨论了系统可能的工作方式。Jay的一些想法并没有完全形成。你提出了一些可能的方案。他对其中一些表示赞同。你们继续讨论。

在讨论期间,对于所提出的每个新主题Jay都编写了相应的用户素材卡,每张卡片都描述考虑系统必须要做的事情。卡片堆积在桌子上,展开在你们前面,当你们讨论这些素材时,你和Jay都会指着它们,把他们拿起来,并在上面作一些记录。这些卡片是有效的助记工具,你们使用它们来描述一些刚刚形成的复杂想法。

在会谈结束时,你说,“好,我对你想要什么已经有了一个大体的认识。我和我的团队会对他进行讨论。我想我们会对各种不同的数据库结构以及表示格式进行一些试验。下次我们会面时,就会有一个团队,并且我们会开始确定系统最重要的特征”

一周后,你新建的团队和Jay会面。他们把现有的用户素材卡在桌子上铺开并开始研究系统的某些细节。

会议气氛非常有活跃。Jay把素材按照它们的重要性排好。对于每一个素材都进行了大量的讨论。开发人员关心的是要保持素材足够的小,这样便于估算和测试。所以他们不断要求Jay把一个素材分成几个小的一些素材。Jay关心的是每个素材都要有一个清晰地商业价值和优先级,倘若他对素材进行了分割,他就会保证这一点。

素材堆积在桌子上。Jay在编写它们,不过,在需要时开发人员在上面写注释。没有人试图去捕获所谈论的每一件事情。素材卡不必捕获所有的东西;它们不过在会谈中起到提示性作用而已。

当开发人员对素材比较满意时,它们就开始编写对它们的估算,这些估算很粗糙并且只是一种预算,但是它们却使Jay对素材的代价有了一个概念。

会谈结束时,明显还有许多素材可以讨论。同样,也清楚地知道已经明确了最重要的素材,实现这些素材需要几个月。Jay结束了会议,他带走了素材卡并承诺明天上午会拿出一份关于第一次发布的方案。

(三)

第二天早上,你又召集了会议,Jay挑选了5个素材卡,把他们摆放在桌子上。

“根据你们的估算,这些素材卡代表着大约50个点的工作量。上一个项目的最后一次迭代在3周内完成了50个点。如果我们可以在3周内完成这5个素材,我们就能够把它演示给Russ看。这样,他就会对我们的进度感到特别满意。”

Jay在催促着。你从他脸上腼腆的表情可以看出他也知道这一点。你回答道,“Jay,这是一个新团队,从事的是一个新项目。期望我们和前一个团队具有同样的开发速度有点专横了。不过昨天中午我和团队谈过,事实上,我们都同意把最初的速度设定为每3周50个点。所以在这个事情上你非常幸运。”

“还请记住,现在有关素材的估算以及设定的速度都是推测出来的,在做计划时我们了解得会多一些,在实现时了解得还要再多一些。”

Jay透过他的眼睛看着你,好像要说,“在这里到底谁是上司?”接着他笑着说,“好的,不必担心,现在我已经知道了规则”

Jay接着把另外15张素材卡放到桌子上。他说,“如果我们到3月底能够完成所有这些素材卡,我么就可以把系统移交给我们的betab版测试用户。那么会从他们那里得到很好的反馈。”

你回答说,“好,我们已经定义了首次迭代,并且具有了此后3次迭代的素材。这4次迭代可以完成我们的首次发布。”

“那么,你们真的能够在接下来的3周内完成这5个素材吗?”Jay说。

“我确实不知道,Jay,”你回答道,“我们来把它们分解成任务,看看能得到些什么。”

于是,在接下来的几个小时中,Jay,你和你的团队把Jay为首次迭代挑选的5个素材中的每一个都分解成小任务开发人员很快就认识到某些任务可以在素材间共享,并且其他一些任务具有一些可以加以利用的公共点。很明显,开发人员的头脑中已经出现了一些可能的设计。他们不时地结成讨论小组并在一些卡片上勾勒出UML图。

很快,白板就被任务充满了,一旦实现了这些任务,就完成了本次迭代中的5个素材。你开始了签订过程,说道,“好,我们来签订这些任务吧。”

“我做初始数据库生成,”Pete说,“在最近的一个项目我做的就是这个,这个看起来并不困难。我估计它需要两天时间。”

“好,那么我做登录屏幕。”Joe说。

“奥,该死,” Elmo,团队的一个新成员,说道,“我从来没有做过GUI,我有点想做这个。”

“哦,年轻人真急躁。”Joe贤明地说,并朝你使了个眼色,“你可以来协助我,年轻人”,他对Joe说,“我认为我需要大约3天完成它。”

开发人员一个接一个的签订了任务并估算了它们。你和Joe都让开发人员自愿选择任务要比把任务分配给他们好。你也充分地知道你不敢质疑任何一个开发人员的估算。你了解这些人,并且信任他们,你知道他们会尽最大努力的。

开发人员知道,他们签订的任务不能超过在他们参与的最近一次迭代中所完成的任务。一旦开发人员关于本次迭代时间表安排满了,他就不再签订任务。

最后,所有的开发人员都停止签订任务。但是,当然,白板上还剩有任务

“我担心这些会发生,”你说,“好,现在只有一件事情要做,Jay。我们在这次迭代中做的过多了。我们可以去掉哪个素材或任务呢?”

Jay叹了口气。他知道这是唯一的选择在项目一开始就加班工作是非常愚蠢的,并且出现这种情况的项目也不会成功

于是,Jay开始去掉最不重要的功能。“嗯,此时,我们还不是真正需要登录界面。我们完全可以在登陆后的状态中启动系统。”

“胡说,”Elmo叫到,“我实在是想做这个。”

“耐心点,急性子”Joe说道,“只有等蜜蜂离开蜂箱后,享受蜂蜜时才不会蛰肿嘴唇(欲速则不达)”

Elmo显得很困惑。

每个人都显得很困惑。

“那么......”Jay继续说道,“我觉得我们也可以去掉......”

于是,任务任务列表逐渐变少。失去任务的开发人员在剩余的任务中又签订了一个。

商谈的过程不是没有痛苦的。其中有几次,Jay显示出了沮丧急躁。有一次,当局势特别紧张时,Elmo自愿要求“超时工作来弥补时间的不足。”当你正打算纠正他时,还好,这时Joe看着他说,“一旦你走上了错误的道路,它就会永远控制你的命运。”

最后,终于确定下来一个Joe可接受的迭代。这不是Joe想要的。事实上,它比Joe想要的要少的多。但是这是团队觉得他们可以在接下来的3周中能完成的东西。并且,毕竟仍然在迭代中完成了Joe想要的最重要的事情。

“那么,Jay”当会谈接近尾声事你说,“你何时能够提供验收测试呢?”

Jay叹了口气。这是事情的另一方面。对于开发团队实现的每个素材,Jay必须提供一组验收测试来证明它们可以使用。并且团队远在迭代结束前就需要这些验收测试,因为他们会明确得指出Jay和开发人员对系统行为认识上的差异。

“今天我会提供给你一些测试脚本的例子,”Jay许诺道,“此后的每一天,我都会增加一些。到迭代的中期,你就会拥有完整的测试集”

(四)

迭代在周一早晨开始了,我们开了一个急速的类—职责—协作者(CRC)会议。到上午10点左右时,所有的开发人员都已经组合成对,并在快速地编码。

“现在,年轻的学徒,”Joe对Elaine说,“你该学习一下测试优先设计的技术!”

“哇,这听起来相当不错。”Elaine回答道,“你是如何做到的?”

Joe微笑了一下。显然,他已经预见到了这一刻。“年轻人,现在代码做了些什么呢?”

“嘿?”Elaine回答道,“它根本什么都没有做,还没有代码呢。”

“好,考虑一下我们的任务。你能想起一些代码应该做的事情吗?”

“当然可以。”Elaine带着年轻人的自信说道,“首先,它应该链接到数据库。”

“那么,要链接数据库,必须的东西是什么呢?”

“你说话真是古怪,”Elaine笑着说,“我认为我们必须要从某个注册表(registry)得到数据库对象,并调用其Connect()方法。”

“哈!敏锐的年轻奇才。你正确地察觉到了我们需要一个对象,在该对象中我们可以缓存(cacheth)数据库对象。”
“‘cacheth’是一个真实的单词吗?”

“在我说出它时,它是的!那么,我们可以编写哪些我们认为数据库注册表应该通过的测试呢?”Elaine叹了口气。她知道她必须合作下去。“我们应该创建一个数据库对象并用Store()方法把它传递给注册表。然后,我们应该能够使用Get()方法把它从注册表中取出来并证实它就是上一个对象。”

“哦,说得对,我的年轻捣蛋鬼!”

“嗨!”

“那么,现在,我们来编写一个测试函数来检测你所说的情形。”

“但是,我们不应该先编写数据库对象和注册表对象吗?”

“啊,你还有许多东西需要学习,没有耐心的年轻人,先编写测试。”

“但是这甚至无法编译!”

“你肯定?如果可以编译怎么办呢?”

“嗯……”

先编写测试,Elaine。相信我。”

于是,Joe,Elaine以及所有其他开发人员都开始编写他们的任务,每次一个测试用例。他们工作的房间中充满了结对人员之间交谈的嗡嗡声。嗡嗡声不时被告呼声中打断,这些高呼声就是某一对人员完成了一个任务或者通过了一个困难的测试用例时所发出来的。

在开发的过程中,开发人员每1~2天就更换结对伙伴。每个开发人员都会了解所有其他人做的东西,因此关于代码的知识就广泛地在整个团队中传播。

每当一对人员完成某个重要的东西,不管是一个完整的任务或者仅仅是任务的一个重要部分,他们都会把完成的东西和系统的其余部分集成起来。这样,代码基每天都在增长,并且集成的难度被减少至最小。

开发人员每天都和Jane进行交流。每当他们对系统的功能或者验收测试用例的解释有疑问时,都会找Jane。
Jane很好履行了她的诺言,平稳持续地给团队提供验收测试脚本。团队用心地理解这些脚本,从而对Jane期望系统做的东西有了更好的理解。

到第二周初时,所完成的功能已经足以演示给JaneJane热切地观看着,演示通过了一个接一个的测试用例。

“这真是太棒了,”当演示最后结束时,Jane说道,“但是这看起来好像不到1/3的任务。你们的速度比预期的慢吗?”

你皱起眉头。你本来想等待一个合适的时机把这告诉Jane,但是现在她却提前提出了一个问题。“是的,很遗憾,我们比期望的要慢一些。我们使用的新应用服务器配置起来很费劲。并且,还得常常重新启动它。每次即使我们对它的配置做了最微小的更改,都必须重新启动它。”

Jane用怀疑的眼光看着你。上周一商谈中的紧张状态还没有完全消散。她说:“那么,这对我们的进度意味着什么呢?我们不能再落后进度了,绝对不能。Russ会很生气的!他会惩罚我们所有人,并为我们增加一些新人手。”

你一直看着Jane。这样的消息是没有办法以令人愉快的方法说出来的。于是你完全不假思索的说道:“看,如果事情还像这样进行下去,那么到下周五时,我们将不能完成所有东西!现在我们是有可能找出一条可以快一些的方法的。但是,坦白地说,我不会依赖于它的。你应该考虑一下从迭代中去掉1个或者2个任务,而又不破坏给Russ的演示。无论如何,我们都会在周五进行演示的,并且我认为你不会想让我们来挑选去掉哪些任务。”

“啊,看在上帝的面上!”当Jane摇着头大步离开时,几乎无法抑制住喊出最后一句话。

不止一次,你对自己说,“从来没有人敢向我保证项目管理会是容易的。”你非常肯定这也不会是最后一次。

(五)

实际的情况要比你期望的稍好一些。事实上,团队确实从迭代中去掉了一个任务,但是Jane做了明智地选择,所以给Russ的演示很顺利。

Russ对进度没有太深的印象,但是他也没有感到沮丧,他只是说:“相当好。但是记住,我们必须能够在7月的展览会上进行演示,如果以这样的速度的话,看起来你们不能完成所有的要展示的东西。”

Jane的态度在迭代完成后有了很大的改善,她回答Russ说:“Russ,这个团队工作得很努力,也很好。到7月时,我确信我们会演示一些最重要的东西。它不是所有的东西,并且其中的一些可能没有真正的实现,但是我们会有一些东西的。”

虽然刚刚结束的迭代很费劲,但是它却校准了你们的开发进度。接下来的迭代好了许多。这并不是因为你的团队完成了比上一次更多的任务,而只是因为不必在迭代的中期去掉任何的任务或者故事。

第四次迭代开始时,一个自然的开发节奏建立起来哦。Jane、你以及开发团队都可以准确地知道彼此期望的是什么。虽然团队工作得很艰苦,但是开发速度却是可持续的。你确信团队能够在一年或者更长的时间内保持这个速度。

在进度方面几乎没有出现什么问题;但是在需求方面却非如此JaneRuss常常检查逐渐增长的系统并对现有的功能提出一些建议和更改。但是任何一方都知道这些更改是花费时间的并且必须要列入计划。因此,更改没有导致对任何人期望的违背。

在3月,你们给董事会做出了一个该系统的较大型的演示。系统功能非常有限,还不足以拿到展览会上去演示,但是进展却非常稳定,给董事会留下了相当深刻的印象。

第二次发布甚至比第一次还要顺利。现在,团队已经找到了一个可以自己执行Jane的验收测试脚本的方法。他们同样也对系统进行重构,直到确实可以容易地向某个增加新特性以及更改原有的特性。

6 月底完成了第二次发布,并拿到展览会行。系统的功能要比Jane和Russ原本想要的少一些,但是它确实演示了系统最重要的特性。虽然展示会上的客户注意到了某些功能还没有实现,但是在总体上却给他们留下了深刻的印象。你、Russ以及Jane在从展示会上返回时都面带笑容。你们都仿佛觉得这个项目是一个胜利者。

事实上,许多月以后,Rufus公司和你们进行了联系。他们曾经为了他们的内部业务开发过一个类似的系统。经历过一个死亡的项目后,他们取消了这个系统的开发,并和你们商谈有关在他们的环境中使用你们的技术的授权许可事宜。

情况确实在不断变好!

(全剧终)

【思考】读完你是否会心一笑,如果是这样,我想你曾经必定经历过糟糕的项目,对小品中流程处理和节奏以及结果甚是向往和一种莫名的冲动,无论是瀑布还是迭代敏捷,项目成功唯一不变的标准就是在范围,进度,质量,成本等相关约束尽可能满足约束下交付。所以,成功的项目过程首先一个相互协作透明的过程,另外大家形成共识:商业价值,优先级,评估和演进,始终关注核心主流程(功能)。

注: 故事抄摘《敏捷软件开发-原则,模式与实践》【美】Robert C.Martin

【项目管理】敏捷小品:Rupert 工业公司 项目:~Alpha~相关推荐

  1. 打造敏捷化的高绩效项目团队︱北汽研发项目管理中心项目经理张志强

    打造敏捷化高绩效项目团队︱北汽研发项目管理中心项目经理张志强 北汽研发项目管理中心项目经理张志强先生受邀为"2021第二届中国项目经理线上会议"演讲嘉宾,演讲议题为"拥抱 ...

  2. 如何把团队拉回到敏捷正轨︱瑞友科技项目群经理徐天岗

    北京瑞友科技股份有限公司工业互联网项目群经理徐天岗受邀为由PMO评论主办的2022首届中国敏捷大会(线上会议)演讲嘉宾,演讲议题为:如何把团队拉回到敏捷正轨.大会将于12月17-18日通过云端面向全国 ...

  3. 软件项目管理-敏捷先锋朱少民

    前言 软件项目管理相关内容 第一章:概述 项目管理的生命周期 项目管理的生命周期--"启动.计划.执行.控制.结束"演进顺序 项目的概念 项目是为完成某个独特的产品或服务所做的一次 ...

  4. 【项目管理】分享一下我做项目用到的方法论和思想(项目经理必修课)

    为什么会写这篇文章? 我从事项目管理大约有3年了.一开始我什么都不知道.现在我同时处理多个关键项目.我也有一些经验.我希望我能总结一下,帮助我理清自己的方法论,以便于今后更清晰.更方便地完成后续项目交 ...

  5. 项目管理课程:从初学者到项目经理

    项目管理课程:从初学者到项目经理 成为成功项目经理的完整课程 课程英文名:The Project Management Course Beginner to PROject Manager 此视频教程 ...

  6. SitePoint Podcast#190:Dave Rupert的开源项目

    Episode 190 of The SitePoint Podcast is now available! This week Kevin Dees (@kevindees) interviews ...

  7. 01.敏捷项目管理——敏捷革命笔记

    00.最终客户价值是在销售时交付,不是在计划时交付. 01.产品开发和管理联合会(Product Development And Management Association,PDMA) 02.要做正 ...

  8. PMO如何打造企业级项目管理赋能平台︱用友金融项目管理部总经理贺小奔

    用友金融信息技术股份有限公司项目管理部总经理贺小奔受邀为由PMO评论主办的2022第十一届PMO大会(线上会议)演讲嘉宾,演讲议题为"PMO如何打造企业级项目管理赋能平台".大会将 ...

  9. IT项目管理-敏捷和传统

    敏捷开发目前如火如荼,很多公司和企业都在谈敏捷,如何应用敏捷,连PMI也推出AGILE的认证,可见该模式的实践还是不错的. 敏捷开发我相信很多项目经理.IT管理者都知道,也看过不少书籍,听过不少讲座, ...

最新文章

  1. 简单读!tomcat源码(一)启动与监听
  2. node上传资源到又拍云
  3. java 10 发布_Java 10 发布之后,大多数受访者仍在使用 Java 8(82%)
  4. flex和box、flexbox高度自适应常见坑
  5. php 字符串判空,php 使用 preg_replace 去除空格后的字符串无法判空
  6. htmlcss笔记--标签默认值样式重置css reset(2)
  7. 请问1到10000之前,有多少升数字?(华图教育面试题)
  8. 常见问题_智能切膜机常见问题
  9. 远程服务器 上传公钥,SecureCRT+Ubuntu SSH服务器的远程公钥登陆
  10. Markdown 使用教程
  11. Notification Swift 3 0
  12. 开源视频会议系统:OpenMeetings 安装方法
  13. Atitit oracle新特性5 6 7 8 9 10 11 12 18 19 20 attilax总结 目录 1.1. :ora 20c 1 1.2. Oracle Database 19c 的
  14. 神经网络的BP算法推导详解
  15. jqwidgets API
  16. Leco题目:两数之和
  17. 了解JavaScript语言--如何在HTML中使用JavaScript
  18. Gephi中的统计算法学习
  19. 万年历,可以查 曰、月、年,缓存到redis,直接抓取使用,
  20. java获取所有进程_Java 获取系统的进程列表

热门文章

  1. visual studio C语言指针提示:使用未初始化的内存xx
  2. python 神经网络中隐藏层的作用是什么?
  3. 第十一届蓝桥杯大赛软件赛省赛第二场 C/C++ 大学B组
  4. xay loves or 异或
  5. 监护仪系统都是Linux吗,基于Linux和MiniGUI的心电监护仪设计
  6. Mysql 和oracle的区别
  7. php创建压缩文件 保存路径,通过php生成zip压缩文件,支持文件和压缩包路径查找...
  8. 中学计算机课的现状和感受,中小学信息技术课程的现状与发展.doc
  9. 螃蟹wifi驱动在AP模式下存在挂死系统的问题
  10. Linux accept tcp,Linux TCP accept without SYN|ACK