The most expensive software mistake is not a security vulnerability or a performance bug. It is building something nobody needed. Post-mortems on failed software projects repeatedly surface the same finding: the team built the wrong thing. The code worked. The problem was the premise.
Problem-solution fit is the discipline of validating that a real problem exists, that your proposed solution addresses it, and that enough people have that problem to justify building - before committing to a production architecture. It is not glamorous. There are no frameworks to install and no deploy commands to run. But it is the highest-return investment a development team can make.
The TL;DR
- Most software failures are failures of product definition, not engineering execution.
- Problem-solution fit requires validating the problem before designing the solution.
- User interviews surface the real problem, which is often different from the stated one.
- Jobs-to-be-done framing reveals what users are actually trying to accomplish.
- Prototype testing before production code is written is the single highest-leverage quality gate.
Why Most Failed Software Projects Got It Wrong
The pattern in failed software projects is remarkably consistent. A stakeholder or founder identifies a problem, often from personal experience or a high-level market observation. Requirements are written. A design is produced. Development begins. Months later, the product launches and adoption is low. The post-mortem reveals that users did not have the problem the way the team thought they did, or that the proposed solution created more friction than it removed.
This failure mode has nothing to do with engineering skill. Teams of excellent engineers ship products that fail because they were never validated against real user behavior. The design was validated against the assumptions of whoever wrote the requirements document.
The inverse is also true: teams with modest technical resources build software that users love because they spent significant time before building - talking to users, watching them work, and testing their assumptions rigorously.
The Problem-Solution Fit Framework
Problem-solution fit is reached when three conditions are true:
- A specific problem is confirmed to exist, through direct observation or interviews, not through assumption.
- The proposed solution meaningfully reduces that problem for the people who have it.
- The solution does not introduce friction that outweighs the value it creates.
The framework to reach this state has four stages: discovery, problem framing, solution validation, and prototype testing.
Stage 1: Discovery Through User Interviews
User interviews are not customer surveys. Surveys measure reactions to hypotheses you have already formed. Interviews surface information you did not know to ask about.
The structure of a productive discovery interview:
- Open with context, not questions: "Tell me about how you currently handle [the domain area]."
- Follow the problems that surface, not your script.
- Never ask users what features they want. Ask what is painful and what they have already tried.
- Aim for 8-12 interviews before drawing conclusions. Patterns emerge around 5-6 participants; the additional sessions stress-test those patterns.
The most important output of discovery interviews is not a feature list. It is a clear statement of the problem: who has it, when it occurs, what they have tried, and why existing solutions fall short.
Stage 2: Jobs-to-be-Done Framing
The jobs-to-be-done (JTBD) framework, developed by Clayton Christensen and expanded by practitioners like Bob Moesta, reframes user needs around the outcome the user is trying to achieve rather than the feature they are asking for. Users do not want a calendar integration - they want to stop missing follow-ups. Users do not want a dashboard - they want to make a decision quickly without having to dig through reports.
JTBD framing is useful because it separates the problem from the solution. When you know the job users are trying to get done, you can evaluate whether your proposed solution actually completes that job, and compare it against alternatives - including doing nothing, or using a spreadsheet.
The canonical JTBD format is: "When I [situation], I want to [motivation], so I can [outcome]."
For example: "When I finish a client meeting, I want to log the key decisions without switching to another tool, so I can send the follow-up email while context is still fresh."
That job statement reveals requirements that a feature list misses entirely.
Stage 3: Writing a Problem Statement
Before designing anything, write a problem statement that the whole team agrees on. A good problem statement includes:
- The specific user experiencing the problem (not "users in general").
- The situation in which the problem occurs (context matters - a problem that only occurs once a week is different from one that occurs every 10 minutes).
- What the user currently does to address it (the workaround reveals tolerance and urgency).
- Why existing solutions are inadequate.
If the team cannot agree on the problem statement, they are not ready to design. The disagreement needs to surface here, not six months into development.
Stage 4: Prototype Testing Before Production Code
A prototype is any artifact that a real user can interact with and react to. It does not need to be functional. Paper prototypes, Figma clickthrough prototypes, and simple HTML mockups are all valid. The purpose is to test the solution concept before committing to an architecture.
Prototype testing with five users will surface approximately 80 percent of the usability problems in a design. This is a finding that has been replicated consistently in usability research, and it means that the investment in even a brief prototype test before development starts pays back many times over.
What to test in a prototype session:
- Can users figure out where to start without instruction?
- Can they complete the core task?
- Where do they get confused or stuck?
- Does the product match their mental model of how the task should work?
The answers to these questions, gathered before a single line of production code is written, are the most valuable data a development team can have.
The Common Objection: "We Don't Have Time for This"
The most common objection to problem-solution fit work is timeline pressure. Discovery interviews and prototype testing take time, and stakeholders who want to move fast often see this as delay.
The counterargument is simple: the time spent in discovery is always less than the time spent rebuilding something that did not work. A two-week discovery phase that catches a fundamental misalignment in requirements prevents a two-month rework cycle after launch.
More concretely: development time is expensive. Every sprint spent building a feature users do not need, or building a correct feature with the wrong interface, is a sprint that cannot be spent building something users will actually use. Discovery and prototype testing are the cheapest possible way to ensure that development sprints go toward the right thing.
Validating Without Building
There is a spectrum of validation fidelity, and teams do not always need high-fidelity prototypes:
Conceptual validation - A one-paragraph description of the product shown to five target users. Can they identify what it does? Does their interpretation match yours?
Storyboard validation - A visual sequence showing the key user journey. No UI, just steps. Do users recognize this as solving their problem?
Wireframe validation - Low-fidelity layout tested for information architecture. Where do users look first? Where do they get lost?
Prototype validation - A clickthrough Figma prototype or simple HTML mockup tested for task completion. Can users complete the core workflow?
Each level catches different problems. Conceptual validation catches fundamental misalignment in what the product does. Prototype validation catches interface friction in how it does it. Both are necessary; neither replaces the other.
When Validation Reveals the Wrong Problem
Problem-solution fit work sometimes surfaces an uncomfortable finding: the problem the team was planning to solve is not the problem users actually have. This is uncomfortable because it invalidates work already done in requirements, design, or early prototyping.
It is also the best possible outcome of the validation process. Finding out that the premise is wrong during a two-week discovery phase is dramatically less expensive than finding out six months into development, or worse, after launch. Discovery research that kills a bad idea is not wasted time - it is the most valuable possible return on investment.
The typical response to this finding is to narrow the problem scope rather than abandon the project. Discovery work on a payroll software product might reveal that the intended feature - automated tax calculations - is not the pain users care about most; what they actually struggle with is importing payroll data from multiple sources without errors. That is a different product with a different architecture, but it is one that users will pay for and use. The two-week discovery phase prevented a six-month build of the wrong thing.
From Validation to Development
When problem-solution fit has been reached and prototype testing confirms that users can successfully complete the core workflow, the team is ready to commit to a production architecture. At this point, the requirements are grounded in observed user behavior rather than assumption, and the design has been stress-tested against real users.
Development can then proceed with significantly higher confidence. The risk of major rework post-launch drops substantially, and the feedback loop established during discovery gives the post-launch team a head start on understanding how usage evolves.
Our software development process integrates discovery and prototype testing as standard phases before any production code is written. If you are planning a new software project and want to ensure you are building the right thing, reach out to start a conversation. The first question we ask is always about the problem, not the solution.