Engineering PhilosophyJune 12, 2025

Code as Craft: Why Velocity Without Intention Accumulates Debt

Brian Mutai

Brian Mutai

Full-Stack Engineer

Reading Time
Code as Craft: Why Velocity Without Intention Accumulates Debt

There are two dominant metaphors for how software gets built. The first is the factory: inputs go in, features come out, velocity measures throughput. The second is the craft: a skilled practitioner applies judgment, builds with care, and produces work that holds up over time.

Most software teams use the language of the factory while hoping for the outcomes of craft. This produces a specific kind of dysfunction: code that ships fast and degrades faster, backlogs of technical debt that are never quite urgent enough to address until they become emergencies, and engineers who are burned out not by the difficulty of the work but by the gap between the quality they know they could produce and the quality the process actually allows.

This essay is about the craft metaphor, why it produces better engineering, and what it requires.

What the Factory Metaphor Gets Wrong

The factory metaphor treats software development as a process of converting requirements into code. The inputs are stories, the outputs are features, and the metric of success is throughput: how many stories closed, how many points delivered, how many releases shipped.

This model works in environments where the inputs are well-understood and the outputs are well-specified. It works well for manufacturing physical objects where the design is stable and the variance is in execution. It works poorly for software, where the design is rarely stable, the problem space evolves as the solution develops, and the quality of the code itself determines how quickly the next iteration can happen.

The factory metaphor systematically undervalues things that do not look like output:

  • Reading unfamiliar code before changing it
  • Refactoring for clarity before adding a feature
  • Writing tests as design instruments, not safety nets
  • Naming things carefully enough that the next person does not have to ask what they do
  • Thinking about the failure modes of a system before building it

None of these produce story points. All of them produce systems that are faster to change and safer to operate. The factory model counts them as idle time.

Craft Is Not Perfectionism

The craft metaphor is often mistaken for perfectionism: the insistence on getting everything exactly right before shipping anything. This is not what craft means.

Craftspeople ship. A carpenter does not refuse to deliver a table because the grain is not quite aligned. They deliver the table and they know what they would do differently next time.

Craft is about judgment, not perfection. It is the ability to assess what a system needs now versus what would be nice in an ideal world, and to make decisions that serve the long-term integrity of the work without blocking short-term delivery.

The questions that distinguish craft from perfectionism:

  • Does this simplification create a burden for the next engineer who touches this code, or does it create clarity?
  • Does this abstraction make the system easier to understand, or does it add a layer that everyone has to learn?
  • Does this test cover a real failure mode, or does it test implementation details that will break every time the implementation changes?
  • Does this comment explain why this code does something non-obvious, or does it restate what the code already makes clear?

These are judgment calls. They cannot be made by a process or a sprint ceremony. They require an engineer with enough context to reason about the long-term trajectory of the codebase and enough autonomy to make decisions that serve that trajectory even when they are not reflected in velocity metrics.

Naming Is Design

One of the most underestimated design activities in software is naming. This is not a stylistic preference; it is a claim about what naming does to the cognitive load of the people who work in a system over time.

A function named processData says nothing about what data is being processed or how. An engineer unfamiliar with the codebase must read the function body, understand what it does, develop a mental model of when it should be called, and then remember that mental model the next time they need to use it. If they misunderstand the function, they will use it incorrectly and the bug will not be obvious at the call site.

A function named normalizeTimestampsToUTC says exactly what it does. An engineer unfamiliar with the codebase reads the name and immediately has a correct mental model. Misuse is detectable at the call site. The cognitive load across the lifetime of the codebase is lower.

The craft perspective treats naming as a first-class design activity. The cost of a bad name is paid every time someone reads the code. A codebase of thousands of files with mediocre names accumulates this tax constantly: during code review, during debugging, during on-call, during onboarding. The interest rate on poor naming is compounding.

Interfaces and the Boundary Problem

In the factory model, the unit of work is the feature. In the craft model, the unit of work is the interface.

An interface (a function signature, an API contract, a module boundary) is the surface across which code communicates. Good interfaces are stable, minimal, and explicit about what they require and what they guarantee. Bad interfaces are implicit, overly broad, and encode assumptions about their callers.

The distinction matters because interfaces are far more expensive to change than implementations. An implementation change is local; it affects the code inside the boundary. An interface change is global; it affects every caller, every integration, every piece of documentation.

The craft investment in interfaces is upfront. Spending an hour thinking carefully about a module boundary before implementing it can save weeks of migration work later. The factory model counts that hour as overhead on the story. The craft model counts it as load-bearing work.

Consider the difference between these two approaches to a notification service:

typescript.snippet

The narrow interface is easier to extend, easier to test, and easier to reason about. Adding a new delivery policy does not change the function signature. The factory model produces the wide interface because it is faster to add parameters. The craft model produces the narrow interface because it is faster to live with.

Ownership and Accountability

The craft metaphor changes the relationship between engineers and the systems they build.

In the factory model, engineers are interchangeable units of production. A story is a story, and any engineer can pick it up. This produces systems where no one has enough context to reason about the long-term trajectory of the code, because ownership is diffuse by design.

In the craft model, engineers develop deep familiarity with specific parts of the system and carry accountability for the long-term quality of those parts. This is not about gatekeeping; it is about having someone who knows enough about a system to recognize when a seemingly unrelated change will cause a problem three levels deep, and who feels responsible for saying so.

The accountability dimension of craft is also where ethics enters. A craftsperson is accountable for the quality and safety of what they build. A software engineer is not only accountable for whether a feature shipped by the sprint deadline; they are accountable for whether the system they built is reliable, whether it handles failure gracefully, and whether it respects the people who will depend on it.

This is especially relevant as software becomes more deeply embedded in critical infrastructure: healthcare systems, financial platforms, climate monitoring tools, supply chains. The engineer who builds a system that processes payroll, manages medical records, or routes emergency resources is accountable for that system in a way that the factory metaphor entirely elides.

What Craft Requires in Practice

The craft metaphor is not implemented by a process change or a new metric. It is implemented by shifting what is valued.

Value clarity over cleverness. A clever solution that is hard to understand is worse than a simple one that is easy to understand, even if the clever solution is technically superior. The next engineer who reads the clever solution has to recover your cleverness every time they need to work in that area of the code.

Value correctness at the boundary over speed inside it. Test the contracts between components rigorously. Be permissive about how things work internally; be strict about what the component promises to callers.

Value honest estimation over optimistic commitment. Craft requires time. If the scope of a task requires refactoring before the feature can be added cleanly, that refactoring is part of the scope. Committing to feature delivery without that time is not moving faster; it is borrowing time from the next iteration.

Value the long game over the velocity dashboard. A codebase that ships 20% fewer features this quarter but is 50% easier to change next quarter has made a good tradeoff. The factory model cannot see this tradeoff in its metrics.

The engineers who produce the best systems over time are not those who code fastest. They are those who carry an internal model of what good looks like, resist the pressure to ship things that do not meet it, and have built enough trust with their teams to make that resistance respected rather than overridden.

That is craft. It is not slower. It is just measured differently.

Brian Mutai

Written by Brian Mutai

Brian is a full-stack engineer specialized in high-performance microservices, cloud infrastructure, and AI integration. He currently consults on critical government infrastructure at Centech Technologies, building national-scale systems for the Somalia Government and World Bank.

Why AI Agents Break in Production (And How to Build Around It)
Up Next

Why AI Agents Break in Production (And How to Build Around It)

Read Essay

Weekly Curation

Deep dives into systems, performance tuning, and technical philosophy delivered to your inbox every Sunday.