Updates to book and study plan.
This commit is contained in:
parent
69c85007a3
commit
5bd06a1459
214
README.md
214
README.md
@ -114,8 +114,9 @@ software development/engineering roles.
|
||||
- [How to use it](#how-to-use-it)
|
||||
- [Don't feel you aren't smart enough](#dont-feel-you-arent-smart-enough)
|
||||
- [About Video Resources](#about-video-resources)
|
||||
- [Pick One Language for the Interview](#pick-one-language-for-the-interview)
|
||||
- [Book List](#book-list)
|
||||
- [Choose a Programming Language](#choose-a-programming-language)
|
||||
- [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)
|
||||
- [What you Won't See Covered](#what-you-wont-see-covered)
|
||||
- [The Daily Plan](#the-daily-plan)
|
||||
@ -155,6 +156,7 @@ software development/engineering roles.
|
||||
- [Design Patterns](#design-patterns)
|
||||
- [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability)
|
||||
- [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms)
|
||||
- [How computers process a program](#how-computers-process-a-program)
|
||||
- [Caches](#caches)
|
||||
- [Processes and Threads](#processes-and-threads)
|
||||
- [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.
|
||||
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.
|
||||
I like using university lectures.
|
||||
It would be great to replace the online course resources with free and always-available public sources,
|
||||
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:
|
||||
|
||||
@ -298,87 +325,81 @@ You could also use these, but read around first. There may be caveats:
|
||||
- JavaScript
|
||||
- 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.
|
||||
|
||||
Read more about choices:
|
||||
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
|
||||
- http://blog.codingforinterviews.com/best-programming-language-jobs/
|
||||
- [Choose the Right Language for Your Coding Interview](http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/)
|
||||
|
||||
[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/)
|
||||
- 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/)
|
||||
- [Algorithms in C, Parts 1-5 (Bundle), 3rd Edition](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080)
|
||||
- Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms
|
||||
|
||||
### 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/
|
||||
|
||||
### 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
|
||||
|
||||
### If you have tons of extra time:
|
||||
|
||||
Choose one:
|
||||
|
||||
- [ ] [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 (Java version)
|
||||
- [book](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/)
|
||||
- [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 (Java version)](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)
|
||||
|
||||
### 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
|
||||
|
||||
This list grew over many months, and yes, it kind of got out of hand.
|
||||
@ -388,35 +409,33 @@ Here are some mistakes I made so you'll have a better experience.
|
||||
### 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
|
||||
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:
|
||||
|
||||
[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
|
||||
|
||||
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.
|
||||
|
||||
I made a mobile-first website, so I could review on my phone and tablet, wherever I am.
|
||||
Each card has different formatting. I made a mobile-first website, so I could review on my phone and tablet, wherever I am.
|
||||
|
||||
Make your own for free:
|
||||
|
||||
- [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 (new - 1800 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db):
|
||||
- [My flash cards database (1200 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.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
|
||||
same card and answer it several times correctly before you really know it. Repetition will put that knowledge deeper in
|
||||
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.
|
||||
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.
|
||||
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. 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)).
|
||||
|
||||
@ -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,
|
||||
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.
|
||||
See here for more: [Coding Question Practice](#coding-question-practice).
|
||||
|
||||
### 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:
|
||||
- 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)
|
||||
- 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
|
||||
@ -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?
|
||||
- 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))
|
||||
- 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.
|
||||
|
||||
@ -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.
|
||||
|
||||
## 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
|
||||
|
||||
- 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)
|
||||
|
||||
- ### 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.
|
||||
- I suggest looking at many examples of DP problems until you have a solid understanding of the pattern involved.
|
||||
- [ ] 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)
|
||||
- [ ] [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
|
||||
- [ ] [Quick UML review (video)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3)
|
||||
- [ ] 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)
|
||||
- [ ] [Design patterns for humans](https://github.com/kamranahmedse/design-patterns-for-humans#structural-design-patterns)
|
||||
|
||||
|
||||
- ### Combinatorics (n choose k) & Probability
|
||||
- [ ] [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)
|
||||
@ -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)
|
||||
- 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
|
||||
- [ ] LRU cache:
|
||||
- [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M)
|
||||
|
Loading…
x
Reference in New Issue
Block a user