Puzzle Driven Development

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

PDD(Puzzle Driven Development)是一种将编程任务分解为较小任务并使其可以并行实现的方法。PDD方法广泛应用于XDSD方法论中。该方法正在等待美国专利商标局(USPTO)对其进行专利审查(申请号:12/840,306)。

我们通过一个例子来回顾一下这种方法。比如说,你是一位程序员,被要求设计并实现一个Java类。这是正式的任务描述:“类DBWriter必须扩展java.io.Writer抽象类,并将所有传入的数据保存到数据库中。”

你有一个小时的时间来完成这个任务。很明显,一个小时是不够的,因为这个问题比预留的时间还要大,需要更多的工作。此外,还有很多未知因素:

  • 什么是数据库架构?它是一个SQL还是NoSQL数据库?

  • 如何连接到数据库?JDBC?JPA?DAO?

  • 如何处理异常?

让我们在尝试以最高抽象级别解决问题时牢记所有这些未知因素。当然,我们从一个测试开始:

在上面的测试中,我们定义了类的预期行为。测试无法编译,因为有两个缺少的类:DataBridgeDBWriter。让我们首先实现桥接器:

接下来,作者本身:

使用上述代码,我们解决了问题。在这个例子中,我们成功地设计、实现和测试了所需的DBWriter类。随后,该类现在可以立即被其他类“原样”使用。

当然,实现并未完成,因为我们还没有向数据库写入任何内容。此外,我们仍然没有回答示例场景中提出的大部分问题。例如,我们仍然不知道数据库需要如何连接,它的类型(SQL还是NoSQL),正确的数据格式等等。然而,我们已经做出了许多重要的架构假设,这使我们能够实现该类并使其可被其他类使用。

现在是时候在我们的代码中识别未知项并用谜题标记它们了。每个谜题都是对细化的请求。我们希望向其他人寻求帮助,以完善和纠正我们的假设。这是我们需要添加的第一个谜题:

这个谜题有三个元素:@todo 标签、#123 定位符和一条注释。定位符显示如下内容:“在处理工单 #123 时创建了这个谜题。”

让我们再添加一个谜题:

这个谜题表明我们的担忧之一,因为我们不确定架构决策是否正确。实际上,目前设计非常原始,很可能是错误的。为了改进和重构它,我们需要从任务说明中获得更多信息。

任务已经完成。现在,您可以将您的分支重新整合到“master”中,并将该票据退还给分配给您的人。他现在的任务是寻找其他能够解决我们刚刚创建的难题的人。

每个现在创建的谜题都会产生其他谜题,这些谜题将由其他人解决。因此,我们简单的一小时任务可能会产生数百个其他任务,可能需要数天甚至数年才能完成。尽管如此,您完成您特定任务的目标是尽快完成它并将您的分支重新整合到“master”中。

有一些简单的规则可以帮助您正确地放置拼图。

首先,您应该将@todo注释放在代码遇到存根的地方。例如,在单元测试中。您正在实现一个测试,但由于尚未实现该类,测试失败了。您可以使用@Ignore注释跳过测试,并在其JavaDoc中添加一个@todo拼图。

其次,您的拼图应尽可能靠近击中存根的代码元素。假设您有一个有三个测试方法的单元测试。由于尚未实现该类,现在全部失败了。最好的方法是忽略每个测试并创建三个(!)拼图。每一个拼图都应解释您对该类的期望以及如何实现它。

第三,尽可能详细地描述。您的拼图很快就会成为其他人的任务定义。因此,请清楚地解释您期望下一个人实现什么,如何实现,使用哪些文档等等。应该提供足够的信息,以便被分配到这些拼图的下一个人能够在没有您的额外输入的情况下实现所需的类!

顺便说一下,通过我们的PDD Ruby gem和0pdd.com托管服务,拼图收集过程可以自动化。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:49

sixnines availability badge   GitHub stars