The Reality Check
For months, I'd been building systems in isolation. Reading architecture books. Debating ORMs. Rewriting things that already worked. Then in early 2023, I got asked a simple question: "Can you build a learning platform for students in Kuwait?"
No ambiguity. No time to overthink. Real people, real deadlines, real money on the line.
That's when everything changed.
Business First, Code Second
Before I wrote a single line, I sat down and asked the questions that actually matter:
- Who uses this? Teachers uploading lessons, students watching videos, parents checking progress.
- When do they use it? During school hours, after classes, on mobile data that might be shaky.
- What breaks the system? If a lesson upload fails mid-stream, if a student can't see their grades, if the whole thing times out on 3G.
The technical architecture came after those answers. Not before.
I could have built a microservices mess. Instead, I chose:
Node.js + Express — familiar, gets out of the way, doesn't force abstraction patterns that don't fit.
PostgreSQL + Prisma — relational data fits a school structure perfectly. Courses have lessons. Students enroll in courses. Transactions matter here.
Redis for sessions — stateless API tier, fast cache layer for frequently fetched data (student grades, lesson listings).
S3 for video storage — don't reinvent the wheel. S3 is simple, reliable, and vastly cheaper than trying to stream from a box under my desk.
Shipping Beats Perfection
Here's what actually happened:
Week 1: Got basic auth and course creation working. Deployed to a VPS. Teachers could log in.
Week 2: Video upload wasn't transcoding properly. Instead of building a perfect video pipeline, I used FFmpeg in a background job. It wasn't elegant. It worked.
Week 3: Query performance tanked when a teacher tried to load a course with 500 students. I added a database index and moved on. Not the fancy NoSQL sharding I'd daydreamed about. Just an index.
Week 4: Students are using it daily. Real feedback. Real bugs. Real priorities.
The system wasn't beautiful. But it shipped, and it solved a real problem. Students in Fajr could upload assignments. Teachers could grade them. Parents could see their kids' progress.
What I Learned
-
Constraints are gifts. A 3-week deadline isn't punishment — it's permission to stop overthinking and start shipping.
-
Boring tech wins. My stack wasn't novel. Express, Postgres, Redis, S3. Combined, they've powered millions of production systems. That's not a bug — that's proof.
-
Real feedback is worth more than perfect architecture. A teacher saying "I can finally see who's submitted their assignment" teaches me more than a week of architectural diagrams ever could.
-
The next rewrite is always better. Fajr isn't perfect. Neither is any system that's been in use for years. But instead of rewriting it from scratch with "better design," I maintain it, add features, and move on to the next problem.
Now What?
This experience reset how I approach every new project. Ask first. Build second. Ship to real users. Then iterate.
The systems I'm proudest of aren't the most architecturally perfect. They're the ones that actually serve people, handle real constraints, and keep running when I'm not looking.
Fajr taught me that.