[NOTE: This article was written in the summer of 2009 for inclusion in a Computing Science Student Society newsletter. It has since been edited and the newsletter has been compiled. As of right now, it has not, however, yet seen the light of day. Here is my article, unedited...]
Congratulations! If you’re reading this, you are either a Computing Science student, interested in becoming a Computing Science student, a student in something linked to Computing Science, or associated peripherally with Computing Science somehow. Either that, or you needed some reading material for the next few minutes. Regardless, congratulations on making it this far.
However, it is amazing how many Computing Science students, specially upon entering the faculty, don’t really know what Computing Science actually is. I’d venture a guess that most people associate computer programming with Computing Science, but that is really not what Computing Science is. As a matter of fact, the computer is just a tool sometimes (not even close to always) used in the study of Computing Science.
“Computer Science is no more about computers than astronomy is about telescopes.”
– Edsger Wybe Dijkstra
If you’re only interested in learning to program in the latest language du jour, then you will actually be rather unhappy going through a traditional standard curriculum in Computing Science. If your only goal is to learn about language X so you can get a job coding, you would really be better served heading over to an institution like BCIT and getting a certificate there. Before you drop this paper and head out, though, you may want to read why I think you might want to stick around.
So what is it, then?
Computing Science (note the use of the word “science”) is basically the study of problem-solving in a computational manner. This means you will learn to solve problems using the scientific model associated with computation, for example, algorithms. An algorithm is simply a finite set of instructions that go through a specific order. I realize that this may sounds rather circular, but you have to realize that algorithms are present almost everywhere. When you decide to make a sandwich, you are using an algorithm to do so. You need to lay the bread down and then add toppings. If there is no bread, you need to solve that sub-problem before you can resume the loop and move on to the next step. It sounds childish, but that is actually a problem you are solving in a computational manner.
Since this is a Bachelor’s of Science, you will have to study a lot of the mathematics, as these are the tools needed to further understand the computational theory. As of the present writing, a regular Major in Computing Science requires at least seven math courses (Calculus I and II, Discrete Math I and II, Linear Algebra, Numerical Analysis, and Introduction to Statistics). You may have to do more math courses depending on the courses and areas you are interested in. Why so much math? Because it is actually the foundation of Computing Science.
Many a new Computing Science student has lamented at the amount of math necessary for this degree, but I would actually venture that some of these courses (I won’t say all, and I will leave my personal bias out of this, because I do think we need to perhaps revamp this part of the curriculum) are absolutely indispensable to Computing Science. For example, Discrete Math I (MACM 101) will introduce you to the entire logic structure computers use in a mathematical manner. This course is the very basis of the entire degree.
But I just wanted to write code!
Don’t pack your bags just yet. All those theoretical tools are what will actually make you a better programmer as well. Do you really need to know the difference between a Quick Sort and a Merge Sort to write most code when you can just type blah.sort() in most high-level languages? probably not. But what it you’re working on some system where memory is still at a premium (like most embedded devices)? You may have to do some programming in a rather low-level language and may even have to implement your own sorting algorithm. You may then need to know why the lower-bound limit on a comparison sort is of the order of O(nlog(n)) (if you haven’t learned this yet, don’t worry, you will in CMPT 307), not to mention the space complexity needed in our two example cases.
More importantly, learning the theory behind most of the computational concepts actually eliminates the limits that bind most of the people who just took time to learn the languages. The truth is, most languages are easier to learn than you think. If you don’t understand the underlying concepts correctly, you are still limited by the little bit you know, as opposed to being able to research the solution you actually want based on the algorithm you actually want to implement your way. That is the difference between a good programmer and a mediocre one.
More importantly, that is the difference between a Code Monkey and a Computing Scientist. The latter can do the job of the former. The opposite is not usually true. Welcome aboard.