![](http://iextendable.com/wp-content/uploads/2024/12/image-1024x839.png)
There’s a game I like to play called Factorio–I put something like 500 hours into it over 2 years :). This screen grab captures part of what I love about it. The down-arrow on the top left corner shows iron plates traveling down a conveyor belt. There’s a splitter that pushes the iron plates off to the right where they’re being fed into machines that create cogs. As the iron plates move to the right down the line of cog machines, they start to thin out. The machines at the end of the line don’t have any raw materials to work with so they sit idle.
Iron plates production is not balanced against cogs production. One might be tempted to increase iron plates production, but a closer look reveals something–the belt carries iron plates is already full. The belt can’t get iron plates to the cogs machines fast enough to satisfy the demand.
Iron plates production is not the bottleneck–belt capacity is. We can either use belts w/ larger capacity (aside: blue belts are already the largest capacity belts in Factorio), or if that’s not possible we need to partition and parallelize our iron plates production.
If the graphic isn’t super clear to you, don’t worry. I won’t rely on it too much. But Factorio is a game about constraints and bottlenecks. These are slightly different things.
A bottleneck is simply a resource that has more demand placed on it than capacity to deliver [sic]. A constraint is the bottleneck with the least capacity in the entire system
source
“Bottlenecks” are “what’s slowing you down,” but a “constraint” acts as a permanent limiter on the productivity of any system. Given the design of any production system, we cannot get more out of it than the constraint allows. If we need more production, we must either duplicate and parallelize our production system, or redesign it.
In order to identify the bottlenecks and constraints of a system, we must map the production process from initial inputs to delivery then look for starved steps. A starved step is like the the cog machines in Factorio–they lack the inputs needed to satisfy the output demands. But all bottlenecks are not created equal: bottlenecks in early steps are more important than bottlenecks in later steps since they have the potential to starve a far greater number of downstream steps. This is the observation behind the advice in the tech industry to “Shift Left.”
This last point yields a paradoxical conclusion proven beyond doubt in the 20th century by Japanese auto manufacturers: building quality gates into your production process increase overall production. This is paradoxical because if you’re stopping the production line all the time, how can you actually increase production? In this model, any quality issue is a bottleneck at any step in the production system. By identifying the source of the quality issue upstream that caused the stoppage we can address and eliminate bottlenecks thus improving overall productivity.
Another way to look at this is from the perspective of the cost of rework. Let’s assume that no production process is perfect and that for any number of widgets produced we will have some percentage of defective widgets for a variety of reasons. If we don’t bother with QA until the end of the assembly line, then we basically have effectively lost the entire cost of production per unit.
loss = cost_per_unit *
(
number_of_defective_units +
min(cost_of_repair, cost_of_replacement) +
opportunity_cost_of_unit_not_being_available
)
However, if we stop the line at the point a defect is first detected, we lose only the cost per unit up to that point in the production process. The earlier we find the defect, the lower the cost of the defect.
Conclusion: Quality inspection at each stage of a production process lowers the cost of the production process by lowering the cost of rework and by increasing the speed of production.
Conclusion: Quality is not properly conceived of as being pitted against productivity, but as a key enabler.
Bottlenecks and Prioritization
One of my favorite ways of distilling all of this complexity is
Any optimization not aimed at a bottleneck is an illusion.
Why is this the case? If you optimize your process before the bottleneck you will create a logjam at the point of the bottleneck since more units cannot get through. If you optimize your process after the bottleneck your downstream workstations will be starved. In either case, you will not actually increase productivity because no more units of work are moving through the system. We can take from this that if we wish to improve our systems we must focus on identifying and removing (where possible) bottlenecks.
Recall though that all bottlenecks are not created equal. The further upstream a bottleneck is, the more negative impact it has on production since no downstream production step can operate at capacity. Therefore we should aim at the earliest bottleneck in our production system.
The Constraint
Eventually you will find a bottleneck that cannot be expanded either due to the resource cost being too high or some other factor. If all of the earlier stages of production are operating at capacity, then this is your constraint of your production system. Upstream steps need to be optimized only to the point that they can feed the constraint at full capacity. Downstream steps need to be optimized only to the point that they can handle the output capacity of the constraint. All other optimizations are wasteful.