Every codebase has a moment of original sin. A decision made under pressure, or optimism, or simple ignorance — that compounds quietly for months until it becomes the reason your senior engineer won't stop talking about a rewrite.
We've built greenfield systems and inherited legacy nightmares. After fifty projects, we've identified the decisions that consistently cause the most pain.
“The teams that get architecture right aren't smarter — they just spent a week modelling their data access patterns honestly before writing a single line of code.”
The four decisions that cause the most pain
The third — and this one surprises people — is authentication. Most teams treat auth as a solved problem. They reach for a library, integrate it quickly, and move on. Then two years later they're trying to add SSO for an enterprise client and realising their user model can't support it without a major migration.
These aren't exotic problems. The antidote isn't prophetic foresight — it's a genuinely honest conversation in week one about where this product is going to be in two years.