敏捷史话(十五):我发明了敏捷估算扑克牌 —— James Greening
雪鸟会议
雪鸟会议前夕,James Grenning 在 Object Mentor 与 Robert C. Martin 一同工作,彼时组织雪鸟会议的 Bob 大叔盛情邀请 James,告知他会议的地点。James 听到地点后毫不犹豫地答应,并在脑海中踊跃欢呼“我要去滑雪!”毕竟,“雪鸟是世界上最好的滑雪场之一”,没有人会拒绝雪鸟的诱惑。当然,除了滑雪这个最直观的念头,James 也曾与 Kent Beck、Ron Jeffries、Martin Fowler、Ward Cunningham 共事、合作,有这样的机会同这些人一起聊聊关于软件开发的事,这也是另一个非常吸引他的原因。

不过他对参加雪鸟会议是否会对自己的工作产生有利影响没有丝毫期待,在会议现场也只是进行些小组交流,他从未预料到这会对软件开发行业产生如此巨大而深远的影响。“我们很确定没有人会在乎,但至少我们做了一些事情: 找出我们有什么共同点,以及共同点在哪里。”
估算扑克
在一定程度上,《敏捷宣言》是在大家聚在一起找出分歧,再找到共同点的过程中产生的。James 认为,这与估算扑克相似,二者的共同点是: 一个团队需要在哪一部分达成共识。
估算扑克的灵感来源于 James 作为敏捷教练参加的一次失败的计划会议。那一次,团队八个人围坐在桌子旁,两位高级工程师主持此次会议,在会议中,二人不断反复讨论如何构建用户故事。当时在场的 James 极为混乱,他用了半小时甚至一小时的时间才意识到,他们在会议开始时谈论的工时数与在会议结束时谈论的工时数完全一致,整个会议所做的事情只是在争论用什么方法去做。而此时其他参会的六个人都已经昏昏欲睡,这是因为争论的这二人“垄断”了整场会议谈话,而没有参与讨论、估算的人已经近乎脱离会议了。当时的 James 手上正好有索引卡片,于是在这场会议中场休息结束后,他给每个人都发了卡片,并要求提出某项工作后,所有人只能出牌,不能讲话,来达成一致同意。

James 在 Object Mentor 网站上写下了这个故事,提出估算扑克。随后,Mike Cohn 发现了这一方法,并根据自己的经验对估算扑克的设计 进行了完善和增强,同时决定将估算扑克在大范围内推广使用。发布后,这副特殊的扑克在程序员中广受欢迎。
当然,估算并不只依赖于这一副扑克牌,James 自己在被 Lowell Lindstrom 展示过亲和图优先级估算的想法后,已经多年未使用估算扑克。但估算扑克确实能通过以牌面朝下的方式隐藏数字,让团队避免“锚定”的认知偏差,提高估算效率。这是一种既能起到群策群力效果又有效避免众口难调造成混乱的好方法,所以 James 的客户们应用推广,由此产生了 风险扑克、 价值扑克等类型。虽然这两种扑克并未推向市场,但团队想要借鉴的话,实现起来并不困难。
测试驱动开发
1999年,James 开始学习极限编程,从事嵌入式咨询工作。当时一直在为客户编写用例并搭建体系架构的 James 在 Object Mentor 进行了第一次极限编程沉浸式学习,也开始接触一些此前未了解过的事。当他看到当时名为“测试优先于开发”(现在的测试驱动开发)的演示时,他发出惊叹:“哇!我们可以打破对我们没有的东西的依赖。”因此,如果需要构建某个系统,并且处于无法与硬件交互的情况下,仍然可以创建软件,并 通过存根和模拟对象等来开发尚不存在的事物。
激动兴奋之余,受到启发的他产生了为做嵌入式开发的程序员介绍测试驱动开发的念头,也将敏捷介绍给嵌入式开发的群体。他开始在嵌入式系统会议上做关于将敏捷应用于嵌入式软件的演讲。也有了专门写作测试驱动开发的主题的书的念头,这个念头后来成型,就是《测试驱动的嵌入式 C 语言开发》。

从这颗被点燃的火花开始,再到他把敏捷、测试驱动开发的火花带给更多的嵌入式开发工程师,他意识到语言通常是不同的,不仅仅是编程语言,人们相互交流的方式本质上是不同的,因为他们谈论的是不同的东西。不同的整体拥有不同的世界,所以游走于不同的群体间就可以学到不同群体的知识,比如他通过与 Bob 的合作了解到了许多非嵌入式的知识。从面向对象、极限编程到测试驱动开发,他愿意把这些不同世界的知识带给其他世界的程序员。
敏捷本身不是目标,而是寻找诚实而高效的方法来交付有价值的产品,这是 James 一直强调的观点。在2011年敏捷宣言十周年的访谈中,他认为自己与十年前在雪鸟会议的自己相比并没有变化,但他一直拥有自我学习和进步的主人翁意识,在尝试不同的想法并不断完善。所以,敏捷更多是一种前进的方式,而不是可以在此停滞的目的地。回首往事,他不会从《敏捷宣言》中删除任何东西,但会补充一些关于持续改进、适应和学习的内容。如今又是新的十年走过,通过他不断更新的网站和活跃的动态,我们相信他一直在前进,从未停滞。
敏捷史话(十五):我发明了敏捷估算扑克牌 —— James Greening的更多相关文章
- 敏捷史话(五):敏捷已逝 —— Dave Thomas
" 敏捷已逝,但敏捷精神长存.因为所谓的敏捷专家卖给你的是方法论,而不是价值."当多数人都在从"敏捷"身上榨取利益时, Dave Thomas 成为了一位逆行者 ...
- 敏捷史话(十四):敏捷之峰的攀登者 —— Jim Highsmith
"我们希望,一起组成的敏捷联盟能够帮助到其他同行,帮他们用新的更'敏捷'的方式去思考软件开发.方法论和组织.做到这一点,我们就得偿所愿了."Jim Highsmith 在雪鸟会议结 ...
- 敏捷宣言(Agile Manifesto)和敏捷开发十二原则
敏捷宣言 The Agile Manifesto Individuals and interactions over Process and tools 个体与交互 重于 过程和工具 Working ...
- 敏捷史话(六):也许这个人能拯救你的代码 —— Robert C. Martin
Robert C. Martin( 罗伯特·C·马丁),作为世界级软件开发大师.设计模式和敏捷开发先驱.C++ Report杂志前主编,也是敏捷联盟(Agile Alliance)的第一任主席,我们尊 ...
- 敏捷史话(四):敏捷是人的天性 —— Arie van Bennekum
敏捷是人的天性,是你与生俱来的东西.面对敏捷,Arie van Bennekum 下了这样一个结论. 但这并不意味着人们只能通过天赋获得敏捷,对于想要学习敏捷的人来说,敏捷绝不是仅仅靠学习僵化的框架. ...
- 提高你开发效率的十五个Visual Studio 2010使用技巧
提高你开发效率的十五个Visual Studio 2010使用技巧 相信做开发的没有不重视效率的.开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS.能够对一个IDE产生依赖,说明这个ID ...
- Docker+ Kubernetes已成为云计算的主流(二十五)
前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...
- 如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记
一.ASP.Net MVC简介 1,什么是ASP.NET MVC? HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大.工作量大.因此提供了ASP. ...
- CODING 敏捷实战系列课第五讲:敏捷中国史
敏捷软件开发方法自 2001 年传入中国以来,历经十多年的发展变迁,目前已经成为国内 IT 企业主流的研发管理方法.敏捷方法的传播和发展历程,是中国 IT 行业发展的剪影.CODING 特邀敏捷顾问. ...
随机推荐
- React组件复用的方式
React组件复用的方式 现前端的工程化越发重要,虽然使用Ctrl+C与Ctrl+V同样能够完成需求,但是一旦面临修改那就是一项庞大的任务,于是减少代码的拷贝,增加封装复用能力,实现可维护.可复用的代 ...
- 关于string【】 数组 进行 toString() 之后无法将数组的内容连接起来组合成 string 字符串 的问题
string[] to string 如果直接对一个string[] 数组进行 tostring()的操作,得到的值都是 system.string[] 如果想要将 string[] 数组内容转换为一 ...
- Python 学习笔记(3)
Python 文件I/O 读取键盘输入: Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘: 1. raw_input #函数从标准输入读取一个行,并返回一个字符串(去掉结尾 ...
- JavaScript async/await:优点、陷阱及如何使用
翻译练习 原博客地址:JavaScript async/await: The Good Part, Pitfalls and How to Use ES7中引进的async/await是对JavaSc ...
- 后端程序员之路 34、Index搜索引擎实现分析3-对文章索引的两层分块
# part_indexer 对文章根据id的hash进行分块索引- 持有 search_index _inc_index[2]; search_index _history_index[2]; 进行 ...
- springboot源码解析-管中窥豹系列之自动装配(九)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- 抽一根烟的时间学会.NET Core 操作RabbitMQ
什么是RabbitMQ? RabbitMQ是由erlang语言开发的一个基于AMQP(Advanced Message Queuing Protocol)协议的企业级消息队列中间件.可实现队列,订阅/ ...
- 漏洞复现-ActiveMq反序列化漏洞(CVE-2015-5254)
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apache ActiveMQ 5.13.0之前 ...
- Python编程中可能经常用到的函数
1.os.walk() 一般用法为 import os ph=r'D:\temp\build' for root,dirs,files in os.walk(ph): print(root,dirs, ...
- 2019 GDUT Rating Contest I : Problem C. Mooyo Mooyo
题面: C. Mooyo Mooyo Input file: standard input Output file: standard output Time limit: 1 second Memory ...