Seven years in, the things I'd tell myself on day one — and the advice I'd skip.
Seven years ago I decided I wanted to build software for a living. I had no CS degree, no bootcamp, no mentor. Just a laptop, an internet connection, and a vague sense that this was something I could figure out.
I did figure it out. But I took some detours I didn't need to take.
Stop collecting tutorials, start finishing things
The first year I watched hundreds of hours of video tutorials and built almost nothing. I was accumulating knowledge without applying it, which meant I wasn't actually learning — I was just consuming content about learning.
The shift that changed everything was forcing myself to build things that were slightly beyond my current ability. Not far beyond — just far enough that I had to look things up, get stuck, figure it out. That discomfort is where the actual learning happens.
Finish the small project before starting the next one. Ship the ugly thing. You'll learn more from the bugs you hit in a deployed app than from any tutorial.
Fundamentals are not boring, they're load-bearing
I avoided learning data structures and algorithms for years because they seemed academic and disconnected from real work. This was a mistake.
Not because of interview questions — though they matter more than they should — but because understanding how things work one level down changes how you think about the code you write. Knowing what a hash map actually is changes how you use one. Understanding recursion makes you better at breaking down problems.
You don't need to become an algorithms expert. But you need to know enough that the fundamentals aren't a mystery.
Read code, not just documentation
Documentation tells you what a library does. Reading the library's source code tells you how. That difference matters.
When I started reading open source code I stopped seeing libraries as black boxes and started understanding patterns I could apply in my own work. It also made me much less intimidated by large codebases.
The communities you join matter
I spent a lot of time in communities that celebrated speed over craft — who shipped the most things in a weekend, who built the fastest, who launched first. That energy is useful in doses but corrosive in excess. It makes you feel like taking time to understand something properly is a weakness.
The communities that made me a better developer were the ones where people talked about tradeoffs, admitted what they didn't know, and took code quality seriously.
What I wouldn't change
The self-taught path is not optimal for everyone. But it gave me something I value: the habit of learning. I never had a course to tell me what to learn next, so I had to develop my own sense of what mattered and why. That instinct is still one of the most useful things I have.