大量预先的需求收集和文档会以很多方式导致项目失败。原因如下:

  1. 最常见的是需求文档变成了软件的开发目的。
  2. 记录语言的不准确性,事实上很难用语言把复杂的东西描述清楚。

用户故事的起源

用户故事的起源是来自与XP极限编程的计划游戏环节,据现在能够追查的记录,最早是这样提到“用户故事”的,在1998年,客户通过用户故事(像用例)来定义项目范围。 XP没有把用户故事作为一个单独的实践来说明,而是作为计划游戏中的一个游戏环节。

什么是用户故事

用户故事描述了对用户、系统或者软件购买者有价值的功能。用户故事由以下三方面组成。

  1. 一份书面的故事描述,用来做计划和作为提示。
  2. 有关故事的对话,用来具体化故事的细节。
  3. 验收测试,用于表达和编档故事细节且可以用于验收故事是否完成。

一个好的用户故事包括三个要素:

  1. 角色:谁要使用这个功能。
  2. 活动:需要完成什么样的功能。
  3. 商业价值:为什么需要这个功能,这个功能带来什么样的价值。

格式如下:

作为一个<角色>, 我想要<活动>, 以便于<商业价值>

例如:
作为一个“网站管理员”,我想要“统计每天有多少人访问了我的网站”,以便于“我的赞助商了解我的网站会给他们带来什么收益。”

用户故事的六个特性 - INVEST

INVEST = Independent, Negotiable, Valuable, Estimable, Small, Testable

一个好的用户故事应该遵循INVEST原则。

用户角色建模

在很多项目中,需求分析人员只从一个角度写用户故事,这样往往容易忽略一些故事,因为有些故事针对的并不是系统的一般用户。

虽然使用软件的用户有着不同的背景、持有不同的目标,但我们仍可以把这些单独的客户进行分组,把一类作为一种“用户角色”。用户角色是一组属性的集合,这些属性刻画了一群人的特征以及这群人与系统可能的交互。

角色建模的步骤

  1. 通过头脑风暴,列出初始的用户角色集合
  2. 整理最初的角色集合
  3. 整合角色
  4. 提炼角色

尽量坚持一个原则:用户角色定义的是人,而不是其它外部系统,如果觉得有帮助,可以偶尔确认一个非人物的系统角色。确认用户角色的核心目的是为了让用户对新系统感动满意。

搜集用户故事

四个字,够用就行。可以也要在项目开始前尽可能多的写出用户故事,但并不是要在项目开始前要花费几个月的时间去写用户故事,相反,它要求大家展望未来一个 发布时间,故事发布的时间越往后,我们就不在需要详细的写这个故事,可以用一个占位符来表示,比如:客户说想要一个报表功能。不需要详细的去描述这个功能 (如:用什么样的方式来实现)。

不同大小的网用来捕获不同的大小的需求,第一遍,我们可以用大网眼的网捞一遍需求池,来得到所有大的需求,通过这些大需求对软件形成整体的感觉,接下来使 用网眼稍微小一些的网再来捞一遍,可以得到中等大小的需求,在开始还没有必要顾及那些小的需求。(可能会漏掉一些需求,但不要再去花费的时间捕捞了)

也许在捕捞的时候会漏掉一些需求,因为这个需求对软件来说不是很重要,故事像鱼一样,会长大,也会死亡,根据每轮的迭代的反馈,会向事先不可预知的方向发展,有些需求可以会变的不在重要,甚至已经没有用了;以前漏掉(认为不重要)的需求可能会变的越来越重要。

捕捉用户事故的方法

用户故事验收测试

验收测试提供了确认用户故事是否被完整实现的基本标准,有了这样的标准,我们就知道什么时候某件事算是做完了。

验收测试还是对用户故事细节的补充,因为故事是不包含细节的,为程序员提供了大量有用的信息。所以应该在代码编写前编写验收测试,主要由客户定义测试。

在一个用户故事卡片或者wiki上,以列举要点的形式,把对系统行为的期望结果和实际结果记录下来。这种技术适用于较小的或者简单的用户故事。

优秀用户故事准则

估算用户故事

故事点数是需要实现一个故事所付出时间的相对度量,借鉴于XP(故事这个概念也是如此)。它们应该被用来估算困难程度,而不是承诺一个特定的时间阶段,这样不同的团队规模或是任务上花去的时间就不会影响故事点数”。

发布计划

为了计划一个发布,客户必须排列故事的优先级,可以采用莫斯科(MoSCoW)法则进行排序:

如果客户已经定义好所有故事的优先级,团队为每个故事进行了估算,那么基于团队的开发速率,是很容易算出一次发布的大致完成时间的。

利用发布计划,我们顺利地将粗粒度的故事分配到发布中的多轮迭代。这种层次的计划--不包含很多细节,可以避免给出精确需求的感觉,却足以根据它开始行动。

迭代计划

整个团队通过举行迭代计划会议来为下一轮迭代做计划,客户以及团队中的所有开发人员包括测试人员都要参加,迭代会议的主要内容如下:

用户故事和其它收集用户需求方式的比较

除了用户故事,常见的需求方法有:用例(use case),IEEE 830软件需求规格和交互场景设计。

IEEE 830软件需求规格

IEEE 830是电气与电子工程师协会定义的如何编写软件需求规格的指南,IEEE的建议覆盖了诸如如何整理需求规格文档、角色原型和良好的需求特征等等,其中最让人印象深刻的就是使用句法“系统应该……”。有如下缺点:

其实需求列表最大的问题在于,列表上的项目描述了软件的行为,而不是用户的行为或者目标,需求列表很少回答“但是,如何使用以及为什么有人需要这个功能呢?”

用例

用例(Use Case)是一种描述系统需求的方法,使用用例的方法来描述系统需求的过程就是用例建模。用例方法最早是由Iva Jackboson博士提出的,后来被综合到UML规范之中,成为一种标准化的需求表述体系。

用例是对系统之间以及一个或多个用户之间交互的一般性描述,使用者要么是用户,要么是另外的系统。用例可以编写为非结构化的文本,或者符合结构化的模板。

用例和用户故事的差异主要有以下几个方面:

  1. 范围不同。二者都用来体现商业价值,但故事规模可以设定比较小(例如,10天完成),以便以此为单位安排工作。用例包含的范围可能比故事大得多。
  2. 完成程度不同。James Grenning曾指出:故事卡中的文字“加上验收测试用例就基本等同于用例”,这意味着故事对应于用例的基本流,而故事的测试要求对应于用例的备选流。
  3. 寿命不同。用例通常是持久的工作产品,在产品开发和维护时,用例一直存在。然而,故事通常只存在于实现该故事的迭代中。虽然故事卡可以存档,但是许多团队都将故事卡销毁。
  4. 编写目的不同。用例的目的是记录客户和开发团队的一致意见。故事是为了便于制定发布计划和迭代计划,并作为有关用户需求细节方面的交谈备忘录。

用户画像与用户场景

通常在产品设计过程中会遇到一个问题,你的产品适用于什么样的用户,什么样的场景。简而言之就是什么样的用户在什么场景下使用你的产品。这也是产品经理设计产品最基础的部分,有了这个基础才能去给产品一个明确的定位,从而进行产品功能的规划,页面设计以及用户体验等东西。只有充分挖掘了用户画像和用户场景,产品才能为用户提供价值。

用户故事和场景的主要区别是范围和细节,场景包含更多的细节,它们的范围通常涵盖多个故事。场景的优点和缺点都是它包含了非常多的细节,优点在于有足够多的细节便于理解与开发,缺点在于这样不利于定义优先级和进行进行迭代。

用户故事的优势

用户故事的缺点

用户故事的本质

用户故事本质上就是鼓励沟通,甚至强迫沟通,因为它没有细节,通过持续的沟通,进而基于用户持续的反馈不停的对软件开发进行调整,从而确保最终交付的软件就是用户想要的。

参考文献