关于用户故事

用户故事拆分方法总结 用户故事从用户的角度描述用户功能,它是一种轻量级、灵活的管理需求的方式。拆分用户故事,是敏捷开发过程中的一项重要的活动。遵循INVEST原则,参考通用的拆分方法,通过在日常工作中练习,你一定能做好。... 阅读详情

关于用户故事

用户故事,User Story,这个词儿来自于敏捷方法Scrum。到底什么是用户故事,因为近期重拾Redo一些项目方面和产品方面的工作,来整理整理相关知识。用户故事与另外几个概念,如用户故事切分、用户故事地图、用例、场景,都有啥关联或关系呢。

1、什么是用户故事

1.1 用户故事

用户故事,User Story。这是一个从属于产品设计的概念,它所指的,是从用户的角度来描述用户需求,要使用用户可以理解的业务预研来描述、切忌使用技术术语。

意即:

  • 角色:谁
  • 活动:需要做什么
  • 价值:为什么

用一句常见格式来描述,即:

As a role, I want goal/desire so that benefit.

或

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

用户故事要点(Ron Jeffries,3C):

  • 简述:用卡片(Card)来简要描述故事。
  • 细节:与Product Owner(或客户)交谈(Conversation)来明确细节。
  • 确认:验收评审,确认(Confirmation)被正确完成。

1.2 用户故事切分

故事有大小、长度,如何编写一个用户故事、才算得上好的用户故事?
它应该遵循INVEST原则:

  • 独立性(Independent):尽可能让一个用户故事独立于其他用户故事,解除相互依赖性,便于确定优先级、评估工作量。可以通过组合、分解的方式来达到“独立性”的目的。
  • 可协商性(Negotiable):这个用户故事的内容可以协商,是一个简短的描述,而具体细节在沟通阶段产出,避免过多的细节限制了与用户的沟通。
  • 有价值(Valuable):这个用户故事,必须对客户具有价值,因此应该站在用户的角度去编写,描述的是一个一个的feature,而非一个一个的task。
  • 可以估算性(Estimable):这个用户故事,优先级、工作量、安排计划,都是可行的,以减少评估上的不确定性。
  • **短小(Small):一个好的用户故事,可评估的工作量要尽量短小,确保在一个迭代周期内可完成。用户故事越大、风险越大。
  • 可测试性(Testable):这个用户故事可以测试以确认是可以完成的,所以必须在定义了验收测试通过的标准后才能认为故事划分完毕。

为了保证用户故事的颗粒度,上面说到了组合、分解的方法,我们也可以灵活应用,目标就是为了让产出的软件能够(Rachel Davies):

  • 能够工作
  • 交付价值
  • 能有效地得到用户的反馈

对于用户故事切分,不同的前辈也总结出一些更多的进一步的方法可供借鉴。

  • Richard Lawrence方法:

    • 根据工作流程的步骤来切分故事
    • 让业务规则中的每种变化都是其自身的故事
    • 切分“实现第一个[x]”,然后“实现其他的[x]”
    • 复杂故事中,将最简单的版本切分为单独的故事
    • 通过故事所操作的数据类型来切分
    • 通过简单数据输入方法和复杂方法之间的区别来切分故事
    • 当前故事的性能转移到一个或多个新故事
    • 按照CRUD(创建/读取/更新/删除)来切分
  • Bob Hartman方法:

    • 根据角色来切分
    • 将高风险和低风险的分离
    • 在每个故事上工作的开发者数量最大化
  • Rachel Davies对于根据输入/输出的数据来切分故事的方式提供了一些细节处理方法:

    • 可以为每个输入页面创建故事
    • 可以为输入页面每个可用元素创建故事
    • 可以创建简单的UI(简单≠漂亮)
    • 可以创建一个命令行界面

1.3 用户故事地图

当我们开始进行一个产品或者项目规划的时候,首先需要梳理出一个backlog,在其中按照优先级列出所要实现的场景和具体功能。

而用户故事地图就有这么一种功效。
这里写图片描述
这里写图片描述
用户故事地图,代表一个完整的用户故事。其核心是一条从左到右的时间线(横轴),以及其下的自上而下的必要程度线(纵轴)。

  • 时间线(横轴,从左到右)

    • 在时间线的上方防止最大粒度的内容(可理解为Epic 史诗,即比较大的User Story);
    • 在时间线的下方放置二级粒度的内容(可看做backlog item,即待办列表项);
    • 在二级粒度内容的下面放置三级粒度的内容(即切分好的用户故事,可作为User Story Task)。

以上形式可以灵活按照实际产品情况进行削减,去掉Epic、将backlog item移到时间线上面。

  • 必要程度线(纵轴,自上而下)

用户故事地图的纵轴,而对于上述的Task(最小用户故事),按照必要程度、重要程度自上而下往下排列。

通过这种方式的划分,可以制定backlog及task用户故事的优先级,并安排迭代周期、迭代版本及对应任务。

大家一定多多少听过MVP,即Most Variable Product 最小化可用产品。这个概念,源于《精益创业》(埃里克·莱斯),有一定了解的朋友一定知道,MVP的目的是以最小的投入发布对用户有价值的产品,帮助我们快速试错,并通过不停的迭代最终找到产品的正确方向。

2、用户故事与其他相关概念

2.1 用例

Use Case

User Story关注的是业务场景和用户故事,更倾向于以用户角度描述响应业务功能的业务价值。用户故事会比较简单,重点是把业务需求和场景(或含业务价值/商业价值)说清楚即可。

而Use Case 用例,它包含了有业务用例和系统用例。其用例建模比较复杂,会涉及到业务流程、业务规则、输入、输出、界面和交互等等。

用户故事与用例里面的业务用例有点类似。但是,用户故事的粒度往往比用例的粒度更细化,如用例中的基本流、扩展流、业务规则都可能转化为用户故事(见上面“1.2用户故事切分”)。

还有一种比较明显的思维/角色/对象上的区别。用户故事从产品角度、业务场景看待,重在用户使用产品的目的/任务/流程/情节等等;而用例面向需求人员和开发人员,重在逻辑、次序。

2.2 场景

Scenario

Scenario 场景,有两拨人在用,当然,他们所指的含义也不一样。

  • 交互设计师(如Alan Cooper)
    • 在RUP(Rational Unified Process)中已有辨析:“场景”在 RUP 内部指用例实例,即只是一个经过可能的基本流和备选流的特定“路径”(即Cockburn所说的“一个行为序列”)。
  • 需求分析师(如Alistair Cockburn)
    • 在以用户为中心的设计方法和用户界面设计方法中常常将“场景”描述为使用经历(Cooper就这么做),这实际上包含了更多的细节,而不仅局限于事件流。虽然该附加信息可能与后来的设计阶段无关,但它对于了解用户、任务和环境却必不可少。

因此,场景可以在业务建模工作流程中广泛应用,但是在需求工作流中,重点则转移到用例上。

Alistair Cockburn:“用户故事”相当于“场景”的标题,而“用例”则是多个“场景”内容的集合。



参考:

百度百科:user story

泽众软测:User Story

知乎:User Story与Use Case的异同;User Story与Use Case是偏等价关系

新浪博客: User Story Mapping初体验;任务、用例、用户故事和场景

人人都是产品经理:创建用户故事地图



用户故事讲解(看最后的例子,你应该就知道怎么样写用户故事了) 一、什么是用户故事 用户故事描述了对用户、系统或软件购买者有价值的功能。一个好的用户故事包括三个要素: 1.角色:谁要使用这个功能。 2.功能:需要完成什么样的功能。 3.价值:为什么需要这个功能,这个功能带来什么样的价值。 二、如何编写用户故事 故事应该很清晰地体现对用户或客户的价值,最好的做法是让客户团队来编写故事。客户团队应包括能确定软件最终用户需求的人,可能包括测试者,产品管理者,真实用户和交互设计师。因为他们处于描述需求的最佳位置,也因为随后他们需要和开发者一同设计出故事细节并确定故事优先级。 为 阅读详情

相关推荐

用户故事地图

用户故事地图 用户故事是描述用户需求分析的一个好方法,可以将backlog变成一个二维地图,从而容易看到整个规划的全貌,帮助开发人员快速的了解客户的需求,并确定产品模块的实现优先级,实现最大用户价值,学会讲一个好的用户故事是很有用的。 一个基本的用户故事包括三个要素:角色、活动、商业价值,其固定的描述格式:作为什么角色,要进行什么活动,才能实现什么商业价值。这个固定语句格式,只是了解用户故事的

zhaole524的专栏 5557

敏捷开发中史诗故事与用户故事的颗粒度

作者:陈勇       出处:blog.youkuaiyun.com/cheny_com       用户故事的颗粒度一直是一个谈论已久的话题,但参加了很多研讨会,搜索了很多网络资源后发现一直没有定论,只好在这里原创一下。 前言:为何需要讨论用户故事的颗粒度 其实需求颗粒度的问题由来已久,即

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+

什么是用户故事

# 一、 什么是用户故事? ## 一、用户故事的概念 概念这种东西我喜欢说文解字的方式去理解和阐述;用户故事=用户+故事=人+故+事,那就是一个人因为什么原因要做什么事,提炼出来三要素就是who、why、what。从需求角度描述就是一个用来确认用户和用户需求的简短描述。 ## 二、用户故事的三要素 用户故事在软件开发过程中被作为描述需求的一种表达形式。为了规范用户故事的表达,便于沟通,用户故事通常的表达格式为:作为一个<用户角色>, 我想要<完成活动>, 以便于<实现价

jackey_sdc的博客 1896

划分用户故事(user-story)的原则

在敏捷开发过程中是通过用户故事来将需求具体化成可以进行迭代开发的一个个现实的可见的开发任务。因此在敏捷软件的开发过程中,用户故事的划分对于迭代和开发起着举足轻重的作用。 用户故事从其名字来看是站在用户的角度所描述的故事,同时也是用户所能看懂的故事,开发人员最容易犯下的一个错误就是站在自己的角度去思考和划分故事,这样就背离了用户故事的初衷。 那什么是用户故事?首先来说用户故事是对需求的细

rxr1st的专栏 2万+

讲故事的用户故事样例之1

曾几何时开始,用户故事的写法成了 用户故事经典句式+验收条件。 在https://blog.versionone.com/agile-acceptance-criteria/ 上提供了如下一个故事的样例。As an executive, I want to be able to filter the dashboard by department so that I can isolate dat

高效软件开发 5618

如何写好用户故事?

“什么是用户故事?为什么要写用户故事?用户故事可以带来哪些优势?” 在创建产品线路图或用户故事地图之后,就可以着手编写用户故事了。如何将产品线路图或者用户故事地图中的需求细化、拆分、编写用户故事,并让其更容易管理,比如:工时评估、优先级排序等等,本篇文章将会详细介绍。 01 什么是用户故事? 用户故事是从用户角度描述产品业务需求的一种方法, 它是敏捷框架中最小的工作单元。它的主要目是让业务人员和技术团队都可以理解需求。用户故事是一种清晰、有效定义产品需求的方式,并可以避免或.

m0_60202396的博客 2679

敏捷工具:用户故事地图梳理需求全景

文长:2770字时长:8分钟针对人群:用户体验设计师,业务分析师,产品经理,研发工程师1 概念什么是用户故事:迭代开发的一种工具代表了可开发的一个工作单元帮助我们跟踪一...

hailang2ll的专栏 3323

用户故事与敏捷方法—一些用户故事(实战二)

为了生成初始的故事清单,团队决定召开一次故事编写工作坊。团队决定从一个特定的用户角色或者虚构人物开始写出团队所能想到的所有故事,然后考虑下一个角色或者虚构人物。 Teresa的故事 团队决定从识别出的虚构人物Teresa入手。 故事卡1:用户可以使用作者、数名或者ISBN搜索书籍 故事卡2:用户可以查看书籍的具体信息。包括出版日期、内容简介、页数 故事卡3:用户可以把书籍放进“购物车”,...

ChibiMarukoChan的博客 1304

敏捷Agile: Epic vs UserStory vs Task

Epic-Story-Task Epic Epic是User Story逻辑上的集合, 一个Epic可以被break down成多个小的User Story; 一个Epic可能需要多个Sprint才能完成. User Story vs. Task 在JIRA中,User Story与Task可以算作同一级别,其中 User Story 可以代表一个user feature, 一个有user va...

邮箱 rex.guan@outlook.com 8606

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1654

用户故事,史诗故事和主题故事

本文转自:scrum中文网 文章链接:http://www.scrumcn.com/agile/scrum/18871.html 敏捷团队喜欢以一种刚刚好的方式处理需求。我们采用最低限度地、逐渐细化并保存在产品待办项(Product Backlog)中的特性描述文字,来替代传统长篇大论的需求文档。 我们发现用户故事是最好的描述方式,这种形式能够捕获到特性足够多的信息,并促进产品负责人和团队在...

Agile_zhanglao的博客 5552

Apache NiFi新手必看:从零开始的数据流设计入门教程(含实战案例)

本文为Apache NiFi新手提供从零开始的数据流设计入门指南。通过实战案例,详细讲解了如何利用这一强大的数据采集工具,以可视化拖拽方式构建自动化数据流,实现从文件监控、内容处理到数据入库的全流程,并涵盖核心概念、环境搭建及生产环境调优要点。

weixin_29066781的博客 149

用户故事与用户故事地图——互联网平台建设

全文包括什么是用户故事、如何讲故事、用故事进行沟通、用故事进行产品设计、用户故事地图、用户故事与用户画像、应用实践七部分。enjoy~ 以下是数字化转型的分享线路图,您现在所在的位置为序号的分享:生态圈建设中,最关键的一部分,载体之平台建设。 以下是正文: 我们开始分享平台设计的用户体验部分,这个是平台建设中,平台的用户体验,是企业全链路精准用户体验...

测试0901-1 1815

深入解析WIFI与蓝牙模块电路设计:从原理到实战

本文深入解析了WIFI与蓝牙模块的电路设计,从核心原理到实战应用。文章以AP6256模块为例,详细拆解了电源树、时钟电路、接口设计及天线射频路径等关键环节,并提供了PCB布局布线的实用准则与调试方法,旨在帮助硬件工程师设计出稳定可靠的无线产品,规避常见陷阱。

weixin_29186249的博客 150

钉钉宜搭低代码开发师高级认证考试题库113题

钉钉宜搭低代码开发师(高级)考试试题题库,多次考试收集整理,判断题,单选题,多选题,排版清晰,查找方便。希望能帮助到大家!!!

qq_40811920的博客 6399

用户故事详解

介绍 在敏捷开发中, 用户故事 (user stories) 是一种轻量级,更灵活的替代品指定软件需求的传统方法 - 软件需求规范,用例规格等。 实际上,可以说用户故事是最重要的敏捷开发 (Agile Development) 中的工件 (Artifacts),因为它是主要将值流传递给用户的容器,敏捷开发就是快速实现价值 (Value)。 用户故事也可以作为我们整个增量价值交付 (increm...

Warren Lynch 的博客 2万+

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 944

如何编写用户故事

在 LLM 时代,用户故事的编写应始终优先聚焦于问题定义,即角色-价值对,避免直接陷入解决方案的细节。通过有效地拆分用户故事,设计合理的整体解决方案和用户旅程,能够确保开发工作始终围绕用户的核心需求展开。

pumpkin84514的博客 1537

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2585

基于扩散模型的图像去噪与修复:原理、实现与性能分析【附核心代码】

扩散模型(Diffusion Models)在图像修复、去噪、风格化、超分辨率等领域的应用,展示了其强大的生成能力和灵活性。通过模拟图像逐步加噪声再去噪的过程,扩散模型不仅能够恢复图像的细节,还能生成高质量的图像。本文详细探讨了扩散模型在图像修复和增强中的应用,并通过具体代码示例展示了如何使用扩散模型进行去噪、风格化、图像超分辨率等任务。扩散模型在图像修复中通过逐步去噪修复损坏的区域,在图像去噪中则能够去除图像中的噪声并保留细节;在图像风格化中,扩散模型通过结合目标风格和内容生成富有艺术性的图像;

一键难忘的博客 2930

用户故事编写指南:写出最贴近用户实际场景的故事

用户故事都会写,但如何写才能更贴近用户实际场景?

minjiekaifa的博客 3705

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

全面解析用户故事地图

昨天一篇文章我们给大家分享了用户故事,这篇文章我们来分享故事地图。什么是用户故事地图?“用户故事”的概念来源于敏捷开发的理念。用户故事是从用户的角度来描述自己渴望得到的特性以及带来的价值。...

liudada8265的博客 6572

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用户故事,什么是用户故事,怎么描述用户故事

用户故事,意为来描述用户渴望得到的功能。包含以下3个要素: 角色 who 要尽可能具体 开发团队不是用户 活动 what 通常每个用户故事都是唯一的 “系统”是暗示的,不会写在故事中 主动,而不是被动(“我可以得到通知”) 价值 value 许多故事可能共享相同的利益声明。 优点可能是其他用户或客户,而不仅仅是故事中的用户。 通常描述方式为: 作为<用户角色>,我要<完成活动>,以便于<实现价值> 例如, 作为<客户>,我想要<扫码登陆>,以便

Demon's blog 1044

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

今天谈谈用户故事地图,不是用户故事

摘要:用户故事地图其实并非是将描述好的用户故事汇总在地图上。而是通过分析、梳理,将用户故事展现出来,进而汇成了一副用户故事地图。

华为云官方博客 1788

敏捷的重要工具——用户故事

敏捷最重要的思想是关注交付价值,如何确定价值?需要沟通,需要新软件的人必需和开发新软件的人充分沟通,一个合适的工具“用户故事”、应运而生。(客户在项目整个过程中全程参与)

u011906276的博客 2990
上一篇: 【转】大企业的敏捷开发
山书生
博客等级 码龄23年 150粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值