Look, I'm a computer science student. And I hope to earn a living in this area. Actually, I hope to marry rich or win the lottery or otherwise not have to worry about earning a living and thus be able to just have fun with computer science. If you can help, let me know. But the point is that there are many areas of theoretical and applied computer science that I find interesting. A few of those are described below.
In my mind this involves everything from determining what a program should do to ensuring that the developed program actually performs as it should. So it ranges from program specification to program maintenance. I have some work experience in this area and my current research falls in this category (although some might place it in a more theoretical setting).
More specifically, I am interested in object-orientedness (both OO design and OO programming) and am experiencing a resurgent interest in functional programming (currently via ML although in the past I was a teaching assistant for a Scheme course). I'm a firm believer in information hiding and data abstraction. For the uninitiated, that basically means pushing unneccesary detail down a level so you don't have to see it (and can't see it) if you don't need it. Eg, when talking about a house one will usually mention the basic floor plan, the number of bedrooms, and when it was built. However, you rarely know what from what country the lumber used to make the house came or how many shingles are on the roof. In software terms, that can be translated into saying you know a program will have the ability to draw rectangles on the screen but you don't need to know whether it stores each pixel of the shape or it knows the center, the length of the sides, and an equation for drawing a rectangle. In most languages the amount of hiding that takes place is left entirely up to the programmer or developer so methods and conventions pertaining to such things are still an area of discussion and debate.
My personal testbed consists of a gradebook program which is probably most suited to being implemented in a database programming language but provides a workable backdrop to experiment with new languages and methods. Some of the languages I'm implementing the gradebook program in are C++, ML, and Java. There are other languages I'd like to become more familiar with, including Forth, PostScript and Gofer. The one tool that I've found most useful for C++ programming is the Standard Template Library (STL). Which leads to another area area of interest...
What I mean by generic is what some people call polymorphic or parameterized. This involves algorithms (procedures for performing some task) or data structures (constructs for holding information in a particular form) that work with many different types. A non computer science example involves electrical outlets. You can plug virtually any electric appliance into any electric outlet, as long as you stay within the same country :-). It doesn't matter wheter you're plugging in a hair dryer or a television -- as long as it has a plug it can be plugged in. A possible translation to programming (and one the STL adopts) is to specify algorithms that will work on any datatype that provides a certain type of 'plug'. That way the person developing the algorithm (for example, a sorting algorithm) need only be concerned with developing the best sort strategy. Anyone can use the sorting algorithm as long as they provide the required plug -- usually a way to access the data and a function that compares to data members. Such genericity may be key to the development of software catalogs. Catalogs will allow software to be constructed by picking appropriate algorithms and data structures and developing the high level logic while assuming that the basic operations are correct.
Some good sources of information on this topic are: