how-implement-hypothesis-driven-development

如何实施假设驱动开发

还记得我们在高中上科学课的时候吗。我们的老师有一个帮助我们学习的框架——一种基于现有最佳证据的实验性方法。我们被要求对我们周围的世界进行观察,然后试图形成一个解释或假设来解释我们所观察到的东西。然后,我们通过预测一个基于我们的理论的结果来验证这个假设,这个结果将在一个对照实验中实现——如果这个结果实现了,我们就证明了我们的理论是正确的。


然后,我们可以通过构建更复杂的实验,调整、进化或放弃任何假设,并根据我们所获得的结果进一步观察,将这种学习应用于通知和测试其他假设。


实验是科学方法的基础,科学方法是探索我们周围世界的系统手段。尽管有些实验是在实验室进行的,但在任何地方、任何时间都可以进行实验,甚至在软件开发中也是如此。


练习假说驱动的开发是把新想法、新产品、新服务——甚至是组织变革——的发展作为一系列实验,以确定是否能达到预期的结果。这个过程反复进行,直到得到一个理想的结果,或者确定这个想法是不可行的。


我们需要改变思维方式,将我们对问题陈述提出的解决方案视为一种假设,特别是在新产品或服务开发中——我们的目标市场,商业模式如何运作,代码如何执行,甚至客户如何使用它。


我们不再做项目了,只做实验。客户发现和精益创业策略旨在测试对客户的假设。质量保证是根据定义的规范测试系统行为。实验原则也适用于测试驱动开发——我们首先编写测试,然后使用测试来验证我们的代码是正确的,如果代码通过了测试就成功了。最终,产品或服务开发是一个过程,用于测试系统在环境或市场中的行为假设。

实验方法的关键结果是可测量的证据和学习。

学习是我们从做实验中获得的信息。我们期望发生的事情真的发生了吗?如果没有,那是什么?这对我们下一步应该做什么有什么启示?


为了学习,我们需要用科学的方法来研究现象,获取新知识,纠正和整合以前的知识回到我们的思维中。


随着软件开发行业的不断成熟,我们现在有机会利用改进的能力,如持续设计和交付,以最大限度地发挥我们的潜力,快速了解什么有效,什么无效。通过采用实验性的信息发现方法,我们可以更快速地针对我们在试图构建的产品或服务中确定的问题测试我们的解决方案。我们的目标是优化我们解决正确问题的效率,而不是简单地通过不断构建解决方案成为功能工厂。


科学方法的步骤是:

  • 观察
  • 制定一个假设
  • 设计一个实验来验证这个假设
  • 说明评价实验是否成功的指标
  • 进行实验
  • 评估实验的结果
  • 接受或拒绝假设
  • 如果有必要,提出并验证一个新的假设


在软件开发中使用实验方法


我们需要挑战对产品或服务有固定需求的概念。当团队执行一个已知或理解的计划阶段时,需求是有价值的,并且可以利用理解良好的实践来实现结果。然而,当你处于探索、复杂和不确定的阶段时,你需要假设。

将一组业务需求交给团队,强化了有缺陷的订单接收方法和思维方式。

商业会思考,“知道”什么是正确的。开发团队的目的是实现他们被告知的内容。但是,当在一个不确定和复杂的领域中操作时,应该鼓励开发团队的所有成员对问题和潜在的解决方案进行思考和分享。一个简单地听从企业主命令的团队并不能充分利用一个跨职能、多学科的团队所提供的全部潜力、经验和能力。


框架的假设


传统的用户故事框架关注于获取我们想要构建什么以及为谁构建的需求,从而使用户能够从系统中获得特定的好处。


作为一个…< >角色

我想要…> <目标/欲望

所以…<接受利益>


行为驱动开发(BDD)和特性注入旨在通过支持软件项目中开发人员、测试人员和非技术人员之间的交流和协作来改进原有的框架。


为了

作为一个…> <作用

我想要…> <目标/欲望


当将工作视为一种实验时,传统的故事框架是不够的。就像在我们的高中科学实验中一样,我们需要定义为达到预期结果而采取的步骤。然后,我们需要陈述我们希望观察到的具体指标(或信号),以提供证据,证明我们的假设是有效的。这些需要在进行测试之前陈述,以减少对结果的偏见解释。


如果我们观察到表明我们的假设是正确的信号,我们就可以更自信地认为我们走在正确的道路上,并可以改变用户故事框架来反映这一点。


因此,支持假设驱动开发的用户故事结构应该是;

我们相信<此功能>


我们将开发什么功能来验证我们的假设?通过定义我们试图构建的产品或服务的“测试”能力,我们确定了我们想要测试的功能和假设。


将导致<这一结果>


我们实验的预期结果是什么?通过建立“测试”能力,我们期望达到的具体结果是什么?


当……时,我们就知道我们成功了。我们看到了一个可测量的信号>


什么样的信号表明我们建立的能力是有效的?我们将衡量哪些关键指标(定性或定量),以提供证据,证明我们的实验已经成功,并给我们足够的信心进入下一个阶段。


您用于统计意义的阈值将取决于您对业务和您所处环境的理解。并不是每家公司都有亚马逊或谷歌那样的用户样本规模,在短时间内进行统计意义重大的实验。您的组织需要定义限制和控制,以确定可接受的证据阈值,以允许团队推进到下一个步骤。


例如,如果您正在建造一艘火箭飞船,您可能希望您的实验具有较高的统计显著性阈值。如果你决定在两个不同的流程中帮助增加用户注册,你可能很乐意忍受一个较低的显著性阈值。


最后一步是清晰而明显地陈述关于我们的假设的任何假设,为团队创造一个反馈循环,以提供进一步的输入、讨论和理解我们执行测试的环境。从技术和业务的角度来看,它们是否有效和有意义?

假设与你的MVP一致,可以为你的产品或服务愿景提供一种测试机制。他们可以测试你的产品或服务中最不确定的领域,以获得信息和提高信心。


假设驱动开发用户故事的例子如下;


商业的故事


我们相信增加酒店在预订页面上的形象

是否会提高客户参与度和转化率

当我们看到评论酒店图片的顾客数量增加了5%,并在48小时内继续预订时,我们就知道我们成功了。


在使用实验方法进行软件开发时,为了测量我们的工作的影响并为团队提供一个反馈循环,必须有有效的监控和评估工具。否则,我们基本上就看不到我们努力的结果。


在敏捷软件开发中,我们将工作软件定义为进度的主要度量标准。

通过结合持续交付和假设驱动开发,我们现在可以定义工作软件和验证学习作为进度的主要度量。

在理想情况下,我们不应该说我们完成了,直到我们衡量了交付的价值——换句话说,收集数据来验证我们的假设。


如何收集数据的例子是执行A/B测试,以测试假设和衡量客户行为的变化。替代测试选项可以是客户调查、纸上原型、用户和/或游击测试。


我们合作过的使用假设驱动开发的公司的一个例子是lastminute.com.该团队提出了一个假设,即顾客只愿意根据他们预订的时间支付最高价格的酒店。Sabre Holdings首席执行官兼总裁汤姆·克莱因分享了他的观点这个故事他们如何在一周内将转化率提高了400%


结论


将假设驱动开发和持续交付等实践结合起来,可以加速实验并扩大有效的学习。这使我们有机会加快创新速度,同时无情地降低成本,将我们的竞争对手甩在身后。在理想情况下,我们可以实现一段流程的理想:原子变更使我们能够识别我们对产品和服务所做的变更之间的因果关系,以及它们对关键指标的影响。


正如Kent Beck所说,“测试驱动开发是在考虑解决方案之前考虑问题的一个很好的借口”。假设驱动开发是一个很好的机会,在你着手解决方案之前,测试你认为的问题是什么。


怎样才能实现更快的增长?

Baidu