As I was laying down to sleep one night last week, I started thinking about the computer science field and where I would want to focus if I were to do graduate studies (probably software engineering or UI related work). I started to build a "map" (okay, it's not really a map) of the CS field in my head and I thought I'd share it with anyone that's looking to study computer science.
Without further delay, here is my map and commentary:
In my opinion, the core principles of computer science are:
- Mathematics. At the heart of it all, computer science is really a branch of mathematics. I don't think anyone who doesn't have a fondness for math (you don't have to be terribly great at it) will make it far in computer science (and if they do, they probably copied their calc. homework :-D). If you look at most computer science curriculums, you'll find that they're heavy in mathematics.
- Programming Languages. All computer scientists must know at least a few useful programming languages (and the good ones know many). Programming languages are the mechanism by which we communicate human ideas and concepts to machines. Different areas of study will typically involve different types of languages. For example, most application development is done in a general purpose programming language (like Java, C#, or Visual Basic.Net). From my understanding, most of the work in the field of AI is done in functional languages such as Scheme, Lisp, and Prolog (these languages were designed for AI). In mathematics applications, you'll find that many computer scientists rely on math programming languages like MATLAB. So each branch in computer science typically relies upon and utilizes different types of languages (although you see crossover as well).
- Tools and Environments. All computer scientists rely heavily upon their tools to get their work done. From emacs, to vi, to pico, to Visual Studio.Net, having the proper tools for the job is very important to the computer scientist. The core tool is almost always some mutation of a text editor (like Notepad). Most computer scientists are familiar with at least one or two different environments/platforms as well (for most universities, this is Unix/Solaris).
- Algorithms. In computer science, there are a few universally useful algorithms and concepts that everyone learns. For example, binary sort. Another good example is recursion (not so much an algorithm as it is a concept).
In my view, CS can be broken out into three main branches:
- Mathematical. As I mentioned, computer science is deeply concerned with solving problems in the area of mathematics. This branch of computer science is really about the application of computing to solving mathematical problems. For example, one of the persistent problems in computer science is how to efficiently factor large prime numbers (the basis of current data encryption algorithms). While this itself is more of a mathematical problem, the practical application of such solutions falls into the computer sience field. Computer scientists in the extremes of this branch (those that are practically pure mathematicians may rarely program computers and work primarily with algorithms and pseudocode).
- Theoretical. This branch of computer science deals with the theory of computing. For example, creating, categorizing, and analyzing algorithms. At Rutgers, I would say, from what I garnered from my TAs, most of the graduate level research was in this area (as opposed to mathematical or practical). The work done in this field is often not useful by itself. For example, I would classify the graduate work that Larry Page and Sergey Brin did at Stanford into this branch. Google, the search engine that you and I use daily, really falls into the third branch.
- Practical/Application. While the Rutgers graduate curriculum focuses primarily on theoretical computing, some schools focus more heavily on application/software development. This includes the actual implemention of theoretical algorithms, building user interfaces, and writing software (in the general case).
Of course, the boundaries between the different branches are not hard boundaries, but rather very loosely defined; however, generally, there is a distinction between one extreme and the other and, typically, someone intersted in one extreme will not be interested in the other extreme.
Number of Students/Types of Students
What I've noticed is that there are generally more students in the third branch than the others, with the least number of students in the mathematical branch. What I've also noticed is that at the left end of the spectrum, you'll find most of the nerds. On the right end of the spectrum, you'll find mostly geeks.
At the far right end of the spectrum (also the most populous among the CS students), are the idiots. These guys are the ones that always try to mooch code off of you as the deadline for handing in the assignment looms near. They are the stragglers that try to latch onto the nerds and geeks in hopes of getting that CS degree because of the tech boom and not because they are intrigued by the different aspects of computer science. Not all idiots are doomed to failure; to be honest, I would classify my mother into this category (she has a masters in mathematics with "computer option"). I really don't know how she managed that one, but she told me that there was a lot of mooching 😀 In any case, she's been highly regarded everywhere she's worked for the last few years as one of the better AS/400 developers. So all hope is not lost; most of the idiots can become very successful and productive programmers once they realize that mooching can't get them through life.
Moving on, there are also the assholes. They're like idiots, but their people skills make them even worse since they posess superior people skills and they will try to manipulate the nerds and the geeks. You can spot these types of people by how they try to use other to their advantage. For example, organizing study groups. Real nerds and geeks don't need study groups to prep for exams. And if they do, they will typically do so with a select group of fellow nerds and geeks. Another common behavioral trait is that they tend to ask many stupid questions, which, aside from the idiots, everyone in the damn lecture hall knows the answer to already. You can almost hear everyone groan when one of these guys/gals raises his/her hand during a lecture to ask a question with an obvious answer. They ask not because they're curious, but rather to get facetime with the professor. These types of people will typically end up in IT management because of their type A personalities and lack of any real understanding of CS. It's like they accidentally enrolled in CS when they really should have enrolled in business, finance, or opertions management.
Real World Applications
Just for the sake of illustration, I listed some of the real world applications (off the top of my head) assiciated with each branch. Don't make too much of my placement of the text as, clearly, database systems require significant knowledge from each of the branches.
Areas of Study/Disciplines
As with the real world application, these are just rough estimations of a few of the areas of study/disciplines in computer science (random list off the top of my head).
If there's one thing that you can take away from this, it's that computer science is not for everyone. I think people don't realize how math heavy it really is and how certain fields require extensive knowledge of mathematics. At Rutgers, for example, I think calc. II and introductory linear algebra are required. You'll find, though, that almost all levels of math courses beyond the required ones play a significant role in different areas of computer science (for example, calc. III and linear algebra (non-intro) are important for anyone that wants to get into computer graphics). In fact, you'll find that many of the courses in math and computer science are cross discipline and can count as credit towards either major (like linear optimization).
In addition, at the graduate level, there are different types of philosophies at different institutions. At Rutgers, the curriculum and research has a heavy theoretical bias (from what my TAs told me) whereas, based on my research, a school like Steven's Institute of Technology offers more practical masters/certificate programs.
I don't know if this will actually help anyone, but I'm throwing this out there for anyone that's thinking about obtaining a computer science degree. Bear in mind that this is from the experience and perspective of one person, me and I offer none of this as fact, so take it with a grain of salt 😉