2 Understanding the problem
This chapter covers
- Separating problem from solution
- Identifying architecture-shaping requirements
- Using tiers for non-functional requirements
- Handling compliance constraints
- Knowing when to move to solutions
Thinking up a brand-new solution is always inspiring. A product team asks for a drag-and-drop canvas where users arrange items freely, and you are already picturing how satisfying it would be to build from scratch a custom rendering engine. You hear that users type something fuzzy into a search box and don't get the results they expected, and full-text search comes to mind straight away, along with the indexing setup you read about last week. We've all been there. Search will follow us through this chapter as a running example, as one area where it is so easy to picture a solution before anyone has properly defined the problem.
As engineers, we are trained to think in terms of solutions – architectures, patterns, technologies. It’s tempting to move quickly into decision mode, especially as we can prototype a solution so quickly these days, thanks to AI capabilities. But jumping to the solution too fast is risky: we may solve the wrong problem, or solve the right one in a way a missed constraint later invalidates.