CS Level Up Series Introduction
Tags: computerscience, algorithms, datastructures, csharp
Published: 2019-10-31 02:52:25

## What is this series about? What are the goals?

Leveling up my knowledge of algorithms, data structures, and system design. The goal is to become a badass.

## What is the format? How will you achieve this?

Right now the plan is as follows:

1. 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)](https://heapclub.gitbook.io/heapclub-algorithms/interview-preparation/important-topics). The goal is [to know all of this](https://heapclub.gitbook.io/heapclub-algorithms/prepwork) like the back of my hand. If I have time I will [also do the maths section](https://heapclub.gitbook.io/heapclub-algorithms/interview-preparation/math)

1. After the prep work I am going to follow a similar approach to [the one outlined here](https://heapclub.gitbook.io/heapclub-algorithms/how-to-study). I will use Leetcode.

1. To understand more about Operating Systems, Networking, & Systems in general I will use the following resources:
   - [A gentle introduction to multithreading](https://www.internalpointers.com/post/gentle-introduction-multithreading)
   - [Process, Threads and Synchronization](https://www.zrzahid.com/process-threads-and-synchronization/)
   - [Threading in C#](http://www.albahari.com/threading/#_Introduction)
   - [Operating Systems notes](https://github.com/orrsella/soft-eng-interview-prep/blob/master/topics/operating-systems.md)
   - [Web Systems](https://heapclub.gitbook.io/heapclub-algorithms/interview-preparation/system-design/web-applications)
   - [Concurrency: Mutual Exclusion and Synchronization](https://www.unf.edu/public/cop4610/ree/Notes/PPT/PPT8E/CH%2005%20-OS8e.pdf)
   - [Networking notes](https://github.com/orrsella/soft-eng-interview-prep/blob/master/topics/networking.md)
   - [TCP vs UDP](https://www.privateinternetaccess.com/blog/2018/12/tcp-vs-udp-understanding-the-difference/)
   - [Networking Zine](https://jvns.ca/networking-zine.pdf)
   - [What every developer should know about TCP](https://robertovitillo.com/what-every-developer-should-know-about-tcp/)
   - [SYN cookies ate my dog - breaking TCP on Linux](https://kognitio.com/blog/syn-cookies-ate-my-dog-breaking-tcp-on-linux/)
   - [How a SQL database works](http://calpaterson.com/how-a-sql-database-works.html)

1. 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](https://www.youtube.com/channel/UCn1XnDWhsLS5URXTi5wtFTA), [Success in Tech](https://www.youtube.com/channel/UC-vYrOAmtrx9sBzJAf3x_xw), [Tushar Roy's System Design Playlist](https://www.youtube.com/playlist?list=PLrmLmBdmIlps7GJJWW9I7N0P0rB0C3eY2), & [Gaurav Sen's System Design Playlist](https://www.youtube.com/playlist?list=PLMCXHnjXnTnvo6alSjVkgxV-VH6EPyvoX)

1. To get even more System Design knowledge, I will be reading the book [Designing Data-Intensive Applications](https://dataintensive.net/). I will try to read this book twice.

1. To solidify design patterns knowledge, I will use the content from [Source Making's Design Patterns](https://sourcemaking.com/design_patterns).

1. (Optional) There is the possibility I will read + complete all the relevant sections of [CTCI](http://www.crackingthecodinginterview.com/). Specifically, these sections are: _Math & Logic Puzzles_, _Object-Oriented Design_, _System Design & Scalability_, _Testing_, _Java_, _Databases_, _Threads & Locks_.

1. (Also optional) SQL resources:
   * [Easy SQL Questions](https://www.jitbit.com/news/181-jitbits-sql-interview-questions/)
   * [Medium-Hard SQL Questions](https://www.jitbit.com/news/181-jitbits-sql-interview-questions/)

1. Other resources I will be consulting:
   * [Alorithms (Sedgewick)](https://algs4.cs.princeton.edu/home/)
   * [The Algorithm Design Manual (Skiena)](http://www.algorist.com/)
   * The internets

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).
- Disjoint-Set/Union-Find
- Sliding Window
- Rabin-Karp
- 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**.


## Who are you?

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. 

(Please note that I previously linked to [this blog post](https://medium.com/@alimirio/before-you-start-solving-problems-on-leetcode-prep-work-9d65fc964c6f) & [this other post](https://medium.com/@alimirio/how-to-solve-problems-on-leetcode-to-prepare-for-technical-interviews-e74781b865d2) - which appears to have taken the content directly from Heapclub whilst removing vital information.)