A shortcoming of most classroom programming is that it mostly teaches writing code, which is important, but secondary to reading code. Obviously there are plenty of examples of illustrative code, demonstrating some point or other, but this seldom represents a meaningful learning experience.
I would venture that the big-picture you're missing is working on a big project. It can be hard to see how the classroom assignments and even projects scale to a full size application.
I'm not suggesting you try to build a large application (though that would certainly be just fine), but what you really need is to work at the source level of such a thing. Many have suggested that you work on a larger task than a classroom assignment, and I think this is the way to go, but you need to work on something that in some way involves another large project at the source level.
A good way to do this is to take a framework and push it to its limits. Create an application built on top of the framework that goes beyond what the framework was really built for.
For example, You can use Django for a blogging engine and learn a good deal about web programming, the python language, and so-on. Doing so won't require you to ever actually look at the framework at the level of its source code.
On the other hand, using that same framework for building a simple, web-based massive online game goes well beyond what django can do completely on its own. You will touch almost every part of the framework's functionality. You will have to really understand what a major portion of the framework does and how it does it. You will have to improve the framework in some ways, so that it actually does what it already almost can, and you will at the same time, have to create whole, new modules for things that are simply beyond what the framework ever could do. You will have to use almost every possible technology for building dynamic web sites.
Another strategy for getting a better feel for the programming craft is to work in a team. A major benefit will be that the project evolves quickly enough to stay interesting, and even reach a level of maturity. Another key aspect is that you will spend a major part of your time reading code from your team-mates, rather than pounding away at new code on your own. This also makes it essential to use some of the tools used in the wild that are rarely taught in class: bug trackers, source control, unit testing and online debuggers.