将业务需求分解为软件功能

我们需要一个解决方案来组织我们需要完成的所有任务。我们可以使用笔记本、草稿纸、便利贴,甚至是简单的看板。但由于我们计划开发的是可维护软件,而且我们希望了解开发过程的进展情况,因此最好能有一个比笔记本更强大的解决方案。

在本项目中,我们将使用 Atlassian Jira。Jira 是一款软件,我们可以用它来组织我们需要构建和处理的所有项目。我们将把它当作一个涡轮增压笔记本,用来记录软件功能的待办事项列表。

我们不会深入关注方法论;相反,我们将使用 Jira 来帮助我们组织项目,以便有条不紊地开始编写软件。

我们希望能够将 Git 分支、拉取请求和提交连接到我们正在处理的问题。我们还希望能将持续集成(CI)(第 9 章,持续集成)解决方案集成到我们的问题中。您可以将 Jira 问题视为一个列表项,代表一个业务问题或一个软件功能。

我们将开始把业务需求分解成由用户故事(Jira 中的问题类型)代表的软件功能列表。为此,我们首先需要创建一个 Jira 账户并初始化我们的项目。

创建 Jira Cloud 帐户并初始化 Jira Cloud 项目

要创建 Jira Cloud 帐户并初始化 Jira Cloud 项目,请按照以下步骤操作:

  1. 首先,我们需要创建一个免费的 Jira 帐户。您可以访问以下 URL: https://www.atlassian.com/try/cloud/signup?bundle=jirasoftware&edition=free 。然后,注册一个帐户:

    image 2023 10 23 09 26 24 884
    Figure 1. Figure 2.4 – Jira sign-up
  2. 注册账户后,系统会提示您在 "您的网站" 字段中输入一个子域名。请使用任意子域名称。完成此步骤后,可以跳过所有其他弹出窗口,直到进入项目模板页面:

    image 2023 10 23 09 27 27 636
    Figure 2. Figure 2.5 – Entering a subdomain name
  3. 在项目模板页面上,选择 Scrum(是一种敏捷开发方法论):

    image 2023 10 23 09 28 08 441
    Figure 3. Figure 2.6 – Selecting Scrum
  4. 在 Scrum 页面上,单击屏幕右上角或右下角的 “使用模板” 按钮:

    image 2023 10 23 09 29 49 898
    Figure 4. Figure 2.7 – Use template button
  5. 在选择项目类型页面上,单击选择团队管理的项目:

    image 2023 10 23 09 30 39 242
    Figure 5. Figure 2.8 – Select a team-managed project
  6. 在添加项目详细信息页面上,您需要输入项目名称。使用 toycarmodels 作为项目名称,并在 Key 字段中输入 TOYC

    image 2023 10 23 09 31 45 055
    Figure 6. Figure 2.9 – Add project details
  7. 完成这些步骤后,您应该得到一个空的 TOYC 板页面:

    image 2023 10 23 09 32 28 384
    Figure 7. Figure 2.10– Empty TOYC Kanban board

现在我们有了一个可以使用的 Jira 项目,我们可以开始创建 issue,代表我们需要做的事情,以帮助博物馆业务开展其管理玩具车项目。我们将使用 Jira epics 对相关的 Jira 问题进行分组,这些问题代表了我们要构建的软件功能。

创建 Jira 史诗

如果我们退一步思考我们之前定义的问题和解决方案,我们就可以列出一份简单的清单,列出我们可以建立的功能。

我们已经确定,我们要为库存管理员志愿者建立一种方法,让他们能够在库存中记录捐赠的玩具车模型,我们还确定了博物馆游客的需求,让他们能够在库存中搜索并找到玩具车模型在博物馆中的展示位置。现在,我们已经确定将有两类用户:

  • 需要输入和存储数据的用户(库存员)

  • 想要查看数据的用户(博物馆参观者)

也就是说,我们可以把需要建立的程序分成两个独立的小项目:一个小项目是针对库存管理员的,另一个是针对游客的。有时,将一个大项目的不同部分分离成各自的小项目会很有帮助;这有助于为项目的不同领域配备不同的开发人员,也有助于集中开发人员的精力。

面向库存文员的解决方案可能会包含许多较小的任务。我们可以开始将这些任务定义为实际的 Jira issue,但在考虑较小的 issue 之前,让我们先创建一个史诗(Epic)。

让我们回到上一组指令中的 Jira TOYC 板页面,开始创建任务单:

  1. 在左侧菜单上,单击 Roadmap 图菜单项:

    image 2023 10 23 09 40 09 893
    Figure 8. Figure 2.11 – Jira roadmap
  2. 在表中,单击 + Create Epic 按钮。将出现一个文本框,其中包含文本需要做什么?:

    image 2023 10 23 09 55 17 750
    Figure 9. Figure 2.12 – Epic title
  3. 在文本框中输入 Inventory Clerk Solution,然后按 Enter

    image 2023 10 23 09 56 23 028
    Figure 10. Figure 2.13 – First epic
  4. 点击刚刚创建的史诗,弹出一个窗口。在描述文本区域,你可以输入任何描述,详细说明我们需要做的事情。在本例中,我将只使用以下文本: Enable the inventory clerk to be able to input and store toy car model data,然后在 Assignee 字段下点击 "分配给我" 链接:

    image 2023 10 23 09 57 56 853
    Figure 11. Figure 2.14 – Epic description
    image 2023 10 23 09 58 32 303
    Figure 12. Figure 2.15 – Assignee
  5. 关闭弹出窗口。

现在我们已经创建了 Jira 史诗,我们可以向该史诗添加项目。我们将添加到史诗中的项目将是用户故事。

编写用户故事

Jira 用户故事 是从最终用户的角度出发,以描述性和表达性的方式非正式编写的软件功能。最终用户可以是非技术客户,也可以是软件开发人员,他们最终将成为软件的消费者。

在上一节中,我们创建了一个名为 "库存管理员解决方案"(Inventory Clerk Solution)的应用程序,其中包含库存管理员记录捐赠玩具车模型的所有信息所需的全部内容。

但是,要实现这一目标,库存管理员需要什么呢?首先,他们需要一个包含表单的窗口或网页。然后,这个表格将用于记录特定玩具车模型的数据

但是,库存管理员如何向系统表明自己的身份呢?看来我们需要认证和授权功能,有了这些功能,我们就可以限制系统的数据输入部分只允许授权用户使用。

库存管理员通过身份验证后,就可以开始向系统输入和记录玩具车模型数据了。

现在,让我们围绕这些简单的功能开始编写故事。

通过思考库存员需要做什么才能将玩具车模型输入并记录到系统中,我们已经确定了至少三个用户故事。

我们可以使用以下模板来编写我们自己的用户故事: 作为一个[角色],[我想要],[所以]

  • 作为库存员(inventory clerk),我希望能够登录系统,以便访问库存系统

  • 作为库存员,我希望能够输入玩具车模型数据,以便保存数据

  • 作为一名库存员,我希望能够看到一个包含记录的表格,以便我可以查看存储的所有玩具车模型数据

现在我们已经有了所需的客户用户故事列表,让我们为他们创建 issue。

创建 Jira 用户故事

请按照以下步骤创建 Jira 用户故事:

  1. 将鼠标悬停在 Inventory Clerk Solution 史诗上,然后单击右侧的 + 按钮。然后它将显示一个文本字段,What needs to be done?

    image 2023 10 23 10 11 08 182
    Figure 13. Figure 2.16 – What needs to be done? text: user story title
  2. 在文本字段左侧的下拉列表中,确保选择 Story

    image 2023 10 23 10 13 12 349
    Figure 14. Figure 2.17 – Selecting Story from the dropdown
  3. 在文本字段中,输入第一个用户故事的标题,As an inventory clerk, I want to be able to login to the system, so that I can access the inventory system,然后按 Enter

    image 2023 10 23 10 14 32 390
    Figure 15. Figure 2.18 – First user story
  4. 重复步骤来创建我们列出的三个故事:

image 2023 10 23 10 15 13 399
Figure 16. Figure 2.19 – Epic with user stories

这些用户故事将在第 6 章 "应用行为驱动开发" 中编写的行为驱动测试中发挥非常重要的作用。

现在,我们已经为 "库存文员解决方案" 创建了第一个史诗和用户故事,请重复上述步骤创建访问者史诗和用户故事。您可以使用以下史诗名称和用户故事:

管理员史诗名称:Visitors Page

用户故事:

  • 作为访问者,我希望看到一个公共页面,其中包含包含车型信息的表格,以便我可以浏览库存

  • 作为访问者,我希望能够过滤该表格,以便我可以缩小结果范围

image 2023 10 23 10 18 27 084
Figure 17. Figure 2.20 – Epics and user stories

完成这些步骤后,我们现在将列出一些我们作为客户和管理员想要实现的目标。我们想要实现的事情列表称为 用户故事,我们使用史诗对其进行分组。在编写代码之前,我们希望能够在某处存储代码并对其进行版本控制。我们将使用 Bitbucket 作为我们的版本控制解决方案。

将 Jira 与 Bitbucket 集成

我们需要一个 Git 仓库来存放我们的代码,如果能将它与我们需要建立的任务列表(Jira issue)集成就更好了。Jira 提供了很多软件集成解决方案,这非常好。Jira 可以与我们的代码库和 CI 解决方案集成,这将在 第 9 章 "持续集成" 中讨论。

目前有很多 Git 版本控制托管软件,但在本项目中,我们将使用 Bitbucket,这样我们就可以快速将其与 Jira 集成,把更多宝贵的时间花在实际编码上。

首先,您需要为此示例项目创建一个 Bitbucket 帐户。前往 https://bitbucket.org/product 并注册一个帐户。如果您已有 Bitbucket 帐户,那也应该可以。

有一套冗长的说明将 Bitbucket 与 Jira Cloud 集成;请按照 https://support.atlassian.com/jira-software-cloud/docs/enablecode/https://support.atlassian.com/jira-cloud-administration/docs/connect-jira-cloud-to-bitbucket/ 中的说明进行操作。

您也可以单击左侧菜单上的代码(Code)链接:

image 2023 10 23 10 22 36 581
Figure 18. Figure 2.21 – Code page

单击主面板上的 连接到 Bitbucket 按钮。然后,您可以按照说明将 Jira 项目连接到您选择的 Bitbucket 帐户。

接下来,单击左侧菜单上的 项目设置 链接:

image 2023 10 23 10 23 55 453
Figure 19. Figure 2.22 – Project settings menu item

项目设置 页面内,单击 功能 菜单项。进入 功能 页面的 开发 组中,单击 代码 部分中的 配置…​ 按钮:

image 2023 10 23 10 26 11 144
Figure 20. Figure 2.23 – Code Configure… button

单击 配置…​ 按钮后,您将被重定向到 工具链 页面;在 构建 部分中,单击 + 添加存储库 按钮:

image 2023 10 23 10 27 21 117
Figure 21. Figure 2.24 – + Add repository button

将出现一个弹出窗口 - 选择您想要在项目中使用的 Git 解决方案。就我而言,我使用免费的 Bitbucket 帐户:

image 2023 10 23 10 28 06 789
Figure 22. Figure 2.25 – Selecting a Git product

单击 Bitbucket 后,您现在可以输入要与 Jira 项目集成的新存储库名称。或者,您也可以选择在自己的帐户中创建的预先存在的存储库。对于这个例子,我将创建一个新的存储库:

image 2023 10 23 10 29 07 245
Figure 23. Figure 2.26 – Creating a new repository for the Jira project

单击 + 创建 按钮,您的 Jira 项目现在应该与您的 Git 存储库集成:

image 2023 10 23 10 30 16 566
Figure 24. Figure 2.27 – Repository integrated with Jira

现在,您可以单击 "返回项目" 链接回到项目窗口,然后单击 "路线图" 链接。点击我们之前创建的 "库存管理员解决方案" 史诗,你应该会在我们的 issue 中看到一个新的 "开发" 部分:

image 2023 10 23 10 32 46 677
Figure 25. Figure 2.28 – Ticket: new Development section with a Create Branch link

现在一切都已配置完毕,您应该可以从 Jira issue 中创建 Bitbucket 分支了。在 "库存管理员解决方案" 弹出窗口中,点击 "创建分支" 链接。您将被重定向到 Git 仓库页面,在那里您可以继续创建分支:

image 2023 10 23 10 34 05 812
Figure 26. Figure 2.29 – Creating a new branch for the epic

返回 Roadmap 页面,刷新页面。再次打开 "库存管理员解决方案" 史诗,这一次,在 "开发" 部分,你会看到现在有一个分支连接到我们的 Jira 史诗:

image 2023 10 23 10 35 12 349
Figure 27. Figure 2.30 – One branch connected to the Jira epic

我们现在可以使用 Jira 创建 Git 仓库了。这意味着我们的 Git 仓库已与我们的 issue 解决方案集成。

我们将在本示例项目中使用 BitBucket,但您也可以选择自己喜欢的版本控制系统并将其与 Jira 集成。

将 Jira 与 github 集成

  1. 在 Jira 项目-》应用-》探索更多应用中,在 Atlassian Marketplace 中搜索 GitHub for Jira

    image 2025 01 08 21 37 59 098
  2. 点击 GitHub for Jira 插件并安装。

  3. 在 Jira 项目-》应用-》管理应用中,点击 GitHub for Jira 来配置该插件。

  4. 点击 Connect GitHub Cloud,授权 Jira 访问你的 GitHub 组织或仓库。

  5. 选择要集成的 GitHub 仓库,并配置同步选项(如分支、提交、拉取请求等)。

总结

在本章中,我们根据我的朋友在一家汽车博物馆遇到的实际问题,提出了一个示例项目。通过了解企业或客户想要实现的目标,我们能够找出阻碍企业或客户实现目标的问题或挑战。通过分析我们针对这些问题提出的解决方案,我们能够提出解决方案计划。我们将解决方案以用户故事的形式列出,并将其归类为 "史诗"。

这些用户故事告诉我们一些行为,确切地说,是系统行为。这些为什么重要?通过了解我们需要构建什么,我们开发人员可以更好地规划如何构建解决方案。我见过有的软件开发周期长达数周或数月,而在开发完成后,开发人员和业务分析师却发现,该解决方案根本没有解决阻碍业务或客户实现其目标的问题,原因很简单,因为业务分析师和开发人员不了解业务想要实现或解决的问题。

有了一份清晰的项目清单,确定了需要构建的内容,我们就能够提出自动测试,检查我们是否满足了所需的行为。我们将在 第 6 章 "应用行为驱动开发" 中构建这些自动化行为驱动测试。

在下一章中,我们将介绍 Docker 容器并构建我们自己的容器。这个容器将用于容纳和运行我们为实现业务目标而构建的 PHP 软件解决方案。