Designing architecture for an imagined future is a common mistake in early-stage products. Instead of solving current problems, complexity is introduced too early, slowing down development and increasing costs. The key idea is simple: architecture should match the stage of the product, not a hypothetical scale scenario.
Speaker
Dmitriy Fedoryshchev is a Lead Software Engineer at EverCommerce with 8 years of experience.
Architecture Should Follow the Stage
Architecture is not a one-time decision — it evolves together with the product.
At the idea stage, the goal is to validate the problem. At early traction, the focus shifts to making the core flow reliable. At scale, the system must support growth, teams, and cost efficiency.
The same technical decision can be appropriate at one stage and unnecessary at another.
Stage 1: Validation Over Engineering
At the earliest stage, speed of learning matters more than system design.
The goal is to validate:
- whether the problem exists
- who the users are
- whether the solution works
Simple tools such as landing pages, forms, spreadsheets, and manual workflows are often enough.
The main risk is not scalability — it is building the wrong product too slowly.
Stage 2: Making the Product Work
As usage grows, expectations change. Manual steps become inefficient, and reliability becomes critical.
The focus shifts to stabilizing the core flow — the main path that delivers value.
At this stage, a simple but structured system is enough:
- a modular monolith with clear boundaries
- a single database
- basic testing and observability
- integration of external services instead of building everything
The goal is not to scale the system, but to make it stable enough for growth.
Avoiding Premature Complexity
Complexity is often mistaken for maturity.
Splitting systems into microservices, optimizing for future scale, or redesigning too early creates unnecessary overhead. The priority should remain on solving real, repeated
Stage 3: Scaling What Hurts
As the product becomes a business, earlier simplicity starts to break down. Costs increase, teams grow, and coordination becomes more complex.
At this stage, complexity is justified — but only where real bottlenecks exist.
Focus areas include:
- asynchronous processing and queues
- caching and performance optimization
- selective service extraction
- stronger observability
- cost control and ownership
The goal is not to scale everything, but to scale the parts that create real constraints.
Build vs Buy Changes Over Time
The build-vs-buy decision evolves with the product.
At the validation stage — rely on ready-made tools and manual solutions.
At the product stage — build the core, integrate supporting services.
At scale — reassess decisions based on cost, control, and reliability.
What works early can become inefficient later.
Common Anti-Patterns
Several recurring mistakes appear across all stages:
- building for hypothetical scale
- keeping temporary solutions for too long
- adding complexity everywhere instead of selectively
- copying architectures designed for large-scale companies
These patterns usually result from misalignment between technical decisions and the current stage.
A Practical Decision Framework
Before adding complexity, it helps to ask:
- what problem exists right now
- what evidence supports it
- what is the simplest acceptable solution
- what operational cost it introduces
- what future flexibility it preserves
This approach helps avoid overengineering and keeps the system focused on real needs.
Conclusion
Good architecture is not about predicting the future. It is about solving current problems without blocking future growth.
When technical decisions align with the stage of the product, development becomes faster, systems remain manageable, and scaling happens more naturally.
