Dudi abidesR&D notes · est. chill
← Back to the rack
Craft & CultureOctober 25, 2026· 5 min read

From Scale to Scale: What Fixing a 2005 Espresso Machine Taught Me About AI Code Generation

A rusted 2005 espresso machine, a black-box office coffee maker, and the same dilemma AI coding assistants put in front of every engineer: operator or architect?

#AI#Architecture#Culture

There is a distinct kind of satisfaction that comes from understanding every single moving part of a machine.

A few years ago, I bought a secondhand Rancilio Silvia espresso machine. It was built back in 2005 and, to put it mildly, it had seen better days. It didn’t work at all when I plugged it in. The internal frame had rusted out, the wiring was a tangled nightmare of oxidized connectors, and when I cracked open the brass boiler, it looked like a limestone cave—completely packed with thick, stubborn mineral scale.

Stripping down the frame and tackling rusted chassis and wiring Opening up the boiler packed with scale

I spent nights scrubbing away the rust, descaling the boiler chamber, replacing seals, and rewiring the electrical harness. Later, to solve the Silvia’s notorious temperature surfing, I wired in a custom PID controller so I could dial in extraction temperatures down to the exact degree.

The rebuilt boiler and brass assembly back together The restored Rancilio Silvia setup in my kitchen

Today, every time I pull an espresso shot at home, I know exactly what is happening. I know how the pressure builds, how the water flows through the group head, and precisely why a shot tastes under-extracted or sour.

Which brings me to the machine at our office: a fully automated Jura super-automatic espresso machine.

The automated Jura coffee machine in the office asking for descaling agent

At work, anyone can walk up to the Jura, hit a button, and walk away 30 seconds later with a respectable cup of coffee. You don’t need to know what a group head is. You don’t need to understand boiler pressure, grind size, or temperature stability. Until, of course, the screen flashes a cryptic error message like “Descale: Agent in tank” or the grinder jams—at which point everyone stands around waiting for a specialized technician or facilities manager to figure out what went wrong inside the black box.

As software engineers in the age of AI coding assistants, we are standing right at this exact junction.


The Black-Box Dilemma in Software Engineering

Generative AI models—whether Copilot, Claude, or custom LLM workflows—are essentially the Jura super-automatic machines of modern software development. You feed them a prompt (“press a button”), and out pops a fully formed function, a refactored class, or a complex React component complete with state management and edge-case handling.

It feels magic. It scales effortlessly. And it leads directly to the core debate engineering leaders and developers are wrestling with today:

Do I still need to understand every detail of the code being written, or should I trust the AI black box to handle it?

There are two extremes emerging in modern engineering teams:

  1. The Purists: Developers who refuse to accept code they didn’t write line-by-line, spending hours inspecting ASTs, analyzing low-level implementations, and distrusting anything generated by an LLM.
  2. The Abstraction Enthusiasts: Developers who treat the LLM as an infallible oracle, committing generated PRs without reading the underlying implementation, as long as the initial manual test pass looks fine.

Both approaches miss the critical lesson of the espresso machine.


Why “Knowing How the Machine Works” Still Matters

If I hadn’t spent hours opening up my Silvia’s boiler and rewiring its thermostats, I would never have understood why coffee extracts the way it does.

In code, the exact same principle applies. When you delegate code creation to AI, having deep foundational knowledge is what transforms you from an operator into an architect.

  • Debugging the Edge Cases: When the automated coffee machine breaks, the average user is helpless. When AI-generated code fails in production—due to race conditions, memory leaks, security vulnerabilities, or subtle context bugs—the engineer who understands underlying memory allocation, concurrency models, and network protocols is the only one who can fix it.
  • Prompting with Precision: Installing a PID on my Silvia required understanding loop feedback, thermocouple sensors, and solid-state relays. Similarly, to steer an AI effectively, you must understand the technical domain well enough to constrain it, spot hallucinations, and feed it the right architectural parameters.
  • Knowing When the Taste is “Off”: An automated machine produces good enough coffee. But if you don’t know what high-quality extraction tastes like, you won’t know how to improve it. AI produces code that looks right at first glance, but without deep code-level intuition, you won’t catch performance bottlenecks or unmaintainable design patterns until they accumulate as technical debt.

The Practical Middle Ground: Pragmatic Mastery

Does this mean every engineer needs to manually write every single boilerplate helper function or SQL migration by hand? Absolutely not. I wouldn’t want to hand-grind every single coffee bean using a mortar and pestle every morning either.

The real goal of adopting AI in engineering isn’t to eliminate technical depth—it’s to shift where your leverage lies:

The “Jura” Mindset (Pure Automation) The “Silvia with PID” Mindset (Pragmatic Mastery)
Treats generated code as an uninspectable black box. Treats AI as an ultra-fast drafting engine whose output must align with deep domain rules.
Struggles when production breaks outside standard patterns. Quickly pinpoints root causes because the underlying systems mental model is intact.
Focuses purely on output volume. Focuses on architectural intent, code maintainability, and system boundaries.

Enjoying the Coffee

I love pulling shots on my renovated Silvia because I built a relationship with the mechanics behind it. But when I’m at the office and context-switching between meetings, I’m glad the automatic Jura exists so I can get a quick caffeine hit.

As developers, we don’t need to fear AI automation, nor should we blindly surrender our craft to it. Use AI to speed through boilerplate, generate test scaffolds, and prototype rapid iterations. But keep your wrenches nearby. Crack open the boiler once in a while. Make sure you still know how the wires connect underneath—because when the system scales and the pressure builds, knowing how the machine actually works is what makes all the difference.