Back to blog
·4 min read·749 words

What 5 Months of Solo Full-Stack Development Taught Me

Lessons on architecture, communication, scope management, and knowing when good enough is the right call — from building a six-platform system entirely alone.

The Starting Point

I used to believe that everything should be perfect. Every function, every component, every API response — meticulously crafted to an ideal standard.

Five months of building a complete restaurant management platform solo taught me otherwise. The system spans six interconnected platforms. I built every piece alone — every frontend, every backend service, the Electron app, the React Native app, deployment, and performance testing.

Here's what I learned.

Communication Matters More Than Code

The client came to me after previous developers had failed. They had looked at his Wix website and simply started cloning it in React. According to the client, they never truly listened.

"Everything you built already exists in my current Wix setup. You haven't added anything."

I took a different approach. I listened. I asked questions. I explained my understanding back to him, sought clarification, and did independent research before writing any code. I documented my interpretation and shared it with him.

When he finally said "Yes — now you understand. I'm very happy. Go build it" — that was when development began.

The best technical skill a developer can have is the ability to understand what needs to be built before building it.

Scope Management Is a Survival Skill

There was a point where the relationship between the client and my CEO became strained — tensions around scope, expectations, and communication. Requirements creep was becoming a real risk.

I stepped in, mediated the conflict, and kept the project on track. Today, both the client and my CEO say the same thing:

"This project survived because of you."

That wasn't about code. It was about managing expectations, communicating clearly, and knowing when to push back and when to adapt.

Architecture Must Evolve

I started with a flat server architecture that worked fine for the original scope. When the client requested separate dashboards and real-time sync, I migrated the entire server from API v1 to v2.

The key changes:

  • Modular architecture — each feature became a self-contained module
  • Redis session caching — eliminated database calls on every request
  • Dual WebSocket transport — Socket.IO for web, native ws for Electron
  • Automatic API documentation — Zod schemas drive both validation and Swagger docs

The lesson: don't marry your architecture. If the scope changes, the architecture must change with it. The cost of not evolving is technical debt that compounds with every new feature.

Learning Under Pressure

I had ten days to build the admin mobile app. I'd never touched React Native before.

In the first eight days, I learned React Native from scratch and built four practice apps. One was a mini social media platform — authentication, CRUD, posting, liking, commenting, and real-time notifications via Firebase Cloud Messaging.

On day nine, I started building the actual production app. I delivered it on day twelve.

The takeaway isn't "I'm fast." The takeaway is: structured, focused learning with a clear goal beats casual exploration. I wasn't learning React Native to "add it to my resume." I was learning it because a real user needed a working app in ten days.

Reliable Beats Perfect

Here's a concrete example. In API v1, I used MongoDB's _id everywhere — from React to the Electron app. It worked, but it felt inconsistent.

During a short break, I worked on a project using PostgreSQL where everything used id. It was cleaner and more pleasant to work with.

When I built API v2, I wanted that consistency. I explored two approaches:

  1. A Mongoose plugin that transforms _id at the ORM layer
  2. A transformer function that converts _id to id at the API boundary

The Mongoose plugin turned out to be fragile — it depended on Mongoose internals that broke across versions. The transformer function added 2–5ms to API response times.

I chose the transformer. My reasoning: when you're building at scale across multiple platforms (web, mobile, desktop), consistency in developer experience compounds. Clean, predictable interfaces across every surface matter more than saving a few milliseconds.

Knowing the difference between "perfect" and "reliable and good enough" is itself a skill.

The Real Lesson

Building software is fundamentally about solving problems for people. The technology is a tool. The real skill is understanding what needs to be built, communicating clearly, and delivering something that works — reliably, on time, and in a way that the client can trust.

Five months, six platforms, one developer. I wouldn't trade that experience for anything.

ShareTweetShare