People's answers to whether or not you need to learn CS fundamentals have a habit of being self-rationalizations, so be careful with what advice you take (I say as I'm about to give advice).<p>How useful things are in "the real world" varies greatly. The consensus seems to be that a lot of people say they go through their whole careers without ever using any of the things you learn in CS (for example, you'll hear a lot of "I've not once ever had to implement quicksort"). I don't doubt that these people are correct, it seems pretty apparent that you can certainly have a go at being a developer without knowing all the fundamental theory.<p>Some people seem to take this as a point of pride, however; like knowing those things would be a drag and a waste of time. I find this attitude perplexing, although I'll admit that it might just be a flaw in my wiring.<p>I want to know EVERYTHING. Literally, I want to know everything. This can't happen, obviously (both for reasons around the limits of time, and also my intellectual failings), so I try and prioritize.<p>If you decide that you really do want to learn all the fundamental stuff, I'm sure people will suggest all sorts of ways that they've been able to do so. Pick and chose the things that people say that seem appropriate to your case, but obviously, everyone learns things differently, so don't expect there to be a good foolproof path you can take.<p>What I've been doing (and keep in mind, I'm an idiot, although I hope slightly less of one every day), is really a brute-force approach.<p>First, I looked at the curriculum at a bunch of well-regarded CS undergraduate programs (I picked MIT and Stanford, mostly because in addition to being pretty well-regarded, both have a lot of material online). I looked at what their early intro CS classes looked like, what books they used, what the lectures looked like, etc.<p>For books and topics which overlap between schools, that's an easy choice as to what materials to use (for instance, it seems like almost everyone uses CLRS for algorithms, so you can pick that one and at least feel comfort knowing you're in good company. I actually used CLRS in school, so this second time around I picked up Skiena's algorithms book ((mentioned effusively by tptacek on here a number of times)) and have been going through that.<p>If you literally just pick out the books from the undergrad classes at a couple of good CS schools and read them completely (and do all the exercises), you'll be a good part of the way there. That's not to say you get the same experience as being there (you don't), but presumably taking four years to go enroll in an undergrad program isn't on the table as an option, so you're making due the best you can.<p>And yes, the real knowledge will come from actually using the stuff you learn in the books, so the whole time, be writing programs ("ABC"...Always Be...Computing).<p>After the third or fourth "level" of classes, is usually the time in undergrad where you then start to specialize. After the core curriculum, you'll find that not everyone takes every class, you just have some number of classes from the "CS bucket" that you have to take, and you pick from it based on schedule and interest. Here is where you have an advantage over people actually in school, however. You don't also have to be taking philosophy (although maybe you should, again, in my case I want to know everything, of which philosophy is a definite subset), so you can spend as much time learning as many things as you want.<p>Want to learn about compilers? Read a book and build the projects. Graphics? Networking, Functional programming (assuming the intro books were predominantly imperative), whatever you want.<p>Basically, learn as much and from as many topics as you want to.<p>That won't help you in the short term ace programming job interview questions (and to be honest, I'm not sure if anything can really be that helpful as a short-term solution).<p>Again, I want to reiterate, you can have a long and successful career as a software developer doing none of these things, but the one thing I'd say is that once you do have a good grasp of actual CS fundamentals, you'll probably be surprised by how much easier it is to solve problems. Not that those problems are unsolvable without it, but that they are much more easily solved (and in some cases able to be avoided completely).