Technical
First Principles Thinking for Software Architecture
Most architecture debates are cargo cult arguments. Someone read a blog post about microservices, and now every project needs Kubernetes. Let me offer a simpler approach that has saved my clients thousands of dollars: start from what you actually need.
What First Principles Means
First principles thinking means stripping away assumptions until you reach the fundamental truths. In software, that means asking: what does this system actually need to do? Not what does the industry say I should use. Not what did my last company use. Just: what are the concrete requirements?
This sounds obvious, but most teams skip it. They start with the technology stack and work backwards to the requirements. That is how you end up with a Kubernetes cluster for a blog that gets 50 visitors a day.
A Real Example
A client needed a blog platform. Here is what they actually needed:
- Create and edit posts
- Publish posts on a schedule
- Send a monthly newsletter
- Spend $0/month on hosting
That is it. Four requirements. The industry-standard solution would be WordPress on a $20/month VPS, or a headless CMS with a React frontend on Vercel with a separate email provider.
My first-principles solution:
- FastAPI backend (free on AWS Lambda)
- DynamoDB (free tier: 25GB storage)
- Next.js frontend (free on Vercel)
- SES for email (free tier: 3,000 emails/month)
Total cost: $0/month. Scales to millions of reads. No servers to manage.
Requirements -> Simplest solution -> Build that
NOT
Buzzwords -> Complex architecture -> Hope it worksThe Three Questions
Before every architecture decision, I ask three questions:
- What problem am I solving? Not what technology am I excited about. The problem drives the solution, never the reverse.
- What is the simplest thing that works? Not the most elegant or the most scalable. The simplest thing that actually meets the requirements today.
- What will I regret in six months? Not what looks good on my resume. Will this choice make maintenance harder, deployment riskier, or debugging slower?
Why Simple Wins
Simple systems are easier to debug. They produce clearer error messages. They deploy faster. They are easier to hand off to clients or new team members. And they are easier to modify when requirements inevitably change.
The best architecture is the one your team can understand, maintain, and extend without calling the original developer. Usually that means fewer moving parts, fewer abstractions, and fewer technologies in the stack. First principles thinking gets you there.
Read more about system design fundamentals at the AWS Well-Architected Framework.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read