The Fergy Stack

Linux at the desk, adventures on the table.

Architecture Is Just Choosing Your Pain (On Purpose)

Someone asks, “Why did you pick that stack?” and you can almost feel the room hoping you’ll say, “Because it’s popular,” so we can all move on and go back to shipping tickets.

But “popular” is not an architecture strategy. It’s a vibe. And vibes don’t show up in your incident postmortem.

Every technical decision is a trade-off. Not in the abstract, not in the “architects like triangles” sense—trade-offs like:

  • Performance vs simplicity: You can get that silky smooth UI… by building something only three people understand, and two of them already left.
  • Flexibility vs predictability: You can design a system that supports every possible future… or you can design one that your team can actually reason about without a support animal.
  • Speed of development vs long-term maintenance: You can ship fast today, or you can avoid paying “interest” for the next 18 months.

Here’s the shift that changed how I make decisions: good architecture isn’t about picking the best tool. It’s about picking the right compromise for the problem you’re solving right now—with eyes open about what you’re buying and what you’re signing up to maintain.

Because frameworks don’t create good outcomes. Decisions do.

Popular is not the same as appropriate

A stack being common can mean it’s well understood, well supported, and easy to hire for. That’s real value.

It can also mean:

  • It fits the needs of companies with very different constraints than yours.
  • It assumes team maturity or operational rigor you don’t currently have.
  • It solves problems you don’t actually have… yet. (Or ever.)

“Everyone uses it” is how you end up with an enterprise-grade solution for a two-page CRUD app. Congratulations, you just adopted DevOps Voltron to water a houseplant.

The compromise you’re actually making

When you choose a pattern, you’re not just choosing code structure. You’re choosing what kind of failures you prefer.

Pick a highly abstracted architecture and you might reduce duplication—but you’ll increase “where does this logic live?” conversations.

Pick a super simple approach and onboarding is easy—but you may hit scaling limits sooner, and refactors get spicy right when the roadmap is already spicy.

This is why “best practice” debates go nowhere. Two engineers can both be right, because they’re optimizing for different pains:

  • One is optimizing for team comprehension
  • Another for runtime correctness
  • Another for delivery throughput
  • Another for operational safety
  • Another for future optionality

It’s like Transformers: you’re not choosing whether it transforms. You’re choosing what it transforms into—and whether you’re okay maintaining it when a wheel falls off mid-battle.

A simple filter that works in real life

When I’m deciding between stacks or patterns, I try to make the trade-off explicit with a few questions:

  • What constraint is real today? (Latency? Hiring? Reliability? Time? Compliance? Team size?)
  • What failure mode can we tolerate? (More bugs? More complexity? More cost? Slower delivery?)
  • Who has to live with this decision? (On-call? New hires? Frontend devs? Product? Everyone?)
  • What do we need to be true for this to succeed? (Observability? Strong types? Consistent code review? Automated tests?)

If we can’t answer those, we’re not choosing architecture—we’re collecting tools like they’re action figures and hoping they form a coherent squad later. (Knowing is half the battle, etc.)

If you try this next week

A lightweight practice that helps: when you make a stack/pattern choice, write a tiny decision note:

  • What we chose
  • What problem it solves now
  • What we’re trading away
  • What would make us revisit it (a measurable trigger)

That last part is the cheat code. It turns architecture from “permanent identity” into “current best move.”

Because the real skill isn’t picking a framework. It’s being honest about trade-offs, aligning the team around them, and revisiting them before they turn into silent misery.

What’s a trade-off you’ve had to make recently in your work?

Want to talk this through?

If you’re dealing with messy React boundaries, TypeScript drift, or a deployment pipeline that hates you back, let’s chat.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *