<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>The Code Craftsmen</title>
    <link>https://thecodecraftsmen.com</link>
    <description>Engineering thinking — architecture, trade-offs, and production reality.</description>
    <language>en-us</language>
    <atom:link href="https://thecodecraftsmen.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>The gap between code that runs and software that works</title>
      <link>https://thecodecraftsmen.com/writing/gap-between-code-and-software/</link>
      <guid isPermaLink="true">https://thecodecraftsmen.com/writing/gap-between-code-and-software/</guid>
      <pubDate>Wed, 04 Nov 2026 00:00:00 GMT</pubDate>
      <description>Tutorials prove you can make something demo. Production asks whether it survives constraints, other people, and time. That gap is where most careers stall — and where engineering actually starts.</description>
      <content:encoded><![CDATA[
<ConstraintBlock title="Who this is for">

- Developers who can finish tutorials but freeze in interviews or production discussions  
- Anyone who has shipped a feature that “worked on my machine” and then spent weeks explaining why  
- Teams hiring juniors who know frameworks but not judgment  

</ConstraintBlock>

## The demo lied to you — politely

Most early wins in software look the same: a screen appears, an API returns 200, the test is green. You feel competent. You should. Making something *run* is a real skill.

Then the questions change.

Why this table shape? What happens when two users edit at once? Who owns the failure at 2 a.m.? What do we delete when the requirement was wrong?

Tutorials rarely ask those questions. Interviews and production do. The gap between **code that runs** and **software that works** is not more syntax. It is judgment under constraints.

## What “works” actually means

Software that works is not the same as software that executes.

It means:

- The behavior matches a real need — not a tutorial checklist  
- Failures are visible and recoverable  
- Another engineer can change it without archaeology  
- The cost of the design is acceptable for the next few years — not just the next demo  

A script that prints “Hello” works as a demo. A payment path that double-charges under retries does not “work,” even if every unit test is green.

## Where the gap shows up

### Interviews

You can recite React hooks and still freeze when asked: *Walk me through how you would design this.* The interviewer is not testing memorization. They are testing whether you can hold trade-offs in your head.

### First jobs

Tickets say “add a field.” Production says “that field is read by three jobs, two reports, and a partner feed.” The gap is context. Tutorials give you isolated problems. Companies give you systems.

### Side projects that never leave the laptop

They run. They impress friends. They never meet messy users, messy data, or messy time. Leaving the laptop is where “works” gets defined.

## How to shrink the gap (without another course binge)

1. **Explain a decision out loud.** Pick something you built. Say what you discarded and why. If you cannot, you do not understand it yet.  
2. **Read one failure mode per feature.** Ask: what happens when the network is slow, the user retries, the data is empty, the dependency is down?  
3. **Maintain something for a month.** Ownership teaches more than a new framework.  
4. **Write the trade-off.** One paragraph: what we gained, what we owe later. That habit is engineering.

You do not need permission to practice judgment. You need problems that have consequences — even small ones.

## What we will keep writing about

At The Code Craftsmen we care about this gap on purpose. Frameworks change. The need to reason about systems does not.

Upcoming pieces will dig into concrete systems — including architecture migrations and rule engines under real volume. This essay is the door: name the gap before you try to cross it.

<Callout label="Takeaway">

If your learning only produces demos, you are practicing performance — not engineering. Aim for software that survives constraints, other people, and time.

</Callout>
]]></content:encoded>
    </item>
    <item>
      <title>Every engineering decision has a cost</title>
      <link>https://thecodecraftsmen.com/writing/every-engineering-decision-has-a-cost/</link>
      <guid isPermaLink="true">https://thecodecraftsmen.com/writing/every-engineering-decision-has-a-cost/</guid>
      <pubDate>Wed, 04 Nov 2026 00:00:00 GMT</pubDate>
      <description>Caching, services, abstractions, and ‘clean’ architecture all buy something. They also create a future obligation. Engineering is noticing both sides before you commit.</description>
      <content:encoded><![CDATA[
## The comfortable half of the sentence

Teams love the first half of a decision:

- “We’ll cache it — it’ll be faster.”  
- “We’ll split it into services — teams can move independently.”  
- “We’ll abstract this — we’ll stay flexible.”  

Those sentences can be true. They are incomplete.

## The bill arrives later

| Decision | What you buy | What you often owe |
|----------|--------------|--------------------|
| Cache | Latency | Invalidation, stale reads, debugging “why is it wrong for 5 minutes?” |
| Extra service | Team boundaries | Network failure modes, versioning, local-dev pain |
| Deep abstraction | Reuse | Indirection, harder onboarding, fear of touching the core |
| More config | Flexibility | Combinatorial testing, “it works in prod config only” |

None of these are forbidden. Unpriced decisions are.

## A simple test before you say yes

Ask four questions:

1. **What problem are we solving this week?**  
2. **What new failure modes appear?**  
3. **Who pays when this is wrong — and how will they notice?**  
4. **What would we delete if this bet fails?**  

If you cannot answer (4), you are not making a reversible decision. You are making a hope.

## “Boring” is often the unpaid invoice you skip

Senior engineers are not allergic to new ideas. They are allergic to unpaid complexity.

Sometimes the right call is a monolith a little longer, a synchronous call a little longer, a duplicated query a little longer — because the organization cannot yet operate the elegant alternative.

Elegance that the team cannot run is not elegance. It is deferred outage.

## How we want to write about systems

When we publish teardowns, we will try to show both columns: what we chose, and what it cost — in time, risk, and attention.

If a post only celebrates the win, treat it as marketing. Engineering writing should leave you able to disagree with the decision and still learn from it.

<Callout label="Takeaway">

Do not ask only “does this work?” Ask “what will we owe in a year if it works exactly as designed?”

</Callout>
]]></content:encoded>
    </item>
  </channel>
</rss>
