how-implement-hypothesis-driven-development

如何实施假设驱动开发

记得回到我们在高中科学课的时候。我们的教师有一个帮助我们学习的框架 - 基于手头的最佳证据的实验方法。我们被要求对我们周围的世界进行观察,然后尝试形成解释或假设来解释我们所观察到的内容。然后,我们通过基于我们的理论来预测在受控实验中实现的理论来测试这一假设 - 如果实现结果,我们已证明我们的理论是正确的。


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


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


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


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


我们不再进行项目,只有实验。客户发现和精简启动策略旨在测试关于客户的假设。质量保证是测试对定义规范的系统行为。实验原理也适用于测试驱动的开发 - 我们首先编写测试,然后使用测试验证我们的代码是否正确,如果代码通过测试,则成功。最终,产品或服务开发是一个测试对环境或市场中的系统行为的假设,它是为此开发的。

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

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


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


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


科学方法的步骤是:

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


使用软件开发的实验方法


我们需要挑战对产品或服务有固定要求的概念。当团队执行众所周知或理解倡议的阶段时,要求是有价值的,并且可以利用很好地了解实现结果的实践。但是,当您处于探索性,复杂和不确定的阶段时,您需要假设。

向团队提供一组业务需求,强化了有缺陷的订单获取方法和思维模式。

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


框架假设


传统的用户故事框架专注于捕获我们想要构建的要求和为谁捕获要求,使用户能够从系统中接收特定的好处。


作为一个…。<角色>

我想要…> <目标/欲望

所以…


行为驱动开发(BDD)和功能注射旨在通过支持软件项目中开发人员,测试仪和非技术参与者之间的沟通和协作来改进原始框架。


为了

作为... <角色>

我想要…> <目标/欲望


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


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


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

我们相信<此功能>


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


将导致<这一结果>


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


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


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


您用于统计学意义的阈值将取决于您对您在内部运营的业务和上下文的理解。不是每个公司都有亚马逊或谷歌的用户样本大小,在短时间内运行统计上有很大的实验。您的组织需要定义限制和控制,以确定可接受的证据阈值,以允许团队提前进入下一步。


例如,如果您正在建造一艘火箭船,您可能希望您的实验具有较高的统计意义阈值。如果你要在两个不同的流程中做出选择,以帮助增加用户注册,你可能会乐于接受一个较低的显著性阈值。


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

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


假设驱动开发用户故事的例子有:


商业的故事


我们相信在预订页面上增加酒店图片的大小

会提高客户参与和转化率吗

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


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


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

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

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


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


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


结论


结合实践,例如假设驱动开发和持续交付,可以加速实验,并放大经过验证的学习。这让我们有机会加快创新的速度,同时无情地降低成本,把我们的竞争对手甩在后面。理想情况下,我们可以实现单个流程的理想:原子变化,使我们能够确定我们对产品和服务的变化之间的因果关系,以及它们对关键指标的影响。


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


如何实现更快的增长?

Baidu