The biggest problem I have with sites like CodeAcademy is shown in the following screenshot:
The problem is that you must enter exactly what the lesson is expecting, regardless of whether what you want to enter is correct, or even better than what they are expecting. I don’t think these sort of sites teach people how to code so much as they teach limited memorization, and how to work the interface.
Coding is about solving problems, learning how to solve problems, and to explore, invent, and play. These sites hamper that, and thus don’t provide the real learning environment needed.
Sites like Project Euler go about things in a different way. You write your code, assert it works and submit it to a forum. This way, there isn’t a single way of writing the code, but the learner is left to learn and explore in creating their answers, and has the benefit of learning from others work at the same time. This is democratic learning. It doesn’t work for everyone, certainly, but to me is the best way to learn to become a craftsperson. The interest, curiosity, desire, and sharing that are necessary for software crafting are rewarded.