Managing queues: the invisible inventory
Factory: inventory is physical
$68k on the balance sheetA pile of 34 parts blocks the aisle; the CFO sees $68k of inventory. Someone acts.
Engineering: inventory is information
$0 on the balance sheetEveryone looks 100% busy. The queue lives in inboxes, ticket trackers and branches, so no one sees it.
What 34 invisible items cost (Q2)
Try: x-ray the queues, then drag the queue per hand-off to 20. Nothing in the manager's view changes, yet cycle time grows by weeks and the weekly cost of delay passes a team's payroll.
Queue vs capacity utilization
Try: drag ρ from 80% to 95% and watch the red curve go vertical. Then set Cs² to 0 (fixed task sizes): the purple curve halves but keeps its hockey-stick shape. Shaded box: queue range for a ±5-point swing in load (Q6).
Variability (Q5)
Kingman: Lq ≈ ρ²/(1−ρ) · (Ca²+Cs²)/2. Variability scales the queue linearly(now ×0.63 vs M/M/1); utilization acts through 1/(1−ρ).
One server, Poisson arrivals
t = 0 work-timesItems in system over time: a random walk
Try: run at 70%, then 95%. The average hides long excursions; the queue wanders, drifts, and stays high for a long time.
Where the delay comes from (Q4)
Now 0 in system. Little's Law (Q12) holds for any stable queue: the measured L ÷ λ converges to the measured average cycle time W whatever the distributions. Speed up to 40× to let it settle.
Queueing structure (Q7)
Mean cycle time, in multiples of one engineer's work time per job (M/M/1 vs M/M/4 with Erlang C).
Try: raise utilization to 95% with 6 engineers: separate queues take 20× the work time, the pooled queue far less. The fast single server wins on paper, but if it goes down everything stops.
Linked queues (Q8)
Try: lumpy arrivals (Ca² = 3) into a predictable upstream step (Cs² = 0.2). At low load the lumps pass straight through to the bottleneck; load the upstream step to 95% and it releases work at its own steady rhythm, shrinking the downstream queue.
Choosing utilization with a U-curve
Q9Total cost = cost of capacity + cost of delay
Demand is 4 items/week; v = (Ca²+Cs²)/2 scales the queue; capacity costs $20k per (item/week) of capacity, so lower utilization means paying for more capacity. Try: raise cost of delay and watch the optimum slide left, away from 100%. Note how flat the bottom is.
Queueing discipline: the order matters
Q10Sequence: FIFO
Bar = work (duration, cost of delay per week). Red shading = time spent waiting, darker for higher cost of delay. Each job costs CoD × finish time. Try: switch FIFO → WSJF and watch the dark red waits move to cheap jobs.
Total delay cost by policy
With 2 jobs the order barely matters; with 12 it decides a large share of the cost. Sequencing is valuable when queues are big, but shrinking the queue reduces the delay of every job regardless of order.
Cumulative flow diagram
Vertical gap (amber) = items in queue on that day. Horizontal gap (blue) = how long the item finishing that day spent in the system (FIFO). Slopes = demand and throughput. Try: inspect day 30 with the firefight on, then day 45 to see the gap close again.
Queue size: leading indicator (shaded = surge)
Cycle time of finished work: lagging indicator
Baseline load is 80% of capacity. Both controllers add 60% capacity while their trigger is on; the cycle-time target equals the queue limit converted by Little's Law, so they are tuned identically. Try: surge ×1.5 with limit 12. Queue control reacts the moment work piles up; cycle-time control waits until delayed items finally finish, by which time the queue is already large. Extra capacity days used: react to cycle time 8, react to queue size 7.
30 independent queues, same average load
Each period: one arrival with probability 0.475, one completion with probability 0.5 (0.9 while intervening). Red = one highlighted path; dashed = σ√t, the random-walk spread. Try: 100% load and wait; then switch to "intervene".
- takeawayQueues are the hidden inventory of product development and the root of most waste. Count them at every hand-off; they cost cycle time, risk, overhead, quality and motivation.
- takeawayQueue size rises as 1/(1−ρ) and in proportion to variability. Pick utilization with a U-curve of capacity cost vs cost of delay; the higher the cost of delay, the further below 100% it sits.
- takeawayManage the queue itself: watch it on a CFD, forecast with Little's Law, set limits, and intervene quickly when a random walk carries it past them. Use pooled queues and WSJF sequencing.
All 16 principles of managing queues
book chapter 3- Q1The Principle of Invisible Inventory
Product development inventory is information, so it is invisible both physically and on the balance sheet.
A factory sees its work-in-process as piles on the floor and dollars on the books; a product team's queue is specs waiting for review, branches waiting for QA, and tickets in a backlog. Because nobody trips over it, nobody manages it. Make it visible: count the items waiting at every hand-off.
↑ see it in the visualization - Q2The Principle of Queueing Waste
Queues are the root cause of most of the economic waste in product development.
Every item waiting in a queue adds cycle time, and with it more risk (the market and technology drift while it waits), more variability, more overhead to track and re-plan it, lower quality (feedback arrives late), and less motivation (no urgency for work that will just wait downstream).
↑ see it in the visualization - Q3The Principle of Queueing Capacity Utilization
Queue size grows explosively, not linearly, as capacity utilization approaches 100%.
For an M/M/1 queue the number of items in the system is ρ/(1−ρ): going from 80% to 90% utilization more than doubles it (4 → 9), and 95% doubles it again (19). A team planned to 100% loading has, in theory, an infinite queue.
↑ see it in the visualization - Q4The Principle of High-Queue States
Most of a queue's damage comes from rare high-queue states, not from typical ones.
Queue size follows a geometric distribution: long queues are improbable, but each one delays many items at once, so the low-probability tail carries a large share of the total delay. Watch for, and react to, those states rather than to the average.
↑ see it in the visualization - Q5The Principle of Queueing Variability
Variability in arrivals and in service times increases queue size roughly linearly.
Kingman's approximation multiplies the M/M/1 queue by (Ca² + Cs²)/2: halving the variability of task durations (e.g. M/M/1 → M/D/1) halves the queue. Useful, but utilization is the bigger lever because it acts exponentially.
↑ see it in the visualization - Q6The Principle of Variability Amplification
At high utilization, small changes in load produce large swings in queue size and cycle time.
The slope of the queueing curve, dLq/dρ, rises steeply near 100%. At 95% loading a 1-point change in load moves the queue by several items; at 70% it barely moves. Highly loaded processes amplify the variability fed into them.
↑ see it in the visualization - Q7The Principle of Queueing Structure
Serve pooled demand with reliable, high-capacity servers.
One shared queue feeding several engineers beats a separate queue per engineer, because no one idles while another's line grows and one long job cannot block everyone behind it. A single fast server is even faster, but becomes a single point of failure.
↑ see it in the visualization - Q8The Principle of Linked Queues
Adjacent queues see either the arrival variability or the service variability of the upstream process, depending on how loaded it is.
A lightly loaded upstream stage passes its arrival pattern straight through; a heavily loaded one releases work at the rhythm of its own service times. Look at the whole chain: smoothing a high-variability upstream step can shrink the queue at a downstream bottleneck.
↑ see it in the visualization - Q9The Principle of Queue Size Optimization
The right queue size is an economic trade-off between the cost of capacity and the cost of delay.
More capacity costs money but cuts queues; less capacity saves money but delays everything. Add the two costs and pick the utilization at the bottom of the U-curve. The higher the cost of delay, the lower the economic utilization.
↑ see it in the visualization - Q10The Principle of Queueing Discipline
The cost of a queue depends on the order in which its jobs are served.
When jobs differ in cost of delay and duration, first-in-first-out is rarely optimal; serving the highest cost of delay per unit of capacity first (WSJF) minimizes total delay cost. Sequencing matters most when queues are large; making queues small is better still.
↑ see it in the visualization - Q11The Cumulative Flow Principle
Use cumulative flow diagrams to monitor queues.
Plot cumulative arrivals and cumulative departures over time: the vertical gap is the current queue, the horizontal gap is the time an item spends in it, and the slopes are demand and throughput. Emerging queues show up as a widening gap long before deadlines slip.
↑ see it in the visualization - Q12Little's Formula
Average wait time equals average queue size divided by average processing rate.
Little's Law (W = L / λ) holds for any stable queue regardless of distributions. If a test team finishes 10 builds a week and 40 are waiting, a new build waits about four weeks; you can forecast cycle time from a queue count.
↑ see it in the visualization - Q13The First Queue Size Control Principle
Don't control capacity utilization; control queue size.
Utilization is hard to measure and, near 100%, tiny errors in it mean huge differences in queues. Queue size is easy to count, and it is what actually causes delay, so set limits on it and act when they are exceeded.
↑ see it in the visualization - Q14The Second Queue Size Control Principle
Don't control cycle time; control queue size.
Cycle time is a lagging indicator: you only learn it when items finish, long after the queue built up. Queue size is a leading indicator that moves the moment arrivals outpace capacity, so it lets you intervene earlier.
↑ see it in the visualization - Q15The Diffusion Principle
Over time, queues randomly drift into seriously out-of-control states and can stay there for long periods.
A queue is the running sum of random differences between arrivals and departures, a random walk whose spread grows with the square root of time. Even with balanced average load, some paths wander far from zero and take a long time to come back.
↑ see it in the visualization - Q16The Intervention Principle
Randomness won't reliably fix a queue that randomness created; intervene quickly when it gets large.
Because a random walk has no memory, a large queue is as likely to grow as to shrink. Set a queue limit and, when it is hit, act: add capacity, shed or block low-value demand, or purge work. Fast, small interventions keep queues bounded.
↑ see it in the visualization