Published 04 Sept 202615 min read

Stop Maximizing Utilization. Optimize Flow Instead.

Overview

A team can be fully busy and still deliver almost nothing.

That is the uncomfortable lesson behind Eliyahu Goldratt and Jeff Cox's The Goal: maximizing the activity of every person or machine is not the same as maximizing the output of the system. In fact, pushing every resource toward 100% utilization often creates more queues, longer lead times, later feedback, and less valuable output.

The better question is not “Is everyone busy?” It is “How quickly and reliably does important work become a valuable customer outcome?”

This article builds that idea from a three-stage factory into two places where local efficiency is especially seductive: software engineering and startups.

The smallest useful model

Utilization is the share of a resource's available capacity currently occupied. Flow is the rate at which the whole system turns selected demand into completed, valuable outcomes.

Those measurements look at different boundaries. Utilization measures a resource. Flow measures an end-to-end system.

Conceptual reconstruction: the system matters only when a selected problem reaches a reliable outcome and produces evidence. This is not a figure reproduced from The Goal.

The first decision is therefore the system boundary. “Code written” is not an engineering outcome. “Contract signed” is not a startup outcome. A useful boundary begins with chosen demand and ends after the customer can experience the result.

This distinction is central to the Theory of Constraints, the management method introduced through The Goal. Its focus is the factor limiting the whole system, not isolated efficiency scores. The Theory of Constraints Institute's overview describes the shift explicitly: away from optimizing separate functions and toward increasing system throughput. Goldratt's official book catalogue identifies Drum–Buffer–Rope, the Five Focusing Steps, and throughput accounting as core applications taught by the book.

One fast stage cannot make a slow system fast

Imagine work passing through three production stages:

StageCapacity per hour
A10 units
B5 units
C10 units

Stage B is the constraint: the resource whose available capacity currently limits the system's output. Even if A and C can each process ten units per hour, the system can finish no more than five.

If A runs at full speed for eight hours, it creates 80 units. B can process 40. The other 40 wait in front of B. If A instead produces 40 units at B's pace, the system still finishes 40 units—but without the extra queue.

Eight-hour resultA at 10/hourA at 5/hour
Work started8040
Work completed4040
New queue before B400

A's extra activity did not create throughput. It created work in progress (WIP): work that has started but has not yet become a finished outcome.

Conceptual reconstruction: the added path opens the delivery system. Demand waits before the constraint; the constraint sets the sustainable completion rate.

The queue is not merely untidy. It changes economics and learning:

  • cash and attention become trapped in unfinished work;
  • lead time grows before throughput grows;
  • defects and wrong assumptions remain hidden longer;
  • priorities change while old work is still moving;
  • coordination expands because more items are simultaneously active.

Goldratt's distinction between activation and utilization helps here. Activation means making a resource work because capacity is available. Useful utilization means operating it in a way that advances the system's goal. A producing ten units while the system can absorb only five is activated, but its extra five units do not improve the system.

Now translate the same structure into the recurring checkout-team example. Selected customer problems accumulate before review and release; that constrained step governs how quickly changes become reliable production outcomes.

Why 100% utilization produces queues

Real work varies. A code review takes ten minutes or two hours. A test fails unexpectedly. A customer misses an onboarding call. A founder delays a decision. If every resource is planned at 100% of average capacity, no spare capacity remains to absorb any of that variation.

The first delay creates a queue. New arrivals continue while the delayed work is being cleared. The queue then creates more delay, because every later item waits behind it. High utilization near a variable constraint therefore behaves less like a perfectly filled calendar and more like a congested motorway.

Queueing theory gives teams a useful consistency check. Under stable long-run conditions, Little's Law says:

average WIP = average throughput × average lead time

John Little's original 1961 paper proves the relationship as L = λW under finite, stationary long-run averages (INFORMS, “A Proof for the Queuing Formula”). The equation is an accounting identity under those conditions, not a promise that every week will behave identically.

Suppose a team has 12 items in progress and completes four per week. Its implied average lead time is three weeks:

12 items = 4 items/week × 3 weeks

If throughput stays near four per week while WIP rises to 20, average lead time rises toward five weeks. Starting more work does not create more capacity at the constraint.

Spare capacity outside the constraint is therefore not automatically waste. It can absorb variation, unblock the constraint, review risky work earlier, improve automation, or remain deliberately unused so the system does not flood itself.

Drum–Buffer–Rope turns the insight into control

Goldratt's production-control pattern is Drum–Buffer–Rope:

  • Drum: the constraint establishes the system's pace.
  • Buffer: a small amount of ready work protects the constraint from being starved.
  • Rope: a release rule admits new work according to that pace.

The buffer is protection, not permission for an unlimited backlog. Too little ready work can leave the constraint idle. Too much hides problems and lengthens lead time. Its health—not its maximum size—guides intervention.

Conceptual reconstruction: measured constraint cadence controls work release; customer evidence changes the next release decision. Falsify this model by checking whether the named constraint actually governs completed outcomes over several cycles.

This is a feedback system. The constraint's observed pace controls admission. The protected queue keeps valuable, ready work available. Completed outcomes produce evidence. That evidence changes what enters next.

The Theory of Constraints Institute's Five Focusing Steps formalize the improvement loop:

  1. Identify the system's current constraint.
  2. Exploit it: get more useful output from existing constraint capacity.
  3. Subordinate everything else: align other work to protect the constraint and stop overproduction.
  4. Elevate it: add capacity only after better use and alignment are exhausted.
  5. Repeat when the constraint moves; yesterday's policy can become today's constraint.

“Exploit” here means use carefully, not overwork people. Remove avoidable interruption, poor inputs, rework, and low-value demand from the constrained step. Sustainable human systems require slack, rotation, and recovery.

Apply it to software engineering

An engineering team often treats coding as the system. It is only one stage.

A realistic path might be:

customer problem -> product decision -> implementation -> review and CI
                 -> production release -> customer behavior

The constraint could be senior design review, flaky integration tests, security approval, deployment access, product decisions, or customer validation. Hiring more programmers helps only when implementation is the active constraint. Otherwise, faster coding feeds a downstream queue.

Consider a checkout team. Five engineers can each finish two implementation tasks per week, but one reviewer and a fragile release process can safely move only four tasks into production. Planning ten new tasks does not create ten outcomes. It creates six waiting tasks, context switching, merge conflicts, stale assumptions, and delayed feedback.

Local metrics make this failure look successful:

Local utilization signalFlow signal
Engineer allocation percentageCustomer problem-to-production lead time
Commits or pull requests openedValuable changes reaching production
Story points startedItems completed and validated
Reviewer calendar occupancyReview queue age and blocked time
Test runner busy timeReliable release throughput

Start with an explicit operating contract

The contract below is illustrative team policy, not a rule copied from The Goal. It defines the system boundary, current constraint, WIP limits, and release rule before prescribing tools.

# Illustrative policy: review quarterly or whenever the constraint moves.
flow_goal: "validated customer problems resolved per week"
start: "team commits to implementation"
done: "change is reliable in production and evidence is reviewed"
current_constraint: "review and release"
wip_limits:
  implementing: 3
  review_and_release: 2
expedite_limit: 1
release_rule: "pull one new item only when a downstream slot opens"

The team, not a workflow engine, interprets this policy. It changes planning and pull decisions: engineers finish or unblock downstream work before starting more. Its physical cost is ordinary developer and CI capacity. Its observable proof is lower queue age and lead time without a fall in valuable throughput or reliability.

Make the release rule executable

The internal decision can be tiny. This TypeScript is illustrative pseudocode; it expresses the policy's state transition rather than production code from the book.

type FlowState = {
  implementing: number;
  reviewAndRelease: number;
  constraintBlocked: boolean;
};

function nextAction(state: FlowState): 'UNBLOCK' | 'REVIEW' | 'PULL' | 'WAIT' {
  if (state.constraintBlocked) return 'UNBLOCK';
  if (state.reviewAndRelease > 0) return 'REVIEW';
  if (state.implementing < 3) return 'PULL';
  return 'WAIT';
}

This rule refuses to equate idle typing time with failure. WAIT is valid when starting another item would violate the WIP limit. UNBLOCK and REVIEW redirect spare capacity toward the constraint.

Test the policy with evidence

Measure the end-to-end boundary, not individual busyness. Given an illustrative work_items table, this query calculates weekly throughput and average lead time for items that reached production:

-- Illustrative schema: work_items(id, committed_at, production_at, outcome_validated_at)
SELECT
  DATE_TRUNC('week', production_at) AS production_week,
  COUNT(*) AS throughput,
  AVG(production_at - committed_at) AS average_lead_time
FROM work_items
WHERE production_at IS NOT NULL
GROUP BY 1
ORDER BY 1;

Pair it with queue age, blocked time at the constraint, escaped defects, and outcome validation. A shorter lead time achieved by shipping smaller but useless changes is not improved flow. A higher throughput achieved by creating incidents is not valuable throughput.

Run the policy as an experiment for several delivery cycles:

  1. Record WIP, throughput, lead-time distribution, review queue age, reliability, and one customer outcome.
  2. Lower the upstream WIP limit without changing staffing.
  3. Redirect spare capacity toward preparing, reviewing, testing, or unblocking constrained work.
  4. Compare completed outcomes and lead time with the baseline.
  5. If throughput falls because the constraint is starved, increase the protective buffer slightly. If the queue keeps growing, reduce release or revisit the constraint hypothesis.

Apply it to a startup

A startup is also a flow system, but its goal changes with stage.

Before product-market fit, useful flow is often validated learning: turning a risky belief about a painful customer problem into behavioral evidence. After product-market fit, the boundary may become retained customer value, reliable onboarding, or profitable revenue. “Features shipped” and “leads generated” are intermediate activity unless they advance that goal.

Common startup constraints include:

  • access to qualified customers;
  • founder decision latency;
  • product reliability;
  • trust, compliance, or procurement;
  • implementation capacity;
  • onboarding capacity;
  • sales capacity;
  • retention or customer success.

Suppose sales signs 20 customers per week while onboarding can activate only five. Sales looks productive. Company flow is five activated customers per week. Fifteen new commitments enter the queue every week, time-to-value grows, expectations decay, support load rises, and churn risk appears before revenue quality can be learned.

Subordination does not necessarily mean “sell less.” It means stop making uncontrolled promises the system cannot fulfill. Sales can schedule start dates, narrow qualification, sell standardized packages, or help remove onboarding friction. Product can reduce setup steps. Founders can protect fast exception decisions. Only after those changes should the company add onboarding capacity.

The same logic can point in the opposite direction. If engineers ship faster than customers can evaluate, engineering is not the constraint. More feature capacity increases inventory. The highest-leverage work may be customer access, positioning, distribution, or a faster learning loop.

Startup symptomLikely question
Many features, little adoptionIs customer learning or distribution the constraint?
Many signed deals, slow activationIs onboarding the constraint?
Full pipeline, few closesIs qualification, trust, or sales execution the constraint?
Strong acquisition, weak retentionIs delivered value or reliability the constraint?
Decisions wait for one founderIs decision authority the constraint?

Do not turn “the bottleneck” into a label for an overworked person. A constraint is a property of the current system: its policies, skills, handoffs, demand mix, and capacity. Blaming the individual usually protects the system that created the queue.

Week 1: define the goal and boundary

Name one valuable output. Choose explicit start and done events. Map every stage between them. Separate arrival rate, WIP, throughput, and lead time; they answer different questions.

Week 2: find the constraint from evidence

Look for the persistent oldest queue, recurring expedite work, blocked downstream capacity, or a step whose lost time reduces completed outcomes. Observe several cycles. A temporary incident is not automatically the constraint.

Week 3: exploit and subordinate

Protect the constrained step from poor inputs, avoidable meetings, rework, and low-value demand. Put quality checks before expensive scarce capacity. Set WIP limits upstream. Swarm to finish and unblock rather than starting more.

Week 4: elevate carefully, then repeat

If the constraint remains binding after the first changes, add skill, automation, tooling, authority, or people. Measure again. If the queue moves, the constraint moved too; update the policy instead of defending the old solution.

Use one weekly review:

QuestionEvidenceDecision
What valuable output changed?completed, validated outcomeskeep or redefine boundary
Where did work wait longest?queue age and blocked timeconstraint hypothesis
Was the constraint starved or overloaded?buffer historyadjust readiness or release
What consumed constraint time without value?rework and interruption logremove or move work
Did flow improve safely?throughput, lead time, reliability, outcomecontinue, reverse, or elevate

Where the model fails

Constraint thinking is powerful, not magical.

  • The boundary can be wrong. Optimizing deployment flow is useless if retained customer value is the real goal and nobody wants the changes.
  • The constraint can move. Improving review may expose testing, product decisions, or demand as the next limit.
  • Several product flows can share resources. One simple bottleneck model may hide different constraints for urgent support, enterprise sales, and self-serve delivery.
  • Little's Law can be misused. Short measurement windows, unstable demand, changing definitions, and censored unfinished work can produce misleading averages.
  • A WIP limit can become bureaucracy. The limit is a feedback mechanism. Change it when evidence shows starvation, overload, or a moved constraint.
  • Human capacity is not machine capacity. Sustainable creative work depends on focus, recovery, learning, and psychological safety. Chronic overload damages future capacity.

The model earns trust through falsification. If the supposed constraint can lose capacity without changing system output, it probably is not the active constraint. If reducing upstream WIP increases starvation and lowers throughput, the buffer or constraint diagnosis is wrong. If flow metrics improve but customer outcomes do not, the system boundary is too narrow.

The reusable decision rule

When someone proposes making a team, tool, or department busier, ask four questions:

  1. What valuable end-to-end output are we trying to increase?
  2. What currently limits that output?
  3. Will this change protect or improve that constraint?
  4. If not, what queue or coordination cost will the extra activity create?

Then apply the discipline:

Keep the constraint productively protected. Keep non-constraints responsive, not maximally busy. Release work at the rate the system can finish and learn from it.

Busy people create inventory. A coordinated system creates outcomes.

Sources and adaptation notes

The book source is Eliyahu M. Goldratt and Jeff Cox, The Goal: A Process of Ongoing Improvement. Editions differ in pagination; this article synthesizes the utilization, constraint, and flow argument rather than claiming one printed page, PDF page, or source figure. The TOC definitions and Five Focusing Steps are cross-checked against the Theory of Constraints Institute pages linked above. The queueing identity is grounded in Little's original 1961 paper.

All diagrams, factory numbers, code, SQL, engineering cases, startup cases, policies, and 30-day practices in this article are conceptual reconstructions or adaptations. They are not figures, code, or case results reproduced from The Goal. They should be tested against a team's observed flow rather than treated as universal prescriptions.

For the complementary Toyota argument about overproduction, read “Efficiency Is Not ‘Faster and More’”.