Leveling up my knowledge of algorithms, data structures, and system design. The goal is to become a badass.
Right now the plan is as follows:
Do some prep work to learn basic algorithms and data structures. I will be mostly following Heapclub's (a now closed interview prep company) curriculum (curriculum here). The goal is to know all of this like the back of my hand. If I have time I will also do the maths section
After the prep work I am going to follow a similar approach to the one outlined here. I will use Leetcode.
To understand more about Operating Systems, Networking, & Systems in general I will use the following resources:
- A gentle introduction to multithreading
- Process, Threads and Synchronization
- Threading in C#
- Operating Systems notes
- Web Systems
- Concurrency: Mutual Exclusion and Synchronization
- Networking notes
- TCP vs UDP
- Networking Zine
- What every developer should know about TCP
- SYN cookies ate my dog - breaking TCP on Linux
- How a SQL database works
At the same time, or perhaps at the conclusion of the above steps, I will be watching all the system design videos from the following YouTube channels: Tech Dummies - Narendra L, Success in Tech, Tushar Roy's System Design Playlist, & Gaurav Sen's System Design Playlist
To get even more System Design knowledge, I will be reading the book Designing Data-Intensive Applications. I will try to read this book twice.
To solidify design patterns knowledge, I will use the content from Source Making's Design Patterns.
(Optional) There is the possibility I will read + complete all the relevant sections of CTCI. Specifically, these sections are: Math & Logic Puzzles, Object-Oriented Design, System Design & Scalability, Testing, Java, Databases, Threads & Locks.
(Also optional) SQL resources:
Other resources I will be consulting:
Curriculum that might not exist on Heapclub, but that I have come across in forums/articles/books that could be useful to learn (if time permits). Here is list of topics that seem important (in perceived order of priority):
- Know common problems: Fibonacci, Valid/balanced parenthesis, palindrome/anagrams of strings, Traveling Sales Person, Knapsack Problem, Longest Common Subsequence (using dynamic programming, bottom-up with a matrix).
- Sliding Window
- Binary Indexed Tree (Fenwick Tree)
- Bipartite graphs (Checking if a graph is bipartite)
- Iterators and associated problems (Flatten a nested list iterator, design a skip iterator, merge K sorted iterators)
- Minimum Spanning Trees
- Fibonacci Heap and it's guarantees
- Either KMP or Z Algorithm (choose one)
- Segment Tree
- Suffix Tree (without worrying about compression + understand what Ukkonen's algorithm is) &/or Suffix Array
- Line Sweep (geometry related, problems: Rectangle Intersection & The Skyline problem)
Allotted time for this project: 12-18 months.
Bootcamp grad with 5.5 years Software Engineering experience. I have done some basic algo/ds stuff in the past, but not much - and I've forgotten almost all of it. I'm terrible at maths, and I suck at recursion.