How I Started Coding: From HTML Pages to Production Backend Systems
A look back at my journey from writing my first lines of code to building scalable, production-ready backend systems with NestJS, Redis, and BullMQ.
A look back at my journey from writing my first lines of code to building scalable, production-ready backend systems.
Where It All Started
My journey starts with building an e-commerce website using Django and HTML.
I still remember the first time I wrote code and something appeared on the screen. It was just a basic HTML page with some CSS.
But seeing something exist just because I typed a few lines of code felt amazing.
That feeling is still the same today.
JavaScript Changed Everything
After some time I started learning JavaScript — the brain of the web page.
And that's when things got interesting.
Web pages weren't static anymore. They could react to clicks, submit forms, and fetch data from APIs. Everything felt alive.
But that opened up a bigger question in my head:
Where does the data come from? How does the server process it? Where is it stored when I submit a form? How does a server manage thousands of users and show them the right data?
That curiosity slowly pulled me toward backend development.
Going Backend
I started working with Node.js — building small Express servers and connecting them to databases.
Most of my early projects were simple CRUD apps. Nothing heavy. But they taught me how APIs work and how data flows through a system.
Developing frontend was fun initially. But the real challenge was always behind the screen.
When Real Users Showed Up
Things became interesting when I worked on systems used by real users.
That's when real problems started appearing.
- Bugs that never showed up in development
- Features that broke under load
- Edge cases nobody thought about
Working on a multi-tenant notification system forced me to think about:
- High traffic handling
- Background jobs
- Message queues
I learned quickly that you can't throw async functions everywhere and hope everything works automatically.
// What I thought worked ❌
async function sendNotifications(users: User[]) {
for (const user of users) {
await sendEmail(user); // blocks everything if provider is slow
}
}
// What actually works ✅
async function sendNotifications(users: User[]) {
await notificationQueue.addBulk(
users.map((user) => ({ data: { userId: user.id } })),
);
// returns immediately — workers handle delivery
}
That's where tools like Redis and BullMQ entered the picture.
Where I Am Now
Currently I build with:
| Layer | Technology |
|---|---|
| Runtime | Node.js |
| Framework | NestJS |
| Language | TypeScript |
| Database | PostgreSQL |
| Cache / Queue | Redis + BullMQ |
But here's what I actually believe:
The stack matters least. The thinking behind it matters most.
What I've Learned
Software development is really about solving human problems.
When I look back — from a basic HTML page to production backend systems handling real users — I'm genuinely surprised at how far the journey has come.
And that's what I love about this field.
There's always something new to learn.
If you're just starting out — keep building. The curiosity that made you write your first line of code is the same thing that will make you a great engineer.
Have questions about backend engineering, system design,and lessons from production? Drop a message — I'd love to help.