Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BAU: Breaking down work #947

Merged
merged 1 commit into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions source/partials/_nav-software-development.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<li><a href="/standards/tracking-dependencies.html">How to manage third party software dependencies</a></li>
<li><a href="/manuals/accessibility.html">Building accessible services</a></li>
<li><a href="/standards/pair-programming.html">Pair programming</a></li>
<li><a href="/standards/breaking-down-work.html">Breaking down work</a></li>
<li><a href="/manuals/browser-support.html">Supporting different browsers</a></li>
<li><a href="/standards/optimise-frontend-perf.html">How to optimise frontend performance</a></li>
<li><a href="/standards/architecture-decisions.html">Documenting architecture decisions</a></li>
Expand Down
46 changes: 46 additions & 0 deletions source/standards/breaking-down-work.html.md.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
title: Breaking down work
last_reviewed_on: 2024-10-10
review_in: 6 months
---
# <%= current_page.data.title %>

Working sustainably in small batches and performing regular releases is considered [industry best practice](https://en.wikipedia.org/wiki/DevOps_Research_and_Assessment#DORA_Four_Key_Metrics).
It reduces the risk of errors being introduced, makes delivery of value more predictable, and enables us to learn faster.

Our perception of value is not just putting working software and new features into the hands of users. It’s also:

- Learning about user needs.
- Improving operational resilience.
- Minimising [toil](https://sre.google/sre-book/eliminating-toil/).
- Reducing cost of change.

We should aim to break down our work into independently releaseable pieces that each deliver their own value.

## Why break down work?

There are many reasons why working in smaller batches provides an advantage in software development.

- It articulates value. If we are able to clearly state where the value is in a piece of work then we are more able to break it down into valuable milestones.
- It reduces waste. Code that is written but not integrated and being used is wasted effort, and we want to minimise that waste.
- It promotes predictable delivery. We often need to know when a feature is likely to be complete and having clear regular milestones facilitates those conversations with evidence rather than estimates.
- It enables fast feedback. We can learn a lot from regularly releasing our code to production environments even if the effects are not visible to users. We also get feedback on our code design because well-written code will be easier to iterate on.
mrwilson marked this conversation as resolved.
Show resolved Hide resolved
- It boosts team morale. The unit of delivery is the team, and delivering value regularly is much better for morale than working on big-bang releases for months at a time.

## How do we break down work?

- [Example mapping](https://cucumber.io/blog/bdd/example-mapping-introduction/). Splitting up a large feature into individual capabilities will demonstrate where the dependencies are, which are the most valuable, and the subsequent ideal ordering.
- Get work live as soon as you can. Deploy changes safely behind feature toggles or limited to lower (non-production) environments to get fast feedback on the thing you've changed. For example, you might integrate your code with a third-party service but discard the result rather than take action; Martin Fowler calls this [dark launching](https://martinfowler.com/bliki/DarkLaunching.html).
- Finish one thing at a time. Having too much work in progress (WIP) reduces the team's ability to react to change and feedback, and it's much better to avoid context switching. If your team has lots of work in flight because there are lots of blockers, then work with your delivery colleagues to establish why this is happening.
- Loosely coupled components and systems. Systems that need to be changed together will block each other, so try to build systems that have well-defined contracts but also operate under the robustness principle (be conservative in what you send, liberal in what you accept). For example, do not rely on ordering for JSON objects and ignore unexpected fields rather than cause an error.
- Failing early and safely. Working in small batches reduces risk of bugs, but when those bugs do happen it's much easier to roll back a small change than a large one. Your team should be aspiring to some form of automated rollback in case of errors in production environments, such as blue-green deployments or canary releases.

## Further reading

Find out more about breaking down work:

- [Why breaking down work is important][breaking down work] - an expanded version of this page
- [Software has diseconomies of scale – not economies of scale][scale]

[breaking down work]: https://blog.probablyfine.co.uk/2024/09/27/why-breaking-down-work-is-important.html
[scale]: https://www.allankelly.net/archives/472/software-has-diseconomies-of-scale-not/
5 changes: 4 additions & 1 deletion source/standards/continuous-delivery.html.md.erb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ You should aim to have small Pull Requests, so that they are easier to review an
You should aim for your feature branches to live for only a day or two before getting merged.
If a branch lasts longer than this, you could ask for help, or consider a different approach to the problem.

You can use approaches like [feature-flagging][] or [modular architectures][] to deploy partially complete features. This reduces the size of changes going to production and encourages your team to build modular, configurable systems.
You can use approaches like [feature-flagging][] or [modular architectures][] to deploy partially complete features. This reduces the size of changes going to production and encourages your team to build modular, configurable systems.

You should [break down work][] into chunks that make continuous delivery easier to achieve as opposed to large chunks and big-bang releases.

### Automatic build promotion

Expand All @@ -68,6 +70,7 @@ Find out more about continuous delivery from:
[modular architectures]: https://continuousdelivery.com/implementing/architecture/
[production monitoring and alerting]: /standards/monitoring.html
[Pull Requests]: /standards/pull-requests.html
[break down work]: /standards/breaking-down-work.html
[Architecting for Continuous Delivery]: https://www.youtube.com/watch?v=Lx9ssegE6FA
[Accelerate]: https://wordery.com/accelerate-nicole-forsgren-phd-9781942788331?cTrk=OTc2NDYwNzZ8NWI2ZDg5NGJkYzAyZjoxOjE6NWI2ZDg5NDQwM2ZhODguNDU0MTgxMTU6ODJlODM3ODY%3D
[Trunk Based Development]: https://trunkbaseddevelopment.com/
Expand Down