Getting Good At Algorithms: Part 1 - The What, Why, And How.
Algorithms has always been my achilles heel. I have decided to take action on this area - and start actually reading on the subject and practicing problems. Getting this handled will help me gain confidence as a lead developer in a software development team. Although this topic was covered in my college undergraduate study, I don’t think I ever really understood the topic well or performed well in that class.
I am going to get good at solving algorithmic problems and chronicle my progress and experiences in doing this.
The main reason why I am doing this is because - you have to know this to be a good engineer. I was able to get away without needing to be good at this but developers far better than me, those I look up to have said time and again that being good at algorithms is an essential skill and a good sign. I always viewed at these algorithm questions as elitism and needless exclusionary practice. That may actually be true in regards to software engineer recruitment processes go. But I am far more interested in the perspectives that this will open up.
John Sonmez of SimpleProgrammer.com fame mentions how it was like looking at the world with a fresh perspective. That is worth having.
I wanted to get good at this for a long time but never put enough time to make good progress. I have been half assing it - buying books on algorithms left and right and not studying any of them. It's the year 2017 and I am 30 years old. I have decided that going forward there will be no more half measures. Anything I do, I will take very seriously or not do at all.
I am starting to write this post series far after I have started to study the subject - about 2 weeks into the preparation. But I have not made much progress in the way of actual studying. But I have done a pretty deep research on the subject and have a fair high level idea of the landscape that I must cover to get good. The material that I will be using to get good are the following:
- Coursera - Algorithms, Standford University
- Coursera - Data structures and Algorithms - University of California, San Diego,
- Introduction to Algorithms - Cormen , Leiserson, Rivest, Stein
- Algorithms - Sedwick, Wayne
- Data structures and algorithms: A pseudo code approach with C++ - Gilberg and Forouzan
Why so much material? Because I want to get the good parts of the topic. And no one author is going to cover the topic comprehensively. For example, Introduction to algorithms covers almost everything but does not cover data structures very well, an understanding of which is important to getting good at solving problems.
I have decided to do that is called Synoptic reading - where you read different books at the same time to get a complete picture of the topic that you are reading. This is something I learnt in How To Read A Book book. It made a lot of sense to me.
Furthermore, instead of blindly reading and practicing, I am going to force direction to my studies by writing about it. Something I learnt in Writing to Learn.
To start off, I have outlined the heading content of all of these books and put them aside. I will not be covering this topic in any given order. I will be covering this topic in an order that I am yet to decide. Because each author of the courseera course and the books have covered it in quite a different order with different emphasis in different places.
For the first time in my life, I am fully committed to doing something to the best possible way. So much so that I have put everything else in life in the back burner.
I could be taking the route the coursera courses are pushing me. But I will miss out on a lot of insights if I do that - I will not be able to deep dive into specific topics
In what order do I read the course?
I could be taking the route the coursera courses are pushing me. But I will miss out on a lot of insights if I do that - I will not be able to deep dive into specific topics and get a comprehensive picture of the topic from all the authors that I have selected.
I can do it in the order of difficulty and my general resistance to the topic. Keep in mind that I am not starting on Algorithms and Data structures from ground zero. I am quite familiar with a lot of the topics. But I have always resisted learning about things like graphs and dynamic programming. May be I should do it do it order of decreasing resistance. But this has the potential disadvantage of throwing things out of gear becuase one topic might build on another. But that doesn't seem to apply much in the books tha I have inventoried.
The end result is a comprehensive understanding of the concepts involved. So I will have to pick a combination of the two approaches - take the structure the coursera courses are taking but fill in the gaps with topics that other material is covering. This is the off the top of my mind idea of how I am going to do this. That's it for now. I will post the actual content plan in the next post after I've made it.