This Repo is a Fork of Coding Interview School and forked for this event
The items listed here will prepare you well for a technical interview at just about any software company, including the giants: Amazon, Facebook, Google, and Microsoft.
Best of luck to you!
-
Motivation - Read this file
- Interview Process & General Interview Prep
- Pick One Language for the Interview
- Book List
- Before you Get Started
- What you Won't See Covered
- The Daily Plan
- How to Pass the Engineering Interview in 2021
- Whiteboarding
- Demystifying Tech Recruiting
- How to Get a Job at the Big 4:
- Cracking The Coding Interview Set 1:
- Cracking the Facebook Coding Interview:
- Prep Course:
- Software Engineer Interview Unleashed (paid course):
- Learn how to make yourself ready for software engineer interviews from a former Google interviewer.
- Python for Data Structures, Algorithms, and Interviews (paid course):
- A Python centric interview prep course which covers data structures, algorithms, mock interviews and much more.
- Intro to Data Structures and Algorithms using Python (Udacity free course):
- A free Python centric data structures and algorithms course.
- Data Structures and Algorithms Nanodegree! (Udacity paid Nanodegree):
- Get hands-on practice with over 100 data structures and algorithm exercises and guidance from a dedicated mentor to help prepare you for interviews and on-the-job scenarios.
- Grokking the Behavioral Interview (Educative free course):
- Many times, it’s not your technical competency that holds you back from landing your dream job, it’s how you perform on the behavioral interview.
- Software Engineer Interview Unleashed (paid course):
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:
- C++
- Java
- Python
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.
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/
You'll see some C, C++, and Python learning included below, because I'm learning. There are a few books involved, see the bottom.
This is a shorter list than what I used. This is abbreviated to save you time.
- Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
- 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
- answers in Java
Choose one:
- Elements of Programming Interviews (C++ version)
- Elements of Programming Interviews in Python
- Elements of Programming Interviews (Java version)
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.
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
- Algorithms in C++ Part 5: Graph Algorithms
- Open Data Structures in C++
- 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.
- Algorithms (Sedgewick and Wayne)
- videos with book content (and Sedgewick!) on coursera:
OR:
- Data Structures and Algorithms in Java
- 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
- Data Structures and Algorithms in Python
- 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
This list grew over many months, and yes, it kind of got out of hand.
Here are some mistakes I made so you'll have a better experience.
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.
Please, read so you won't make my mistakes:
Retaining Computer Science Knowledge.
A course recommended to me (haven't taken it): Learning how to Learn.
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.
Make your own for free:
- Flashcards site repo
- My flash cards database (old - 1200 cards):
- My flash cards database (new - 1800 cards):
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, 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).
You need to apply what you're learning to solving problems, or you'll forget. I made this mistake. Once you've learned a topic, and feel comfortable with it, like linked lists, open one of the coding interview books and do a couple of questions regarding 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.
I keep a set of cheat sheets on ASCII, OSI stack, Big-O notations, and more. I study them when I have some spare time.
Take a break from programming problems for a half hour and go through your flashcards.
There are a lot of distractions that can take up valuable time. Focus and concentration are hard. Turn on some music without lyrics and you'll be able to focus pretty well.
These are prevalent technologies but not part of this study plan:
- SQL
- Javascript
- HTML, CSS, and other front-end technologies
Some subjects take one day, and some will take multiple days. Some are just learning with nothing to implement.
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
You don't need all these. You need only one language for the interview.
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)
I may not have time to do all of these for every subject, but I'll try.
You can see my code here: