Every system has a bottleneck that limits the possible output of that system. Some software teams are organised linearly (work is passed along a chain of teams); in which case the bottleneck is one of those teams. Many software teams are self-organising (or at least seek to be), in this case there will be a person or function in this team which is the bottleneck.
Ensure there is a steady supply of work for the bottleneck
As the bottleneck controls our output, and time lost from the bottleneck is lost for the team, we ensure there is always work for the bottleneck to do.
Offload the bottleneck from unnecessary tasks
Any work that can be done by others is disbursed to them, freeing the bottleneck up to only do work they must do.
Plan others’ work around the bottleneck
The bottleneck’s work (including others work that requires the bottleneck) is planned first. Once it is planned, others work which does not interact with the bottleneck’s can be planned.
Ensure quality inputs into the bottleneck
To minimise the risk of bottleneck rework, extra quality steps are introduced immediately before the bottleneck.