Some concrete things you can do to learn, just based on what I've found enjoyable and worthwhile:
Solve some Project Euler problems, then read other solutions in the forums and try to implement some of the algorithms and optimizations you find there. This will force you to learn some basic algorithms and some math, and expose you to a wide variety of concepts and techniques. (Yes, I am constantly pimping this on HN.) http://projecteuler.net/
Learn a new programming language or two every year. By learning extremely different languages (C, Lisp, Haskell, Io, Forth, Mercury, J...) you'll learn to think in a lot of different ways. But even before that, just translating what you know into a different context will help force you to learn the names and underlying forms of most of the fundamental building blocks: data structures, closures, higher-order functions, polymorphism...
http://learnyouahaskell.com/
Read research papers related to your field. When you don't understand something, follow the citations or look it up in Wikipedia. If you don't know what to read, start at ACM Queue and see what's interesting. Then branch out into other publications.
http://queue.acm.org/
Watch lectures from MIT OpenCourseWare, especially 6.001 (Structure and Interpretation of Computer Programs, taught by the authors). Among other things, you'll learn how to build a simple interpreter and compiler. http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Compute...