Since apparently learning to code is some major fad right now (which I perpetuated in my classroom before my shoulder was busted), my greatest challenge with learning to code is how many options there are out there to learn Too many is the answer. Too many. The very basics of good teaching are to teach both the "how" and the "why", modeling, providing time for support practice, and providing independent practice so I can retain and generalize the skills learned. The options I've found online all vary significantly in quality in these respects, and the quality seems to change and drop off at regular intervals. For example, my Udemy.com class in C++ was a great place to start. Initially, the e-instructor explained everything very clearly with his amazing thick accent. Most importantly, he started with teaching "why" you do certain things before teaching "how", which as a teacher I know is essential to ensuring someone can use the skills in the future to solve unique problems they never came across. They'd have the tools to attack a problem that seemed foreign because they knew how their tools worked and consequently where they would be effective to use and the impact they could have. Unfortunately, about half-way through the lesson, (as I mentioned with my issue involving fatty fingers and validity checks), the quality sort of dropped off and instead of teaching he just started to show how to do things without anything resembling why. Thankfully, I'm pretty good at deduction and producing cases that can ensure whether or not something is working the way I suspect it is, and I can look information up pretty well, but what's the point in paying for a class that I need to supplement with hours of trial & error + research to learn a basic functions actual functionality? I want to spend those hours of trial & error + research learning how to solve my own problems instead! Way more fun.
The other issue I had with the Udemy.com class I took was the lack of independent activities or homework to ensure I had learned what I was expected to learn. There were two incredibly easy quizzes total, but that's all. Again, this wouldn't have been a big deal if I had known the "why" behind what I was doing, because I could easily make up my own activities, but when you lack the "why", independently structuring a problem you can solve gets a little trickier – which is how I knew I knew less than I had expected to by the time I finished.
Despite some major educational flaws involving my inability to generalize the skills I learned without hours of independent study and raking through the internet, I still believe C++ was a good place to start since it tied to a language I had some background in – even if it was nearly a decade ago. I had taken C in high school when I first loved coding, but ultimately decided to go to college for something else because while I loved it, I wanted it to continue to be more of a hobby so that my love didn't fall away. In college, I continued to work in some scripting languages to make mods and additions to games I loved (Ragnarok Online, oh yeah!), but by senior year I was so busy being old that it dropped off.
In hind sight, this might have been a silly line of reasoning. Why not pursue something that I love as a career? The passion should have gotten me through all the normal ups and downs no problem, but for whatever reason I had a fear that something I loved to do for recreation would become tainted once it was a career. Fortunately, years of tech support helping pay for my undergraduate school also made me realize I love teaching and going to Carnegie Mellon made me more than aware of the fact I'm totally cool with people who have disabilities. Somewhat joking, but also CMU has an abnormally high rate of students with Autism Spectrum Disorder. Which is awesome.
Anyway, on a less personal note, once I finished with my Udemy course, I felt sort of disillusioned and uncertain of what to do with myself. I knew my next step was going to be learning languages that I can use on my old web domain after the fundamentals of coding were out of the way, but I felt like they hadn't really been fully taught and my independent deductions left me hesitant to say I was correct in said deductions and standing on solid ground. I looked at a few different sources as where to go next.
I tried Codecademy.com. I had two major complaints. While the format of the website was amazing and something I hope to be able to make one day with the instructions, code, then seeing what you build in real time all lined up in a way where it didn't feel crowded, it was far too much like rote memorization and once again didn't include the "why". I could figure out how by looking at source code and messing around with it. My second issue was the pacing of the lessons was so slow that after I got a bit into CSS I decided to try something else. Also, I learn very well with audio, so videos would have been nice too, but this is more a personal learning style issue than actually a critique on the material.
I checked another Udemy course, but they all looked to lack independent tasks and explaining "why" as well. There were a few Ruby online programs out there that were either free or charged very little, the online courses from Stanford and the like, and a couple things like TheOdinProject.com, which has a great information for reading and connects to a wide breadth of different resources (including Codecademy, TreeHouse, etc…) as well as laying what to learn out in a specific order, but a lot of it linked back to Codecademy for basic information. Which, as I stated earlier, not a huge fan even if I want to cuddle their website at night. Then finally, I found the one for me. Udacity.com. For now, this is the path I'll be on until I likely wander over to TheOdinProject or FreeCodeCamp looking for more.
Udacity explains things clearly, including why you use different parts of code or how functions work, and then offers quizzes and homework immediately requiring you to independently apply what was learned. Also, there are videos, so that's a plus for me, and you code things without them explicitly telling you exactly what to code to the point where you can probably copy and paste unlike Codecademy. Some people may not like that it gives information not directly tied to the immediate skill you're trying to acquire, for example a few minutes spent talking about Ada Lovelace, but I genuinely enjoyed the random tidbits of information.
The how, the why, modeling (lectures showing how to do something) and guided practice (quizzes that then walk you through the steps – I'm assuming this would be closer to typical guided practice if you paid, but I'm good with my freebies), and independent application (homework & since you have enough of the why you can set your own assignments easily such as working on that old domain!). Udacity is the closest thing I have found to best practices in teaching online so far.
Udacity is perfect for me – at least for the time being where I'm still just getting off the ground and trying to solidify my learning from C++ into other languages. I plan on starting with Python since it's the closest to C++ (though so much simpler and more elegant), while I continue with HTML/CSS through independent study since they both so far have seemed incredibly direct while I was doing Codecademy.
I have, of course, also considered a bootcamp, but that's a post for another day.
EDIT 1/30/15: I just finished Udacity's HTML/CSS section, and I felt the need to update to say that while there are some portions where they explain how/why quite well, there are others where they return to the old school way of teaching code which is "look at this block of text – copy it onto yours – see what it does!" At this point I can only really recommend their introduction to CS course, though I may recommend others as I continue or stop recommending that one if it gets progressively worse which seems to be the trend in MOOCs.