JA EN
LearnEngineering Process
·★ MEMBER·9 min read

Upstream Work in the AI Era — When Code Gets Cheap, What Gets Valuable?

When implementation gets cheap, which parts of the cost remain, and what becomes expensive by comparison? We put the relationship between deciding and reworking into an equation, then design specs for AI as lossy compression of intent — starting from zero assumed knowledge.

ModalitytextTasksystems

An analogy: when typesetting vanished, did editors lose their jobs?

Arranging type for print used to be a skilled trade. Once desktop publishing arrived, the cost of that step fell to roughly nothing.

Publishers did not empty out. What got cheap was arranging the letters, not deciding what to publish. If anything, once anyone could typeset, the volume of printed material went up — and the ability to pick what was worth reading became the scarce part.

The same shift is happening in writing code. The time spent working out "how do I write this line" has visibly shrunk. What has not shrunk is the time spent deciding what to build, and what counts as done. Let's break that down as a cost structure rather than a vibe.

Intuition: bottlenecks don't disappear, they move next door

Picture a factory line. When the stages run in series and one of them is much slower than the rest, that stage sets the pace for everything. Put a machine in and make it ten times faster, and total time still doesn't go to zero — the next-slowest stage simply steps forward as the new bottleneck.

That is what teams are experiencing. Because "building" got fast, the stages on either side of it became relatively more visible: time spent killing ambiguity in the request, time spent choosing between options, time spent checking whether what came back is right.

There's a second effect that is easy to miss. Being able to build fast also means you can now travel in the wrong direction fast. When implementation was slow, that slowness acted as a speed bump: you had room to notice, mid-build, that a feature wasn't needed. With that room gone, deciding direction has to happen earlier and more deliberately.

Mechanism: split the cost into three parts

Argue for upstream work in words and it turns into moralizing. Write it as an equation and the structure shows up. The total cost of delivering a feature:

C=D+B+pRC = D + B + p\,R
(1)

CC is total cost, DD is the cost of deciding (gathering the request, comparing options, making the call), BB is the cost of building (implementation and everything around it), pp is the probability the spec is wrong, and RR is the cost of redoing the work once that error surfaces.

What the equation says, in words: everything it takes to ship a feature is just deciding, plus building, plus the redo you sometimes have to pay for. The rework term carries pp because it doesn't happen every time, so pRp\,R is expected rework cost.

Cheaper implementation means a smaller BB. DD barely moves — listening to a request and weighing options are hard to hand off to a tool. Part of RR shrinks along with BB, but the underlying structure stays: mistakes propagate downstream before anyone notices. That mechanism is covered in Upstream Engineering from Scratch.

Once BB is small enough, total cost is roughly CD+pRC \approx D + p\,R. So ask how much CC moves when pp moves a little:

Cp=R\frac{\partial C}{\partial p} = R
(2)

The right-hand side is nothing but RR, which says: whatever you shave off the probability that the spec is wrong, you save that much multiplied by the entire rework bill. Upstream effort turns into money only once RR multiplies it. The larger RR is — that is, the later mistakes surface — the more an hour spent upstream is worth. Conversely, if a mistake shows up in five minutes, just build the thing. How thick your upstream process should be isn't a matter of conviction; it's set by the size of RR.

A wrong heading turns speed into a loss

The other thing worth separating is quantity from direction. As vectors, the useful part of your output is its projection onto the intended direction:

value=vcosθ\text{value} = |v|\cos\theta
(3)

v|v| is how much you built and θ\theta is the angle between intent and result. At zero degrees, everything you built counts. At ninety degrees, no amount of building counts at all. Past ninety, the value is negative — and not metaphorically: that's code you have to delete and dependencies you have to unpick, each with a real bill attached.

Put in words: what counts as value is not how much you built, but only the share of it that points where you meant to go.

Cheap implementation means it's easy to grow v|v|. When θ\theta is small, value grows in proportion. When θ\theta is large, the loss grows in proportion too. Running fast only pays when you're pointed the right way.

FIG 1As an analogy — treat one vector as "intent" and the other as "what you actually built," then rotate. Lengthening the arrow (more implementation) doesn't lengthen the projection if the angle is off

So what do you actually write? One framing carries a lot of weight: a spec is your intent, compressed into a string of characters, and the reader decompresses it back into an implementation.

What's behind this

§

Members-only from here

371 walkthroughs, 26 textbook chapters, 48 student units and 6 close readings — all included for $4.99/mo, with three new explainers every day. Cancel any time; access runs to the end of the period.

Already a member? Sign in to keep reading

Comments

Sign in to comment