Date: 2015-05-04 21:07

一则漫画的启示

遇到的问题

  • 编写严谨、漂亮、详细的文档本身成为一个目标,使用越来越冗长的文档,尝试用精确的语言来记录越来越多的细节和越来越具体的所谓全面的需求。
  • 语言本身是模糊的,“详细”的需求文档会造成“确定性的幻觉”,让我们以为需求已明确确,最后做出根本不符合预期的产品。
  • 我们发现从MRD到PRD到技术文档,虽然有众多的评审会议,但是其实很多细节都是割裂的不确定的,表面上一派祥和,实则暗流涌动
  • 需求缺陷(requirement defect)比实现缺陷(implementation defect)更加致命,导致的后果就是开发加班和项目延期,甚至开发出一个完全没有价值的产品。

思考

  • 或许需求分析使用固化模板的文档和精确的语言的想法是错误的方向?
  • 需求描述是否不在于复杂,而在于简单?
  • 产品研发是否不在于尽力在前期定义细节,而在于及时响应,开发随需而动(just in time)?
  • 需求传递是否不在于文档,而在于密切的交流?

一种敏捷方法

  • 业界对于这种敏捷方法有很多实践和命名,叫它实例化需求(Specification by Example),或者叫它行为驱动开发(Behavior Driven Development),示意图如下
  • 这个方法的目的是为了保证团队交付正确的产品,其核心是协作制定需求说明、举例说明、可执行的需求、活文档。

用户故事

  • 通过捕捉一目了然的格式一致的用户故事,我们可以掌握足够的信息可以继续前进。
  • 给用户故事排优先级,并且先开发重要的。
  • 按需及时展开,通过交谈获取所需要的细节。
  • 我们产出具有真正价值的软件,成果可以被审核和验证甚至交付使用。
  • 然后我们继续开发后续最重要的用户故事。

用户故事的内容
- As a (role of user), I want (some feature) so that (some business value).
- 我作为(某个角色),想要(某个功能)从而(获得某个业务价值)

用户故事的组成
- card:编写故事描述,用于项目计划并做为需求备注(故事的基本功能)
- conversation:故事的需求细节,通过与用户之间交谈来补充。
- confirmation:决定需求完整的关键因素,由大量测试传递和记录。

用户故事的特点
- 非常强调口头上的沟通(可避免文本需求的多义性)
- 对每个人都容易了解
- 大小刚好适合计划
- 适合迭代开发
- 鼓励延后细节(迅速启动开发,在需要的时候再明确细节)
- 鼓励人人参与的设计

用户故事的编写
- 形式:故事讨论会、1-2个小时、故事卡
- 参与者:业务、PD、PM、设计、开发、测试
- 方法:先确定用户是谁,围绕用户编写故事,不考虑细节、越多越好

可执行的需求

以下示例是基于目前流行的测试框架cucumber实现:

1.PD编写feature文件(用Gherkin编写,支持中文)

# qry_train_ticket.feature
# language:zh-CN
功能:查询车票作为:12306网站的用户想要:查询车票信息从而:获得车次详情和余票数量规则1可查询60以内的余票信息背景:假如我已经完成12306网站的用户注册场景大纲: 查询某一天的车票信息假如 我输入账号和密码完成登录进入车票查询界面当 我在输入<出发地>和<目的地>,选择<出发日>,并点击查询按钮那么 我就可以看到<查询结果>并且 次日车票信息内容如下:
|车次 |出发站 |到达站|出发时间|到达时间|历时|一等座|二等座|备注 |
|G7666|杭州东|南京|19:53|21:22|1小时29分|50|100|  |
|G7358|杭州东|南京|20:29|21:22|2小时55分|60|80|  |并且 60天车票信息内容如下:
|车次|出发站|到达站|出发时间|到达时间|历时|一等座|二等座 |备注|
|G7666|杭州东|南京|19:53|21:22|1小时29分|50|100|暂售至0628|
|G7358|杭州东|南京|20:29|21:22|2小时55分|60|80|暂售至0628|例子:|出发地|目的地|出发日|查询结果||杭州东|南京南|20150504|已经没有余票||杭州东|南京南|20150505|当天车票信息||杭州东|南京南|20150630|60天车票信息|

2.测试编写step文件 (支持Ruby、Groovy、Java等常见语言)

# qry_rain_ticket.rb
假如(/^我已经完成(\d+)网站的用户注册$/) do |arg1|pending # Write code here that turns the phrase above into concrete actions
end
假如(/^我输入账号和密码完成登录进入车票查询界面$/) dopending # Write code here that turns the phrase above into concrete actions
end
当(/^我在输入杭州东和南京南,选择(\d+),并点击查询按钮$/) do |arg1|pending # Write code here that turns the phrase above into concrete actions
end
那么(/^我就可以看到已经没有余票$/) dopending # Write code here that turns the phrase above into concrete actions
end
那么(/^次日车票信息内容如下:$/) do |table|# table is a Cucumber::Core::Ast::DataTablepending # Write code here that turns the phrase above into concrete actions
end
那么(/^(\d+)天车票信息内容如下:$/) do |arg1, table|# table is a Cucumber::Core::Ast::DataTablepending # Write code here that turns the phrase above into concrete actions
end
那么(/^我就可以看到当天车票信息$/) dopending # Write code here that turns the phrase above into concrete actions
end
那么(/^我就可以看到(\d+)天车票信息$/) do |arg1|pending # Write code here that turns the phrase above into concrete actions
end

3.在cucumber环境下执行

4.开发根据step编写功能

象观敏捷之旅-用户故事与敏捷方法相关推荐

  1. 用户故事与敏捷方法阅读笔记03

    今天读完了<用户故事与敏捷方法>的第12章:用户不是什么 用户不是IEEE 830,不是用例,不是场景.读完这一章,我了解到对于任何方法,总会碰到不顺的情况,我们会看看发生问题时的一些不良 ...

  2. 用户故事与敏捷方法pdf

    下载地址:网盘下载 内容简介  · · · · · · <用户故事与敏捷方法>详细介绍了用户故事与敏捷开发方法的结合,诠释了用户故事的重要价值,用户故事的实践过程,良好用户故事编写准则,如 ...

  3. 15.用户故事与敏捷方法——Scrum与用户故事笔记

    00.本用户故事源自于基线编程,所以故事能够很自然地狱基线编程的其他时间形成一个体系.不过,用户故事作为一种管理需求的方法,也可以应用到其他类型的软件过程中. 01.一轮迭代过程是一种持续改进的过程. ...

  4. 用户故事与敏捷方法 - 第十章 迭代故事

    迭代故事 整个团队通过举行迭代计划会议来为下一轮迭代做出计划,客户与团队中的所有人员全部参与.由于团队将仔细研究用户故事,所以毫无疑问他们会有一些问题.需要客户团队随时回答问题. 迭代计划会议的一般内 ...

  5. 《用户故事与敏捷方法》阅读笔记一

    在没有读本书之前,虽然课上老师也讲用户故事,但是其实一直是对这个概念比较模糊,当时的理解就是用户故事就是简单的模拟用户使用软件的情形,也仅仅是模拟用户使用软件的情形,没有什么其他太多的用户.但是读了这 ...

  6. 《用户故事与敏捷方法》阅读笔记三

    用户故事具有多种好处: ①用户故事强调口头沟通:自古以来,口头表达是十分重要的.而且相比于书面书写的易产生歧义,口头表述更见简单明了,需求文档也是如此. ②人人都可以理解用户故事:相比于一些墨守成规的 ...

  7. 用户故事与敏捷方法笔记 --- 用户故事

    用户故事 用户故事描述了对用户.系统或软件购买者有价值的功能. 用户故事应该具备以下特点: 1) 独立的:应该避免故事间的项目依赖.在对故事排列优先级时,或者做计划时,故事间的相互依赖会导致问题. 2 ...

  8. 用户故事与敏捷方法-第一章问题答案

    1.1 用户故事包含哪三个部分 一份书面的故事描述,用来做计划和提示 有关于故事的对话,用于具体化故事情节 测试,用于表达和编档故事细节且可用于确定故事何时完成 1.2 客户团队由哪些人组成? 客户团 ...

  9. 07.用户故事与敏捷方法——优秀用户故事准则笔记

    00.一个更好的办法是换一种方式编写故事,每个故事都提供某种程度的完整(end-to-end)的功能. 01.尽管不十分完美,即使只提供部分功能,但只要发布的功能可以跑,就可以放心地把应用程序发布给用 ...

最新文章

  1. asp遍历前端的所有控件
  2. 自然语言处理期末复习(7)平行文本与机器翻译
  3. SQL中Group By的用法整理
  4. 用html和css布局如下图像,[看书][CSS精粹(第2版)]第三章 CSS和图像 HTML网页布局...
  5. android的ant脚本build.xml自动生成模板
  6. 记录一次浏览器主页被劫持的经历
  7. UI自动化测试篇 :ReportNG替代TestNG自带html版测试报告初探
  8. MySQL 结果集问题(获取不存在表的信息导致的隐藏bug)
  9. Dynamic CRM2013安装系列三、SQL及CRM2013安装
  10. python绘图——坐标轴
  11. 学好英语,才能当个好程序员,英语基础语法总结
  12. u盘文件不显示却占空间
  13. 分类性能度量指标:准确性(AC)、敏感性(SE)、特异性(SP)、F1评分、ROC曲线、PR(Precision-Recall)曲线、AUC曲线,混淆曲线
  14. 目测优衣库董事长只能听到赞扬的声音:3星|《经营者养成笔记》
  15. 关于短视频技术轮廓探讨
  16. 【ZJOJ 5454】【NOIP2017提高A组冲刺11.5】仔细的检查
  17. 【原创】HSV和YCrCb色彩空间介绍
  18. 国有建筑企业数字化转型整体解决方案
  19. 全球光刻机龙头是怎样炼成的
  20. 机房环境监控系统机房守护者!

热门文章

  1. 创建简单demo通用步骤
  2. 三鹿奶粉中的三聚氰胺是什么?三聚氰胺的用途与毒性
  3. css日积月累系列---简易的flex布局使用sass和less 封装版
  4. IT专业人士:Windows 7部署的攻坚兵
  5. Centos使用阿里云源
  6. VSS2005配置错误:The Sourcesafe Web service cannot be accessed at the specified address
  7. 性能监控-软中断出现瓶颈的查看方式
  8. Maria840js面试题:不使用中间变量,交换int型的 a, b两个变量的值
  9. Python学习手册(第4版) pdf
  10. 玩转二叉链表 PTA(JAVA)