People sometimes ask me where I learned programming. I learned long before going to college. Most of my formative years were spent reading books that are now available at atariarchives.org.
It's a lot of fun looking through those books now. I remember holding the paper versions in my hands, and typing the programs into my Atari 800.
My favorite among the books is De Re Atari: A Guide to Effective Programming by Chris Crawford, Lane Winner, Jim Cox, Amy Chen, Jim Dunion, Kathleen Pitta, Bob Fraser, and Gus Makrea. I spent a lot of time studying this book, learning all the ways to do cool stuff with the Atari 8-bit hardware. It also contains a lot of advice about how to design software, and most of that advice is still applicable today.
Those were the good old days, when developing software for personal computers required knowledge of hardware registers, assembly language, memory layouts, and so on. Today, we hide the details of the hardware as much as possible, but I think having experience with such low-level stuff is beneficial. If you're a young whippersnapper who has only used high-level APIs like DirectX, OpenGL, and Windows GDI to do graphics, I'd recommend paging though some of these old books to see how programmers used to do things.
One last thing: Atari rules, Commodore sucks.