This is an old post written in February 2013 and published my old blog. I am publishing it here because it resonated with the community when it was first posted. The basic idea continues to flourish with the rise of sites like rejected.us and Max Howell’s very popular tweet.
I am a great programmer, but a horrible algorithmist. It is a thought that has been weighing on me heavily recently, and I’d like to gather other developers feelings on the subject as well.
I started what can be called my professional development career back in 1999. I was still in middle school, but my father hired me at his software company. My official duty was to make updates to our websites, but I mostly ended up bugging the other developers to help me learn.
From there I picked up Perl (somewhat) and then moved to PHP and front end web development where I have stayed comfortably for the last twelve years.
When it comes to building large scale systems, understanding the details of those systems, and actually writing them, I do very well. I can write elegant PHP code (believe it exists), and really understand programming well. I do all the things a software craftsman does: writes tests, automates as much as possible, learns new technologies, hones my craft with side work and open source work, and build systems that will scale with demand and customer requests.
I even have a degree in Computer Science from what I think is a great university.
However, I feel I am a horrible algorithmist.
Ask me to write a complex algorithm (even one that has been discovered), and I start to get sweaty palmed and nervous. Is this a symptom you have as well? To really be able to express an algorithm in code, I really have to spend a lot of time understanding it to do so.
I understand that an algorithm is just a series of steps to complete a problem. I am referring to complex algorithms like sorting, recursive merging strategies, cryptography, and compression, to name a few.
My proudest college accomplishment was writing the A* algorithm for my first Data Structures and Algorithms class. I spent hours physically drawing graphs and keeping written tables of the heap that the nodes were being pushed onto and off of.
I even kept the drawings because I was so proud of them (click the links below to see the sketches).
What it boils down to is I often have trouble seeing the underlying algorithm to a complex problem. I once interviewed with Amazon and did not make it past the second round because I could not see the underlying algorithm in one of the questions they asked me (the questions on overall architecture, however, I aced just fine). Fortunately, this is not something you either have or do not. Some programmers do have a natural ability to see the underlying algorithm to a problem, but if you can not, it can be learned.
Am I alone in feeling this? Do other programmers struggle with this as well? Is this a manifestation of Imposter Syndrome? I thoroughly enjoyed college, but I did not study as hard as I should have. If you are a Computer Science major in college now and a lot of this does not come naturally, I urge you: please spend time on your studies. Really learn the algorithms presented in class. If you never actually use them during your career, at least it will help you feel more like a programmer.