This (not so smart) question has been posted hundreds of times in quora. And may be it has been posted thousands of times in many chat groups or forums.

I myself was wondering about the same problems when i started my career as developer. First it should be clear that, I'm NOT a kind of competitive programmer who started programming at ten, doing codeforce contests or topcoder marathon at weekends, won regional ACM/ICPC contest.

I started learn it seriously when I back to master school, after a year doing some outsource job, which I didn't learn many things. My first real programming part-time job is web development in Ruby on Rails. As you know web development is basically bases on do you know knowledge, so obviously you do not have to know about algorithm, you can still buid a blog in 10 minutes. You even do not need to know about design pattern, because you just need to do what DHH say (lol). So why do I need to learn algorithm? When I asked myself this question, the most thing bugged me is that I don't know any proper people to ask (I was shy too), so I think writing the answer that I found my self here will help people like me few years ago, and that would be nice.

Many people think that algorithm is just a bunch of knowledge, and when your daily job does not require that knowledge, you don't need to learn it. This is a valid argument, and very practical. I do not deny it, and just want to provide another view from me.

Learning algorithm is not just about algorithm

Building software for me just like playing lego. Your knowledge as building brick, and you construct the best thing you can by reassemble those bricks. Those bricks could be logic thinking, write proper for loop, calculate multidimensional arrays index faster. If you get used to how to use those bricks more properly, definitely you will be able to build better house. The only one way to get used to anything to do something with it again and again. Remind that building web application is somehow just a simple repeatable, and 'do you know' work. Let me take an example as rails web app, you will generate new app, write migration, write model, write controller with some simple logic,.., so building web app again and again will not help you solve complex problem, write code faster or even better thinker. In another way, algorithm problems is vary, complex and interesting enough for your daily train of using computer science knowledge to build faster, precise software.

View from an interviewer

Recently, I involve in interview engineer for my team, which is a very interesting experience. As an interviewer I have to think about what kind of engineer I want to work with. Joel has a very good article called Guerrilla Guide To Interviewing for engineer interviewing. Simply talking, every company looking for people who:

  • Smart, and
  • Get things done.

And what can be better than algorithm to confirm those two things? I did not mean that you have to reverse binary tree on the whiteboard (eventhough that it is easy problem). I want to ask just-hard-enough question, which can show that how you're a good problem solver. Hard question in computer programming may be not all about algorithm, but it has high chance to contain some. And good interview question is not to confirm that do you know about X or Y algorithm, it's needed to be out of your knowledge range, so you need to figure out how to solve it your self in a short time, and we want to see that progress, that's all. Therefore, without algorithm, it's hard to define a fairly good question that can confirm the two above things. Note that I did not say that the interview content will all about algorithm, but it should be a inevitable part of it.


I pretty much sure that learning algorithm will help you a lot to be better programmer, even that you don't need to explicit use those knowledge in your daily work. Don't think that learn that will help you get promotion or better job (actually good knowledge in algorithm will raise your chance to get good job), let's learn algorithm because you want to be a-better-you.