Controlling flow under uncertainty
Half a kilometer of one lane
Throughput = speed × density
Try: push demand past 60 cars/km in open access and watch the “add 10%” stat turn negative. Then switch on ramp metering at ~55: throughput stays near peak and the excess waits harmlessly at the ramp.
Demand over a day vs capacity
Visible congestion: forecast wait if you arrive at…
Try: raise the price from $0 to $5. Moving a small share of work out of the rush hours removes most of the queue time, because queue time grows nonlinearly with load. The right-hand curve is the forecast you would publish (F3) so requesters can decide for themselves.
No resynchronization: slips accumulate
Resync every 2 weeks
Try: set the margin to 0. Lateness carries over every cycle and the cadence no longer bounds anything (F6). Give each cycle a margin of about σ and the deviation resets every cycle (F5).
Wait per question over 120 working days
cadence capacity 2.5/d vs demand 1.5/d · margin okTry: raise “people needed” to 7. On-demand waits balloon because the chance that everyone is free on a day is 0.7n, while the standing slot never waits more than its interval. Then drop the slot capacity below demand: the cadence loses its margin and its waits stop being predictable.
Handoffs: upstream completions → downstream pickups
Finished work waiting between the stages
Try: “Synchronized” puts the pickup just after upstream finishes, so work barely waits. “Synced, no margin” uses the same cycles but picks up before the latest upstream finish, so jittered batches miss and wait a whole cycle (F10). “Non-harmonic” shows irregular waits that no offset can fix (F14).
Jobs waiting for one team
| job | weeks | CoD $k/wk | CD3 | |
|---|---|---|---|---|
| APlatform migration | 1.00 | |||
| BCheckout bug | 4.00 | |||
| CEnterprise SSO | 5.00 | |||
| DAnalytics export | 1.00 | |||
| EPricing page | 1.00 |
Schedules (Gantt) and the delay cost each one pays
Total cost of delay = Σ CoD × finish week
Try: “Equal cost of delay” makes SJF tie WSJF (F15); “Equal durations” makes HDCF tie WSJF (F16). Switch to “durations unknown” and make job A 15 weeks long: the sorted policies can no longer see it coming, and round-robin with a cheap switch limits the damage (F19). Raise the switch cost to see why preemption only pays when switching is cheap (F20).
Who can do what
Solid: specialty. Dashed: cross-trained, works at 80% speed. Expert 1 alone faces 91% load from X.
Mean cycle time (× one job's service time), 15,000 simulated jobs each
| Bind at arrival, blind | Bind at arrival, see queues | Late binding (shared queue) | |
|---|---|---|---|
| Specialists only | 8.6 p90 22.2 | 8.6 p90 22.2 | 8.6 p90 22.2 |
| Chained cross-training | 15.1 p90 36.4 | 4.1 p90 8.8 | 2.9 p90 6.2 |
| Fully flexible | 25.7 p90 59.1 | 4.3 p90 9.4 | 2.7 p90 5.7 |
Try: raise the share of type X until expert 1 is past 100% load. Specialists go unstable; one dashed link per person (chain) keeps everything flowing, and late binding beats binding at arrival even with the same people (F25, F26). Lower the off-specialty speed to see the cost of flexibility.
F29 · one shared pool vs dedicated resources
Try: at 85% utilization with 4 resources, the pool cuts cycle time by about 3×. Add allocation delay to see when central control becomes the bottleneck itself.
F30 · smooth arrivals before the bottleneck
Kingman: Wq ≈ ((ca² + cs²)/2) · ρ/(1−ρ) · ts. Arrival variability multiplies the bottleneck’s queue, so pay to smooth it upstream where capacity is cheap (release work at a steady rate, split big batches).
- takeawayThroughput peaks at a moderate occupancy and collapses beyond it. Regulate what enters the system, and publish the forecast flow time so people can see the congestion.
- takeawayCadence bounds variance, makes waits predictable and makes small batches cheap, provided each cycle has a capacity margin. Keep nested cadences harmonic and synchronize adjacent steps.
- takeawaySequence by CD3 (cost of delay ÷ duration) at each queue. Use round-robin when sizes are unknown. Bind work to people late, through a flexible, visible network.
All 30 principles of controlling flow under uncertainty
book chapter 7- F1The Principle of Congestion Collapse
Above a certain load, output does not level off; it falls off a cliff.
On a highway, a network or a busy engineering team, extra load past the peak makes everything slower, so less work leaves the system per hour. A test lab that accepts every request ends up with engineers chasing, re-queueing and re-running stale builds, and fewer tests finish per week than when it was less loaded.
↑ see it in the visualization - F2The Peak Throughput Principle
In systems that can congest, regulate occupancy so you stay at the load that gives the highest throughput.
Throughput is speed × density, and speed drops as density rises, so throughput peaks at an intermediate occupancy. Ramp meters do this for freeways; a WIP limit on a review queue does it for a team: hold excess work outside, where it does no harm.
↑ see it in the visualization - F3The Principle of Visible Congestion
Make congestion visible by publishing a forecast of how long new work will take to get through.
Drivers re-route when the sign says '35 min to downtown'; nobody re-routes on a raw queue count. Show requesters the expected flow time ('a new lab request today finishes in about 9 days') so they can choose to wait, reprioritize or go elsewhere.
↑ see it in the visualization - F4The Principle of Congestion Pricing
Charge more for capacity at congested times so that demand that can move, does.
A modest price for peak capacity shifts flexible demand into the shoulders, where capacity sits idle. Internally this can be a priority surcharge on an expedite, or a budget charge for using the shared prototype shop during crunch weeks.
↑ see it in the visualization - F5The Principle of Periodic Resynchronization
Use a regular cadence to stop variance from piling up.
Without resynchronization, schedule slips add up like a random walk and grow with the square root of time. Re-aligning plan and reality every period, as in a fixed-length sprint or release train, keeps deviations bounded to what happens within one cycle.
↑ see it in the visualization - F6The Cadence Capacity Margin Principle
A cadence only holds if there is enough spare capacity to absorb each cycle's variation.
A bus can depart on time only if the schedule has slack for slow traffic. A two-week sprint loaded to 100% cannot absorb surprises, so lateness rolls into the next sprint and the cadence becomes fiction; plan sprints with a margin.
↑ see it in the visualization - F7The Cadence Reliability Principle
Use cadence to make waiting times predictable.
If the architecture review happens every Tuesday, nobody waits more than a week, and everyone knows it. An on-demand review has no ceiling on wait: it depends on whether the reviewers' calendars line up.
↑ see it in the visualization - F8The Cadence Batch Size Enabling Principle
A regular cadence lowers transaction cost, which makes small batches economical.
Pre-scheduled events cost almost nothing to convene, so you can hold them often and handle a few items each time. Weekly releases on a fixed train are cheaper per release than ad-hoc releases that must be negotiated, so batches shrink.
↑ see it in the visualization - F9The Principle of Cadenced Meetings
Hold frequent meetings on a predictable schedule instead of convening them on demand.
A short daily or twice-weekly slot where the right people are already present removes the scheduling overhead and the multi-day lead time of finding a common free hour. Questions wait at most one interval.
↑ see it in the visualization - F10The Synchronization Capacity Margin Principle
Synchronization only works if each participant has enough capacity margin to show up on time.
If the handoff is at 10:00 and upstream sometimes finishes at 10:15, those items miss the pickup and wait a full cycle. Leave enough margin (or offset the pickup) to cover upstream variation.
↑ see it in the visualization - F11The Principle of Multiproject Synchronization
Synchronize work from several projects to share fixed costs and gain scale.
One combined design review, one shared prototype build or one test-lab slot that serves several projects at once spreads the fixed setup cost. Projects that align their milestones to a common cadence get these economies without large batches.
↑ see it in the visualization - F12The Principle of Cross-Functional Synchronization
Use synchronized events that bring every function together to make cross-functional trade-offs quickly.
A trade-off between firmware, hardware and manufacturing is resolved in minutes when all three are in the same room at the same time, and in weeks when it is negotiated by sequential handoffs and email.
↑ see it in the visualization - F13The Synchronization Queueing Principle
Align the batch size and timing of adjacent processes to shrink the queue between them.
If upstream finishes a batch just before downstream pulls one, work barely waits. Mismatched cycles or phases leave finished work idle in an inventory between the two stages, even when both have plenty of capacity.
↑ see it in the visualization - F14The Harmonic Principle
Make nested cadences whole-number multiples of each other.
Daily stand-ups inside two-week sprints inside quarterly releases line up every time. A 3-day cycle feeding a 4-day cycle drifts in and out of phase, so waits are irregular and synchronization is lost.
↑ see it in the visualization - F15The SJF Scheduling Principle
When every job has the same cost of delay, do the shortest job first.
Finishing short jobs first means fewer jobs sit waiting behind long ones, so the total delay paid is smallest. Quick bug fixes before a long refactor, if they are equally urgent.
↑ see it in the visualization - F16The HDCF Scheduling Principle
When every job takes the same time, do the job with the highest cost of delay first.
With equal durations, the only lever is which delay cost you pay the longest; make the cheap-to-delay jobs wait. Among equally sized features, ship the one that unlocks the biggest customer first.
↑ see it in the visualization - F17The WSJF Scheduling Principle
When durations and costs of delay both vary, use weighted shortest job first: rank by cost of delay divided by duration.
Cost of delay divided by duration (CD3) is the delay cost avoided per unit of scarce capacity. Sorting by it minimizes total delay cost on a single resource; SJF and HDCF are its special cases.
↑ see it in the visualization - F18The Local Priority Principle
Priorities are local: they belong to a queue at a moment, not to a project for all time.
A 'priority 1 project' does not need to go first in every queue it touches; at a given resource, what matters is the CD3 of the waiting jobs right there. Global rankings applied everywhere make the wrong call at many queues.
↑ see it in the visualization - F19The Round-Robin Principle
When you cannot know how long tasks will take, share capacity in short time slices.
Round-robin keeps one unexpectedly huge job from blocking all the short ones behind it: each job gets a quantum in turn, so short jobs finish early. Pick a quantum long enough that switching costs stay small.
↑ see it in the visualization - F20The Preemption Principle
Interrupt work in progress only when the cost of switching is low.
Preempting makes sense when a new job's cost of delay is far higher and the switch is cheap. Every interruption costs setup and context, and frequent preemption can cost more than the delay it saves.
↑ see it in the visualization - F21The Principle of Work Matching
Use sequencing to match each job to the resource best suited for it.
When a specialist frees up, pick the waiting job that benefits most from that specialist instead of the next in line. This only works if the decision is made when the resource frees up, not when the job arrives.
↑ see it in the visualization - F22The Principle of Tailored Routing
Choose and adjust the sequence of process steps to suit each job.
A one-line config change should not travel the same 14-step path as a new subsystem. Let low-risk work skip steps that add no value for it and send high-risk work through extra checks.
↑ see it in the visualization - F23The Principle of Flexible Routing
Route each job through whatever path is currently the most economical.
The best path changes as queues come and go. Like a router or a GPS, decide the route at run time from current congestion, not from a fixed plan made months ago.
↑ see it in the visualization - F24The Principle of Alternate Routes
Build and maintain alternate routes around points of congestion.
A second qualified test vendor, a backup reviewer, or a simulation that can stand in for a hardware test: alternates absorb surges. They must be exercised regularly or they will not work when needed.
↑ see it in the visualization - F25The Principle of Flexible Resources
Use flexible, cross-trained resources to absorb variation.
Even a little cross-training, such as each engineer able to cover one neighbor's area, captures most of the benefit of full flexibility because it links all the queues into one chain.
↑ see it in the visualization - F26The Principle of Late Binding
The later you commit a job to a specific resource, the smoother the flow.
Assigning work to a person at arrival locks it into that person's queue even if someone else frees up first. Keep a shared queue and bind work only when a resource is actually free.
↑ see it in the visualization - F27The Principle of Local Transparency
Make tasks and resources reliably visible to adjacent processes.
Flexible routing and late binding need to see where the queues are and who is free. A visible board of the next process's queue lets upstream route work to an idle path instead of a blind guess.
↑ see it in the visualization - F28The Principle of Preplanned Flexibility
If you need fast responses, plan and pay for flexibility before you need it.
Cross-training, pre-qualified alternate suppliers and modular architectures take time to build. Flexibility bought in advance is cheap insurance; flexibility improvised in a crisis is slow and expensive.
↑ see it in the visualization - F29The Principle of Resource Centralization
Centralized resources, managed correctly, reduce queues.
Pooling demand from many sources onto a shared pool of servers smooths variation, so a central pool needs less capacity for the same wait time than dedicated per-team resources. It fails only if central allocation becomes slow or bureaucratic.
↑ see it in the visualization - F30The Principle of Flow Conditioning
Reduce the variability of the flow before it reaches a bottleneck.
Queue size at a bottleneck grows with the variability of arrivals into it. Smooth the arrivals upstream, where capacity is cheap, so the expensive bottleneck runs at high utilization without a large queue.
↑ see it in the visualization