If you want to compete against Joe average programmer with a degree then just learn Java or .Net plus the latest greatest technology fad offering (think Hadoop, Node/Angular/React, Rails back in the day, etc). From there you should have no trouble finding a startup company or a small contracting outfit with ties to bigger consultants serving enterprise clients. If you're good then accept a right-to-hire situation and an enterprise IT shop will pick you up.
Don't sell yourself short and don't take shitty odd consulting jobs from small businesses because you feel inadequate due to lack of degree. Create demand for your skill and reap the rewards. At the end of the day you will likely be the only one who cares about the degree.
I have a degree in business administration. My relevant work experience programming has always got me an interview using the tactics I outlined above.
If you have relevant work experience and a strong track record for delivering results then you will have no problem getting an interview regardless of your degree status.
[1](https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-...)
Like finding software developers: just cuz they have a degree doesn't mean they learned anything.
When you are offering lackluster responsibility, and bottom feeder pay, don't be surprised when you can't find talent.
What a CS degree will tend to provide (but not always) is a set of abstractions and a university perhaps may provide some different patterns of thought (but again not always).
That said, there's nothing every self-taught programmer (or CS grad) should learn. There's no standard individual. There's no standard set of circumstances. Sometimes the best answer is using something off the shelf. Sometimes the best answer is reinventing the wheel. Sometimes it's cut and paste. A CS degree (lack thereof) doesn't make someone wiser...or a good fit for a team or a lot of other things that matter.
That said, there are reasons to get a CS degree that have nothing to do with skill. There's social expectations. There's internal motivation. There's the simple pleasure offered by the opportunity/excuseto study something of interest for a few years.
Good luck.
Granted the OP could probably do better to clarify his goals for better targeted advice. Personally I would suggest to him/her that they should look at the MIT syllabus, or a trade-school syllabus, and go from there.
You won't be coding any fancy algorithms so you're worrying about the wrong thing. You just need to learn the best practices and stick to them. And then you learn most of the skills you will need through experience.
Also note that without a degree your employment possibilities are more limited. You will probably have the most luck in web or mobile app development.
I don't think this is really the case anymore. I work at a largeish game dev company and know quite a few people (coworkers and just other developers working for other companies) who have no degree and no trouble finding jobs. Admittedly this is purely from personal observation specifically in game dev, but it doesn't seem like my degree-less friends get any fewer recruitment offers or advancement opportunities than friends who went to college.
Don't get me wrong, I see plenty of people having trouble finding a position in games. It's just that this isn't limited to people with or without degrees (and isn't even limited to engineering positions specifically, where finding work seems to be easier). A lot of the time the people I see asking about their troubles finding a position simply don't have a portfolio of work to show potential employers.
And then there are people who haven't started applying yet but want to prepare. They ask in online development communities what they need to do to be ready - a lot of the time the answer from other people who do or have worked in games is to make games and build a portfolio, not necessarily ship off to college by default. Having said that nobody is disputing that college can be a great way to build that portfolio and learn things at the same time! The paper itself just doesn't seem to be as important as it used to be anymore.
You can't replace the full scope of CS studies with online courses or books simply. What you can do is to start widening your current domain of knowledge. You are a programmer: How does your language of choice work internally? How do compilers/interpreters do it for other languages? How does a single core handle your program? What happens with multiple cores? And so on...
You'll find yourself knowing more and more about SO, architecture, etc and you'll be able to take advantage of the knowledge right away (because it's related to what you do) and in the future (because many CS domains share common parts).
Last, if books work for you, use them. If hacking some electronics does it, then pursue that. Just find a way to learn things that doesn't get you tired. And whenever you're in the office and someone just talks about something you have no clue, ask for tips, always!
Things that have helped me the most from my CS degree:
* Learning the internals of operating systems and the UNIX API (Modern Operating Systems (3rd Edition), Advanced Programming in the UNIX Environment, 3rd Edition)
* Network programming (Unix Network Programming, Volume 1 and everything else really by W. Richard Stevens)
* Compilers (Compilers: Principles, Techniques, and Tools is the goto book, but I found it hard to read stand-alone. Might be worth finding a different textbook here)
* Algorithms and data structures (Introduction to Algorithms, 3rd Edition)
* Learning the basics of how CPUs work form a computer engineering book is useful as well, along with assembly language, and how higher level languages like C get translated to ASM and eventually machine code. I can't quite remember what text books I used for this.
Compilers was useful, even though I've never written one professionally, as knowing how to parse anything well save you headaches when someone tells you to parse some HTML for instance. You will also pick up regular expressions and some fun useful data structures.
2. And/or, do a deep dive study into every aspect of what you're currently working on. But 1 will help with 2.
What I can recommend is to learn Github and git. Beyond that, it really depends on what you want to focus on.
What interests you?