What the hell am I thinking choosing computer science as a major. I know almost jack shit about actually writing actually useful applicable programs in the real world. I know next to nothing about compilers, or IDEs, or anything like that. And I can't seem to find any information online because I have no idea what to search for or where to look or what I'm doing wrong. Or the information I do find I just don't understand.
Extremely discouraged. Not getting anywhere. Realizing I know very little about something I thought I was competent at.
As a computer science major I can tell you that finally, at the end of my junior year, am I starting to feel like I actually know how to write real-world "useful" programs. Honestly though my biggest piece of advice for learning "useful" things like that is to simply buy a school textbook in the field you want to learn in (or torrent/download, CS books are usually the easiest to find somewhere, and I promise I won't hate you if you decide you don't want to pay the 1000% markup because publishers are scumbags) and start reading it/coding up simple projects.
Another thing I found was really helpful was to get involved in an open source project (mine is linked in my sig, of course
). Joining something like that means you get a constant list of problems that you can work on and you get to immediately see results, as opposed to coding up something from scratch where the really big projects might require years of effort before you get something even really workable. Working with an open source project also helps you learn to work as a team (which is honestly a key skill for any real development), and the fact that there is a community you get involved with helps you come back to it time and again and stay focused on helping out.
That said my biggest piece of advice for any computer programmer is to "think about what you are programming, and why you are programming it long before you ever write a single line of code". Use whiteboards, use mind maps, use whatever the heck you want, but if you don't already have at least the key components of whatever algorithm you want to use in your head by the time you are actually trying to fix a problem, then you've already failed.
Thinking about what you are coding, and taking the time to do so are what separates a true computer scientist from someone who just knows how to program (and it's an idea you can begin applying all of the way back in CS 101; even if you don't know all of the fancy algorithms and logic simply taking the time to think about what you want to do, to logically break it down into smaller steps, is enough).