Updates to book and study plan.

This commit is contained in:
John Washam 2021-08-31 20:31:23 -07:00
parent 69c85007a3
commit 5bd06a1459
1 changed files with 111 additions and 107 deletions

218
README.md
View File

@ -114,8 +114,9 @@ software development/engineering roles.
- [How to use it](#how-to-use-it) - [How to use it](#how-to-use-it)
- [Don't feel you aren't smart enough](#dont-feel-you-arent-smart-enough) - [Don't feel you aren't smart enough](#dont-feel-you-arent-smart-enough)
- [About Video Resources](#about-video-resources) - [About Video Resources](#about-video-resources)
- [Pick One Language for the Interview](#pick-one-language-for-the-interview) - [Choose a Programming Language](#choose-a-programming-language)
- [Book List](#book-list) - [Books for Data Structures and Algorithms](#books-for-data-structures-and-algorithms)
- [Interview Prep Books](#interview-prep-books)
- [Before you Get Started](#before-you-get-started) - [Before you Get Started](#before-you-get-started)
- [What you Won't See Covered](#what-you-wont-see-covered) - [What you Won't See Covered](#what-you-wont-see-covered)
- [The Daily Plan](#the-daily-plan) - [The Daily Plan](#the-daily-plan)
@ -155,6 +156,7 @@ software development/engineering roles.
- [Design Patterns](#design-patterns) - [Design Patterns](#design-patterns)
- [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability) - [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability)
- [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms) - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms)
- [How computers process a program](#how-computers-process-a-program)
- [Caches](#caches) - [Caches](#caches)
- [Processes and Threads](#processes-and-threads) - [Processes and Threads](#processes-and-threads)
- [Testing](#testing) - [Testing](#testing)
@ -282,10 +284,35 @@ Mark all boxes with X after you completed your changes:
Some videos are available only by enrolling in a Coursera or EdX class. These are called MOOCs. Some videos are available only by enrolling in a Coursera or EdX class. These are called MOOCs.
Sometimes the classes are not in session so you have to wait a couple of months, so you have no access. Sometimes the classes are not in session so you have to wait a couple of months, so you have no access.
I'd appreciate your help to add free and always-available public sources, such as YouTube videos to accompany the online course videos. It would be great to replace the online course resources with free and always-available public sources,
I like using university lectures. such as YouTube videos (preferably university lectures), so that you people can study these anytime,
not just when a specific online course is in session.
## Pick One Language for the Interview ## Choose a Programming Language
You'll need to choose a programming language for the coding interviews you do,
but you'll also need to find a language that you can use to study computer science concepts.
Preferably the language would be the same, so that you only need to be proficient in one.
### For this Study Plan
When I did the study plan, I used 2 languages for most of it: C and Python
* C: Very low level. Allows you to deal with pointers and memory allocation/deallocation, so you feel the data structures
and algorithms in your bones. In higher level languages like Python or Java, these are hidden from you. In day to day work, that's terrific,
but when you're learning how these low-level data structures are built, it's great to feel close to the metal.
- C is everywhere. You'll see examples in books, lectures, videos, *everywhere* while you're studying.
- [The C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
- This is a short book, but it will give you a great handle on the C language and if you practice it a little
you'll quickly get proficient. Understanding C helps you understand how programs and memory work.
- You don't need to go super deep in the book (or even finish it). Just get to where you're comfortable reading and writing in C.
- [Answers to questions in the book](https://github.com/lekkas/c-algorithms)
* Python: Modern and very expressive, I learned it because it's just super useful and also allows me to write less code in an interview.
This is my preference. You do what you like, of course.
### For your Coding Interview
You can use a language you are comfortable in to do the coding part of the interview, but for large companies, these are solid choices: You can use a language you are comfortable in to do the coding part of the interview, but for large companies, these are solid choices:
@ -298,86 +325,80 @@ You could also use these, but read around first. There may be caveats:
- JavaScript - JavaScript
- Ruby - Ruby
Here is an article I wrote about choosing a language for the interview: [Pick One Language for the Coding Interview](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/). Here is an article I wrote about choosing a language for the interview:
[Pick One Language for the Coding Interview](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/).
This is the original article my post was based on: http://blog.codingforinterviews.com/best-programming-language-jobs/
You need to be very comfortable in the language and be knowledgeable. You need to be very comfortable in the language and be knowledgeable.
Read more about choices: Read more about choices:
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/ - [Choose the Right Language for Your Coding Interview](http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/)
- http://blog.codingforinterviews.com/best-programming-language-jobs/
[See language resources here](programming-language-resources.md) [See language-specific resources here](programming-language-resources.md)
You'll see some C, C++, and Python learning included below, because I'm learning. There are a few books involved, see the bottom. ## Books for Data Structures and Algorithms
## Book List This book will form your foundation for computer science.
This is a shorter list than what I used. This is abbreviated to save you time. Just choose one, in a language that you will be comfortable with. You'll be doing a lot of reading and coding.
### Interview Prep ### C
- [ ] [Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/) - [Algorithms in C, Parts 1-5 (Bundle), 3rd Edition](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080)
- answers in C++ and Java - Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms
- this is a good warm-up for Cracking the Coding Interview
- not too difficult, most problems may be easier than what you'll see in an interview (from what I've read) ### Python
- [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
- [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/)
- by Goodrich, Tamassia, Goldwasser
- I loved this book. It covered everything and more.
- Pythonic code
- my glowing book report: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
### Java
Your choice:
- Goodrich, Tamassia, Goldwasser
- [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/)
- Sedgewick and Wayne:
- [Algorithms](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/)
- Free Coursera course that covers the book (taught by the authors!):
- [Algorithms I](https://www.coursera.org/learn/algorithms-part1)
- [Algorithms II](https://www.coursera.org/learn/algorithms-part2)
### C++
Your choice:
- Goodrich, Tamassia, and Mount
- [Data Structures and Algorithms in C++, 2nd Edition](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/0470383275)
- Sedgewick and Wayne
- [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/)
- [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/)
## Interview Prep Books
You don't need to buy a bunch of these. Honestly "Cracking the Coding Interview" is probably enough,
but I bought more to give myself more practice. But I always do too much.
I bought both of these. They gave me plenty of practice.
- [Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/)
- Answers in C++ and Java
- This is a good warm-up for Cracking the Coding Interview
- Not too difficult. Most problems may be easier than what you'll see in an interview (from what I've read)
- [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
- answers in Java - answers in Java
### If you have tons of extra time: ### If you have tons of extra time:
Choose one: Choose one:
- [ ] [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) - [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836)
- [ ] [Elements of Programming Interviews in Python](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/) - [Elements of Programming Interviews in Python](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/)
- [ ] Elements of Programming Interviews (Java version) - [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/)
- [book](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) - [Companion Project - Method Stub and Test Cases for Every Problem in the Book](https://github.com/gardncl/elements-of-programming-interviews)
- [Companion Project - Method Stub and Test Cases for Every Problem in the Book](https://github.com/gardncl/elements-of-programming-interviews)
### Language Specific
**You need to choose a language for the interview (see above).**
Here are my recommendations by language. I don't have resources for all languages. I welcome additions.
If you read through one of these, you should have all the data structures and algorithms knowledge you'll need to start doing coding problems.
**You can skip all the video lectures in this project**, unless you'd like a review.
[Additional language-specific resources here.](programming-language-resources.md)
### C++
I haven't read these two, but they are highly rated and written by Sedgewick. He's awesome.
- [ ] [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/)
- [ ] [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/)
- [ ] [Open Data Structures in C++](https://opendatastructures.org/ods-cpp.pdf)
- Rich and detailed collection of Data Structures and Algorithms
- Great for first-timers
If you have a better recommendation for C++, please let me know. Looking for a comprehensive resource.
### Java
- [ ] [Algorithms (Sedgewick and Wayne)](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/)
- videos with book content (and Sedgewick!) on coursera:
- [Algorithms I](https://www.coursera.org/learn/algorithms-part1)
- [Algorithms II](https://www.coursera.org/learn/algorithms-part2)
OR:
- [ ] [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/)
- by Goodrich, Tamassia, Goldwasser
- used as optional text for CS intro course at UC Berkeley
- see my book report on the Python version below. This book covers the same topics
### Python
- [ ] [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/)
- by Goodrich, Tamassia, Goldwasser
- I loved this book. It covered everything and more
- Pythonic code
- my glowing book report: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
- [ ] [Open Data Structures in Python](https://opendatastructures.org/ods-python.pdf)
## Before you Get Started ## Before you Get Started
@ -388,35 +409,33 @@ Here are some mistakes I made so you'll have a better experience.
### 1. You Won't Remember it All ### 1. You Won't Remember it All
I watched hours of videos and took copious notes, and months later there was much I didn't remember. I spent 3 days going I watched hours of videos and took copious notes, and months later there was much I didn't remember. I spent 3 days going
through my notes and making flashcards, so I could review. through my notes and making flashcards, so I could review. I didn't need all of that knowledge.
Please, read so you won't make my mistakes: Please, read so you won't make my mistakes:
[Retaining Computer Science Knowledge](https://startupnextdoor.com/retaining-computer-science-knowledge/). [Retaining Computer Science Knowledge](https://startupnextdoor.com/retaining-computer-science-knowledge/).
A course recommended to me (haven't taken it): [Learning how to Learn](https://www.coursera.org/learn/learning-how-to-learn).
### 2. Use Flashcards ### 2. Use Flashcards
To solve the problem, I made a little flashcards site where I could add flashcards of 2 types: general and code. To solve the problem, I made a little flashcards site where I could add flashcards of 2 types: general and code.
Each card has different formatting. Each card has different formatting. I made a mobile-first website, so I could review on my phone and tablet, wherever I am.
I made a mobile-first website, so I could review on my phone and tablet, wherever I am.
Make your own for free: Make your own for free:
- [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards) - [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards)
- [My flash cards database (old - 1200 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db): - [My flash cards database (1200 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db):
- [My flash cards database (new - 1800 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db): - [My flash cards database (extreme - 1800 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db):
Keep in mind I went overboard and have cards covering everything from assembly language and Python trivia to machine learning and statistics. It's way too much for what's required. Keep in mind I went overboard and have cards covering everything from assembly language and Python trivia to machine learning and statistics.
It's way too much for what's required.
**Note on flashcards:** The first time you recognize you know the answer, don't mark it as known. You have to see the **Note on flashcards:** The first time you recognize you know the answer, don't mark it as known. You have to see the
same card and answer it several times correctly before you really know it. Repetition will put that knowledge deeper in same card and answer it several times correctly before you really know it. Repetition will put that knowledge deeper in
your brain. your brain.
An alternative to using my flashcard site is [Anki](http://ankisrs.net/), which has been recommended to me numerous times. It uses a repetition system to help you remember. An alternative to using my flashcard site is [Anki](http://ankisrs.net/), which has been recommended to me numerous times.
It's user-friendly, available on all platforms and has a cloud sync system. It costs $25 on iOS but is free on other platforms. It uses a repetition system to help you remember. It's user-friendly, available on all platforms and has a cloud sync system.
It costs $25 on iOS but is free on other platforms.
My flashcard database in Anki format: https://ankiweb.net/shared/info/25173560 (thanks [@xiewenya](https://github.com/xiewenya)). My flashcard database in Anki format: https://ankiweb.net/shared/info/25173560 (thanks [@xiewenya](https://github.com/xiewenya)).
@ -427,7 +446,6 @@ and feel comfortable with it, like linked lists, open one of the coding intervie
linked lists. Then move on to the next learning topic. Then later, go back and do another linked list problem, linked lists. Then move on to the next learning topic. Then later, go back and do another linked list problem,
or recursion problem, or whatever. But keep doing problems while you're learning. You're not being hired for knowledge, or recursion problem, or whatever. But keep doing problems while you're learning. You're not being hired for knowledge,
but how you apply the knowledge. There are several books and sites I recommend. but how you apply the knowledge. There are several books and sites I recommend.
See here for more: [Coding Question Practice](#coding-question-practice).
### 4. Review, review, review ### 4. Review, review, review
@ -454,8 +472,6 @@ Some subjects take one day, and some will take multiple days. Some are just lear
Each day I take one subject from the list below, watch videos about that subject, and write an implementation in: Each day I take one subject from the list below, watch videos about that subject, and write an implementation in:
- C - using structs and functions that take a struct * and something else as args - C - using structs and functions that take a struct * and something else as args
- C++ - without using built-in types
- C++ - using built-in types, like STL's std::list for a linked list
- Python - using built-in types (to keep practicing Python) - Python - using built-in types (to keep practicing Python)
- and write tests to ensure I'm doing it right, sometimes just using simple assert() statements - and write tests to ensure I'm doing it right, sometimes just using simple assert() statements
- You may do Java or something else, this is just my thing - You may do Java or something else, this is just my thing
@ -465,7 +481,7 @@ You don't need all these. You need only [one language for the interview](#pick-o
Why code in all of these? Why code in all of these?
- Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember) - Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember)
- Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python or Java)) - Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python or Java))
- Make use of built-in types, so I have experience using the built-in tools for real-world use (not going to write my own linked list implementation in production) - Make use of built-in types, so I have experience using the built-in tools for real-world use (I'm not going to write my own linked list implementation in production)
I may not have time to do all of these for every subject, but I'll try. I may not have time to do all of these for every subject, but I'll try.
@ -478,22 +494,6 @@ You don't need to memorize the guts of every algorithm.
Write code on a whiteboard or paper, not a computer. Test with some sample inputs. Then test it out on a computer. Write code on a whiteboard or paper, not a computer. Test with some sample inputs. Then test it out on a computer.
## Prerequisite Knowledge
- [ ] **Learn C**
- C is everywhere. You'll see examples in books, lectures, videos, *everywhere* while you're studying
- [ ] [The C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
- This is a short book, but it will give you a great handle on the C language and if you practice it a little
you'll quickly get proficient. Understanding C helps you understand how programs and memory work
- [Answers to questions](https://github.com/lekkas/c-algorithms)
- [ ] **How computers process a program:**
- [ ] [How CPU executes a program (video)](https://www.youtube.com/watch?v=XM4lGflQFvA)
- [ ] [How computers calculate - ALU (video)](https://youtu.be/1I5ZMmrOfnA)
- [ ] [Registers and RAM (video)](https://youtu.be/fpnE6UAfbtU)
- [ ] [The Central Processing Unit (CPU) (video)](https://youtu.be/FZGugFqdr60)
- [ ] [Instructions and Programs (video)](https://youtu.be/zltgXvg6r3k)
## Algorithmic complexity / Big-O / Asymptotic analysis ## Algorithmic complexity / Big-O / Asymptotic analysis
- Nothing to implement - Nothing to implement
@ -897,7 +897,8 @@ Graphs can be used to represent many problems in computer science, so this secti
- [ ] [Tail Recursion (video)](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1) - [ ] [Tail Recursion (video)](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1)
- ### Dynamic Programming - ### Dynamic Programming
- You probably won't see any dynamic programming problems in your interview, but it's worth being able to recognize a problem as being a candidate for dynamic programming. - You probably won't see any dynamic programming problems in your interview, but it's worth being able to recognize a
problem as being a candidate for dynamic programming.
- This subject can be pretty difficult, as each DP soluble problem must be defined as a recursion relation, and coming up with it can be tricky. - This subject can be pretty difficult, as each DP soluble problem must be defined as a recursion relation, and coming up with it can be tricky.
- I suggest looking at many examples of DP problems until you have a solid understanding of the pattern involved. - I suggest looking at many examples of DP problems until you have a solid understanding of the pattern involved.
- [ ] Videos: - [ ] Videos:
@ -922,10 +923,6 @@ Graphs can be used to represent many problems in computer science, so this secti
- [ ] [Global pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment) - [ ] [Global pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment)
- [ ] [Local pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment) - [ ] [Local pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment)
- ### Object-Oriented Programming
- [ ] [Optional: UML 2.0 Series (video)](https://www.youtube.com/watch?v=OkC7HKtiZC0&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc)
- [ ] SOLID OOP Principles: [SOLID Principles (video)](https://www.youtube.com/playlist?list=PL4CE9F710017EA77A)
- ### Design patterns - ### Design patterns
- [ ] [Quick UML review (video)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3) - [ ] [Quick UML review (video)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3)
- [ ] Learn these patterns: - [ ] Learn these patterns:
@ -955,7 +952,6 @@ Graphs can be used to represent many problems in computer science, so this secti
- [ ] [Handy reference: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips) - [ ] [Handy reference: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips)
- [ ] [Design patterns for humans](https://github.com/kamranahmedse/design-patterns-for-humans#structural-design-patterns) - [ ] [Design patterns for humans](https://github.com/kamranahmedse/design-patterns-for-humans#structural-design-patterns)
- ### Combinatorics (n choose k) & Probability - ### Combinatorics (n choose k) & Probability
- [ ] [Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)](https://www.youtube.com/watch?v=8RRo6Ti9d0U) - [ ] [Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)](https://www.youtube.com/watch?v=8RRo6Ti9d0U)
- [ ] [Make School: Probability (video)](https://www.youtube.com/watch?v=sZkAAk9Wwa4) - [ ] [Make School: Probability (video)](https://www.youtube.com/watch?v=sZkAAk9Wwa4)
@ -987,6 +983,14 @@ Graphs can be used to represent many problems in computer science, so this secti
- [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb) - [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb)
- Pages 1048 - 1140 in CLRS if you have it. - Pages 1048 - 1140 in CLRS if you have it.
- ### How computers process a program
- [ ] [How CPU executes a program (video)](https://www.youtube.com/watch?v=XM4lGflQFvA)
- [ ] [How computers calculate - ALU (video)](https://youtu.be/1I5ZMmrOfnA)
- [ ] [Registers and RAM (video)](https://youtu.be/fpnE6UAfbtU)
- [ ] [The Central Processing Unit (CPU) (video)](https://youtu.be/FZGugFqdr60)
- [ ] [Instructions and Programs (video)](https://youtu.be/zltgXvg6r3k)
- ### Caches - ### Caches
- [ ] LRU cache: - [ ] LRU cache:
- [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M) - [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M)