I have a somehow biased experience: I quit school long before graduating, I've never been good at sitting around, listening and taking notes.
So then, I really had to get to know some programming, and hit the real work world.
The good news is, it's absolutely feasible.
The bad news is, it's god damn hard, requires a good amount of passion, and there's a non negligible possibility that you end up realizing you'll never be good at it.
From what you wrote in your question, I take it you're affraid that after spending time learning at school, you'll be useless for a while at work.
To that, I say go on and start just about right now to do a program, oh, and make it big. Make it use lots of areas in programming. It's gonna be hard, it should be.
Focus on "real world" stuff:
- use enterprise level tools (visual studio 2010 ultimate, rather than
notepad++ for example)
- enterprise level frameworks (WPF/Prism)
- make use of dependency injection/inversion of control (they're in
every project i worked on, really)
- don't focus on optimization: that'll come with experience (i.e:
forget about fancy sorting algorithms, they're built in or available in libraries anyway)
- start by reading every pattern of the GoF. Mark my words, i said
"read". You need to know it's there, you need to partially understand what it's
for. You don't need to understand how it works.
Then whenever you
find yourself faced with an architectural problem (i.e: you write
complex code to handle something you think is simple/you write the
same code over and over again) odds are a pattern can help, go and use it.
That list is .NET oriented, because I am, I just hope you get the point =)