However there are a few topics I consider essential... operating systems, algorithm runtime/performance, data structures, basic software engineering/design patterns, memory management (seriously, everyone should have a course in C or C++) and functional programming (like Haskell).
Even hacking away at a PHP or Node server, there are times when a bit of knowledge of Big-O runtimes can save you from creating a script that never finishes.
If you can afford it, I'd recommend pursuing a formal route. It exposes you to a lot of ideas and ways of thinking that are hard to get in practice. After having programmed for around 4 years now, I often wish I'd studied CS.
In lieu of that, I think Udacity's nanodegrees programs are probably a good way to end up in a paid position relatively soon.
(I'm assuming you're looking to break into web programming. I can't speak for other areas.)
A lot of devs even at a mid or higher level have little curiosity for the theory side of things, and eventually you'll run into problems that require knowledge of it, so being enthusiastic (and a bit self-starting) in that area pays dividends in my experience even if you're not the most experienced dev going for a job.
The only caveat is that both were/are small companies, so no HR apparatus to go through.
Have some idea what you're doing. Talking the talk is great, but you must be able to walk the walk. Apply to everything that sound like you can/want to do it, even if you don't technically meet the requirements. Those are mostly for HR pre-filtering since HR doesn't really know what they're talking about in 99% of cases - they're just looking for keyword hits.
He's also a vastly different person than I am, writing code is not a passion of his, while it is of mine. I'd be writing code whether or not it was my job, while he'd rather be doing other things.