敏捷开发:机器学习项目的用户故事?

12

我刚刚完成了一个监督学习算法的原型实现,可以自动为公司数据库中所有项目(约500万个)分配分类标签。

结果看起来不错,我已经得到许可计划生产实施项目。

我以前做过这样的工作,所以我知道软件的功能组件。我需要一系列网络爬虫来获取数据。我需要从爬取的文档中提取特征。这些文件需要被分成“训练集”和“分类集”,并且必须从每个文档中提取特征向量。这些特征向量会自组织成簇,并通过一系列再平衡操作传递给簇。等等等等。

因此,我制定了一个计划,包括大约30个独特的开发/部署任务,每个任务都有时间估计。开发的第一阶段-忽略了一些长期希望拥有但优先级不足以进入开发计划的高级功能-需要大约两个月的工作量。(请记住,我已经有一个工作原型,因此最终实现比从头开始启动项目要简单得多。)

我的经理认为计划看起来不错,但他问我是否可以将任务重新组织为用户故事,原因有几个:(1)我们的项目管理软件完全是围绕用户故事组织的;(2)所有的计划都基于将整个用户故事安排进冲刺中,而不是单独安排任务;(3)其他团队-例如Web开发人员-已经充分利用了敏捷方法,他们从将所有软件功能建模为用户故事中受益。

因此,我创建了一个顶层项目用户故事:

作为系统的用户,我想通过类别搜索项目,以便在庞大而复杂的数据库中轻松找到最相关的项目。

或者,也许这个特性的更好的顶层故事是:

作为内容编辑,我希望自动为我们数据库中的项目创建分类标识,以便客户可以轻松地在庞大而复杂的数据库中找到高价值数据。

但这并不是真正的问题。

对我来说,棘手的部分是找出如何为机器学习体系结构的其余部分创建下级用户故事。

例如...我知道算法需要两个主要的架构分支:(A)训练和(B)分类。而且我知道架构的培训部分需要构建一个簇空间。

我阅读过的所有敏捷开发文献似乎都表明,用户故事应该是“提供任何业务价值的最小可能实现”。当设计一款终端用户软件时,这非常有意义。从小处着手,然后随着用户需求增加功能。

但是,单独的簇空间本身就没有任何业务价值。网络爬虫、特征提取器也没有。对于一个部分系统,没有任何业务价值(无论是对于最终用户还是对于公司内部的任何角色)。只有在同时开发附带的分类器的情况下,才可能存在一个经过训练的簇空间。

我想,可以创建下属组件作为故事中的用户的用户故事:

作为监督学习簇空间构建例程,我希望从特征提取器中获取数据,以便我存在。

但这似乎非常奇怪。将用户故事模型化为这样有什么好处呢(无论是对于开发人员、我们的用户还是任何其他利益相关者)?

尽管主要故事可以轻松地沿着架构组件边界划分(网络爬虫、培训器、分类器等),但我无法想出从用户的角度进行有用分解。

你们觉得呢?如何计划复杂、不可分割、非面向用户的部件的敏捷用户故事?

3个回答

1

使用“垂直切片”概念可能会很有帮助。想象一个简单的三层应用程序(例如UI/逻辑/数据库)。不是先构建一层,再构建另一层,而是在这三个层面上“垂直切片”。一个最初的故事可能是“作为用户,我希望能够登录系统,以便我可以访问它。”完成后,这个故事可能是可交付的,因为它提供了完整的功能,但很可能无法为客户提供足够的价值,使其真正值得发布。垂直切片的一个好处是,您已经对所有层面有了一些了解,这些知识可以在将来的迭代中使用。

如果您对此不熟悉,INVEST模型对用户故事非常有用:

I - 独立

N - 可协商

V - 有价值

E - 可估算

S - 适当大小

T - 可测试


谢谢回答!我熟悉垂直切片,并且我绝对同意它们为GUI中心应用程序中设计和实现隔离功能提供了非常好的模型。但是这种模型不适用于设计复杂的算法数据导向系统。我当然可以沿着组件边界(有爬虫、特征提取器、集群创建器、分类器等等)划分项目,为不同组件之间创建清晰的API边界。但这不是一个分层应用程序。甚至没有用户界面。 - benjismith
这个团队有多少人在工作?你对旅程的“顺畅度”有多大把握?除了让项目经理和管理层高兴之外,将其转化为“真实”的用户故事是否有价值?你们的Sprint周期有多长? - Earl Everett

0
任何故事都有一个角色、一个动作和一个目标。因此,请考虑编写一个名为“角色”(又称演员)的故事,描述他们为实现目标而做些什么。
您所记录的内容应该有明显的测试,即定义成功和失败的有效决策过程。
我认为您在这里遇到问题的原因是被“业务价值”所困扰。首先,定义整体任务完成时的标准,然后,“实现业务价值”是朝着目标取得进展。
在敏捷开发中,有些事情需要稍微有些创意,因为它们往往是面向业务流程的。
更新:
有几点需要注意。
  1. 定理表明,如果您无法从系统外部观察到组件的任何效果,则可以删除该组件而不会对观察等价性产生影响。

  2. 有一种被定义为“任务”的东西,通常是程序员分配的小于用户故事的任务。如果您有一个似乎太大的故事,请将其拆分为任务。但是,要以具有明确定义的外部行为的方式进行拆分,或者在可以观察其行为的上下文中构建它。

因此,我推荐几种可能的方法:

  1. 设置大型故事并将其分解为异常庞大的子步骤

  2. 通过分区数据集来分解故事。例如,要分解“用户请求标签已更新”,请将测试数据分解为仅包含将接收标签α的数据,并创建一个名为“用户请求将标签更新为α”的故事。由于您知道所有内容都是α,因此构建始终分配alpha的最简代码,并考虑选择代码。


关于“明显测试”,在分类器的顶层,肯定有一些明显的测试,我已经能够测量各种不同类型的聚合准确性。但是一旦我把设计分解成组件,测试就变得不那么明显了。在与“分类”隔离开来的情况下测试“特征提取”非常困难,因为分类器的结果定义了提取特征的成功标准。直到这些组件被组装成完整的系统之前,系统的任何部分都不会产生可测量的正确或错误的结果! - benjismith

0

我认为你可以同样衡量部分系统的正确或错误结果。你需要存根其他系统组件。这是完全可能的。此外,在我看来,系统的一部分作为其他模块的参与者是有意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接