Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
6:18
Subscribe
Share
Lancer: Sunil Srivastava和我讨论了测试驱动开发对领导层的价值。 Sunil: 从领导的角度来看,他们关注的是我们如何更快、更便宜、更迅速地交付产品,而不仅仅是代码。所以,如果你从这个角度去思考团队如何能够交付高质量、易于改变且成本低廉的代码,尽可能快地完成,这就是测试驱动开发可以帮助领导层的地方。 Lancer: 比如说我是某公司的副总裁,我在考虑进行TDD;我需要花钱请顾问进来,让我的组织掌握这种技能。那我为我的投资能得到什么回报呢? Sunil: 你能够让你的团队更快地行动? Lancer: 那是如何实现的?他们如何更快地行动? Sunil: 因为TDD涉及单元测试,他们能够在代码层面进行测试。所以,如果你能在代码层面进行测试,并且进行多个测试,那么你就减少了对更大的应用进行依赖性测试的需要:回归测试、性能测试和其他集成测试。打破这种依赖性是很重要的,因为其他测试可能需要更长的时间,会拖慢开发交付的速度。所以,如果你不需要为更大的应用创建太多的测试,并且在单元测试层面有信心,你的构建速度会更快。你会更多地使用低层级的测试,不需要进行那么多高层级的测试,这样就节省了维护那些难以维护的应用测试的时间。 Lancer: TDD让你的团队花更多时间编写新功能,花更少时间修复错误,因为错误更少了。 Sunil: 是的。所以从副总裁和领导的角度来看,你关注的是,正如你所说的,团队更专注于新功能的开发,而不是修复错误和重新工作。这降低了项目的持续成本,这意味着我可以更快地交付产品,这才是他们关心的,对吧?所以速度更快,上市时间大大缩短。这就是测试驱动开发从领导角度提供的好处。 Lancer: 当企业想要转向新方向时,TDD也能够使代码更轻松地跟随业务方向而变化。 Sunil: 因为代码编写得易于理解,是模块化的,所以能够更轻松、更快速地进行转变。 Lancer: 为变革制定预算。我觉得我们有点谈到了。所以如果我要花钱雇人来改变我的组织,我需要知道我会得到什么回报。我们说过你将会得到更快的功能交付和转向能力,可能还有其他一些东西。所以归根结底,如果我们要谈论资金,这对你的组织有什么价值呢? Sunil: 你知道,一些团队关注的关键点是,正如我所说的,更快的交付、24/7的运行时间、更高的代码质量、更少的缺陷、更低的成本。我认为这些最终转化为,低成本、更高的交付运行时间以及能够转向。这些是领导关心的事情。我认为这就是你可以向领导展示的。 Lancer: 当我们谈论时,我想到了另一个点。错误库存会减少,趋近于零。 Sunil: 是的。这涉及到技术债务。TDD可以帮助你将技术债务减少90%或80%。我见过一些团队通过实践测试驱动开发,几乎消除了相当于10年技术债务的情况。 Lancer: 跟随TDD大师正在进行的酷炫事物,或者与我们合作将您的企业转变为一个精益、高效、零缺陷的微测试机器。请前往TDD gurus.weebly.com。下一集我们将听取Richard Hundhausen关于Nexus敏捷扩展框架的意见。 Richard: 如果你愿意,Nexus框架只是围绕现有Scrum框架的外骨骼。
敏捷理念
027将未完成的故事纳入Sprint计划
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
6:18
Subscribe
Share
您可以通过邮箱:Brandon.Linton@Accenture.com或者Twitter联系到布兰登·林顿 兰瑟:你的团队一直致力于研究用户需求,然而有时候他们并没有实现所有的需求。在上一集中,我和布兰登·林顿讨论了如何将未完成的需求进度记录到你刚刚完成的sprint中。现在我们将继续讨论,当你把这些未完成的需求或者需求们带入下一阶段计划时,你该如何处理它们。 布兰登:我们总是想尽可能的反映出最真实的情况。如果你知道这个需求是13个点,那么就不要说它是20个点。因为接下来会有两种可能:第一,这个需求变得更小,因为剩下的工作量更少。第二,这个20点的需求现在已经变成40个点了,因为原始的工作量评估是不准确的。 兰瑟:也许企业架构师走过来,说:“不,你需要增加功能,例如申请登录等等…”,那么现在这个需求就难多了。 布兰登:是的,我想我还没有遇到过一个愿意推翻现状的团队。这跟信用无关,只跟它的大小有关。而你又做了多少努力?让我们来谈谈这个场景,它可能比你想象的要大的多,这有助于团队更好的理解工作速度,尤其是当你遇到了一些需要做这种改变的事情。如果这个SDK的实现比我们想象的困难得多,那么就请重新评估它,试着让你的工作速度尽可能的真实,尽可能做出最好的承诺。展示你真正相信的他们的工作速度,或者基于你对他们的深入理解进行速度评估。这种练习将使你更接近持续的、真实合理的节奏。 兰瑟:如果这个需求只剩下3或5个点,你就把它搁置了,然后因为你得到了所有额外的点数,突然间,你的下一个Sprint速度就被人为的提高了。现在你并不能真正的去计划它,这于你的计划无益。 布兰登:是的,你的意思是,如果你完成了一个20点的需求 ,而它实际上只需要付出3个点的努力,那么你就通过虚假的方式提高了你的工作速度;在下一个sprint中,这给你的利益相关者设定了一个虚假的期望。你也可以这样做,对吧?因为你们是一个scrum的团队,对吧?你认为你应该能够维持下去,那么你就是这样惹上麻烦的。 兰瑟:简单来说,在已经完成的工作中,速度等于需求点。当你使用Sprint计划来规划未完成的工作时,不管你在之前的Sprint中已经完成了多少工作,你都必须对剩余的工作量进行重新评估。 兰瑟:布兰登,请问该怎么联系您呢?电子邮件或者Twitter? 布兰登:我现在根本记不起我的Twitter了,它主要是用来发牢骚的。 兰瑟:如果你有任何问题,你可以在推特上对布兰登抱怨,就像我们在这个播客上说的一样,你可以在Twitter上找到他;当然也有可能是布兰登·林顿在 Twitter上搜索你。 布兰登:林顿,L-I-N-T-O-N,但是为了保险起见我再说一下我的邮箱,我的邮件是brandon.linton@accenture.com。 兰瑟:这一集是前一集的延续。请参阅前26集,了解我们谈话的全部内容。
敏捷理念
026便捷又实用的计算速度和待办事项的方法
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
12:13
Subscribe
Share
布兰登·林顿的联系方式: Brandon.Linton@accenture.com 兰瑟: 这一集,我们和布兰登·林顿讨论了关于计算工作速度的便捷的方法,特别是关乎未完成的用户需求。 布兰登: 你好,我叫布兰登·林顿。我住在底特律,它位于美国的密歇根州。我是埃森哲解决方案的敏捷教练。 我在敏捷空间工作了八年时间,提供咨询业务长达四年。很高兴能和兰斯一起工作。 兰瑟: 是的。我也很高兴能和布兰登一起工作。 布兰登: 很高兴来到这里。我们正在做一个关于需求的播客,主要研究那些需要较长时间才能完成的需求。 兰瑟: 是的。那么,这是一个问题吗? 布兰登: 这不但是一个问题,还是一个大问题。不久前,我们在办公室就这件事情进行了一次简洁的沟通,是的,我们在谈论,或者说我在谈论一个我刚刚加入的团队,问题出现在一次sprint计划会议上,他们有一个需求;但是在上一次的sprint中,他们还有多个需求没有完成。我们的需求依然具有很高的优先级。他们说,这是8个需求,我们可以先完成5个,然后把剩下的3个放在最后一个sprint中。总之,一切就是从这里开始的。 兰瑟: 我们把讨论的这个数字称为需求点,当团队有一大堆工作要做时,他们会制定一个sprint计划。 布兰登: 对的。 兰瑟: 最终他们得到了我们称之为速度的东西。 布兰登: 是的。但是速度到底是什么呢?拿开车来说,我们开车的时候车会有一个车速。速度有很多不同的形式。对,在scrum一文中,我给速度下了定义,你知道的,这只是一个大概的定义,或许它可以用更好的词语来定义,但是在这里我想说的是,在布兰登的世界中,速度是点数,需求的总点数就是在sprint中已经完成的、结束的那些。再没有比这更贴切的说法了。 兰瑟: 在这里,为了进一步强调布兰登的观点,我们假设一个场景:团队有10个需求,所有需求的点数相同,都是5个点。因此,这意味着如果他们完成所有的需求,他们需要完成50个需求点。 布兰登: 所以即使你有10个需求,但是你只能完成其中一个,那么,这就是你的速度。即使其他的需求即将完成,那也与你的速度无关。这有点像踢足球,如果你没有进球,不管你离终点有多近,一英寸,一码,还是50码,你都没有完成。因为拥有可持续的速度,意味着拥有一个能无限期保持的可重复的速度。 兰瑟: 所以正如布兰登所说,这并不是为了计算你的点数,而是为了建立你可以用于制定计划的指标。这些指标应该等同于我们在不确定的时间内所能达到的目标。 布兰登: 有趣的是,一个新的团队,往往会说,这个需求需要完成的点已经不是8个了,我们已经完成了5个,所以我们只需要计算剩下的3个。当然,这也引起了争论,那么,什么叫需求完成呢?他们说,嗯,这个任务,还有这个任务,你是知道的,这个,这个也是好的,这个已经完成了90%了,布兰登,对吧,我获得了所有的点,我们几乎就要完成了。但我总是说,好吧,你是在为谁做这个?这可能是多方面的,这取决于你工作的团队。如果这是某个应用程序的“保持登录”功能,当你返回后,不需要再次登陆,这个时候,除了保持登陆复选框,你的所有功能都是正常的,这对您的最终用户来说不是很有用,因为您登录的内容会一直存在,你甚至没有选择。这个功能并没有完成,它几乎快要完成了,但仍然是未完成状态。那么我要说的是,你的用户关心你做了多少吗?未来的用户能体会到它的价值吗?他们并不在乎你做了多少,他们只在乎你还有没有完成。 兰瑟: 这就好比,我把所有要买的东西都放进购物车,然后到了结账台,收银员说,对不起,这些东西我们不卖了,你不能买了。就像,我想要的东西都拿了,但是我却不能把它带回家去。所以我想我只在乎我能不能把它们带回家。 布兰登: 这可能会揭示一些有趣的机会,如何更好地分割需求。用你的比喻,如果我有一辆装满东西的购物车,我到了结账台,但是那是只收现金的,然而我没有现金。好吧,我当然没有现金了,我得在这里排队。但是如果我有现金,那至少是一种可以满足的用例或场景。因此,这可能意味着有机会将需求分开。但另一个,我们谈话的另一部分,我们现在怎么处理这些需求呢?尤其是因为你是对的… 兰瑟: 现实情况是,一部分需求完成了,但是另一部分需求并没有按时完成。他们根据邓恩的需求来计算工作速度。所以他们整理了所有的邓恩需求。他们把每个人的需求点加起来,可能一共是50个,但是他们仍然有一些需求没有完成,现在他们想为此制定一个计划。 布兰登: 假设这仍然是一个优先级高的事项。我在刚开始就会问:这些问题是否仍然重要,你知道,中途或部分完成,这些是否依然是迫切需要的。如果不是,把它们放在待办事项里,以后再做;如果是的话,你仍然想去追求这些,那么就像我平时所说的,让我们好好研究它们,再重新进行评估,因为在开始研究这些东西时,我们在sprint中可能学到了一些东西,但是还没有完成。我们现在是否能更好的知道完成这个需求实际上比我们之前估计的要付出更多的努力。 兰瑟: 是的。所以我有90%的需求完成了一段时间,假设这是一个20点的需求,我没有得到任何点数,我没有,我知道那不是斐波那契函数。很抱歉,伙计们,但这是一个20点的需求,我不明白,现在我们又要重新评估它,我们要评估什么工作是被遗留的,什么是仍然需要做的,或者是完成剩下的需求还需要什么东西。 布兰登: 对的。 布兰登: 是的。我们不想考虑的是,我们已经投入了多少精力。在速度方面,我们总是告诉团队,你需要非常专注于剩下的工作来完成这个任务。还有我们提到的那个场景,比如说,你知道的,20点的需求现在实际上只有13点,因为我们已经完成了一些工作,我们投资了一点,但还有很多路要走。你可能会说,好吧,我上一次sprint时做的工作没有得到表扬。你是完全正确的,那不是速度,对吧?你,我们,我们并没有完成。现实就是一个20点的需求现在变成了13点。所以如果我们看一下点数的总和,假设这是一个发布,现在你怀疑100个点降到了93个,对吧?你的,你的完成时间移动了一点点,对吧?你还没有完成需求,所以这不是工作速度,就拿获得信用来说,嗯,不要为之而担心。但事实却是,为了达到同样的价值,只需要少做一点努力,你想重新评估它,你知道,当这个需求仍然拥有优先权时,你需要考虑重新评估它。 兰瑟: 下一集,布兰登将继续劝阻我们不要把速度看做是衡量团队付出努力的方法或者是某种形式的信用,而不去估量他们已经完成的工作。 布兰登: 你知道的。我知道你想尽可能的反映出最真实的情况。所以,如果你知道这个需求是13点,就不要说它是20。 Tout Agile Noir Chinese version
敏捷理念
025 作为开发者,如何熟练掌握TDD?
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
4:57
Subscribe
Share
最重要的几点: * 开始实践 * 如果某个问题难度太大:暂时保留下来,之后再回过头来重构代码 下面的情况说明你已经熟练起来了: * 一天8小时已经能写出很多个测试了 * 能重构4个较长的函数或者类,并让它们通过测试 * 很不喜欢收到跳过测试的建议 * 已经快一周没用过调试器了 下面的情况说明你已经非常精通了: * 能教会他人如何熟悉TDD * 你的团队项目有很高的代覆盖率了(高于80%),并且还在持续提升 * 团队的技术负债在每一轮冲刺中不断降低 开发者要熟练掌握TDD,必须得经历的那些事情: 先编写测试代码,再写产品代码。之后,你的大脑会形成条件化的思维,也就是形成一个新习惯。40/4挑战是一种培养新习惯的方法。它的意思是在4周的时间段里,写出40个单元测试。之后,你会在TDD上取得突破,并变得熟练。你在代码编写中会遇到好些困难,并发现困难通常都能通过先进行微测试来解决。你会发现一两个自己难以解决的问题,但没关系,继续努力。4周过后再来重新解决这个问题, 这时候你已经成为了专家,能用你条件化的思维来平衡测试与产品代码了。在回顾微测试提供的快速反馈时,你感到非常享受。你开始注意到你开发出了更多的功能,而且在修复有问题的代码上花费的时间越来越少。 开发者熟练不起来的常见原因有哪些? 14到22集的IT戏剧《敏捷思维》中,我们列出了几个原因。毫无疑问,最常见的原因,就是开发者对于已有的思维定式太过于习惯和舒适了。“我不先写代码,就没法写出微测试来。”这种思维定式让他们不愿意战胜自己来尝试新事物。然后,不舒适的感觉让他们继续自己既有的固定思维,跳过了要先写的微测试,直接编写代码。但这样反而让通过测试和实现功能的周期更长,也更冒险,因为你老是会遇到问题却没有任何头绪。 下一集会讲述一种“调皮或优雅”的方式来计算团队速度,由敏捷教练Brandon Linton带给大家。
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
7:02
Subscribe
Share
上一集,我们讨论了如何让团队实施TDD,也就是用微测试来发展他们的代码。让一个团队实施TDD非常有帮助,因为这样展示了TDD的实施不仅可行,而且很有价值。下一步是如何让整个组织采纳实施TDD。没有组织的接受,在管理层或者产品负责人更换的时候,TDD就有可能被否决。这种事情随时都有发生:团队自己发现了新事物的价值,管理层换人了,不理解团队的做法,于是开始干预,并停止了相应的做法。所以,组织的采纳是对TDD未来价值的确认。这样能使TDD成为公司文化、雇佣政策和职业路径的一部分。在一个团队成功展示了TDD的价值之时,就是全面实施TDD的时候了。 步骤一、让顶层人员熟悉相关情况 包括有关的管理人员、架构师以及产品负责人 管理层应该了解实施TDD需要的付出和会有的回报,这样他们就不会以负面的形式进行干预。开发人员最不喜欢实施TDD时的不确定性。挑战包括让管理层、架构师和产品负责人熟悉TDD时,这三类人群有着完全不同的需求和对TDD不同的看法。因此,传递的消息、目的和技术对话的效果都应当有所不同。 步骤二、进一步实施 开发者需要学会如何使用单元测试库,如何重构代码,如何设置连续整合服务器,以及如何采用先编写测试的设计。这些在起始阶段都会减慢开发者的速度。即使管理层已经作出了决定,开发人员也会按照自己的想法接受或者反对TDD。虽然并不需要每个人的同意,各团队需要40%到60%的开发人员有使用TDD的意愿。增加甚至长达数年的学习激励,可以让态度“还不明朗”的开发者开始先试用TDD几个月。根据我的教练经验,这足以使TDD新手变得熟练。 我见过较好的实施方法包括,副总为每位开发者分配奖金,团队的领头人负责确立一些可实现但又有挑战性的TDD实施目标。这样,也就确定了微测试数量的目标。如上一集提到的40/4挑战一样,目标是需要在两三个月的时间段里,让开发人员实现熟练掌握TDD的效果。 步骤三、设置标准 设置标准会成为团队对任务完成最低的定义。一种便捷的方式,就是让标准透明可见,容易通过连续整合展开。下面是一个例子: * 拥有一台连续整合服务器 * 服务器必须执行编译步骤,并让其可见 * 服务器必须执行微测试,并让其可见 * 服务器必须执行微测试的代码覆盖率评估,并让其可见 * 服务器必须执行宏测试,并让其可见 * 不能交付未通过测试的代码 * 服务器必须执行设计负债,并让其可见 * 新代码必须有90%的代码覆盖率 最后的一项对有大量历史遗留代码的情况较为困难,需要花费数年甚至数十年的时间来达到90%的代码覆盖率。因为任何理由都不可能让我们一切都从零开始来重写代码。添加到历史代码库的新类应该有很高的代码覆盖率,但是在用连续整合服务器实施检查时会较为困难。 步骤四、可持续的系统 雇佣政策需要直接地针对熟悉TDD或是对学习TDD持开放态度的人。在目前的情况下,招聘反对TDD的开发人员是不合适的。这样的招聘行为只会导致他们与同事之间的压力,以及增长整个组织负面的状况。因此,可以把TDD和结对编程作为面试的一个步骤。在实施级别薪酬的组织里,把测试自动化和代码重构作为确定级别的一部分指标。 下一集,作为开发者,如何熟练掌握TDD?
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
9:00
Subscribe
Share
如果14到22集里TDD 的IT戏剧一样,一旦你找到了具备测试驱动开发实施能力和可以积极驱动这件事的人选,那么你就占到了起手。我们会回顾Vanilla Pop让他的团队实施TDD的一些步骤,同时也会增加一些我认为很有效的小贴士。 步骤一、寻找火花 寻找一个思维灵活、而且资历也比较高能影响到团队其他人的人选。让他们积极地在样本代码上试验学习TDD,之后在实际工作中开始应用。 另一个策略,是雇佣一个有敏捷软件开发经验的开发者,通常被称为敏捷技术教练或是XP教练。让他参与几次团队的设计冲刺。敏捷教练,比如我自己,有十多二十年使用不同编程语言全栈实施TDD的经验,因此帮助你的团队在几天内改变编程模式,并不是难事。 步骤二、让火花称为火焰积极地研究学习团队工作中所写的代码 教会每个开发者如何结合自己的用户故事来实施TDD。在几轮设计冲刺中进行结对编程,这样你的开发人员就能得到足够的指导,了解如何自己解决最有挑战的微测试问题,就这样让火花燃烧起来。一开始会有些难度,大家也会学习如何删除、改变已有代码,运用新学到的设计模式以便更方便地添加微测试。 减少发布的压力,使每个团队成员都能有时间学到让他们能够产出产品功能的技能。举例来说:让团队决定来做更少的用户故事,这样他们能够为代码提供更多的微测试。另一种方法,是选择一个故事,以结对编程的方式来实施TDD。然后在下几轮的冲刺中,继续这样的方式,直到每个人都能在他们的日常工作中都操练过一些TDD。 40/4挑战,以及永远停留在初级阶段的危险 使用社交化帮助团队操练,讨论微测试在站立期间所取得的成就。 步骤三、投入,让壁炉的火焰更旺获取管理层支持 同他们交流在全部产品代码中使用TDD的愿景。选择两个月后的某时间,让团队讨论使TDD成为主流的产品标准。让产品的微测试工作更加透明 公开每天新增的微测试数量。讨论但不要吹嘘有站立会里有多少交付的微测试。在连续整合服务器的面板显示有关的数据是个好主意。 停止抱怨自动化测试。开发者很快就会开始指责“新事物”减缓了进度,而且看似没有多少好处。每个人都知道学习需要时间。在开始学习这个方法的前两个月,速度减慢是正常、普遍的现象。抱怨正常出现的现象,只会让管理层有所顾虑,担心团队的不安。为了度过这一阶段,我建议关注学习新技能积极的一方面,与组员分享减慢速度后所学到的新事物。之后,速度就会回升,变得更快,但学习的过程必不可少。 在设计冲刺回顾中讨论微测试工作,这样你的组员就会知道他们需要为产出持久的价值负责。利益相关方也要了解到团队的新方法。 步骤四、保障燃料的持续供给 团队工作协议应该把处置未通过的测试作为优先任务。唯一一个更重要的事情,是产品的应用交付。在测试未通过时,有关的人员或者结对小组,应该停下来了处理这个问题。 新增且没有单元测试的代码,应该被删除,就像未通过审阅的代码一样。 对交付应用的代码进行结对编程(定义交付应用代码)。 如果两个月之后,团队对于新代码的使用上还有问题,反思这一情况出现的原因,这种情况只可能因为创建的微测试有问题或者开发者没有按有关的流程执行引发。 期待在开始启动TDD的6个月之后,代码几乎不会出现瑕疵,或是同未采用测试时的旧代码相比错误明显减少。错误追踪系统中的数量走势应当相应地下降。 据我的经验,在历史代码上启用TDD一年之后,错误追踪系统已经用处不大了,只是个支持和开发部门间的工作流程罢了。出现的错误应该少于10个。 下一集,让整个组织实施TDD
敏捷理念
022 TDD和Stack Overflow的专家开发者
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
12:32
Subscribe
Share
《黑色敏捷书》简体中文版可在这里购买:https://weidian.com/s/161651986?wfr=c&ifr=shopdetail (《敏捷思维》在背景中播放) Vanilla:呃,你就是Lecter先生吧? Hannibai:Lecter博士。叫我Hannibai就好了。 Vanilla:博士先生,TDD是如何运作的呢,我们可以尝试使用吗? Hannibai:流程似乎非常简单,和开发者熟悉的传统工作流步骤恰好相反。目前我对这样工作的效果比较关注。此外,我还很关注这种工作流的价值。 Vanilla:呃,是的。回到工作流上,你了解这些步骤吗? Hannibai:工作流似乎是,第一步,研究产品代码,发现你想变动的地方。 Vanilla:没错,正是。 Hannibai:第二步,决定具体的设计。考虑是新增方法,还是直接修改已有的代码。 Vanilla:然后呢?关键的步骤是? Hannibai:是的,Clarice。第三步是—— Vanilla:呃,Clarice? Hannibai:请让我继续说,第三步是很有趣的一步。我们并不是直接变动代码,相反,我们会写出—— Vanilla:(很激动地)测试代码! Hannibai:没错,为变动代码所写的微测试。有时候,我们需要改变一个已有的接口,或者写一个新的对象和函数,然后用测试来驱动调用已有代码里的新接口。确定微测试的规格,是实现下一步功能的最简单方法。 Vanilla:(很夸张地)然后呢? Hannibal:第四步,运行微测试,查看是否能通过。观察红色的错误提示。你看见是哪个了没有(严肃地),Clarice? Vanilla:啊哈…… Hannibal:也就是说,微测试的确有可能通不过。但你知道吗,Clarice? Vanilla:啊…… Hannibal: (angrily) There is no sense in writing automated tests that cannot indeed fail! Hannibal:(有些生气的样子)如果所写的微测试100%会通过的话,就没必要写啦! Vanilla True Vanilla:确实如此。 Hannibal:还有第二个原因,你知道不?在我们添加或是修改了产品代码之后,可以观察测试结果由失败到通过的改变。 第三个原因,先写测试,能让你从代码调用者的角度思考。调用代码的人才是新功能的使用者。这不像你自己独自吃掉一个蛋奶酥,很快当。学会用良好的方式编写接口,不可能像吃蛋奶酥一样一下子就好。这一切是一种更高明的代码编写方法。 Vanilla:(觉得尴尬和唐突)呃,好的。听起来挺不错的。我们可以开始了吗? Hannibal:没错。我们把故事分成两部分,一部分要使用TDD,另一部分不用TDD。我们用计时器来测量每个组所花费的精力。 Vanilla:好的,为什么这样做呢? Hannibal:(清了清喉咙)啊,亲爱的Clarice,你看见了没?我们必须了解TDD的确是能节省开发和测试环节时间的。不然何必使用TDD呢? Vanilla:是的,有道理。 Hannibal:计时开始,大家行动吧! (Typing sound. Music. Time passes. Ding.) (打字的声音。音乐。时间过去了。叮。) Vanilla:测试已通过。 …
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
7:08
Subscribe
Share
Vanilla Pop:IT团队怎么样呢?我们可以用TDD来实施一次设计冲刺,然后看看情况吗? Horst:我还是坚持我自己不赞成微测试的政策。不过,我很乐意让团队来自己决定如何才能向我交付功能和质量。 代码狗:我不相信TDD。你不能在写代码之前就先写好测试啊。你知道吗?没人会这样做。你想想,不过几周,就会回到老样子,我称之为错误驱动开发。我们调试代码的人就是这样做的。 架构师:我改变了。请教了专家,建议我尝试一下更为灵活的思维。我努力做得更好。不再强加观点给同事。让团队决定,而不是我自己命令他们。一首叫“Kumbiyah”的歌,我们都开始唱唱好吗?Pop是对的。他向我展示了一种方法,所以,我们需要做的就是开始实施。管理层希望我们带头,实现全部代码100%的微测试覆盖。副总已经签发这件事。会有个连续整合服务器来运行它们。我们只需要实施即可。这就是目前的规矩。好运哈。 Jose:(小声说)呃,灵活思维持续不到5分钟。 Junior Joe:(小声说)你认为那会是个新记录吗? 代码狗:啊,这不会发生的。我们不会真地那么做吧?那是质量控制的事情啊。 Jose:我不知道。Vanilla Pop之前的工作很出色。你看过这些测试没? 代码狗:呃…没有,那是Pop的东西呢。 Junior Joe:我觉得有点眉目了。我支持。 Vanilla Pop:谢谢。 架构师:Vanilla Pop和Junior的覆盖率有40%。这是一个小的也是新的单页应用。代码狗也在做TDD,按我的估计,下周我们可实现100%覆盖。我们努力前进吧,伙计们。 (时间过去了。)星期二,50%。星期三,60%。星期四,65%。星期五,85%。(继续前进!)星期一90%。 架构师:不错!我对代码狗的转变印象深刻。他抓住了TDD的精髓。实际上,他处理的代码块实现了100%的覆盖。我提议给他颁个奖。 代码狗:(吃惊了)哇,谢谢! 各位开发人员:(拍了拍代码狗的背。) Junior:干得好! Vanilla:很自豪能认识你。 Jose:对开发者来说很不错了。 Vanilla:他真地这样做到了。 Horst:这是什么情况?我这样滑动屏幕,为什么什么都看不见呢? 代码狗:(尴尬的样子)我知道这是什么情况。我会调试并修复的。 (关门了) Jose:很奇怪。他的代码是100%覆盖的,却似乎是有错误一样。 Junior:也许是个整合的问题?我审阅了他的代码,并建议他在视图层停止调用I.O.。不大量使用虚构的对象,就没法进行微测试。 架构师:代码狗在哪里?我希望它能适当重构一下代码。他的代码过于占用网络带宽了。 Vanilla:他正在处理一些Horst发现的情况。 架构师:什么?不可能吧!他的代码有100%的覆盖,看看这些漂亮的代码覆盖报告。 Vanilla:是的,真是个奇迹。Junior,你能向大家展示下他的微测试吗? Junior:啊,好的! Vanilla:啊,天呐。图灵的魂魄都会为此震惊的。 Jose:你看看Pop?他不是一个像你这样有个性的开发者。 Junoir:你会认为他的50个微测试什么测试也没做吗?我没有理由不这么想? Vanilla:这些测试是假的。 架构师:这人真不可思议!他只是假装在TDD! Jose:哦,天呐。他居然这样做了。真是疯狂,搞砸了。天呐,糟糕极了! 解说:代码覆盖是分析了解团队的代码自动化进展的好方法。但是如果推进得过快,或是用政策来强制实施,就容易得到虚假的结果。代码覆盖测试工具能让我们了解测试运行的时候哪些代码被执行,但并不能告诉我们自动化的测试是否在起作用。设想一个针对两个数值求和的函数。如果测量代码覆盖时,函数被执行,那么就会有100%的覆盖,但是代码全覆盖并不意味着函数会返回一加一等于二这样的结果。 结对编程或者审阅测试代码可以避免造假。如果你要审阅代码,那么检查微测试代码比检查产品代码更重要。微测试规格体现了开发者的意图。如果微测试质量足够好,那么我们可以相信能通过测试的产品代码也是高质量的代码。 下一集,TDD和Stack Overflow的专家开发者。
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
6:22
Subscribe
Share
Vanilla Pop:看见了没?在写产品代码前先写一小段测试,一切都会非常完美。 Joe:我不知道,我觉得思维上还不太适应这种向后工作的方式。 Vanilla:但这样操作对你来说是很容易的,对吧? Joe:那是自然!我已经从这儿学到了这套方法! Vanilla:(声音听起来不太确定)呃,我们继续结对编程吧。 Joe:你知道吗,我感觉你非常担心的样子。而且,我需要独自工作,不然我会感觉自尊心受伤了。 Vanilla:好的,你都这样说了,那行。 (时间一点点过去了,音乐声配上打字的键盘敲击声。在这天结束的时候,关灯时开关发出了响声,门也砰地一声合上了。) 第二天 Vanilla:我们看看这些测试吧。 Joe:来吧!你会喜欢这些测试的,我还做了一些调整。 Vanilla:呃?我点击测试按钮的时候,停顿了一下,而且…… Joe:(很自豪地说着)弹出了一个对话框! Vanilla:呃…… Joe:是的,这个对话框会询问用户希望往测试中传递什么样的疯狂参数。这样,我就可以用一个测试来取代你的4个测试了。 Vanilla:啊……现在测试时,我需要进行互动才能—— Joe:很厉害不是吗?如果需要进行调试,就都全部准备好了! Vanilla:但是Joe,我并不希望与微测试进行互动。有时候,会有数千个微测试,与它们互动时间上是没法操作的。只需要点击一下,全部的微测试就应该都开始运行了。 Joe:(心碎了)噢!明白了,我来处理吧。 (过了一段时间) Vanilla:为什么今天的测试运行报告比昨天少了一些测试呢? Joe:有些测试不知怎么回事,一直通不过,所以我禁用了一些测试? Vanilla:等一下!你的意思是,我每天都在增加测试,而你开始工作的头几天,你就直接把测试数量减下去了? Joe:这么说,是的。你的测试在我调整了代码之后就不起作用了。 Vanilla:是吗?你应该维护已经提交的测试,不然我们就只能原地踏步。 Joe:但是你把测试设计得太不灵活了。你得同意使用对话框,让用户手动输入测试参数的方法,就像我之前实施的那样—— Vanilla:但是Joe,每个微测试都是针对单一的情景设计的,仅仅就一个情景。这样测试才简单易懂,而且容易维护。 Joe:那如果测试没通过,你希望我怎样处置呢?打开对话框,没错对话框很有用! Vanilla:你需要维护测试,Joe。 Joe:可是我怎样知道哪一部分出了问题呢?是测试还是我的代码? Vanilla:测试的结果会提醒你有情况。这时你需要调查分析,并做出判断:是自己的代码出了问题,还是测试需要更新。 解说:Vanilla Pop正在让组员开始学习TDD。第一个错误,就在于他没有让Joe和他一起结对编程。教育系统培养的开发者习惯自己独立完成任务。而且,很多开发者习惯花费几个小时,自己面对着电脑挣扎,而不愿意与其他同行争执和讨论。这就是我们的本性。这个特性对学习编程其实还是有利的。我们坐在电脑前,独自折腾代码,不断反复,直到变得足够好,最终成功地交付项目。 但还有更好的方式。我们已经不再是学员,而在公司上班的好处,就是这里有很多熟练的开发者。开发者一起工作的时候越多,依靠这种社交方式,一个人的技能就会越快地传递给另一个开发者。如果能实施TDD这样的新流程,速度会明显快得多。结对编程是学会技术实践的好办法,一个秘密武器。不然,Vanilla Pop和初级程序员Joe依靠不断反馈的方式学习,会慢得多。 下一集,代码狗卷入了一场代码覆盖丑闻。
敏捷理念
018 产品负责人不喜欢测试驱动开发 (TDD)
Play Episode
Pause Episode
Mute/Unmute Episode
Rewind 10 Seconds
1x
Fast Forward 30 seconds
00:00
/
6:41
Subscribe
Share
联系: 想成为所有管理者争夺的高端开发者吗?想成为带领公司中最好的团队的经理吗?康美国帮助您将软件开发技能或开发人员的管理技巧提升到新的高度,并提供一些有见地见解的建议。 通过邮件跟我联系,康美国将发给您免费的视频,文章和工作表。有时候我会给您发送关于低成本的学习产品,例如电子邮件课程,书籍以及在线研讨会:http://agilenoir.biz/zh/敏捷理念/ 018 产品负责人不喜欢测试驱动开发(TDD) 解说:Vanilla Pop向产品负责人讲述团队在做的TDD。 Horst:Vanilla Pop,你好!你的工作真做得挺好,公司里新的明星员工。你对现在的工作怎么考虑的呢? VPop:设计冲刺(sprint)计划会议在明天。我主要在为我们团队试验性地实施TDD,而且—— Horst:TDD,是和测试有关是吗? VPop:没错。微测试。我觉得已经可以向整个团队教授如何实施了。才开始的时候会对开发的速度有些影响,但适应了之后速度就会回升。 (脑海里的声音:会减缓一些速度?他确定这样能行吗?) Horst:不好意思啊,Jose不是已经在测试这个App了吗?有人在测试,为什么还要另外再测试呢? VPop:呀,这两种测试是不一样的。Jose所做的是宏测试,有些还是手动的。我们所做的是自动化微测试,只检测代码是否运作正常,而不是产品的功能。 (脑海里的声音:测试代码,而不是功能?到底是什么意思哦?) Horst:抱歉,但Jose进行的测试,不也是在测试代码吗?不是吗? VPop:没错,但这些测试会更详尽地测试一小段代码,代码有没有瑕疵会马上显现出来。 Horst:所以,你的意思是Jose的测试速度很慢? VPop:其实不是。如果说他的测试速度慢的话,主要是慢在我们寻找有问题的代码这一环节。宏测试并不能帮助我们定位代码的问题在哪里。它只能让我们知道代码有问题。 Horst:但是如果你们花费时间,去编写对代码的测试,而我们已经另外有独立测试的时候,听起来有些过度测试的感觉。我更希望你们编写功能性的代码,而让Jose去处理质量控制。 VPop:并不是这样的。如果所有的开发人员都这样做的话,我们可以确保代码零瑕疵。 (脑海里的声音:“零”,他当真说的是零瑕疵吗?他真是疯了!) Horst:如果所有的开发人员都这样做,他们就是在进行重复的多余的测试,而没有把精力花在编写软件的功能上。不行!我们必须保持更快的速度,我们一定要在市场上占据到需要的位置。产品的功能才是重点!(Horst的口号) Every business wants features that keep working and don’t want to pay for bug fixes …