About a year and a half ago I became interested in learning to program (specifically, iOS). Since my school currently lacks computer science classes (well next year they say they might have one using html, which doesn't seem that interesting to me), I have to learn it on my own. I picked up the bock Programming in Objective-C by Stephen G Krochan and was on my way (however, I didn't learn C beforehand). I quickly learned the basics of the language and started making apps.
In my opinion, learning to program is split up into several categories:
Basics of Programming - How programming works
Learning the Language - Syntax, Format, etc
Learning the apis and built in classes - In the case of Objective C, learning the Cocoa api, various classes, how views interact, etc
Concepts - Objects, pointers, design patterns, etc.
Since I'm learning on my own, I want to make sure I cover all these categories. I'm currently writing apps just fine, using a learn-by-doing approach, picking up new concepts and learning new classes as I go whenever I need to in my projects. This is a practical method- obviously I can't really sit down and memorize the documentation....
I want to make sure I'm learning everything that would be taught in normal computer science classes. Since I'm learning on my own, I'm concerned that I'll miss important concepts, which could later come back to bite, whether in College, on an exam, in a Job Interview, etc. However, it is hard to tell if I'm missing anything important, and what should I spend my time learning to enhance my programming knowledge.
I personally feel that I have a good feel for programming in general. I recently took a short class (outside of school) on java, and found that I had no problem, in fact it was pretty easy. Since I already get the basics of programming, it was more about learning the syntax and parts of the language. However, I'm not so sure how good my knowledge is on programming concepts.
Now I'm trying to the find best way to learn more programming concepts and practices, and a way to check to see what I'm missing in my understanding of computer science. I've looked around at options. There are several free online courses about programming, but my concern is that these will be short and simple, focused on writing a program, and less about programming/computer science in general. I've also heard that it might be a good idea to learn C, but I'm not sure how much this will help me.
So I'm looking for advice. What are the essential things taught in a computer science class that I should learn, and what would be the best way to do this? If anyone has advice on this, that would be very helpful. Thanks.