Archive for the 'Design' Category

The reluctant Computer Scientist

Wednesday, January 25th, 2006

The other day in class I described myself as a “recovering computer scientist.” This comment was motivated by a growing tension I feel between what I’ve been taught formally and what I find myself drawn to now, three years later. At Harvey Mudd I had a professor who summed up all the problems of programming as being ultimately reducable to some combination of the following elements:

  1. Caching
  2. Adding a level of abstraction
  3. Removing a level of abstraction

Let me flesh these ideas out just a bit, since I’ve offered them here with very little context. Caching is an optimization technique that you’ve probably experienced through your travels on the web. Browsers cache web data because it’s expensive (CS-speak for ‘slow’) to retrieve. Caching can be used in any number of situations where you want to hold onto data that was difficult to acquire. Knowing when to add or remove levels of abstraction—using functions to replace potentially reusable code—depends a lot on the situation and requires some judiciousness about when abstraction will create more problems than it solves.

From this perspective, designing efficient and well-designed software isn’t a goal—it’s the goal. It’s not that I dispute these as desirable ends, but it seems like designing the means of creating software with only these rules in mind will lead one to a kind of soul-less and out-of-touch place. For sure, these are very important elements to consider when building a piece of software (who wants to use slow and badly designed software?), but focusing too much on design seems to flatten the landscape of software into a flatlands where one can set new land-speed records in supercharged vehicles ill-equiped to do anything of actual use.

It’s probably unfair for me to crticize the Computer Science establishment using such a straw man—indeed, the above reductionist equation was offered rather tongue-in-cheek. I had a good many clued-in profs who understood the nuances of writing quality software far better than I ever will. As a hacker, I need to draw on the right aspects of my CS education, but also resolve them with a far wider range of motivations and guiding forces. Lately I’ve allowed myself to follow my intuition, often a bit too unchecked. I want to try to maintain a self-indulgent hacker spirit, but try to augment it slightly with the discipline of a proper Computer Scientist.