Small Development Task

Product Backlog Items, even when sized to fit in a development iteration might still be too large to let you maintain the integration cadence you want. You want to integrate each Task Branch quickly. This pattern describes a way to approach splitting a backlog item into development tasks to keep the work on the task branch short and code robust?

Working in Increments Can Be Hard

You want to integrate changes frequently to maintain a healthy Main Line. While the definition of “frequently” can vary by team and context, for many teams, it means “at least once a day.”

A Product Backlog Item could be small enough to be completed within your desired integration time, but in many cases, a PBI will involve more work than that.

It can sometimes be difficult to identify units of work related to a backlog item that reflect useful, “ready to merge” functionality:

Even when teams are cross-functional and include “full stack” developers, some stories might require work from multiple team members. For example, a story with mobile, web, and backend components might involve three developers. Coupling development tasks adds schedule and integration risk:

Integrating a partial implementation of a Product Backlog Item can enable integration and collaboration between developers working on the Product Backlog Items. Decoupling tasks to enable parallel work can involve disposable scaffolding, which can seem like waste.

Smaller, frequent merges help to avoid integration surprises, but each merge to the Main Line adds overhead, particularly for Code Review. When tasks are coupled, each task adds coordination overhead. When tasks are larger, dependencies can slow development.

A merge carries some overhead, though larger merges have more overhead than smaller ones.

When you develop using Test-Driven Development and/or Unit Testing, the tests typically cover small units of work, even if the units don’t represent a complete feature.

You want to balance delivery speed with process overhead, giving you the ability to deliver working software at high frequency.

Small Pieces Loosely Joined

** Split Each Product Backlog Item into Small Development Tasks that can be completed and integrated in a day or less. Design to allow for incremental integration and/or feature hiding.**

Small Development Tasks are coherent units of work that can be completed quickly and merged into the Main Line without breaking anything. A Small Development Task is usually associated with a Task Branch. If a Product Backlog Item cannot be completed by a developer in the desired integration time, plan to break it into a set of tasks that:

Working in small steps can improve quality {Broza, 2024 #243160}:

Small, safe steps. Proceed in tiny steps that are easy to test and undo. This principle takes the ideas of breaking work down, making reversible decisions, and getting rapid feedback to a micro level. It allows you to quickly realize what doesn’t work and to then change direction. Test-driven development implements this principle too.

The team should plan these tasks in a way that facilitates collaboration. While, Ideally, Product Backlog Items are independent, Small Development Tasks may have sequence dependencies. Strive to develop mechanisms such as contract tests and interface definitions that allow others to move forward while a task is in progress.

By breaking down work into smaller parts, you can {Berczuk #158708}:

Additionally, since smaller tasks are easier to estimate and track, you can:

The act of trying to break backlog items into Small Development Tasks can also validate your engineering approach {Sutherland and Coplien, 2019 #38181}:

Keep in mind that the main purpose of bringing the team together to refine the backlog may be to get the team to start thinking about how to implement the envisioned features. Refinement is part of a learning process.

Planning for Small Development Tasks means that your team needs to do some basic design work during planning and identify intermediate goals, which will provide more confidence in their ability to meet goals.

Task Breakdown Approaches

Breaking down work need not be complex, though doing it well requires some design thought. Some natural boundaries in the development process can help you break down tasks:

For example, consider an app that has mobile, web, and backend components. You could:

Not all post-merge integrations will go smoothly, especially if the intermediate tests were incomplete, but you can work to improve on this.

When you have a small task that implements only part of a feature, you want to be mindful that the work does not interfere with the running system. There are (at least) 3 basic strategies to approach this:

Add test cases that ensure that code is not accessible from an external interface unless the correct flags are set. Be sure to apply appropriate security approaches to ensure that partial implementations do not expose vulnerabilities.

Cautions

Caveats

There is a perspective that one should prefer small “tracer bullet” stories that cut through the system over tasks {Cohn, 2006 #222473}:

Don’t split a large story into tasks. Instead, try to find a way to fire a tracer bullet through the story.

If you can find an end-to-end story that can be completed in a short period of time, this is ideal, though when you have different people working at different parts of the stack, you may still have different code commits, perhaps touching different repositories.

Next Steps

Refs