The Default Bias
Every component must justify itself. The burden of proof sits on complexity, not simplicity — because complexity is never free and almost never leaves.
ADDING ONE COMPONENT (queue, cache, service, store)
buys: its specific capability
costs: +1 network hop on affected paths
+1 failure mode (it can be down, slow, or wrong)
+1 consistency question (when is data where?)
+1 operational surface (deploys, alerts, upgrades, runbooks)
+N lines of config nobody fully owns by month six
The capability is visible in demos; the taxes are paid at 3am. Designs that stack components “for scale we might have someday” pay all taxes immediately for benefits that may never arrive.
The Failure Pattern
TYPICAL OVER-ENGINEERED STARTING LINEUP
Client → CDN → API Gateway → Service Mesh → 6 microservices
→ Kafka → Flink → Cassandra + Redis + ElasticSearch
→ K8s multi-region with Istio mTLS everywhere
team size: 4 engineers. traffic: 50k DAU.
result: every feature touches five repos; debugging requires
six dashboards; deploys are ceremonies; velocity approaches zero
— while a single well-indexed Postgres could serve this load
on one node.
None of those tools are wrong. Deployed without their triggering evidence, they are wrong here.
The Evidence Bar
A component earns entry when a measurable trigger fires:
| Proposed addition | Required evidence |
|---|---|
| Cache | Measured repeated reads; DB load demonstrably reduced would result |
| Queue | Work identifiable as async; sync path measurably hurt by it |
| Second datastore | First datastore’s model provably mismatched to an access pattern |
| Microservice split | Team/deploy contention real; blast radius argument concrete |
| Sharding | Single-node write ceiling actually approached in metrics |
“Wouldn’t it be cool” and “we’ll need it eventually” fail the bar. Eventually arrives with its own evidence.
Complexity Budget Thinking
Treat total system complexity as a fixed budget spent per feature:
SIMPLE VERSION COMPLEX VERSION
POST /rides inserts row POST /rides writes Kafka event,
returns 201 consumer validates, writes Cassandra,
saga compensates on timeout...
both "work." the second spends budget that no current requirement
justified — budget now unavailable when a REAL hard problem arrives
Simplicity hoarded early is capacity available later. This mirrors the LLD YAGNI principle raised to system altitude.
The Honest Counter-Case
Sometimes complexity is correct up front:
- Compliance regimes (data residency, audit trails) are day-one requirements, not future ones.
- Known spiky workloads (flash sales, ticket drops) with signed contracts behind them.
- Rewrite windows: migrating a legacy monolith justifies strangler-pattern scaffolding from the start.
The test is not “is it complex?” but “does a named, present requirement demand it?”
Interview Framing
Interviewers probe this by asking “why not simpler?” about any box drawn. Strong answers either simplify on the spot or defend with a trigger (“the queue exists because match requests spike 20x during rush hour and riders cannot block on matching”). Defending complexity with numbers converts a weakness into demonstrated judgment.
Premium Content
Unlock Avoid Premature Complexity and all premium lessons with a subscription.
From ₹199.99/year — See plans