I didn't know what I wanted to do before going to college at Penn State. I just knew that I had to go to college. I was always interested computers so I ended majoring in Information Sciences and Technology. About halfway through when I actually got to take some programming classes I discovered that I had a passion for software. I went to my counselor and inquired about switching over to CS. Unfortunately, almost nothing from my major would transfer and I had to pretty much start over. As someone paying for college myself this really wasn't an option. I continued on with IST in the Design and Development option.
I ended becoming the first employee at Bay Area startup. They were a bit desperate and I convinced them I could make their Android apps. I did and they are both highly rated. I also made one of my own that ended up getting featured on Google Play and receiving a lot of press. I have a bit of knack for it but I am so bored with GUIs and UIs. I want to work on harder problems and not just use other peoples libraries. The problem is that my lack of knowledge limits my thinking. I want to fix this. I am torn between going back to school for another BS in CS, pursuing a MS in CS, or teaching myself from things like MIT Open Courseware and Udacity.
I am not really worried about getting a job. This is about gaining knowledge. Although having a "real" CS would certainly help keep me from being pigeon holed as an app developer and open a few more doors. I do think that going back to school would be the quickest route to gaining the knowledge I want. I am just worried that I wouldn't get into a top school and I don't know if I should try to do a BS, MS, or just take classes. I really don't want another $50k in debt either. Especially when things like the Georgia Tech online MS CS is coming out for $7k.
So, what is the best way for a proven and largely self taught developer to take their knowledge to the next level?
1. Algorithms & Data Structures <- The biggest one
2. Baremetal Hardware. ASM, goes into the design of a physical cpu with ALUs, etc. Sometimes you make your own basic CPU. I suggest using a course with ARM ASM, simpler than x86 ASM.
3. Operating Systems & Multithreading Theory. You usually do a bunch of C language work here. Maybe combine it with a project on an ardunio or similar.
4. Discrete Mathematics
5. Databases
6. (Optional) Compilers. Write your own compiler, do this after the ASM course.
7. (Optional) Artificial Intelligence. Learn cool things such as machine learning. AI can be very statistical at times, so I suggest adding a Statistics & Probability course to supplement. Statistics is used a lot in business, so it's useful to know for life in general.
8. (Optional) Computer Graphics, using OpenGL!
On top of that I suggest you learn a functional language like Clojure or Haskell. Or both of them. Also learn a language where you have to do memory management and deal with pointers (like C, C++, Objective-C) if you don't include it in your Operating Systems course. After that you can basically do anything in software. Any new language and platform will be just covering concepts you already understand at that point, so you'll be able to learn them extremely quickly.