《敏捷可执行需求说明 Scrum提炼及实现技术》—— 导读

前  言

市面上关于需求说明方面的书籍有很多。不幸的是,这些书绝大多数对于软件开发团队来说都不实用。因为那些书依赖于传统的工程实践。他们假设需求是可以事先获得的,并且一旦被写出来,在项目进行过程中就不会再修改。而且,他们认为就算发生变更,都是一些细微的变化,因此,可以通过变更管理流程来进行追踪。他们创建了从明确需求阶段开始的系列流程,而这个阶段将在团队开始设计和实现产品之前提供详细的需求说明。
本书目标

我认为传统的工程实践对软件开发来说并不适用。提炼软件需求说明的流程的核心问题是不确定性很高,这与传统的工程是不同的。幸运的是,在过去十年,随着敏捷社区的成长,我们已经整合出了更符合软件开发现实问题的知识体系。很多书都提到,敏捷方面的书籍已成为对软件开发感兴趣的所有人必读的书籍。这些书绝大部分都包含了至少一到两章跟需求相关的内容,其中有些甚至整本书都只讨论这个话题。我认为描述的有些内容非常重要,因此我会在本书里引用或参考这些内容。
我写本书是为了让敏捷知识体系更加饱满。这是可执行需求说明相关的敏捷实践的纲要。可执行需求说明能够让你更加轻松地测试软件行为是否满足需求。在本书中,我自始至终都在解释如何在前提条件尚不明确的时候,以及需求难以把握且需要持续演进的情况下把软件需求说清楚。软件研发实践者们将学会如何一步一步地紧紧围绕愿景,采用浮现式迭代实践,渐进明细地捕捉需求。他们还将学会如何通过编写细小的需求分支而将需求说清楚。
本书的目标是解释获得可执行需求说明收益所需要的技术机制。它不仅会提供一个迭代式挖掘需求的可靠案例,还将进一步地教你如何将需求说明与正在构建的软件连接起来。整个流程将引导你创建一个可执行的需求说明书。
即使我们有很好的意图也不能强制要求干系人同意我们的做法意识到这一点很重要。有句非洲谚语简洁明了地阐述了这个问题:“你不能拔苗助长。”当认知尚未完善,需求也在持续变更的时候,我们不能再依赖传统的工程技术。相反,强调经验技术的迭代式需求探索方式显得至关重要。探寻目标不仅是为了正确地解决问题,同时也是要解决正确的问题——这是软件构建过程面临的最大挑战。
本书的独特之处在于,它将教会你如何通过使用可执行的需求说明把需求和架构连接起来。你将学会通过Scrum框架如何在说明需求的同时,将需求验证过程自动化。读完本书,你可以选择一种工具,开始为将来的敏捷项目创建可执行需求说明。以下我列举了阅读本书的五个好处:
你将明白,当从传统的方式转型成敏捷实践的时候,业务分析工作将会发生何种变化。
你将学会如何在Scrum 框架内提炼浮现式需求。
你将见识如何采用故事板和纸原型法改善跟干系人之间的沟通。
你将发现如何开展浮现式设计,同时确保任何时候的实施的正确性。
你将了解采用敏捷实践的软件架构师如何随着当前的软件开发进行浮现式设计。

谁应该是本书的读者

本书的读者应该是已经在应用Scrum框架或者正在转型实施敏捷实践的人。他们理解敏捷的本质,但是并不熟悉可执行需求说明。他们希望了解为什么可执行需求说明有用,以及最重要的是如何开始实施这一新的实践。
随着Scrum框架的大量使用,敏捷团队面临的第二大挑战就是如何将业务分析师和架构师组合成活跃互动的团队成员。任何面临这一挑战的Scrum Master、经理、决策者都应该阅读本书。另外,所有参与敏捷项目的团队成员也将从本书获益。它并没有直接宣称业务分析师和软件架构师将会因找到一本直接说出他们所关注的问题的书而高兴。
高级或专家级的敏捷实践者将会对本书清晰的可执行需求说明全局感兴趣。他们可以利用本书成功地将团队引领到这条路上。另外,全书使用的术语可以帮助领导者更有效地与同事沟通。

本书的路线图

可执行需求说明提炼方法要求人们在思维方式上做出改变。本书的重点也在于此。可执行需求说明提炼方法有助于缩小干系人希望软件能做什么(什么)和该软件的确能做什么(如何)之间的差距。可执行需求说明以一种使开发团队很容易根据可执行需求说明来验证软件的方法澄清需求,而这跟需求变更一样在频繁地发生。
为了促进这种思维方式的改变,本书提供了一个跨越9章的独特思路。
第1章:解释了为了有效应对持续变更的需求而采用迭代探索和可执行需求说明的必要性。
第2章:解释了如何识别那些不可改变的事情:那些团队应该依赖的、核心的、有把握的事情。而这些有把握的事情不是需求本身。它们是能够保证一个方案得以实现的防护栏。它们组成了一个牢固的基石,保证迭代式需求探索方法成为可能。
第3章:揭示了为了找出不确定性,团队必须通过短周期反馈环挖掘干系人的期望和需求(“愿求”)。
第4章:介绍了如何采用用户故事表达“愿求”,并学会如何使用产品待办事项列表记录它们。
第5章:解释了如何通过优化产品待办事项列表来帮助我们做迭代计划,这样可以提高整个反馈环成功的概率。
第6章:展示了如何通过故事场景编写用户故事行为脚本来确认用户故事。
第7章:解释了如何将故事场景转换成自动化测试,这样我们就可以很容易地对照逐渐演进的需求说明确认软件行为是否符合预期。
第8章:介绍了如何通过详细说明非功能性需求保障软件质量。
第9章:本书最后一章,总结了全书最关键的要素。

目  录

第1章 解决正确的问题
1.1 从解决方案中甄别需求
1.2 识别不确定性的影响
1.3 处理不确定性
1.4 小结
1.5 参考资料

第2章 依赖坚实的基础
2.1 界定不可更改的边界
2.2 组建一个健康的团队
2.3 要求所有干系人参与
2.4 明确一个可以共享的愿景
2.5 识别出一个有意义的共同目标
2.6 识别出一系列高级别的特征
2.7 验证“可能存在”的假设
2.8 小结
2.9 参考资料

第3章 使用短周期反馈环探索干系人的“愿求”
3.1 运用试错法
3.2 应用短周期反馈环
3.3 根据预期收益设定反馈目标
3.4 关注干系人的“愿求”
3.5 小结
3.6 参考资料

第4章 使用用户故事表达“愿求”
4.1 使用用户故事描述愿求
4.2 通过研究角色及其利益探索“愿求”
4.3 建立一种通用语言
4.4 使用待办事项列表记录“愿求”
4.5 小结
4.6 参考资料
第5章 优化产品待办事项列表提炼用户故事
5.1 管理产品待办事项列表
5.2 通过合作优化产品待办事项列表
5.3 采用圆点投票法对用户故事进行排序
5.4 采用故事板的方式阐明用户故事的需求
5.5 通过比较的方式估算用户故事规模
5.6 按照业务价值拆分用户故事
5.7 使用协作白板追踪用户故事
5.8 交付一组功能连贯的用户故事
5.9 使用用户故事计划工作
5.10 小结
5.11 参考资料

时间: 2024-10-09 17:22:33

《敏捷可执行需求说明 Scrum提炼及实现技术》—— 导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul