CP//DEV

8/1/2026 · 5 min read

The river and the stone: what should flow and what should stay still

Heraclitus and Parmenides argued over whether reality changes or endures. Every application settles that argument each time it decides where a value lives.

An eight-month-old order showed a total that had never been charged. It wasn’t a rounding bug or a bad calculation: the order didn’t store the price, it stored a reference to the product. And the product had gone up in January.

The shop’s entire history rewrote itself, retroactively, every time someone touched the catalogue. Nobody had built it that way on purpose. It had simply been assumed that a price is one piece of data, when it’s really two different things sharing a name.

Two Greeks arguing about the same thing

Heraclitus made his case with a river: you can’t step into the same one twice, because neither the water nor you are the same any more. Everything flows. Stability is the appearance; change is what’s real.

Parmenides said the opposite. What is, is; what is not, is not. Change is an illusion of the senses, because for something to change it would have to pass from being into non-being, and non-being doesn’t exist. What’s real is what stays identical to itself.

The West has spent twenty-five centuries failing to settle it. We settle it every week without noticing, whenever we decide whether a value gets stored or computed.

A price is two values

A product’s sale price is a river: it moves with costs, with the season, with the competition. Asking “what does this cost?” is asking about the present state, and there’s exactly one valid answer — today’s.

The price a specific unit sold for on a Tuesday in January is a stone. It happened. No later commercial decision can edit it, the same way changing your mind doesn’t change what you had for dinner yesterday.

An order doesn’t contain products: it contains a photograph of some products at the moment of purchase. Name, price, tax, shipping address, terms. All of it copied, not referenced. That’s the part of the system Parmenides governs: what already is, is, and has to stay identical to itself for as long as the database exists.

The catalogue next door still belongs to Heraclitus. It flows without asking permission.

The rule: reference what you want to change along with you, copy what you want to survive your changes.

Both mistakes are symmetrical

There’s the river pretending to be a stone: live data somebody froze for performance, now quietly lying. An unflushed cache. A denormalised stock counter that drifted one night and nobody knows when. An order total that no longer matches the sum of its lines. You catch it in an uncomfortable way: two places answer the same question and disagree.

And there’s the stone pretending to be a river: a settled fact recalculated every time someone looks at it. That’s what the shop’s history was. So is an invoice regenerated on every page load, a report whose numbers shift depending on when you open it, a log reconstructed from current state instead of written as things happened.

The first is a visible bug. The second is worse: it’s invisible. The system doesn’t fail, it answers confidently, and the answer is false.

What Parmenides was right to defend

Nobody argues that Heraclitus’s river isn’t the same river. Every drop of water is replaced and it’s still called the Ebro. Something persists while everything else moves, and that something isn’t the matter: it’s the identity.

In a system, identity is what must never change even when everything hanging off it does. A row’s primary key. The public URL of an article. The slug of a page that’s already indexed and linked to from outside. The customer ID dragged across invoices, tickets and contracts.

No flow allowed there. Changing an identifier isn’t an edit, it’s an amputation: it breaks every link that pointed at it, and those links belong to other people, so you never find out. That’s why mutable data gets edited freely and keys don’t get touched; it’s why a good URL outlives three redesigns.

You can rewrite a page’s entire content without moving its address. Which is exactly the river: new water, same bed, same name.

How I decide now

Before storing anything, two questions:

  • Is this a fact or a state? A fact has a date and never gets edited: you correct it by writing another fact on top, the way bookkeeping reverses a bad entry instead of deleting it. A state has no date, it has now, and it should live in exactly one place.
  • Who wins if two copies disagree? If there’s no clear answer, I don’t have a cache: I have two competing truths, and the one that wins does so by accident.

And a third one, which has saved me the most grief: what breaks out there if this gets renamed? If the answer includes “links I don’t control”, that field isn’t a field any more. It’s a contract.

Neither everything flows nor nothing changes

In Ockham’s razor I wrote that every abstraction is a bet on the future. This is the bet before that one, made before a single line gets written: deciding which side of the system each value belongs to.

Systems that age badly tend to be dogmatic. The ones that let everything flow lose their history: they can’t say what happened, only how things stand today. The ones that freeze everything lose their present: they pile up copies of a reality that already moved, and none of them knows which is in charge.

The craft is in splitting it. Let the catalogue flow, let the sale be stone. Let the content flow, let the URL be stone. Let the draft flow, let the published version be dated and still.

Heraclitus and Parmenides were both right. They were arguing about the whole world, which is an argument with no referee. We’re arguing about one specific table, and there the answer exists — you just have to remember to ask before the history starts rewriting itself.

Keep reading