What Chores Teach Me About Queues

Household chores are a brutally honest queueing system. Work arrives from ordinary life, the machines have fixed capacity, and completed-looking steps have a habit of producing another pile somewhere else.

a man sitting in front of multiple monitors

Household chores are a brutally honest queueing system. Work arrives from ordinary life, the machines have fixed capacity, and completed-looking steps have a habit of producing another pile somewhere else.

Laundry is the cleanest example. A load can be washed and still be nowhere near done. It can wait in the machine, move to a basket, dry, wait in another basket, get folded, and wait again before returning to where it belongs. Counting washer cycles measures activity. The household experiences whether clothes are available.

I began using that sequence to examine why small operational queues become sticky even when every worker looks busy. The failure isn't always lack of capacity. Often it’s the way work is released, transferred, and declared complete.

Cause: work enters faster than attention does

The obvious cause is arrival rate. More loads begin than the complete path can finish. But the limiting resource isn't necessarily the washer. It may be the attention required at transfer points.

A machine can finish on schedule and wait for a person to empty it. Starting the next load creates the appearance of throughput while the downstream basket fills. In software, a fast ingest step can do the same thing. It accepts work, transforms its status, and hands it to a slower review or delivery step. Each acceptance looks productive. The unfinished inventory grows.

Batching makes the problem harder to see. Starting several similar tasks feels efficient because setup cost is shared. Yet each batch creates a later obligation that competes with new work. If I schedule around the machine's availability and ignore my own downstream attention, I optimize the cheapest stage.

The first correction is to identify the actual constrained step. It isn't always compute. It can be a person matching results, a device with a narrow window, or a final placement step nobody finds interesting.

Propagation: transfers create hidden inventory

Queues multiply at boundaries. Work waiting inside the washer is visible because the door won't open onto an empty drum. Work transferred into a basket is easier to ignore. It has left the machine, so the machine's local metric improves, but the household's unfinished work hasn't changed much.

Operational systems produce digital baskets constantly. Exported files wait to be delivered. Generated drafts wait to be read. Successful backup jobs produce media that still need rotation or verification. Each upstream tool can report success because it completed its contract. The larger workflow accumulates objects between contracts.

Those transfer queues are dangerous when their capacity appears unlimited. A physical basket eventually overflows. A directory or database can accept thousands of items while the interface continues to show a tidy count. The lack of a hard boundary delays the moment anyone has to confront the mismatch.

Age matters more than total volume at this point. A basket with one load left for several days tells a different story from several loads moving through in an afternoon. Old work indicates a broken transfer, an avoided decision, or a completion definition that stops too early.

Correction: limit open cycles

The most effective household correction isn't a faster washer. It’s refusing to begin another cycle when the downstream path has no room. Finish the current load far enough that the next one won't strand it.

In operational terms, I cap work in progress across the full sequence, not per machine. A worker can be idle while downstream work clears. That looks inefficient on a utilization chart. It’s often the right global choice. Maximum utilization at every stage produces maximum opportunity for work to wait between stages.

I also make transfer states explicit. processed isn't delivered. generated isn't reviewed. washed certainly isn't put away, despite what the machine's cheerful melody suggests. Each state names the next kind of work instead of borrowing the final outcome's language.

Small batch sizes help when correction is likely. If the first few outputs reveal a bad assumption, I want a small basket of rework, not an afternoon's production. The setup may repeat more often, but the queue stays easier to inspect and redirect.

Completion: return capacity to the system

A chore is complete when its result is usable and the shared capacity is available for the next cycle. The clothes are put away, the basket is free, and no wet load is waiting because the handoff was forgotten.

For a software workflow, that may mean the result reached its destination, any rejected item has a clear disposition, and temporary staging has been cleared. Completion should release more than a status. It should release storage, attention, locks, or whatever scarce resource the next unit needs.

This is why closure work can feel disproportionately valuable. Moving the last few items doesn't produce a dramatic count, but it collapses a whole active queue and returns its containers to circulation. Starting fresh work before that closure creates more visible motion and less available capacity.

I haven't turned household chores into a kanban ceremony. Nobody needs a dashboard for socks. The lesson is smaller and more durable: watch the spaces between machines, count age as well as volume, and define done where the result becomes usable.

When a queue grows now, I look downstream before adding another worker at the front. Somewhere there is usually a digital basket holding work that every upstream stage has already stopped counting.