
Every engineer has joined a new project and thought:
“Wow, this system is perfect. I wouldn’t change anything.”
That feeling lasts about 6 seconds.
Whether you’re building a learning portal, job-matching engine, student analytics system, or an assessment pipeline, technical debt appears daily. Not because we’re careless, but because we’re shipping to real students with real deadlines and real business needs.
I love clean architecture. I enjoy thinking about modular systems, caching strategies, microservices vs monoliths, event streams, all of it. But I also accept a hard truth:
My architecture is bad, and yours is too. Not today, but eventually.
Let me explain.
Your system might be “good” right now.
• Maybe it scales to 10x your current load
• Maybe your team understands how everything fits together
• Maybe your patterns are clean
But architecture isn’t judged by the present. It’s judged by how quickly it becomes obsolete.
Your architecture becomes “bad” when:
• Your team grows from 3 engineers to 20
• You shift from bootcamp-only to LMS + job platform + B2B partnerships
• New student flows require new data structures
• Compliance requirements force data residency rules
• Performance expectations change (e.g., interactive editors, real-time code execution)
Great engineers design for change & versatility, not perfection.
And most “bad” architecture isn’t caused by bad engineers.
It’s caused by business decisions that require speed, not purity.
In a startup, that’s normal.
Technical debt is part of the process.
It’s not evil.
Sometimes it’s the only way to survive.
But debt must eventually be paid.
The trick is knowing how to build for now while keeping the door open for later.
Build for your current scale, while anticipating that the future will look nothing like today.
At Sigma School, we don’t pretend we know exactly where we’ll be in 2 years.
Student behavior changes. Hiring partner needs to change. The LMS will evolve.
Jobier grows in ways we can’t predict.
The only constant is that everything will change.
So the job isn’t to create “perfect” architecture.
The job is to create malleable architecture.
One of the best architectural decisions is simply:
Not deciding yet.
Here’s a (relatable) example:
Let’s say you’re storing student progress data. You know that eventually you’ll need a more complex warehouse or analytics system. But right now:
• You only have a few thousand students
• Queries are simple
• Dashboards are lightweight
• Scale is not the issue
So yes, just put the data in Postgres.
But here’s where many engineers mess up:
They go “all in” on Postgres features:
• Advanced JSONB queries
• Stored procedures
• Tight coupling and JOINs everywhere
Suddenly… the system is married to Postgres.
When you need to migrate?
Pain.
Heavy pain.
You might use Postgres now, but you should build:
• flatter data structures
• simpler schema
• fewer assumptions
• loosely coupled services
This way, migrating to BigQuery, ClickHouse, or a custom analytics pipeline is not hell.
Great architecture isn’t about being scalable today.
It’s about being changeable tomorrow.
Modularity > cleanliness
Adaptability > premature optimization
Future-proofing > future-guessing
It’s strategic patience.
As engineers, we don’t know:
• how user behavior will shift
• what new features will become core
• how markets will evolve
• which technology will emerge next year
• how the business will pivot
So instead of building a “perfect” system based on assumptions…
We build a good system that’s easy to change once we know more.
That’s the real job.
Our LMS, student support pipeline, matching engine, Jobier backend, all follow the same principles:
• Build the simplest system that solves today’s problem
• Keep components modular
• Avoid tight coupling unless absolutely necessary
• Document every assumption
• Prepare to migrate, rewrite, or replace parts as we grow
• Don’t over-engineer until real data demands it
The future always surprises us.
So instead of pretending to predict it, we build for flexibility.
Your architecture is bad. Mine is too.
Not because we’re sloppy, but because things change.
And that’s the point:
Great architecture isn’t designed to be perfect.
It’s designed to be rewritten.