Here are some resources on coding interview patterns:
- https://www.educative.io/courses/grokking-the-coding-interview (PAID)
I recently attempted a LeetCode Contest but I could not solve a problem. The reason I could not solve the problem is that even though I knew it was similar to a problem I had worked on previously, I did not know how to solve that previous problem.
Algorithmic problems are based on pattern recognition but that pattern recognition isn’t helpful if too much time has passed.
To increase my retention I am using this schedule https://www.quora.com/Whats-the-best-spaced-repetition-schedule. It is the Fibonacci numbers. I am using Gmail’s ability to snooze emails to the future to practice algorithmic problems that are helpful in solving many other problems. I also use Gmail’s labels to keep track of my emails.
Ahmed, what advice do you have for people who want to become great programmers like you?
Don’t try to solve harder problems unless you are really good at solving the easier ones. That means solve a lot of really easy problems (that could be hundreds), that will improve your coding skills, which should be the easiest skill to gain. Then go to little bit harder problems, and so on.
Here are some additional resources for data structures and algorithms practice:
- Firecode.io I have only used this for a few days but it is amazing! It has a very user-friendly interface and it is also designed to provide spaced-repetition of problems to enhance learning and memorization.
- Pramp was introduced to me by Infinitely Finite and is also highly recommended in Mohsin Ali’s guide. Pramp provides free interview practice with other developers. Pramp has helped me improve at solving problems, explaining my thinking process, and teaching and helping others improve their algorithmic coding.
- Geeks for Geeks Practice is great because problems can be sorted by company, topic, and difficulty. There are countless problems and there are plenty of explanations as well. I have fun solving problems here and improving my ranking 🙂
- Tushar Roy‘s video explanations are very organized and easy to understand. He breaks down concepts step-by-step and also draws out every step, and then shows how to implement the concepts as code.
- Hacker Rank has problems from Cracking the Coding Interview along with superb video explanations by author Gayle Laakmann Mcdowell.
- A2 Online Judge has an endless supply of practice problems organized by category.
Here are some of lessons I have learned over the last few weeks solving problems at LeetCode, Geeks for Geeks, Pramp, and Hacker Rank.
- Solving code challenges is fun! I love seeing the Green Check Mark or the PASS or earning points 🙂
- Code challenges are very difficult. They can be very frustrating and upsetting. But the reward is learning the concept. Learning a concept, i.e. recursion, is like earning a key that opens up doors to both solving similar problems and to being able to understand more complex concepts (i.e. backtracking).
- I used to just try to start coding by trial and error. That was a disaster. I have learned to really focus on using examples. I try to have a number of input and output examples including edge cases, smaller examples, and medium size examples.
- After I have my examples, I need to be able to solve it in plain English first. I like to draw things out, i.e. the array with values, linked lists, trees, etc. Then I try to solve these examples in plain English.
- If I have tested my plain English logic and things seem to work, then I will finally start to code. If my logic does not seem to work, I will start brainstorming possible solutions.
- If at any point I get stuck, I will go for a walk or stretch.
- The most important thing about the code challenges is that I am having fun doing them. As long as I keep on having fun, I will keep learning and improving my skills.
- This is a great soundtrack to listen to while coding Crypt of the NecroDancer OST.
- Everyone learns and improves at a different pace depending on their experience, natural aptitude, time and energy, etc. I have learned that I feel much better when I compare myself to my past self (and see how much I have improved) and to my future self (to see where I want to be), instead of comparing myself to others.
- Instead of thinking, “I can’t solve this problem, I have never seen anything like this before :(” I am better off thinking, “Great, I now have the opportunity to learn something new :)”
The code challenges have tested my patience at times, but overall it has been great. I have learned and improved so much, I can’t wait to solve even more and bigger problems 🙂
Here is a post I found with some great suggestions to improve your coding skills: Improve your programming skills
I think this post has a great balance between code kata-like sessions and time/thinking intensive sessions. In other words, a nice balance between coding sprints and coding marathons. It also has some great ideas on how to slowly and surely expand your coding skills. Check it out: Improve your programming skills.
Before I was doing the LeetCode algorithm problems in order of difficulty. I was doing and redoing the problems in random topic order.
I am now doing the problems by category. I am not finishing the category until I am able to solve the problems in the category. I think this is an improvement because it is more drilling and practicing of recalling and typing the correct solution. It is definitely more difficult than just searching for patterns, but it is providing me with a better understanding of what each line of code does in a solution.