Why are you learning computer science?

Are you currently majoring in computer science, or planning to do so? What do you hope to learn from the curriculum? If your answer is something in line with “writing a useful software” or “getting a job as a software developer,” this post is for you. I want you to not experience the same misunderstanding and frustration I had with university CS program.

Although I was never one of those kids who were writing compilers for fun at the age of 10, I’ve always loved working with computers. I’ve been navigating through private BBS and assembling my computers since I was 12. So when I started my college education, computer science was naturally one of the first majors I have considered. I loved computer. Computer science is about computers. Of course I would love computer science too, right? Wrong. I never felt more miserable than when I was working on CS courses. They were interesting and challenging, but I could not really see where the entire curriculum was headed at. The courses started to feel aimless and pointless. I couldn’t keep on learning something I felt pointless. Eventually, I changed my major, and decided that I would never have anything to do with CS.

Well, it turned out that my first job after graduation involved software development. I talked about changing my major - I graduated with degree in psychology and information science. Information science is about using information systems in social context, which fulfilled my wish to work with technology but saved me from directly working on technology. But when our startup had to develop some software, I was one of the few who had some background in technology so I had to jump into software development. I was less than happy to do so, since my experience in college told me that I would absolutely hate everything about it.

And there was another surprise: I actually enjoyed software development a lot! It was definitely not easy since I had to teach myself to do it under budget and time pressure. I was tired, confused, happy, and mad at the same time: tired because I was working every hour except when sleeping; confused because I was loving something that I was so sure that I would hate; happy because it was such a fun to learn something new and implement it every day; and mad because I felt that my university misled me into believing that CS is a terrible field.

Eventually I stopped being angry. After all, I can only blame myself for not really trying software development before abandoning CS altogether. But then how did it happen? How could have something this enjoyable felt so boring and pointless at school? It was after I read Hackers and Painters by Paul Graham that I could come up with answers to this question. In it, he describes why he dislikes the term “computer science”:

I’ve never liked the term “computer science.” The main reason I don’t like it is that there’s no such thing. Computer science is a grab bag of tenuously related areas thrown together by an accident of history, like Yugoslavia. At one end you have people who are really mathematicians, but call what they’re doing computer science so they can get DARPA grants. In the middle you have people working on something like the natural history of computers– studying the behavior of algorithms for routing data through networks, for example. And then at the other extreme you have the hackers, who are trying to write interesting software, and for whom computers are just a medium of expression, as concrete is for architects or paint for painters. It’s as if mathematicians, physicists, and architects all had to be in the same department.

It was an eye-opening moment. It was clear to me that I definitely belonged to the hacker camp. No other words described my attitude toward computer better than his: a medium of expression. I was interested in learning about computer as long as that knowledge was useful in achieving my objectives. On the other hand, university CS departments are much more focused on the other two camps. It was not designed to teach what I wanted to learn in the way I wanted to learn. It was no wonder that I found the university CS curriculum pointless: the goal and method of curriculum was completely different from what I wanted.

I still believe that I am largely responsible for this entire misunderstanding and misplaced dislike. Yet, my university CS department is also partly responsible for failing to clearly communicate the goal of its curriculum. My other two majors, psychology and information science, clearly laid out what I could expect to have learned at the end of the curriculum and what the goals of their curriculae were. They also divided their courses into a few different tracks, helping students to better understand different schools of thoughts that exist within their disciplines. CS department did terrible job at that. Now when I look at my university CS department’s website, I can tell that they also tried to provide such guideline. Too bad that they did such a shoddy job that it’s hard to understand, and if I find it hard to tell after a few years of experience in the field, it would be fair to assume that it’s almost impossible for college freshmen or sophomores to understand that vague guideline.

I hope that other universities are better at informing their students, but unfortunately it seems that my experience is the general trend. Students have little idea what all their education means, and CS departments are generally bad at communicating their intention to the students. This cycle is a terrible waste of resource and time for both sides.

Paul Graham described CS department as a bizarre academic department composed of mathematicians, computer historians, and hackers loosely connected by computer as a common denominator. Well, CS curriculum is the same. You get to learn a strange mixture of mathematics, computer history, and software development. Of the three, software development is represented the least. Why? Because CS professors are first and foremost researchers, not software developers. They wrote their doctoral dissertation on some kind of mathematical proof or network theory. They belong to the mathematician and computer historian camps. Few of them had a long career in enterprise software development. So if you want to learn how to write some practical real-world software, CS curriculum might not be the best option for that. After all, that’s not the goal of university CS curriculum.

But it will teach you a broad, sturdy foundation in general computer science, and no existing education curriculum can beat its effectiveness. You will probably not use every single thing that you’ve learned in CS curriculum. Actually, 90% of software development has little to do with algorithms or other advanced CS concepts. But the fundamental concepts and knowledge you’ve gained will greatly save the time and efforts you have to invest in learning more advanced topics that you will definitely need to become an accomplished software developer.

This is a slow but stable, inefficient yet comprehensive path. You will need patience and long-term planning.

The alternative is self-teaching. There are tons of excellent resources on the internet for free that will help you learn programming. If you’re motivated in learning, you will be writing your own software much earlier than you would have taken to earn a CS degree. Instead of investing four years upfront to learn advanced CS concepts, you will pick them on need-base for your software. Since you’re actually applying such knowledge to real-world projects, your understanding of the concept will be stronger than some classroom knowledge. On the other hand, your knowledge and skill is likely to be inconsistent, with strong foundations in some areas but gaping holes in some others. You’re also likely to get lost if you’re learning by yourself - seeking a mentor or community guidance is highly recommended. Since you won’t be use a CS degree as a certification for your skill, you will have to maintain a portfolio of codes and projects to proe yourself.

This is a fast but rickety, practical yet wild path. You will need perseverance and self-discipline.

I believe that eventually both paths lead to the same destination. The difference lies in what you learn first: software development and then broader CS concepts as expansion, or strong CS foundation first and then learn how to apply those concepts in real-world software development. It’s just a different order of learning, and you need both to become a proficient software developer.

I want you to be aware of what options you have and to make the right choice for your goal. I didn’t fully understand my choice at the time and that caused me unnecessary grief and stress. Still, it turned out okay for me. I would not have majored in CS even if I had understood what it was about. My goal lies in solving human and social issues using computers, rather than studying computers themselves. So I’m happy with my path.

Now I will repeat my initial question: Why are you learning computer science? I hope my post gave you some food for thought when you try to answer that question.