Wednesday, April 10, 2013

Should I study Computer Science?

!!! Attention: this article (and in fact my whole blog) have moved to site:
http://thecsbox.com/2013/05/03/how-to-prepare-for-programming-interviews-part-ii/ !!!


This is an article that I’ve always been wanting to write. I hope it can help high school students thinking about their college majors or undergraduates who still have to choose majors. About myself, I’m a CS grad student at Princeton and will be interning at Facebook. While I can’t speak much about working as a software engineer yet, I do have my fair share of experience with a 5 years computer science education so far and with being passionate about technology since middle school. Nevertheless, this article just reflects my own experiences and opinions.

First things first

If you just *know* that studying computer science is what you’re meant to do, then really, you don’t even need to read this article :-) I feel it’s like with entrepreneurship and starting a company, some people just have to do it, because for them, that’s what they are meant to do. On the other hand, if you’re not sure, then this article offers some discussion, hoping to be helpful in your decision process. But that’s really all it can do. No one can create that inherent desire for you.

These things are a plus

A love/passion for something in technology is very important. Maybe you have played around with Linux, or done some Web design, or you want to know how computer games work, or anything related to technology where you played around, explored it and really liked the experience. You don’t necessarily have to know how to program, but a desire to study technical things and some unexplainable attraction and fascination by tech can go a long way. For me it was Linux. I just really loved playing around with different distros, tweaking the system, compiling my own kernel, etc. I wouldn’t consider myself a programmer yet at that time, but I could already feel my affinity for technology and experienced the joy I had when playing around with things.

Being good in math is another plus in my opinion. While there are a lot of articles out there that will tell you that math doesn’t matter so much for computer scientists, I disagree. While math might not be necessary for the process of programming itself, it will definitely help you in studying data structures and algorithms. Constructs like trees and graphs are very mathematical in nature, so is analyzing the performance of an algorithm or reading through proofs of the properties of some data structures. Good math abilities show that you are a good rational logical thinker and that you are smart, both of which can only help during a CS education.

There are two other things that will make your life easier during programming. One is attention to detail. Coding and especially debugging can at times be an extremely painful process. When you’re sloppy and don’t pay much attention to detail, learning to program will be much more difficult and time consuming to you than to someone who pays great attention to detail. One way to reflect on this is, do you really like to think things through? Tend to make plans in great detail? Or have the tendency to micromanage your time? (ah, that’s me...) If these things describe you, they can be signs that you enjoy attention to detail.

Another often underrated quality is patience. For all these hours required to hunt down that one tiny bug that is messing up with your whole program, patience is the one thing that, if you don’t have it, it’s no use how smart or passionate you are. I’m not sure how you can make sure that you have enough patience, but I guess it is something that can be trained, and once you start working on difficult programming problems, or you are debugging in a big software project, you will notice whether you are a patient person ;-)

These things should be kept in mind

With the risk of getting angry responses, a minus point I see is that you are not smart enough. Let's not kid ourselves, making it through an intense computer science education and getting the software engineering job at the dream tech company you have always wanted is not for everyone. Especially when you are interviewing, you will become aware that you are competing with some very smart people. During my Facebook on site interview when we introduced ourselves, I think over half of the interviewees were from MIT and about everyone was from a top notch school, and it was quite intimidating. It's hard (let alone potentially pointless) to provide measures about being smart, but I would say that one quality of smart people is that they have a fairly good self awareness of how smart they are. (Especially not tending to think they are smarter than they actually are).

Another thing that may sound strange but that I have also observed is that computer science might not be for you if you are too smart and don't feel it's challenging enough. Don't get me wrong, I don't mean that there aren't very bright software engineers out there. I have only observed that some people don't find programming that inevitably comes with computer science intellectually challenging enough. Most often this comes together with not much passion for technology. If you feel you belong to that category, I think an undergraduate CS education can't hurt, but you could go into research after that instead of working as a software engineer. There are extremely interesting research areas in computer science that don't deal so much with programming itself, but are for example more theoretic and involve a lot of mathematical proofs (theoretical computer science) or use a lot of statistical models (machine learning) or combine computer science with another subject (i.e. biology).

All that being said, I don't mean to discourage anyone. I am more of a believer in determination and hard work than inherent ability. Maybe you're lucky to be very smart, and things come easily to you. But if not, you just have to make up for it through hard work.

I also don't consider prior programming experience very important. Don't let "more experienced" people scare you. The truth is, there will always be someone who is better and more experienced than you. I have seen people with zero background in programming and computer science succeed in college, so not having enough experience should not hold you back.

The last red flag to point out is, please don't study computer science just because you have heard it is "hot" and you can find a great job and earn a lot of money this way. This is a sure way to approach it all wrong. While these things may be true and may come along with a computer science degree, they should not be your primary motivation.

In connection with that, just like in any other area, it is tough to make it to the top. Don't get an unrealistic picture from all the success stories floating around, about how fun and awesome it is to work at [insert favorite tech company here] or about yet another CS guy who started a company and turned into a millionaire. As always, there are much more stories of failure than of success (we just don't hear about them), and even for the successful ones, we don't know what inhuman amount of work they put behind it to get there.

Just to stick with common article structure, let's sum things up :). Passion for technology, math abilities, attention to detail and patience are things that will help you, while not being smart enough, or strangely being too smart, or studying it just because you think you can easily get a great job with it, could be warning signs.

-------------------------------
Wohoo, thanks for reading this lengthy article to the end. I sincerely hope it can be of some help, and let me know what you think about it! Feedback of any kind is appreciated!


Related Articles:
How to prepare for Programming Interviews
Unix in a Nutshell

No comments:

Post a Comment