Part III · The workflow
Quality Is Contextual, Not Absolute
Version 1.0 · November, 2026
In this section7
In traditional engineering culture, “code quality” is treated as a universal standard that must be met at all times.
In Build First, quality is contextual:
- A one-off exploratory prototype does not need the same standards as a production system
- Code written to answer a question does not need the same polish as code meant to scale
- Early messiness is acceptable if it is intentional and temporary
What’s not acceptable is confusing temporary code with permanent code.
Build First requires you to be explicit about which phase you’re in.
Two Phases of Code in Build First
1. Exploratory Code (Disposable by Default)
Exploratory code exists to:
- Test an idea
- Validate a user workflow
- Explore data shape or API constraints
- Answer a design or product question
Characteristics:
- Fast
- Direct
- Minimally abstracted
- Sometimes duplicated
- Often “ugly”
This code is allowed to be bad because it is not meant to live long.
The discipline is not making it perfect—it’s being honest that it’s provisional.
A useful rule:
If you’re not sure this thing should exist at all, you should not be polishing it.
2. Committed Code (Designed to Last)
Once something proves valuable—when users rely on it, or when it becomes a structural part of the system—it transitions into committed code.
This is where traditional engineering values fully apply:
- Clear abstractions
- Consistent patterns
- Tests where appropriate
- Thoughtful naming
- Performance considerations
- Documentation
The key difference is timing:
You earn the right to clean up by proving the thing matters.
The Build → Show → Refine Loop Protects Quality
Build First isn’t just “build fast.” It’s a loop:
- Build something real
- Show it—to users, teammates, stakeholders
- Refine based on what actually mattered
This loop prevents over-engineering because:
- You don’t abstract before you understand the problem
- You don’t optimize paths no one uses
- You don’t lock in architecture based on guesses
Code quality improves because you’re responding to reality, not theory.
Guardrails That Matter (and Ones That Don’t)
Build First still needs guardrails—but they should protect long-term velocity, not short-term aesthetics.
Guardrails Worth Keeping
- Consistent formatting and linting (automated)
- Clear module boundaries once code is committed
- Naming that reflects real concepts, not hypothetical ones
- Deleting code aggressively when ideas don’t pan out
Guardrails to Relax Early
- Perfect abstractions
- Comprehensive test coverage for exploratory paths
- Strict architectural purity
- Premature DRY-ness
Duplication is often a signal, not a failure—it shows you what wants to become an abstraction later.
Refactoring Is Not Failure—It’s the Plan
In Build First, refactoring is not a sign something went wrong.
It’s evidence that learning happened.
You should expect:
- Early shortcuts
- Renamed concepts
- Collapsing or splitting modules
- Rewriting parts once intent is clear
The mistake is pretending you can avoid this by designing harder upfront.
The Real Risk: Letting Prototype Code Fossilize
The biggest danger in Build First isn’t messy code—it’s unlabeled messiness.
Problems arise when:
- Exploratory code quietly becomes production code
- Temporary hacks gain users without being revisited
- No one “re-commits” the code with intention
The fix is cultural, not technical:
- Call prototypes prototypes
- Schedule consolidation passes
- Explicitly mark transitions from exploration → commitment
Build First Engineers Are Not Less Disciplined
They are disciplined about different things:
- Learning before optimizing
- Reality before theory
- Working software before elegant diagrams
- Ownership over appearances
Build First doesn’t lower the bar for quality—it moves it to the right moment.
In Short
- Build First tolerates mess early, not forever
- Code quality is enforced when code earns permanence
- Refactoring is expected, not embarrassing
- Velocity comes from deferring certainty, not skipping rigor
The goal isn’t messy systems.
The goal is systems shaped by truth instead of assumption.