Solo Founder Product Engineering Handbook / Chapter 11
Discovery for Builders Who Want to Code Too Soon
Recognize premature coding as avoidance, then use customer evidence to decide what product code is allowed.
Preparing audio…
Audio edition
Discovery for Builders Who Want to Code Too Soon
The Editor Feels Safer Than the Market
Technical founders rarely need to be convinced to work hard. The problem is that the easiest hard work is often the wrong work.
Code gives clean feedback. The compiler complains. The test fails. The layout shifts. The deploy breaks. Each problem has a shape the founder knows how to attack. Customer uncertainty is different. A stranger may ignore the email. A buyer may admit the problem exists and still refuse to act. A user may praise the demo and keep using a spreadsheet. A market may reveal that the beautiful idea is solving the wrong moment in the workflow.
When the founder feels that uncertainty, coding can become emotional avoidance disguised as discipline. The founder is not lazy. The founder is seeking control. They open the editor because the editor will not reject the premise.
That is the danger at the start of customer discovery. If the unknown is whether a specific customer has a painful enough problem, more product code can make the founder less able to learn. It creates sunk cost, expands surface area, and gives the founder something to defend. The solo-founder version is especially costly: every unnecessary build hour is also an hour not spent reaching customers, hearing objections, finding the current alternative, or discovering that the first wedge should be narrower.
The rule for this part of the book is simple:
Do not write durable product code until discovery has named the customer, the painful workflow, the current alternative, and the assumption the first build is meant to test.
This is not anti-engineering. It is engineering discipline. Before product-market fit, code should be purchased with evidence.
What Premature Coding Protects You From
Premature coding usually begins with a reasonable sentence:
I just need a quick version so people can react to something real.
Sometimes that sentence is true. Often it hides fear.
Customer contact exposes the founder to rejection before they have an artifact to hide behind. It also removes flattering ambiguity. In the idea stage, the imagined user is grateful, rational, and ready to switch. In discovery, the real customer is busy, budget constrained, politically constrained, attached to old tools, and often solving a different problem than the founder expected.
Code protects the founder from several uncomfortable facts:
- The target customer may be too vague to find.
- The painful problem may be occasional rather than urgent.
- The user may not be the buyer.
- The current alternative may be good enough.
- The switching trigger may be absent.
- The trusted workflow may require domain knowledge the founder does not yet have.
- The idea may be personally interesting but commercially weak.
Those facts are not insults. They are exactly the facts a solo founder needs early, while the product is still cheap to change.
The avoidance pattern has a recognizable loop:
- The founder feels uncertainty about demand.
- Outreach, pricing, or rejection feels exposed.
- Coding creates visible progress.
- The product becomes more detailed.
- The detail makes rejection feel more expensive.
- The founder decides the product needs more polish before showing anyone.
The loop can run for weeks without producing a single decision-changing fact. The founder may ship authentication, onboarding, dashboards, settings, analytics, billing, roles, exports, and email templates before knowing whether the customer urgently wants the outcome.
The most reliable warning sign is this: if a feature makes you feel calmer but would not change after ten customer conversations, it is probably serving the founder more than the customer.
Product Code Versus Discovery Artifacts
The rule does not forbid making things. It separates an artifact that asks a question from a product that creates obligations.
A sketch may help a customer say, “No, that is not where the handoff breaks.” A spreadsheet may let the founder deliver the promised result once. A local script may reveal whether the source data can support the result at all. These are discovery artifacts: narrow, answer-seeking, and disposable by design.
Product code behaves differently. Accounts, stored customer data, permissions, integrations, billing, and reusable architecture create maintenance and support promises. They also change the founder’s relationship to the idea. Once the founder has built enough machinery, a customer conversation can stop being an inquiry into the workflow and become a defense of the almost-product.
The boundary is emotional as well as technical. A discovery artifact should be easy to delete after it teaches you something. If deleting it would feel like losing progress, decide whether the artifact has quietly become the product.
Discovery Is Not Validation
Many builders use “validation” to mean any activity that makes an idea feel safer. The loose language hides a sequencing mistake.
Discovery asks what is already true in the customer’s world. It investigates recent behavior, current workarounds, consequences, budget, constraints, and switching triggers. The founder is trying to understand the problem before asking the customer to judge a solution.
Validation asks whether a specific offer, prototype, manual service, price, workflow, or product behavior holds up. It needs a clearer claim. Without discovery, validation often tests only the founder’s imagination.
Discovery questions look backward and sideways: what happened last time, what triggered it, who became involved, which tools survived, what the failure cost, and what has already been tried. Validation makes a proposition face reality: will a customer give access, time, data, money, or workflow change for this offer?
Discovery is not passive research. It should change a build decision. If several conversations do not affect who you serve, what you refuse to build, what you test manually, or what you kill, the work is too vague.
“Busy managers need better reporting” cannot constrain engineering. “Owners of six-to-twenty-person bookkeeping firms spend Friday afternoons turning cleanup status into client updates, using a shared spreadsheet and email templates, with the pain peaking before month-end close” can. It names a reachable customer, a recurring situation, the current alternative, and a trigger. The evidence has begun to shape a product boundary.
A Build Decision Changed By Discovery
Suppose a founder wants to build an AI intake product for small property managers.
The comfortable engineering plan is obvious. Build a tenant portal. Add photo uploads. Classify maintenance requests. Create vendor dispatch rules. Store unit history. Add status notifications. Support priority queues, manager approvals, vendor accounts, and billing exports. The founder can spend a month on this and feel productive every day.
Discovery makes the idea smaller and sharper.
In conversations with managers of small rental portfolios, the founder learns that request intake is not the urgent pain. Tenants already send maintenance issues through email, text, voicemail, and the existing property-management system. The painful moment happens when a vague request arrives with just enough detail to alarm everyone and not enough detail to dispatch the right help. The work is not “collect a ticket.” The work is “decide what must be clarified, what might be urgent, who should respond, and what the tenant should be told now.”
The current alternative is a messy combination of tenant messages, a shared inbox, a manager’s memory, vendor text threads, and the official system updated later. The cost is not only time. Bad triage creates tenant anxiety, unnecessary vendor calls, missed urgent issues, and messy follow-up. The switching trigger is not a better portal. It is the moment when one manager can no longer keep ambiguous requests straight.
That discovery changes the first test. The founder does not need authentication, vendor accounts, billing exports, or a full maintenance system. The cheapest credible test is a manual triage assist for three managers:
- The manager forwards recent ambiguous requests with any photos or tenant messages.
- The founder produces a clarification checklist, urgency label, and tenant reply draft.
- The manager uses or rejects the draft and reports what was missing.
- The founder tracks which facts were necessary, which labels were trusted, and whether the workflow saves enough time to repeat.
This is not less serious than code. It is more disciplined. It tests the value moment before creating the product machinery.
The same discovery also creates a build boundary:
Do not build tenant accounts, vendor dispatch, or property-system integrations until managers repeatedly value the triage output and can identify the inputs they are willing to provide.
Now product code has a job. If the manual service works, the first coded system might be an internal tool that assembles a triage packet from a constrained intake format. If it fails, the founder has avoided building a portal nobody needed.
When Coding Early Is Legitimate
The exception is narrow: a small amount of code may be the cheapest honest way to reduce a named uncertainty.
Perhaps feasibility is the riskiest assumption. Perhaps the promised result depends on a data source whose quality is unknown. A small simulation may be the only way to understand one step of the workflow, or a security boundary may need testing before the founder can make a responsible promise. A throwaway internal tool may also help deliver a manual service without enlarging the customer-facing product.
In each case, the code needs a learning job and a stop rule. Suppose the claim is that agency update drafts can be assembled from one CSV export and three account-manager notes. The permitted code might be one local transformation script. Login, a client portal, direct ad-platform integrations, and saved templates remain forbidden. If the CSV lacks the decision context and every set of notes is irreducibly custom, the experiment stops. The script is allowed to fail without becoming a platform.
Time-boxing alone does not create discipline. A founder can waste a weekend instead of a month. The stricter test is whether the work produces evidence that could cancel or redirect the next build.
Write the Boundary Before Opening the Editor
Before durable product code, complete this memo in concrete sentences. Do not score it. One vague line can be enough to stop the build.
| Field | Sentence to complete |
|---|---|
| Customer | “The first customer is…” |
| Painful situation | “They encounter the problem when…” |
| Current alternative | “Today they use, ask, tolerate, or avoid…” |
| Consequence and urgency | “This becomes costly enough to act when…” |
| Switching trigger | “They would try a new approach if…” |
| Riskiest assumption | “The decision-changing unknown is…” |
| Cheapest credible test | “Before product code, I can learn by…” |
| Code allowed | “If code is necessary, I will only build…” |
| Code forbidden | “Until the evidence changes, I will not build…” |
| Stop rule | “I will narrow, change, or stop if…” |
The first five lines must come from customer reality rather than the founder’s preferred feature list. Ask for the last occurrence, the tools and people involved, the consequence of delay or error, money or staff time already spent, and the condition that would make change worth the disruption. The next chapter develops that conversation. Here, its purpose is simply to prevent unearned scope.
Customer language needs interpretation. “We hate it” may describe a workaround the team nevertheless trusts. “We need everything integrated” may conceal one step that can be handled manually. “The team would love this” may arrive without a buyer. “This would be nice” may never overcome switching cost. Polite encouragement is not demand; demand asks the customer to accept some friction—time, access, data, money, workflow change, or risk.
The last three lines turn what you learned into an engineering decision. Without them, discovery can become a collection of interesting notes while the original roadmap survives untouched.
Two Ways to Keep Hiding
The first is to show a solution too early. Once a mockup appears, people discuss buttons, labels, and missing fields. Their comments can sound wonderfully specific while leaving the prior question unanswered: is this workflow painful enough to change?
The second is to invent a committee of imaginary buyers. The founder supplies their objections—SSO, exports, integrations, permissions, dashboards, audit logs, mobile support—and then generously builds the answers. The product acquires enterprise surface area without enterprise evidence.
Avoidance also has a mirror image. A founder can interview forever because a decision would risk being wrong. Discovery has done enough for the current cycle when it supports a next move: narrow the segment, run a manual test, make a disposable artifact, permit one small product slice, investigate a different customer, or stop.
Put the Feature on Trial
Choose the feature you most want to code this week: the one you return to when outreach feels slow. Write the pre-code memo, then ask:
- What customer fact would make this feature unnecessary?
- What cheaper test could produce that fact before product code?
- If that test failed, would I still want to build the feature?
If the final answer is yes, name the reason. The feature may still be worth building, but it is no longer an evidence-seeking move. The next honest step may be a better conversation, a deliberately bounded technical experiment, or the decision to build for reasons other than customer learning.
Code earns its place when the uncertainty has a name and the work is designed to answer it.
Continue reading
Full table of contents