Part 2A - Understanding Engineering Capacity
(Reading Time: 4 minutes 30 seconds)
Jira Isn’t a Capacity Statement
Have you ever been asked why a development team isn’t delivering more features? Let’s say we have three developers working forty hours a week. That’s 120 hours of engineering capacity every week. It sounds like a lot of time, so where is it going? Usually we open Jira, look at the stories that were completed, and try to explain what everyone was doing.
There’s nothing wrong with starting there. A Jira board can tell us what work we’re managing, what has been completed, and what we still intend to do. Depending on how we estimate our work, it may even give us an idea of the effort involved. But a list of completed stories isn’t the same thing as accounting for the team’s available capacity.
Where Engineering Capacity Goes
In Part 1, Making Invisible Developer Work Visible, I introduced five purposes of engineering work: Build, Fix, Improve, Run, and Evolve. These describe what we’re trying to accomplish, rather than the individual activities involved in accomplishing it.
Consider a team of three developers responsible for a customer portal.
Accounting for the Work
Definitions
Activity Cost Pool:
An activity cost pool is a collection of costs associated with performing a specific activity or group of related activities within an organization, which are subsequently allocated to products, services, or other cost objects using an appropriate cost driver.
Activity Cost Driver:
An activity cost driver is a measurable factor that determines or reflects how much of an activity is consumed by a product, service, or other cost object, and is used to allocate costs from an activity cost pool to those cost objects.
Cost Object:
A cost object is anything for which an organization wants to separately measure, accumulate, or assign costs, such as a product, service, project, system, department, or customer.
If we look at the work distributed to the different activities over two sprints, it looks like this:
Two Week Summary - Sprint One
| Person | Task | Activity Cost Pool | Activities | Cost Object | Activity Cost Driver (Hours) |
|---|---|---|---|---|---|
| Developer 1 | Add button to Customer Portal | Build | Coding | Customer Portal | 40 |
| Developer 1 | Test button added to Portal | Build | Testing | Customer Portal | 40 |
| Developer 2 | Find invoice bug | Fix | Debugging | Invoice Calculation | 40 |
| Developer 2 | Fix invoice bug | Fix | Coding | Invoice Calculation | 10 |
| Developer 2 | Add tests to prevent bug recurring | Fix | Testing | Invoice Calculation | 30 |
| Developer 3 | Migrate database to new format | Evolve | Designing | Engineering Department | 80 |
Two Week Summary - Sprint Two
| Person | Task | Activity Cost Pool | Activities | Cost Object | Activity Cost Driver (Hours) |
|---|---|---|---|---|---|
| Developer 1 | Release button to production | Build | Build Pipeline | Customer Portal | 20 |
| Developer 1 | Ensure button works | Build | Observability | Customer Portal | 60 |
| Developer 2 | Release hot fix | Fix | Build Pipeline | Invoice Calculation | 20 |
| Developer 2 | Ensure hot fix works | Fix | Observability | Invoice Calculation | 60 |
| Developer 3 | Migrate database by creating test data | Evolve | Coding | Engineering Department | 80 |
Monthly Summary - Activity by Cost Object
| Cost Object | Activity Cost Pool | Designing | Debugging | Coding | Testing | Build Pipeline | Observability | Total |
|---|---|---|---|---|---|---|---|---|
| Customer Portal | Build | 0 | 0 | 40 | 40 | 20 | 60 | 160 |
| Invoice Calculation | Fix | 0 | 40 | 10 | 30 | 20 | 60 | 160 |
| Engineering Department | Evolve | 80 | 0 | 80 | 0 | 0 | 0 | 160 |
| Total | 80 | 40 | 130 | 70 | 40 | 120 | 480 |
Note: whether a cost is direct (Customer Portal/Invoice Calculation) or indirect (Engineering Department) depends on the cost object, not on the cost driver.
Conclusion - Understanding Capacity
In Part 1 - Making Invisible Developer Work Visible, we established five different purposes of engineering work. We’ve now taken that a step further by looking at how engineering capacity is consumed, what activities developers are performing, and where that effort is going.
In our example, we accounted for 480 hours of development work over two sprints. We can see how much time was spent building features, fixing defects, and evolving existing systems. We can also see which activities consumed that capacity and which parts of the system they supported. That’s more information than simply knowing which Jira tickets were completed.
Knowing where our capacity went doesn’t tell us whether it was well spent. We also haven’t established what any of that work actually cost the organization. What we have is a starting point for understanding how engineering resources are consumed.
In Part 2B - Understanding Activity-Based Engineering Costs, we’ll take a closer look at how activities consume engineering capacity, and how we can allocate that effort to the features, services, and systems that demand it.