New Year's Resolutions for Programmers
Understand something about C or C++ that you didn't before. Find something you use a lot (such as the main function, or "using namespace std;"), but don't fully understand. For instance, why does main() return an int? What are the two arguments to main(), and when do you use them?
Spend some time reading the comp.lang.c FAQ. You won't understand all of it, but pick out a few sections that you feel uncomfortable with and learn the real answers.
Reading the answers to other people's questions might seem silly, but a lot of the time, they're questions you might not have thought to ask (yet).
Understand Unicode. It's not just a set of 65,000 characters you can use. Joel Spolsky has a great introduction to what every software developer needs to know about Unicode. The world can't run on the first 256 ASCII characters forever.
Write grep. Grep is a program that searches a specified list of files for a given regular expression. Writing grep will expose you to some of the fundamental principles of computer science: in the process of writing grep, you'll probably want to look up finite state machines, regular languages, converting regular expressions into NDFAs, and turning an NDFA into a DFA. It's not as bad as all that math makes it look!
Learn a new language in a different programming style. C is great, but it's only an imperative language. C++ is great, but it only adds an understanding of object oriented programming to your arsenal of techniques. Why not branch out and learn Scheme, a functional programming language?
While you might not use it all the time, it will change the way you think about programming. It's also popular in the AI community and taught to all incoming CS majors at the Massachusetts Institute of Technology.
For something a bit more practical, try Ruby, an appealing language for its structure (fully object oriented) and ease of use (it has a lot of the same syntactic sugar as Perl). Mr. Neighborly has a good Ruby tutorial.
Do some research. Coding is great, but there's as lot that you can code that isn't just fun -- it's new. With sites like Google Scholar, cutting edge research questions are available to everyone. Interested in performance programming?
Just last year, a grad student at Harvard wrote his dissertation on tuning database parameters using machine learning techniques. Interested in music? Why not try writing a program that can learn genres or composers and then identify their pieces?
A hidden Markov model is one option; what else can you do?