What is Computer Science?

When I’m asked what I study, I often say “computers”. When I’m asked where I work, I say “at some computer place”. But those description are far from accurate.

Inspired by a recent blog post from a friend and colleague about why he’s passionate about math (see What is Math?), I decided to write a post about what I do and what Computer Science (CS) is to me.

I actually wrote a similar post about CS last fall. While many of my views have since evolved, many haven’t, and it details some cool real-world analogies for binary search and recursion, two popular CS topics (see Common misconceptions about CS).

Full disclaimer, my experience in CS is by no means extensive, so I will try my best to not extrapolate unduly.

During the school year I’m an undergraduate student and teaching assistant in CS at Brandeis University, and currently I’m a software-engineering intern at a big data analytics company called HP Vertica.

I guess I should start with the bits that confuse people the most.

Out of the five computer science classes I’ve had so far, only one allowed me to use a laptop, tablet, or any sort of electronic device in class. At my job, I spend just as much time writing documentation or drawing out figures on a whiteboard as I do writing code.

A prominent computer scientist and winner of the 1972 Turing Award (the Noble Prize of Computer Science), Edsger W. Dijkstra, is famous for saying “Computer Science is no more about computers than astronomy is about telescopes”.

But how can that be? The study of computers isn’t about computers?

Well, it turns out that CS is not the study of computers. It is instead the study of computation–the study of modeling, interacting with, and abstracting over information. The computer turns out to be a great tool for this.

I know as little about why your iphone’s screen looks kind of yellow as you do. I do not know how to unlock a locked Macbook without a password. And I certainly do not know how to “hack” into a “mainframe”, or whatever.

That being said, I can give you some examples of the kind of work I have done.

For a personal project in high school, I wrote a program that analyzed any given text file (like Moby Dick, the Bible, etc.) and generated psuedo-random text that mimicked the style of the source text. The goal (and result) was that the generated text looked like it was excerpted from the source text.

At my current job, I’ve optimized various SQL queries to run faster–in one extreme case, a 100x performance boost was measured.

The “real-world application” is that million-customer companies can ask “what’s the average distance that my customers live from the store that is nearest to them” and see results in seconds or minutes, rather than in hours or days.

My high school project took about 4 hours of planning out and about 2,000 lines of code. The project at my job took over 100 hours of planning out and only about 750 lines of code.

“Planning out” at my job included background research, inventing the optimizations, proving their validity and effectiveness, documenting them, designing my implementations for them, putting them through review of a panel of engineers, filing patent paperwork, etc.

The point is that my time is not spent fiddling with phones, tablets, or computers. Instead, it’s spent using the computer as a tool to do some pretty cool things with information.

But since I find it pretentious to say I study “modeling, interacting with, and abstracting over information”, if you ask me what I study, I’ll probably still say “computers”.