New Year's Resolutions for Programmers

Happy New Year! I hope you had a good time celebrating 2005. Now it's time to get back to business. But before you do, take some more time for programming. Whatever your level, we've got some suggestions for you to try over the next twelve months.

Beginner

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).

Intermediate

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!

Advanced

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?

Finally, I have a New Year's resolution of my own: to regularly add new content to Cprogramming.com. I've got several new articles and tutorials that will be coming out the pipe, so check back soon!