指南

如何撰写用户故事(含示例与验收标准)

用户故事是从用户视角对某项功能的简短描述:“作为[某类用户],我希望[目标],以便[原因]。”在它下面,你要写下验收标准,即若干具体条件,只有全部满足,该故事才算完成。每个故事都应小到能一次完成构建和测试,并且写得让任何人都能进行检查。

用户故事是由敏捷软件团队推广开来的,但当你借助 AI 应用构建工具独自开发时,它同样有用。好的故事就是好的提示词。

格式

一个用户故事包含三个部分:

作为 [谁],我希望 [什么],以便 [为什么]。

  • 谁是某一类具体的用户:初次访问的游客、付费会员、诊所前台、管理员。不要只写“用户”。
  • 什么是他们想做的事情,用他们自己的话来说。不是界面如何运作。
  • 为什么是他们所关心的结果。这一部分最容易被跳过,却能防止你做出错误的东西。

示例:

作为健身会员,我希望用手机取消课程预约,以便候补名单上的人可以顶替我的名额,而且我不会被收取爽约费。

“为什么”告诉你“做什么”没有说明的两件事:它必须能在手机上使用,并且涉及候补名单和费用规则。

验收标准

故事说明想要什么,验收标准说明何时算完成。它们应当足够具体,使两个人对每一条是否通过都能达成一致。

常见的写法是 Given / When / Then:

  • **Given(给定)**某个起始情境
  • **When(当)**用户执行某个操作
  • **Then(则)**出现这个结果

以健身预约的故事为例:

  1. 给定我有一个在 12 小时之后的预约,当我点击取消并确认,则该预约被删除,我看到“预约已取消”。
  2. 给定我取消了一个预约,且该课程有候补名单,当取消保存后,则候补名单上的第一位会获得名额并收到邮件。
  3. 给定一个在 12 小时之内的预约,当我点击取消,则在我确认之前,会看到将收取晚取消费用的提示。
  4. 给定我在手机宽度的屏幕上,则取消按钮无需左右滚动即可看到。

普通的检查清单也可以,只要每一项都可以测试。“取消很方便”无法测试,“从预约列表最多点两次即可取消”则可以。

分步骤:写出好的故事

第一步:从真实的用户和真实的问题出发

选定一类用户,以及他们今天正在为之苦恼的事情。如果你做过客户访谈,就使用他们的原话。“我总是忘记取消,结果被扣费”比“添加取消功能”是更好的起点。

第二步:写出一行的故事

填入模板。如果你写不出令人信服的“以便”,就先问问这项功能是否真的需要。

第三步:添加三到六条验收标准

先覆盖主要的成功情况,再覆盖重要的变体:不同的角色、空状态、限制条件、错误。如果你写了六条以上,这个故事可能太大了。

第四步:注明超出范围的内容

一行字就能省去很多反复沟通:“超出范围:付费课程的退款;管理员代会员取消。”这样可以防止故事在你构建的过程中不断膨胀。

第五步:对照 INVEST 检查

INVEST 是衡量好故事的常用检查清单。一个好的故事应当是:

字母含义快速检验
I独立(Independent)无需等待其他故事即可构建
N可协商(Negotiable)描述的是需求,而不是固定的设计
V有价值(Valuable)如果上线,用户会注意到
E可估算(Estimable)你大致能猜出它的工作量
S足够小(Small)能在一次工作中完成构建和测试
T可测试(Testable)每条验收标准都可以检查

你不必给每个故事都打分。当一个故事感觉不对,而你想知道原因时,这个方法最有用。

好与坏的示例

较弱的故事问题更好的故事
作为用户,我希望有一个仪表盘。没有具体的用户,没有原因,无法测试作为店主,我希望在一个屏幕上看到今天的订单和营收,以便一眼就知道今天的生意是否顺利。
作为管理员,我希望数据库有一个状态列。描述的是实现方式,而不是需求作为管理员,我希望能把订单标记为已发货,以便客户不再发邮件询问包裹在哪里。
作为客户,我希望管理我的账户。太大:涵盖了许多功能作为客户,我希望能修改我的邮箱地址,以便收据发送到我的新邮箱。
作为访客,我希望网站速度快。这不是故事,而是每个人都需要的质量要求将它作为每个故事的一条标准写入,或者作为单独的性能目标。

如何拆分过大的故事

大型故事是项目停滞的地方。常见的拆分方式有:

  • **按用户角色。**会员取消自己的预约;员工可以取消任何人的预约。
  • **按流程中的步骤。**浏览课程;预约课程;收到提醒。
  • **先做简单情况。**现在先实现免费课程的取消;费用和退款留给之后的故事处理。
  • **按数据变化。**先支持一个门店,之后再支持多个门店。
  • **先做正常流程,再做错误处理。**先让它正常工作,再添加课程已满、通行证过期等情况的处理。

拆分出的每一部分仍应是用户可以使用并能察觉到的东西。

把用户故事用作提示词

带有验收标准的用户故事,非常接近 AI 应用构建工具的好提示词。它为 AI 提供了谁、什么、为什么以及“完成”的定义。每条消息发送一个故事:

作为健身会员,我希望用手机取消课程预约,以便候补名单上的人可以顶替我的名额。 验收标准:

  1. 在“我的预约”中,每个预约都有取消按钮,并包含确认步骤。
  2. 在课程开始前超过 12 小时取消,只需删除该预约。
  3. 在开始前不足 12 小时,确认前显示“将收取 5 美元的晚取消费用”,并将该费用记录在预约上。
  4. 如果课程有候补名单,第一位候补者获得名额并收到邮件。
  5. 在手机宽度的屏幕上可以正常使用。 超出范围:退款,员工代会员取消。 请先构建这部分,然后在预览中逐条检查验收标准,并告诉我哪些通过了。

你也可以让 AI 根据粗略的想法起草故事,然后由你自己修改:

这是我的应用想法:[两三句话]。请为第一版写出用户故事,按用户类型分组,每个故事附上 3 到 5 条 Given/When/Then 形式的验收标准。标出哪些是上线必需的,哪些可以稍后再做。

务必阅读并修改结果。AI 不了解你的用户,而你了解。

验收标准同时也是你的测试计划。当故事构建完成后,请自己逐条核对每条标准。我们关于上线前测试应用的指南就是在此基础上展开的。

用户故事与其他文档的关系

  • 产品需求文档描述整个产品:问题、用户、范围。用户故事是其中的具体细节。参见如何用 AI 撰写 PRD。
  • 缺陷报告描述的是已经构建完成的某个故事中出现的故障。参见如何撰写好的缺陷报告。
  • MVP 是能够交付核心价值的最小故事集合。参见什么是 MVP。

常见错误

  • **“作为用户……”**太笼统。请写出具体的用户类型。
  • **省略“以便”。**没有原因,就无法做出合理的取舍。
  • 写的是解决方案而不是需求。“我希望有一个下拉菜单”,在没有人考虑设计之前就把设计锁定了。
  • 无法测试的标准。“简单”“快速”“直观”是愿望,而不是标准。
  • 实际上是史诗(Epic)的故事。“管理我的账户”其实是十个故事。
  • **一次性写完所有故事。**详细地写出接下来的几个故事;其余的保留为一行的概要,等到需要时再展开。

Mythex 中的用户故事

在 Mythex 中,Plan(计划) 模式非常适合把想法转化为故事:智能体会在修改任何内容之前先讨论方案。当某个故事准备就绪后,切换到 Build(构建) 并粘贴进去,每条消息一个故事。每完成一个故事后,可以使用 /test 在预览中点击操作并检查流程;如果某条回复的方向错了,也可以用 Revert to this point(恢复到此处) 将其回滚。参见文档中的有效提示词,以及我们关于为 AI 应用构建工具撰写提示词的指南。

用户故事检查清单

  • 写明了具体的用户类型
  • 描述的是需求,而不是设计
  • 包含真实的“以便”原因
  • 有三到六条可测试的验收标准
  • 至少覆盖一种边界情况或错误
  • 说明了超出范围的内容
  • 足够小,能在一次工作中完成构建和测试
  • 构建完成后已逐条检查验收标准

常见问题

用户故事的格式是什么?

常见模板是:作为[某类用户],我希望[某个目标],以便[某个原因]。其后跟随验收标准,即一组简短的条件,只有这些条件全部满足,该故事才算完成。

什么是验收标准?

验收标准是具体、可测试的条件,用来定义用户故事何时算完成。它们通常以 Given / When / Then 的形式书写:给定某个起始情境,当用户执行某个操作,则会出现特定的结果。

用户故事应该多大?

足够小,能够在一次工作中完成构建和测试,同时本身仍然有价值。如果一个故事有五到六条以上的验收标准,或者涉及多个页面,就按用户角色、流程中的步骤拆分,或者先做简单情况,边界情况留到之后再做。

用 AI 构建时,用户故事有用吗?

有用。带有验收标准的用户故事,几乎就是理想的提示词:它说明这个功能是为谁设计的、他们需要什么,以及该如何准确地检查它是否正常工作。每条消息只发送一个故事,也能让 AI 的修改保持小巧,便于测试。

Mythex · Pricing · 用 AI 构建任何东西 · 网站和应用模板 · Mythex 对比 · AI 应用构建术语表 · 免费的 AI 应用构建工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 繁體中文(香港) 繁體中文(台灣)