描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302511083
![](https://static.easterneast.com/file/easternspree/img/5e091c635f9849305ddc5801_724534.jpg)
专注于“用户故事”这一灵活、敏捷和实用的需求方法
强调如何用更短的时间开发更符合用户需求的软件应用
揭示如何在不能直接与用户交流的情况下搜集用户故事
精辟阐述如何围绕着用户故事进行全面的规划、进度、估算和测试
诠释用户故事的优势,用户故事与用例、使用场景和传统需求方法的不同
极限编程(Extreme Programming)、Scrum或其他任何敏捷方法的理想搭档
《敏捷软件开发:用户故事实战》的精彩内容:
用户角色建模:理解不同用户角色之间的共性与差异
搜集故事:用户访谈、问卷调查、观察和工作坊
与管理者、培训师、销售人员和其他代理人合作
为验收测试写用户故事
运用故事来排优先级、设进度和估算发布成本
各章末尾包含思考练习题
《敏捷软件开发:用户故事实战》共5部分21章,介绍了如何写出理想的用户故事,造成用户故事不理想的因素有哪些,如何在无法直接接触到用户的情况下有效搜集用户故事,如何对写好的用户故事进行整理、排优先级并在此基础上进行计划、管理和测试。
《敏捷软件开发:用户故事实战》适合采用XP、Scrum甚至其他自主敏捷方法的所有开发、测试、分析师和项目负责人阅读和参考,可以帮助他们以更少的人手在更短的时间内开发出更符合用户需求的产品或服务。
第I部分 开 始
第1章 概述 3
什么是用户故事? 4
细节在哪里? 5
“需要在多长时间内完成?” 7
客户团队 7
使用故事的过程是什么样的? 8
计划发布和迭代 9
什么是验收测试? 11
为什么要改变? 12
小结 13
思考练习题 13
第2章 编写故事 15
独立的 15
可协商的 16
对用户或客户有价值的 18
可估算的 19
小的 20
拆分故事 20
合并故事 22
可测试的 23
小结 24
开发人员的责任 24
客户的责任 24
思考练习题 24
第3章 用户角色建模 27
用户角色 27
角色建模步骤 29
通过头脑风暴,创建初始的用户角色集合 29
整理初始的角色集合 30
聚合角色 31
细化角色 32
两个额外的技术 33
用户画像 33
极端人物 34
如果有现场用户呢? 34
小结 35
开发人员的责任 35
客户的责任 35
思考练习题 36
第4章 收集故事 37
引出和捕捉需求是不适用的 37
一点儿就够用了,不是吗? 38
方法 39
用户访谈 39
问卷调查 41
观察 41
故事编写工作坊 42
小结 44
开发人员的责任 45
客户的责任 45
思考练习题 45
第5章 与用户代理合作 47
用户的经理 47
开发经理 48
销售人员 49
领域专家 50
营销团队 50
前用户 50
客户 51
培训师和技术支持 52
业务分析师或系统分析师 52
如何与用户代理合作? 52
当用户存在但访问受限时 52
当真的找不到用户时 53
你能自己做吗? 54
建立客户团队 54
小结 54
开发人员的责任 55
客户的责任 55
思考练习题 55
第6章 用户故事验收测试 57
在编码之前编写测试 58
客户定义测试 59
测试是过程的一部分 59
多少测试才算多? 59
集成测试框架 60
测试的类型 61
小结 62
开发人员的责任 62
客户的责任 62
思考练习题 62
第7章 好故事编写指南 63
从目标故事开始 63
纵切蛋糕 64
编写封闭的故事 64
约束卡片 65
根据实现时间来确定故事规模 66
不要过早涉及用户界面 66
需求不止故事 67
故事中包括用户角色 67
为一个用户编写故事 68
用主动语态 68
客户编写 68
不要给故事卡编号 68
不要忘记目的 69
小结 69
思考练习题 69
第II部分 估算和计划
第8章 估算用户故事 73
故事点 73
团队估算 74
估算 74
三角测量 76
使用故事点 77
如果用结对编程呢? 78
“敲黑板” 79
小结 79
开发人员的责任 79
客户的责任 79
思考练习题 80
第9章 发布计划 81
我们希望什么时候发布? 82
希望在发布中包含哪些特性? 82
故事优先级排序 83
混合优先级排序 84
风险故事 84
优先考虑基础设施需求 85
选择迭代长度 86
从故事点到预期工期 86
初始速率 86
猜测速率 87
创建发布计划 87
小结 88
开发人员的责任 88
客户的责任 89
思考练习题 89
第10章 迭代计划 91
迭代计划概述 91
讨论故事 92
分解任务 92
认领责任 94
估算及确认 94
小结 95
开发人员的责任 96
客户的责任 96
思考练习题 96
第11章 度量和监测速率 97
度量速率 97
计划速率和实际速率 99
发布燃尽图 100
迭代燃尽图 102
小结 104
开发人员的责任 104
客户的责任 105
思考练习题 105
第III部分 经常讨论的话题
第12章 用户故事不是什么 109
用户故事不是IEEE 830 109
用户故事不是用例 112
用户故事不是场景 115
小结 117
思考练习题 117
第13章 用户故事的优点 119
口头沟通 119
用户故事容易理解 121
用户故事的大小适合于计划 122
用户故事适合迭代开发 123
故事鼓励推迟细节 124
故事支持随机应变的开发 124
用户故事鼓励参与式设计 125
故事增强隐性知识 125
用户故事的不足 126
小结 126
开发人员的责任 127
客户的责任 127
思考练习题 127
第14章 用户故事的不良“气味” 129
故事太小 129
故事相互依赖 130
镀金 130
细节过多 131
过早包含用户界面细节 131
想得太远 132
故事拆分太频繁 132
客户很难对故事排列优先级 132
客户不愿意写故事并对故事进行优先级排序 133
小结 134
开发人员的责任 134
客户的责任 134
思考练习题 134
第15章 在Scrum项目中使用用户故事 135
Scrum是迭代式和增量式的 135
Scrum基础 136
Scrum团队 137
产品待办列表 137
Sprint计划会议 138
Sprint评审会议 140
每日Scrum站会 140
在Scrum项目中加入用户故事 142
用户故事和产品待办列表 142
Sprint计划会议中使用用户故事 142
Sprint评审会议中使用用户故事 143
用户故事和每日Scrum站会 143
案例学习 143
小结 144
思考练习题 145
第16章 其他主题 147
处理非功能性需求 147
纸质还是软件? 148
用户故事和用户界面 150
保留故事 152
用户故事描述bug 153
小结 154
开发人员的责任 154
客户的责任 154
思考练习题 155
第IV部分 一个完整的项目案例
第17章 用户角色 159
项目 159
识别客户 159
识别一些初始角色 160
聚类与细化 161
角色建模 163
增加用户画像 164
第18章 故事 165
Teresa的故事 165
Ron船长的故事 168
初级海员的故事 168
非海员礼品购买者的故事 169
报表查看者的故事 169
一些管理员的故事 170
结束 171
第19章 估算故事 173
第一个故事 174
高级搜索 176
评分和评价 177
账号 177
完成估算 178
所有的估算 179
第20章 计划发布 181
估算速率 181
对故事进行优先级排序 182
完成的发布计划 183
第21章 验收测试 185
搜索的测试 185
购物车的测试 186
购买书籍 187
用户账号 188
管理 188
测试约束 189
最后一个故事 190
第V部分 附 录
附录A 极限编程概述 193
附录B 各章思考练习题参考答案 203
参考文献 217
在20世纪90年代中期的大部分时间里,我都感到愧疚。我当时正在为一家公司工作,这家公司每年都会收购一家新公司。每次收购一家新公司,我都会被分派去负责打理他们的软件开发团队。收购的每个开发团队都带来了辉煌、美观、冗长的需求文档。我不可避免地感到愧疚,因为我自己的团队从来没有写出过如此优美的需求规格说明。但是,我的团队在生产软件方面一直比我们收购的团队成功得多。
我清楚我们成功的方法。然而,我总有一种难以名状的感觉,如果我们能写出大而冗长的需求文档,我们可能会更加成功。毕竟,那正是我当时正在阅读的书籍和文章中所描述的做法。如果成功的软件开发团队都在编写华丽的需求文档,那么看起来我们也应该这样做。但是,我们从来没有时间做。我们的项目总是太重要,需要我们尽快启动,以至于我们从一开始就没有时间来写文档。
因为我们从来没有时间写美观而冗长的需求文档,所以我们决定采用一种工作方式来与用户沟通。我们不是把需求写下来,让它们来回传递,并在时间不够用的时候还在谈判,而是和客户交谈。我们会在纸上绘制界面样例,有时候会创建原型,通常我们会写一些代码,然后向预期用户展示我们编写的内容。至少每月一次,我们会邀请一组具有代表性的用户,并向他们演示我们开发的功能。通过贴近用户并向他们演示小的增量进展,我们找到了一种方法来帮助我们在没有美观需求文档的情况下取得成功。
尽管如此,肯特•贝克(Kent Beck)仍然感到愧疚,认为我们没有按照我们应该的方式去做事。
1999年,肯特•贝克的革命性小册子《解析极限编程》出版发行。一夜之间,我所有的愧疚荡然无存。终于有人提出了开发人员和客户之间用讨论取代“写文档-商谈-再写文档”的模式。肯特阐明了很多事情,并带给我很多新的工作方法。但是,最重要的是,他证明了我从自己的实践中领悟到的是正确的。
大量的前期需求收集和文档可能在多方面导致项目失败。最常见的一种情况是需求文档本身成为软件开发的目标。需求文档只有在能够帮助实现交付某些软件的真正目标时才应该编写。
大量的前期需求收集和文档可能在多方面导致项目失败的第二种情况是书面语言的不准确性。我记得很多年前听到过一个小孩洗澡的故事。小孩的父亲已经在浴缸中放满了水,正准备帮助他的小孩进入水中。这个小孩大概两三岁,先把脚趾头伸入水中蘸了一下,然后迅速将脚趾移开,并告诉她的父亲“让它暖和一些”(make it warmer.)。父亲把手伸入水中,惊讶地发现水不是太冷,已经比他女儿习惯的温度更热了。
父亲思索了一下孩子的请求,意识到他们的沟通出现了问题,用相同的词语来表示不同的意思。孩子“让它暖和一些”的请求被任何成年人都解释为“调高水温”(increase the temperature)。然而,对于孩子来说,“让它变暖”意味着“让它接近我认为暖和的程度”。
文字,尤其是白纸黑字那样的,通过它来表达软件这样复杂东西的需求,是比较简单有限的载体。由于它们可能被误解,所以我们需要用开发人员、客户和用户之间频繁的对话来取代书面文字。用户故事为我们提供了这种方法,让我们写下来足够多我们不会遗忘的内容,并且我们可以估算和计划,同时还鼓励及时沟通。
读完本书的第I部分时,你将准备开始改变总是严格写下每一个需求最后细节的工作方式。读完本书的时候,你会知道在具体环境中实施故事驱动过程所有的必要信息。本书分为四个部分和两个附录。
第I部分“开始”,描述开始编写故事需要了解的一切。用户故事的目标之一是让人们说话而不是写作。第I部分的目标是尽快让你交谈。第1章概述了什么是用户故事以及如何使用故事。接下来的章节提供了编写用户故事,通过用户角色建模收集故事,在无法访问实际最终用户时编写故事以及测试用户故事的更多细节。第I部分的结尾部分提供了一些指导方针,可以用来改进用户故事。
第II部分“估算和计划”,有了一系列用户故事后,我们经常需要回答的第一件事是“需要花费多长时间来开发?”。第II部分介绍了如何使用故事点来估算故事,如何在3~6个月的时间范围内计划发布,如何更详细地计划随后的迭代,最后如何度量进度并评估项目是否按照既定的意愿进行。
第III部分“经常讨论的话题”,首先描述故事与用例,软件需求说明和交互设计场景等需求方案的不同之处。随后探讨用户故事的独特优点,如何判断出现问题的时间,如何调整敏捷过程Scrum以使用故事。最后一章着眼于各种小问题,例如是否在纸质卡片或者软件系统中编写故事以及如何处理非功能性需求。
第IV部分“一个完整的项目案例”,一个扩展的例子,旨在帮助归纳用户故事的所有内容。如果说开发人员可以通过故事更好地理解用户的需求,那么本部分的完整示例是非常重要的,这个示例将展示用户故事的各个方面及其结合方式。
第V部分“附录”,用户故事源于极限编程。阅读本书之前不需要熟悉极限编程。附录A提供了极限编程的简要介绍。附录B包含对各章结尾思考练习题的解答。
在这一章里,我们将介绍如何编写故事。为了创建好的故事,我们需要关注六个特征。一个好的故事应该具备以下特征(INVEST):
独立的(Independent)
可协商的(Negotiable)
对用户或客户有价值的(Valuable to users or customers)
可估算的(Estimatable)
小的(Small)
可测试的(Testable)
《极限编程》(Extreme Programming Explored)和《重构实践手册》(Refactoring Workbook)的作者比尔•威克(Bill Wake)建议用单词首写字母缩写INVEST指代这六个特征(Wake 2003a)。
独立的
我们应该尽量避免故事之间相互依赖。故事间的相互依赖会导致优先级排序和计划出现问题。例如,假设客户选定了一个高优先级的故事,而这个故事却依赖于一个低优先级的故事,这样就会产生问题。
故事间的相互依赖也会使估算变得更加困难。例如,假设我们在BigMoneyJobs网站上工作,需要编写故事:公司如何为在网站上发布职位进行付费。我们可以写出如下这些:
1.公司可以用Visa信用卡对发布职位进行付费。
2.公司可以用万事达信用卡对发布职位进行付费。
3.公司可以用美国运通卡对发布职位进行付费。
假设开发人员估算需要3天的时间来支持第一种信用卡(不管它是哪种),然后给第二种和第三种各分别需要1天。对于像这些有相互高依赖关系的故事,你不知道如何对每个故事进行估算—哪个故事应该给3天的估算?
当故事间出现这种依赖时,有两种应对方法可以避免。
将相互依赖的故事合并成一个更大但独立的故事。
寻找一种不同的方式来拆分故事。
将不同种类的信用卡合并成一个独立的大故事(“公司可以使用信用卡对发布职位进行付费”)是不错的,因为合并后的故事只需要5天时间。如果合并后的故事花费的时间要比这长得多,通常一个更好的方法是找一个不同的维度来拆分故事。如果对这些拆分后故事的估算时间更长,那么另一种拆分方法如下:
1.客户可以用一种信用卡支付。
2.客户可以用另外两种信用卡支付。
如果你不想将这些故事合并在一起,并且无法找到一个很好的方法来拆分它们,那么你还可以采用简单的方法,即在故事卡上放两个估算值:较高的估算值给二者之间必须在前面完成的故事,较低的估算值给后面接着要完成的故事。
可协商的
故事是可协商的,它们不是签署好的书面合同或者是软件必须实现的需求。故事卡是对功能的简短描述,其细节是在客户和开发团队之间的对话中协商产生的。因为故事卡本身并不是详细的需求,而是用来提示客户和开发团队进行对话的,所以它们不需要包括所有相关的细节。然而,在编写故事的时候,如果一些重要的细节是已知的,那么就应该把它们包括在故事卡的注释中,如故事卡2.1所示。挑战在于如何掌握包含“足够”的细节。
公司可以用信用卡支付发布职位的费用。
注释:接受Visa信用卡、万事达信用卡和美国运通卡。考虑美国发现卡。
故事卡2.1 一个注释了额外细节的故事卡
故事卡 2.1是一个不错的故事卡,因为它提供了适量的信息供开发人员和客户讨论。当一个开发人员开始编码实现这个故事时,故事卡会提示她必须支持三种主卡(Visa信用卡、万事达信用卡和美国运通卡),同时她也可以询问客户是否已经决定接受美国发现卡。卡片上的注释可以帮助开发人员和客户恢复之前中断的对话。理想的情况下,不管是原来对话的开发人员和客户,还是其他的开发人员和客户,对话都应该能够恢复。把细节加入故事时,应该以此为指导原则。
另一方面,让我们思考一个带有太多注释的故事,如故事卡2.2所示。这个故事有太多的细节(“收集卡片的过期月份和日期”),还结合了一个单独的故事(“系统可以存储一个卡号供将来备用”)。
公司可以用信用卡支付发布职位的费用。
注释:接受Visa信用卡、万事达信用卡和美国运通卡。考虑美国发现卡。当支付金额超过100美元时,需要提供卡背面的ID号。系统可以根据卡号的前两位数字识别客户使用的是何种类型的信用卡。系统可以存储卡号以备将来使用。收集信用卡的过期月份和日期。
故事卡2.2 细节过多的故事卡
处理故事卡2.2这样的故事是非常困难的。大多数读者在阅读这种故事时,会错误地关注本不应该关注的细节。然而,在许多情况下,过早指定细节只会产生更多的工作。例如,如果两个开发人员讨论和估算一个简单的故事“公司可以用信用卡支付发布职位的费用”,开发人员知道他们的讨论有点抽象,他们不会误以为他们的讨论是明确的,或者他们的估算是准确的,因为缺少太多的细节。然而,如果向故事卡中添加更多类似故事卡2.2中的细节,关于这个故事的讨论就有可能变得更加具体和真实。但这可能会导致错误的判断:故事卡反映了所有的细节,没有必要再与客户进一步讨论这个故事了。
如果我们把故事卡看作是开发人员和客户进行对话的一种提示,那么故事卡中包含如下信息就是很有价值的。
用来提示保持开发人员和客户对话的一两句话。
在整个对话期间待解决问题的注释。
已经通过对话确定的细节将变成测试。如果使用纸质故事卡,我们可以在故事卡背面注明测试内容,如果使用电子系统,可以标注在合适的地方。故事卡2.3和故事卡2.4展示了故事卡2.2中的过多细节如何变成测试,用于提示对话的注释可以留存在故事卡正面。这样,故事卡的正面包含故事本身和关于相关问题的注释,而卡片的背面则包含用于验证故事是否像预期的那样,以测试形式体现的故事细节。
公司可以用信用卡支付发布职位的费用。
注释:我们需要接受美国发现卡吗?
UI注释:不需要专门的字段来输入信用卡类型(可以从信用卡号的前两位来获得该信息)
故事卡2.3 修正后的故事卡正面(只有故事和需要讨论的问题)
评论
还没有评论。