40+ Projects Later: The Uncomfortable Truths No Bootcamp Teaches You
Contrarian lessons from building across dozens of projects, languages, and frameworks — the stuff no course teaches you.
40+ Projects Later: The Uncomfortable Truths No Bootcamp Teaches You
I have built a lot of things. Full-stack apps, IoT systems, ML pipelines, microservices, game servers. Somewhere along the way, I internalized a few things that directly contradict what we are taught.
1. Starting over is a skill, not a failure
I do not think I have ever gotten the architecture right on the first try. Monoliths that should have been split. Microservices that should have been a single process. Database schemas that made sense until they did not.
The instinct is to think I should have planned better. No — you cannot plan away ignorance. You did not know what you did not know. Refactoring is not wasted work. It is how you learn the shape of the problem.
Contrarian take: If you never want to rewrite something, you are not pushing into new territory.
2. Knowing your tools is overrated — pattern recognition is what matters
I have worked across a dozen languages and frameworks. People think the stack is the skill. It is not.
The skill is recognizing that your auth problem is really a session management problem. That your slow API is an N+1 query. That your microservices are coupled through a shared database.
These patterns are language-agnostic. The debugging process is the same everywhere — just different syntax.
Contrarian take: Do not go deep on one stack. Go wide. The patterns transfer. The syntax does not.
3. The hardest part is not code — it is deciding what to cut
Every project that shipped had a moment where I cut a feature I knew was good. The temptation is to keep adding. Just one more feature. That is how projects go to die — not from lack of ideas, but from an inability to say no.
Contrarian take: Your work is not what you build. It is what you choose not to build.
4. Nobody reads your clean code but you
I have written beautifully architected services with proper separation of concerns, dependency injection, and high test coverage. I have also shipped tightly-coupled, I will fix it later code that worked just fine.
Clean code matters for maintainability. But if you are the only one who ever reads it, you optimized for the wrong audience.
Contrarian take: Ship the messy version first. Clean it up when the pain demands it.
5. Burnout does not look like exhaustion — it looks like apathy
I did not stop building because I was tired. I stopped because I stopped caring. The projects that died were not the hard ones — they were the ones that stopped being interesting.
The fix was not rest. It was working on something that scared me a little.
Contrarian take: If you are bored, you are not learning. Pick the thing that feels slightly too big.
6. Your GitHub is not your resume
Dozens of repos. But the signal-to-noise ratio is what matters. One well-documented, well-architected project teaches more about a developer than 30 half-finished repos.
Contrarian take: Delete what does not represent you. Curate your profile like a portfolio, not a storage unit.
The meta-lesson
Most of what we are taught about software development is optimized for passing interviews, not for building. Shipping real work requires different instincts — when to cut, when to rewrite, when to ignore best practices, and when to push through boredom.
I did not learn these from courses. I learned them from failing repeatedly and building anyway.

Whilmar Bitoco
Full-Stack Developer & Aspiring Cloud Engineer