In other words, what exactly is “computer science”? Regardless of the answer, it (and just about anything else you can think) is often confused as something else entirely by those who aren’t part of it. Throughout my years in college, I’ve been asked some pretty remarkable things that the inquirers thought involved computer science, but in reality did not.
What exactly, then, is computer science? Before I delve into what it is, let me start with what it isn’t.
Computer science is NOT…
- Hacking. Much as we would like to think of ourselves as black hats who can break into any website/database/network at will, that’s not what computer science teaches us to do. In fact, “hacking” and “hacks” often refer to clever, unconventional ways of solving problems within computer science, not maliciously breaking things.
- Gaming. Same reasoning as the previous: while there is certainly plenty of overlap between being a computer scientist and playing a lot of video games, they are not synonymous. Not all of us are socially-retarded gamer geeks whose only source of vitamin D is the glow of our sixteen computer monitors, and not every socially-retarded gamer geek is a computer scientist.
- Programming. This is probably the one biggest misnomer, but also the one that is easiest to forgive. True, to be an effective computer scientist, you probably do need to know how to do some programming. But it doesn’t imply software engineering is your life’s calling. It certainly isn’t mine. Programming and computer science happen to be extremely complementary, but in keeping with the pattern that has been emerging through the previous points, one does not by necessity imply the other. And getting a degree in computer science does not relegate you to a life of code monkey-ing.
Computer science IS…
- Algorithms. You must know all your basic search and sort algorithms, as well as graph theory and complexity theory, and how to prove the correctness of these algorithms. Data structures also come with this territory: how best to organize ordered data? unordered data? Data with complex dependencies? Data that is very quickly changing?
- Discrete math. This is the foundation the other areas depend on: if you don’t understand areas like set theory, geometry, and number theory, you’re bound for a painful CS experience. Just check out the Wikipedia page on discrete math; every one of those items listed is absolutely essential for a thorough computer science understanding.
- Computers and Languages. Do you understand how instructions are pipelined through the computer? Can you explain how CPU caching works? How many transistors does a register require? What role does an abstract syntax tree play in compiling a programming language down to machine code? These are all questions that draw on a base in computer science that is rooted in the history and implementation of computer systems and the programming languages that run on the hardware.
PLEASE NOTE: These lists are NOT exhaustive. These are very broad points, indicators to look for that in general will not lead you astray. Furthermore, keep in mind that computer science and the items I initially listed aren’t necessarily mutually exclusive! If I had to sum up in a single expression: “Programming != Computer Science, but there is overlap“. If all else fails, stick with that rule of thumb.
More posts to come soon!