Deliberate Practice, Algorithms, diary of learning on 11.27.2022
Here is my application of principles of Deliberate Practice on 11.27.2022. I use the GitHub repository as a diary to easily save activity from any device and as self-observing feedback.
What did I achieve
- I found material to read.
- I came up with questions to ask.
- I gained motivation to learn the essentials of computer science.
I have read the following:
- https://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
- https://softwareengineering.stackexchange.com/questions/20832/is-big-o-really-that-relevant-when-working-in-industry/20838#20838
- https://softwareengineering.stackexchange.com/questions/133993/is-programming-or-computer-science-in-general-all-about-algorithms
- https://www.google.com/search?client=firefox-b-d&q=The+Algorithm+Design+Manual
Algorithms are essential when writing code that should run for significant inputs. Creating software without knowledge of the design of algorithms, computational complexity, and analysis of algorithms is like shooting yourself in the leg.
What did I do?
I have searched for materials to read about dynamic programming. Soon after, I realized that it was more complex because of my weak knowledge of algorithms. I learned it includes multiple unfamiliar topics, so I need to step back. I have to go through the topics in the book in the presented order. I have to get familiar with recurrence relations and mathematical calculation of runtime complexity.
I have researched the whys of algorithmic complexity, day-to-day usage, and how important they are. I learned about the single point of failure and how a lack of knowledge in algorithms can cause it. Additionally, writing programs unaware of computational complexity is like shooting one in the leg. Imagine writing a server that scales poorly with a surge of customers. We must consider runtime complexity in software with the potential for unknowingly significant inputs.
I have never thought about software and the design of algorithms in such a way. My school didn’t teach me that, or there was too much information, and I couldn’t take that in. At least, my school didn’t teach that. Asking the whys and thinking about patterns and processes immensely helped me. I have a good picture now of why computer science fundamentals matter, how I can apply them in real-world applications, and why they are so important.
I want to take out two more points that I learned that are extremely valuable.
First, thinking about the why has increased my motivation. This is the reason why I had to answer the whys and think about patterns and processes on the topic of algorithms.
The best teachers didn’t set the rules for particular problems. They instead encouraged students to think about general patterns and processes — the why is more important than the how. Engaging the mind in a way a computer scientist thinks, a physician, or a mathematician engages it in a whole different way of thinking. I have experienced this myself, and after reading opinions on computer science fundamentals from the articles above, I am convinced. Many agree that they are important and explain why and where they apply and what problems can arise when we don’t know those fundamentals.
Second, writing a section on what I did, helps me set up feedback for myself. I can see what I have done right. Currently, I can’t see what I did wrong, but for today I feel I have changed my mental representation of algorithms considerably. I have a completely different view of computer science fundamentals, such as the design of algorithms and their analysis. I used to reject their importance and consider them an interview burden, but searching for why they are so important has changed my mind. Perhaps I could have achieved this effect if I had talked to any of my professors while at university, but I didn’t have that on my mind then. Perhaps I would have had a different point of view much earlier if I had talked to any of them. This is an excellent thing to consider, and I will keep it in mind.
What can I improve?
Set up a questionnaire that I need to answer.
The questionnaire reminds me of questions I must consider to improve. Questions focused on self-improvement will remind me and point me in the right direction since I am performing a self-study without a mentor. Such a questionnaire will get me back on track when my mind wanders away in thoughts.
Answer these questions after each of my sessions.
- What did I achieve?
- What did I do right?
- What did I do wrong?
- What can I improve?
- What is my larger goal?
- What to do further?
- What am I going to do?
- What is my progress?
- How can I track my progress better?
Larger goal
Learn dynamic programming.
Think about the importance, applications, and purpose of dynamic programming
Think about WHY, not HOW.
- Create a mental representation of the core of dynamic programming.
- Why is dynamic programming important?
- When is dynamic programming used?
- Where is dynamic programming applicable?
- What are the parts of dynamic programming?
- How can I use dynamic programming?
- Come up with more questions.
Further
- Find content on memoization and get familiar with it.
- Find content on recursion and get familiar with it.
- Find content on recurrence relation.
- Find content on mathematical induction.
- Find a problem that is solvable using recursion. Solve it using recursion, then using iterative way. (File system traversal?)
- Find TWO SIMPLEST DYNAMIC PROGRAMMING PROBLEMS and solve them.
- Find a dynamic programming problem with the solution.
Read
- Read the book chapter
- https://www.topcoder.com/thrive/articles/Dynamic%20Programming:%20From%20Novice%20to%20Advanced
- https://www.quora.com/What-are-the-prerequisites-for-Dynamic-Programming
- https://www.hackerearth.com/practice/notes/dynamic-programming-i-1/
- https://www.codechef.com/wiki/tutorial-dynamic-programming
- http://praveendhinwacoding.blogspot.com/2013/06/700-problems-to-understand-you-complete.html
- https://www.geeksforgeeks.org/fundamentals-of-algorithms/#DynamicProgramming
Steps
- recurrence relation
- mathematical induction
- memoization
- optimize the algorithm using dynamic programming