敏捷开发用户故事系列之八:剖析用户故事描述语法(兼谈不同种类故事的语法)

1、掌握用户故事编制艺术,提升敏捷开发效能 本文深入探讨了用户故事在敏捷开发中的核心作用,从用户故事的基本概念、编写技巧到优先级排序与估算方法,全面解析了如何通过用户故事提升软件开发效能。文章还强调了理解用户视角的重要性,介绍了用户研究、用户角色、同理心地图等工具,并讨论了如何与利益相关者高效协作、细化用户故事以及持续改进产品质量。通过案例研究和专家观点,为读者提供了实用的方法论和最佳实践,帮助团队更好地满足用户需求,实现业务目标。 阅读详情
这是敏捷开发用户故事系列的第八篇。( 栏目目录)
本文内容来自火星人团队对火星人产品中300个用户故事编写后总结的经验和成果,欢迎致力于敏捷开发而又对用户故事感到困惑的开发者参与讨论。
本篇文章尤其适合参加MPD专场“用户故事颗粒度、分类及组织结构”的学员,及参加火星人敏捷开发产品培训的学员。
用户故事中,最有名的就是三段式语法了:“作为一个……(角色),可以……(功能),以便……(客户价值)。”
然而这种语法用于描述用户的业务操作比较方便,但若用于描述非功能性需求(包含重构、缺陷等),或用于描述对功能的增强,则有点力不从心。
让我们来剖析一下用户故事语法,并尝试写一下其他类型故事的语法。

分析

传统用户故事的语法为何得以成功流传10年而没有发生变化?

“因为他们是大师发明的。”

错,因为发明了这个语法,他们才成为大师的,这是因果倒置。

真正的原因是,这个语法很好地表明了需求的三个最重要的要素:角色,功能,客户价值。

角色

为什么要角色?

1. 有利于开发人员理解场景。

普通用户/管理员,存款客户/银行职员,……这些区别,令开发人员更容易理解产品的用途、风格、操作人员的熟练程度、操作习惯等。

2. 有利于找特定的用户核实

无论是产品的潜在用户调研,还是项目中与客户核实需求,如果有一个“角色”字段,都令沟通工作可以与适当的角色地进行,完成的产品自然也就令这些角色的人员满意。

功能(标题)

功能是最好理解的,就是程序员原来写的那种功能的名字,或称为标题。

不过,要放到这种语法里边,还是要动点脑筋的。

1. 主语-谓语原则

比如:(在某个用户管理系统中)“显示所有用户”,就不是一个好功能,为什么呢?把它套到用户故事语法中:

作为一个系统管理员,可以显示所有用户,以便……。

是不是感觉有点别扭?对,应该用“查看所有用户”,会更好一些。

作为一个系统管理员,可以查看所有用户,以便……。好多了。

可是,难道所有用户故事的名字都要和语法中的功能相同吗?不能写一个名为“显示所有用户”,但内容是“作为一个……,可以查看所有用户,以便……。“的故事?

能,但不要这样写,因为这违反了DRY原则。

DRY原则就是Don't Repeat Yourself原则,一件事情不要做两遍,尤其是这种本来就差不多、很容易混淆的事情。

所以,好的功能是以用户为主语的一个谓语。

2. 动宾词组原则

如果连续有用户的新建、删除、编辑、查看,是否可以只写”新建“”删除“?

这是在一次培训中大家实际讨论到的问题。

理论上说在这种场景中可以(有一些小问题),但是在其他时候会遇到大问题。

小问题:”查看“往往分为”查看所有用户Index“和”查看单个用户详情Details“两种,不写宾语不容易区分。

大问题:在故事板、燃尽图、我的个人中心等地方,如果凑巧一个故事需要单独存在的时候,失去了动作的宾语,会出现多个”新建“”删除“故事,容易混淆,不如”新建用户“”删除用户“来得好。

火星人在开发过程中尝试了各种方案,最后最佳结论是:

故事标题=功能;角色-功能是主语-谓语关系;功能本身是动宾词组。

用户价值

用户价值看似简单,其实很难写。

请看:作为一个管理员,可以查看所有用户,以便了解系统中有哪些用户。

看上去还不错,对吧?但是如果这个系统是优快云博客,里边有600万注册用户,这个管理员为什么要查看所有用户?他怎么才能查看所有用户?如果这个系统是QQ,又会如何?

所以一个管理员,不会无缘无故查看所有用户。但是,也不能不查看用户(否则无法查看详情、删除、申诉、找回密码、禁言……),但是,要为管理员找到一个合理的理由,并以合理的方式查看某种用户,才是正确的故事。

实际案例剖析:火星人中新建用户

”作为一个管理员,可以新建用户,以便在系统中新建一个用户。“

好像可以,但又有点像废话。怎么办?

在亲自编写了300个用户故事后,我们发现可以尝试这样:

1. 尝试找到功能的现实用意,然后写出不同于功能的用户价值。

”作为一个管理员,可以新建用户,以便将特定用户添加到火星人系统中。“

不管汤、药如何,读起来顺嘴一些了。

但如果觉得还不够好,请尝试2。

2. 对顽固的不好描述的用户故事,尝试添加一些形容词、副词、壮语,用以描述这种操作的核心价值。

什么叫核心价值?有些操作希望”方便“”快捷“,另外一些则需要”安全“”一致“,这就是核心价值。

”作为一个管理员,可以新建用户,以便快捷地将特定用户添加到火星人系统中。“

恩,好像可以了。但是……如果一个管理员,要一个一个在弹出窗口中新建用户,保存,再新建,再保存……这个功能可能挺快捷,但对最终业务而言,如果有1000个用户要添加,实在谈不上快捷。

所以,请看3。

3. 如果感觉用户故事无法满足核心价值,请尝试改进故事,乃至换一个新故事。

”作为一个管理员,可以批量创建用户,以便快捷地导入已经有的用户数据。“

批量创建比创建快多了,每行一个用户,用逗号分隔用户名、邮箱……可是出了错怎么办?

弹出”输入的数据不符合要求,请检查格式是否正确。“

但如果有1000行,该怎么办?额……请看4。

4. 请验证改进后的用户故事能达成核心价值。

既然要快捷,除了错也应该迅速定位。

这样吧:所有识别成功的用户先暂存起来,所有不成功的行,则留在屏幕上(最多也就是几行),修改后再次识别,直到全部成功;确认后开始批量创建。

这个过程不用写在故事语法里边,因为没地方放。但要写在需求详情/测试用例里边。

好了,这就是火星人产品中”批量创建用户“的辗转经历。

不同种类故事的语法

让我们来尝试为其他种类的故事(非功能性需求)分别编制一套语法。首先解决两个问题:

1. 这种故事有哪些最重要的要素?

2. 如何编写才能突出这些要素?

在编写了300多个用户故事后,火星人团队摸索到了一套自己的编写语法,并预置在火星人产品中(请在8月中旬关注本博客,了解在线体验系统的信息)。

在看具体示例之前,先写一下最后的总结,方便大家理解我们为何识别了这些要素。

语法总结:

1. 角色多数时候是必需的

增强、重构、Bug……都有其受益者或受害者,若没有角色字段,很难站在真是位置上猜想其真实需求,也很难找人核实、询问优先程度。

2. 客户价值(或潜在损失)多数时候是必须的

若不能识别客户价值(或潜在损失),就不能知道增强、重构后是否达到了商业效果,或Bug修正后是否避免了潜在损失。

3. 原来“功能”的位置各不相同。

火星人中的几个实例

由于未必了解这些故事的背景,读者可能不会很清晰地判断故事的好坏,但请重点留意语法格式的作用。

– 实现后 , 作为 一个产品经理, 可以在 查看意向表 时 ,突出地看到本次和上次迭代的意向 表, 以便 连贯地思考本次迭代的需求规划。
在这个实例中,“实现后,作为一个……(角色),可以在……(原功能)时,……(超出的功能),以便……(超出的价值)。”这一语法突出了实现前后的功能差异。(仅限于对功能的增强描述)
增强类型中,一般会暗含一个被增强的功能,但描述内容则是超出的功能和超出的价值。
– 实现前 ,原来的中间为树两侧为迭代的展示方式较为占用空间,树的高度太大导致难以完整看到; 实现后 ,以故事树为主体配合左侧的当前迭代故事,查看和操作更加快捷。
在这个实例中,“重构前,……;重构后,……”的语法对比了重构前后的差异,这种差异必须面向用户进行描述,以便产品经理能正确理解和排序。
– 作为一个 产品经理,在 加入或挪出故事 时 ,顶端的产品按钮上人天数据不刷新, 导致 计划时对各产品的总量和比重的错误判断。
在这个实例中,“作为一个……(角色),在……(功能)时,……(现象),导致……(潜在损失)”的语法表达了在何时,会出现何种现象,导致何种业务问题。有些缺陷发生时“现象”很不明显(比如数据不刷新),因此必须描述导致的业务问题以便理解问题的实质。
– 当前 链接中的产品 ID 是硬编码的(直接访问火星人), 在 部署到实际环境中时 , 将导致 链接失效。
在这个实例中,“当前……(当前的临时实现方法),在……(未来某种情况下)时,将……(可能出现的现象),导致……(潜在的损失)。”的语法表达了当前的何种技术原因,在何时,将会发生何种问题,并导致何种潜在的损失。
自然语言处理在用户故事生成中的应用 自然语言处理在软件开发生命周期中扮演着越来越重要的角色,尤其是在用户故事生成方面。用户故事是敏捷软件开发中用于描述系统功能需求的简短语句,它以用户的视角出发,清晰地表达了用户的期望和系统应该提供的服务。本文章的目的在于全面探讨自然语言处理技术如何应用于用户故事生成,涵盖从基础概念到实际应用的各个方面。范围包括核心算法原理、数学模型、项目实战案例以及相关工具和资源的推荐。本文将按照以下结构进行组织:首先介绍背景信息,为读者提供理解后续内容的基础; 阅读详情

相关推荐

LTspice基础教程-009.LTspice波形测量

<<==上一篇:LTspice基础教程-008.LTspice PWL设置 >>==下一篇:LTspice基础教程-010. 首篇博客文末提供所有相关资源百度网盘分享链接

gaoyong_wang的博客 4万+

敏捷开发用户故事系列之八:剖析用户故事描述语法(兼谈不同种类故事的语法)...

本文内容来自火星人团队对火星人产品中300个用户故事编写后总结的经验和成果,欢迎致力于敏捷开发而又对用户故事感到困惑的开发者参与讨论。 本篇文章尤其适合参加MPD专场“用户故事颗粒度、分类及组织结构”的学员,及参加火星人敏捷开发产品培训的学员。 用户故事中,最有名的就是三段式语法了:“作为一个……(角色),可以……(功能),以便……(客户价值)。” 然而这种语...

weixin_34128839的博客 241

合并数组与非合并数组——SystemVerilog

合并型数组(packed): — 合并型数组可以实现连续的存储,赋值时不需要用 '{ }。 //合并型数组 bit [3] [7:0] b_pack // 表示3行 x 8列的数组,[3]是高维度(高维度),[7:0]是低维度(第一维) 数组中,数据排列为{b_pack[3],b_pack[2],b_pack[1],b_pack[0]},其中每个b_pack为8个bit; bit是二值逻辑,每位bit只占据1位。故24位bit只占据一个word(一般一个word为32bit)的存储空间

SummerXRT的博客 7638

如何写好用户故事

用户故事是从用户的角度来描述用户渴望得到的功能,最早来自于1999年极限编程中的一个实践。一个好的用户故事包括三个要素:角色-Who:谁要使用这个功能。活动-What:需要完成什么样的功能。商业价值-Why:为什么需要这个功能,这个功能带来什么样的价值。用户故事通常按照如下的格式来表达:英文:As a [who], I want [what] , so that [why].中文:作为一个, 我想要, 以便于好的用户故事必须遵循INVEST原则即:Independent(独...

weixin_38515820的博客 1459

(35)远程识别(又称无人机识别)(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(35) 远程识别(又称无人机识别)》。

无人机开发(开源Ardupilot) 4万+

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122

编写用户故事模板_编写用户故事时,您的团队可能会犯错误-以及如何解决它们

编写用户故事模板There's a lot of information out there on how to write user stories and why it's important. And yet, many of us make mistakes that cost us a lot. 关于如何编写用户故事及其重要性的信息很多。 然而,我们许多人犯的错误使我们付出了很多代价。 ...

cumian8165的博客 1545

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4572

编写用户故事时常犯的五个错误

大多数敏捷软件开发和测试中关于收集需求出现的问题都来源于用户故事。的确,对于很多敏捷团队来说要以如此简洁的形式准确表达出需求并非容易的事。如何编写好的用户故事是很多刚开始接触敏捷开发流程的团队所经常遇到的问题。如果在编写用户故事的时候稍有不慎,很可能会导致开发错误的测试用例和错误地理解需求,然而最糟糕的是实现了与预期不一致的功能最终导致本次迭代宣布失败。接下来让我们来看看在编写用户故事过程中五...

pioneer的专栏 434

【HALCON工业视觉应用探索】08. C#+Halcon视觉引导机器人抓取:从入门到工业级实战(附完整代码+部署指南)

摘要:本文聚焦C#+Halcon在视觉引导机器人抓取领域的落地应用,从新手友好的“二十分钟基础引导系统”切入,逐步深入工业级场景(汽车变速箱壳体抓取)。内容涵盖核心概念(手眼标定原理、坐标转换、机器人通信协议)、完整技术流程(图像采集→目标定位→标定转换→机器人执行→结果反馈)、工业级代码实现(多目标识别、智能抓取策略、实时状态监控),以及现场部署关键技巧(硬件选型、通信配置、精度优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1263

gurobi最新下载安装教程 2023.11

我下载的最新版gurobi支持python3.7-python3.11,这个序号与计算机硬件捆绑,一旦激活就会失效。运行激活码之后,产生的。如果既放置在了上面的默认搜索目录,又设置了。系统环境变量(不是用户环境变量),指向保存的目录和文件名(例如。高版本产生的许可文件兼容低版本。验证不会成功,学术许可不会激活。之后cmd进入命令行,cd进入gurobi所在的。,实测不到一小时即可审核完毕,获得对应的许可。如果学校的网关没有将本校的。系统环境变量指向不同的目录和文件,原厂无关,是学校网络的设置问题。

Cachel Wood的博客 2万+

5个常见的用户故事错误

用户故事是传达用户或客户如何使用产品的简单但有效的方法。 但是编写帮助团队构建出色软件的用户案例可能具有挑战性。 以下列表总结了五个常见的用户故事错误,以帮助您改善故事。 故事狂 一些产品所有者和团队非常喜欢用户故事,以至于一切都表达为故事。 这要么导致产生一些相当奇怪的故事,要么是捕获用户界面设计,复杂的用户交互和技术要求的故事; 或这些方面都被忽略了。 像任何技术一样,用户故事...

danpu1174的博客 479

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

敏捷开发用户故事系列之八 剖析用户故事描述语法(兼谈不同种类故事的语法)

敏捷开发用户故事系列之八 剖析用户故事描述语法(兼谈不同种类故事的语法)

hdfyhf的博客 390

深度学习工具包 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")

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

DeepSTARR:革命性DNA序列增强子活性预测工具,从249bp序列到精准功能分析

DeepSTARR是一款基于卷积神经网络(CNN)的革命性工具,能够从249bp DNA序列中精准预测增强子活性。作为DNA序列分析领域的创新解决方案,它通过深度学习技术为研究人员提供了快速、准确的增强子功能预测能力,极大推动了基因组学和分子生物学研究的发展。 ## 🌟 什么是DeepSTARR? DeepSTARR是一个经过专业训练的卷积神经网络模型,专门用于从DNA序列直接预测增强子活性

gitblog_00744的博客 712

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

聊聊用户故事地图

主要的用户故事场景,就是测试应优先关注的覆盖场景。本文就聊聊用户故事场景的脑爆梳理方法:用户故事地图

Eyemon的博客 1542

结构化开发 vs 敏捷开发:从数据流图到用户故事的5个关键差异点对比

本文对比了结构化开发与敏捷开发在需求分析阶段的5个关键差异,包括需求表达形式、文档完备性、团队协作模式、变更管理机制和质量保障方式。通过用户登录功能的案例,展示了结构化开发的数据流图(DFD)与敏捷开发的用户故事地图的显著区别,帮助技术负责人根据项目需求选择合适的方法论。

weixin_28559803的博客 302

产品经理内容分享(二):用户故事地图,测试左移到需求阶段

主要的用户故事场景,就是测试应优先关注的覆盖场景。。相关理论来自Jeff Patton。常规的需求拆分手法,很容易让人忘掉软件需求的全景图,用户故事地图则是一个生动的全景故事挖掘活动,参加者不限于产品经理和设计师,也可以包括开发,测试,运营,业务代表。鼎叔曾参加了两次用户故事地图的工作坊,花了两三个小时完成了“早上起床做什么”的故事地图设计及讨论,印象还挺深刻。用户故事的目的就是在协作中更好地达成共识,它比单纯描述事实的效率高很多倍,它也不是需求分析,后者目标是精确构建软件结构。

之乎者也·的博客 2062

敏捷开发用户故事系列之八:剖析用户故事描述语法0

http://blog.youkuaiyun.com/cheny_com/article/details/7801690 转载于:https://www.cnblogs.com/ltp211/archive/2012/08/03/2622014.html

weixin_30664539的博客 81

敏捷开发过程剖析及工具推荐

敏捷开发,要求在开发过程中不断增强,从而提高软件质量,以达到提高商业收入的目的。它是一个迭代的过程,一个不断提高企业投资回报率和服务质量的过程。值得注意的是,成功的敏捷开发,单纯依附于活跃的开发过程和理解敏捷所带来的效益并对此有浓厚兴趣的企业用户。  本文将介绍敏捷开发的五大过程及这些过程中所要用到的工具。  1.  敏捷计划  典型的敏捷开发将整体工作分为一系列的发布过程,每个

yingtao242002的专栏 664

为什么你的用户故事总是失败(并用 5 步解决方法彻底修复)

摘要:本文针对敏捷开发中用户故事失败问题,提出5大常见陷阱及解决方案。关键问题包括故事模糊、缺乏验收标准、规模过大、非用户导向及未定义完成标准。通过5步框架(明确价值、拆分故事、设定验收标准、定义完成标准、验证反馈),帮助团队编写清晰可执行的用户故事。文章强调用户故事应聚焦价值交付,推荐使用INVEST原则和"Given-When-Then"格式,并提供实用工具和检查清单,帮助团队提升故事质量,实现可预测的交付成果。

Warren Lynch 的博客 418

避坑指南:用Jira管理Scrum项目时,90%团队都搞错的Epic与用户故事关系

本文深入解析了使用Jira管理Scrum项目时,团队常犯的Epic与用户故事关系错误。通过对比价值交付单元与需求容器的区别,揭示三大用户故事拆分陷阱,并提供Jira中的实操矫正方案,帮助团队提升Backlog管理效率,实现真正的敏捷价值交付。

weixin_30823001的博客 547
上一篇: IT职场人生系列之二十三:知识体系(专家与杂家)
下一篇: 企业实施单元测试现状调查(浙江大学管理学院 李云)
火星人陈勇
博客等级 码龄18年 4899粉丝 381原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值