coding-interview-university
Awesome study plan for software engineering interviews — covers CS fundamentals, data structures, and algorithms
A comprehensive awesome-list and study plan designed to prepare aspiring software engineers for technical interviews at major tech companies. It guides users through essential computer science fundamentals, including data structures, algorithms, and system design. The plan outlines a structured curriculum with recommended resources, practice problems, and interview preparation strategies.
- Structured curriculum for CS fundamentals
- Detailed coverage of data structures and algorithms
- Interview prep strategies and coding practice problems
- Optional advanced topics like system design
- Available in multiple languages via translations
README
View on GitHub ↗Coding Interview University
I originally created this as a short to-do list of study topics for becoming a software engineer, but it grew to the large list you see today. After going through this study plan, I got hired as a Software Development Engineer at Amazon! You probably won't have to study as much as I did. Anyway, everything you need is here.
I studied about 8-12 hours a day, for several months. This is my story: Why I studied full-time for 8 months for a Google interview
Please Note: You won't need to study as much as I did. I wasted a lot of time on things I didn't need to know. More info about that is below. I'll help you get there without wasting your precious time.
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!
Translations:
Translations in progress:
What is it?
![]()
This is my multi-month study plan for becoming a software engineer for a large company.
Required:
- A little experience with coding (variables, loops, methods/functions, etc)
- Patience
- Time
Note this is a study plan for software engineering, not frontend engineering or full-stack development. There are really super roadmaps and coursework for those career paths elsewhere (see https://roadmap.sh/ for more info).
There is a lot to learn in a university Computer Science program, but only knowing about 75% is good enough for an interview, so that's what I cover here. For a complete CS self-taught program, the resources for my study plan have been included in Kamran Ahmed's Computer Science Roadmap: https://roadmap.sh/computer-science
Table of Contents
The Study Plan
- What is it?
- Why use it?
- How to use it
- Don't feel you aren't smart enough
- A Note About Video Resources
- Choose a Programming Language
- Books for Data Structures and Algorithms
- Interview Prep Books
- Don't Make My Mistakes
- What you Won't See Covered
- The Daily Plan
- Coding Question Practice
- Coding Problems
Topics of Study
- Algorithmic complexity / Big-O / Asymptotic analysis
- Data Structures
- More Knowledge
- Trees
- Trees - Intro
- Binary search trees: BSTs
- Heap / Priority Queue / Binary Heap
- balanced search trees (general concept, not details)
- traversals: preorder, inorder, postorder, BFS, DFS
- Sorting
- selection
- insertion
- heapsort
- quicksort
- mergesort
- Graphs
- directed
- undirected
- adjacency matrix
- adjacency list
- traversals: BFS, DFS
- Even More Knowledge
- Final Review
Getting the Job
- Update Your Resume
- Find a Job
- Interview Process & General Interview Prep
- Be thinking of for when the interview comes
- Have questions for the interviewer
- Once You've Got The Job
---------------- Everything below this point is optional ----------------
Optional Extra Topics & Resources
- Additional Books
- System Design, Scalability, Data Handling (if you have 4+ years experience)
- Additional Learning
- Compilers
- Emacs and vi(m)
- Unix command line tools
- Information theory
- Parity & Hamming Code
- Entropy
- Cryptography
- Compression
- Computer Security
- Garbage collection
- Parallel Programming
- Messaging, Serialization, and Queueing Systems
- A*
- Fast Fourier Transform
- Bloom Filter
- HyperLogLog
- Locality-Sensitive Hashing
- van Emde Boas Trees
- Augmented Data Structures
- Balanced search trees
- AVL trees
- Splay trees
- Red/black trees
- 2-3 search trees
- 2-3-4 Trees (aka 2-4 trees)
- N-ary (K-ary, M-ary) trees
- B-Trees
- k-D Trees
- Skip lists
- Network Flows
- Disjoint Sets & Union Find
- Math for Fast Processing
- Treap
- Linear Programming
- Geometry, Convex hull
- Discrete math
- Additional Detail on Some Subjects
- Video Series
- Computer Science Courses
- Papers
Why use it?
If you want to work as a software engineer for a large company, these are the things you have to know.
If you missed out on getting a degree in computer science, like I did, this will catch you up and save four years of your life.
When I started this project, I didn't know a stack from a heap, didn't know Big-O anything, or anything about trees, or how to traverse a graph. If I had to code a sorting algorithm, I can tell ya it would have been terrible. Every data structure I had ever used was built into the language, and I didn't know how they worked under the hood at all. I never had to manage memory unless a process I was running would give an "out of memory" error, and then I'd have to find a workaround. I used a few multidimensional arrays in my life and thousands of associative arrays, but I never created data structures from scratch.
It's a long plan. It may take you months. If you are familiar with a lot of this already it will take you a lot less time.
How to use it
Everything below is an outline, and you should tackle the items in order from top to bottom.
I'm using GitHub's special markdown flavor, including tasks lists to track progress.
If you don't want to use git
On this page, click the Code button near the top, then click "Download ZIP". Unzip the file and you can work with the text files.
If you're open in a code editor that understands markdown, you'll see everything formatted nicely.

If you're comfortable with git
Create a new branch so you can check items like this, just put an x in the brackets: [x]
Fork the GitHub repo:
https://github.com/jwasham/coding-interview-universityby clicking on the Fork button.
Clone to your local repo:
git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git cd coding-interview-university git remote add upstream https://github.com/jwasham/coding-interview-university.git git remote set-url --push upstream DISABLE # so that you don't push your personal progress back to the original repoMark all boxes with X after you completed your changes:
git commit -am "Marked personal progress" git pull upstream main # keep your fork up-to-date with changes from the original repo git push # just pushes to your fork
Don't feel you aren't smart enough
- Successful software engineers are smart, but many have an insecurity that they aren't smart enough.
- The following videos may help you overcome this insecurity:
A Note About Video Resources
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.
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.
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, 2nd Edition
- 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.
- 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.
You may not need it, but here are some sites for learning a new language:
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:
- 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. This is the original article my post was based on: Choosing a Programming Language for Interviews
You need to be very comfortable in the language and be knowledgeable.
Read more about choices:
See language-specific resources here
Books for Data Structures and Algorithms
This book will form your foundation for computer science.
Just choose one, in a language that you will be comfortable with. You'll be doing a lot of reading and coding.
Python
- Coding Interview Patterns: Nail Your Next Coding Interview (Main Recommendation)
- An insider’s perspective on what interviewers are truly looking for and why.
- 101 real coding interview problems with detailed solutions.
- Intuitive explanations that guide you through each problem as if you were solving it in a live interview.
- 1000+ diagrams to illustrate key concepts and patterns.
C
- Algorithms in C, Parts 1-5 (Bundle), 3rd Edition
- Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms
Java
Your choice:
- Goodrich, Tamassia, Goldwasser
- Sedgewick and Wayne:
- Algorithms
- Free Coursera course that covers the book (taught by the authors!):
C++
Your choice:
- Goodrich, Tamassia, and Mount
- Sedgewick and Wayne
Interview Prep Books
Here are some recommended books to supplement your learning.
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
If you have tons of extra time:
Choose one:
- Elements of Programming Interviews (C++ version)
- Elements of Programming Interviews in Python
- Elements of Programming Interviews (Java version) - Companion Project - Method Stub and Test Cases for Every Problem in the Book
Don't Make My Mistakes
This list grew over many months, and yes, it got out of hand.
Here are some mistakes I made so you'll have a better experience. And you'll save months of time.
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. I didn't need all of that knowledge.
Please, read so you won't make my mistakes:
Retaining Computer Science Knowledge.
2. Use Flashcards
To solve the problem, I made a little flashcard site where I could add flashcards of 2 types: general and code. Each card has a different formatting. I made a mobile-first website, so I could review on my phone or tablet, wherever I am.
Make your own for free:
I DON'T RECOMMEND using my flashcards. There are too many and most of them are trivia that you don't need.
But if you don't want to listen to me, here you go:
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).
Some students have mentioned formatting issues with white space that can be fixed by doing the following: open the deck, edit the card, click cards, select the "styling" radio button, and add the member "white-space: pre;" to the card class.
3. Do Coding Interview Questions While You're Learning
THIS IS VERY IMPORTANT.
Start doing coding interview questions while you're learning data structures and algorithms.
You need to apply what you're learning to solve problems, or you'll forget. I made this mistake.
Once you've learned a topic, and feel somewhat comfortable with it, for example, linked lists:
- Open one of the coding interview books (or coding problem websites, listed below)
- Do 2 or 3 questions regarding linked lists.
- Move on to the next learning topic.
- Later, go back and do another 2 or 3 linked list problems.
- Do this with each new topic you learn.
Keep doing problems while you're learning all this stuff, not after.
You're not being hired for knowledge, but how you apply the knowledge.
There are many resources for this, listed below. Keep going.
4. Focus
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.
What you won't see covered
These are prevalent technologies but not part of this study plan:
- Javascript
- HTML, CSS, and other front-end technologies
- SQL
The Daily Plan
This course goes over a lot of subjects. Each will probably take you a few days, or maybe even a week or more. It depends on your schedule.
Each day, take the next subject in the list, watch some videos about that subject, and then write an implementation of that data structure or algorithm in the language you chose for this course.
You can see my code here:
You don't need to memorize every algorithm. You just need to be able to understand it enough to be able to write your own implementation.
Coding Question Practice
Why is this here? I'm not ready to interview.
Why you need to practice doing programming problems:
- Problem recognition, and where the right data structures and algorithms fit in
- Gathering requirements for the problem
- Talking your way through the problem like you will in the interview
- Coding on a whiteboard or paper, not a computer
- Coming up with time and space complexity for your solutions (see Big-O below)
- Testing your solutions
There is a great intro for methodical, communicative problem-solving in an interview. You'll get this from the programming interview books, too, but I found this outstanding: Algorithm design canvas
Write code on a whiteboard or paper, not a computer. Test with some sample inputs. Then type it and test it out on a computer.
If you don't have a whiteboard at home, pick up a large drawing pad from an art store. You can sit on the couch and practice. This is my "sofa whiteboard". I added the pen in the photo just for scale. If you use a pen, you'll wish you could erase. Gets messy quickly. I use a pencil and eraser.

Coding question practice is not about memorizing answers to programming problems.
Coding Problems
Don't forget your key coding interview books here.
Solving Problems:
Coding Interview Question Videos:
- IDeserve (88 videos)
- Tushar Roy (5 playlists)
- Super for walkthroughs of problem solutions
- Nick White - LeetCode Solutions (187 Videos)
- Good explanations of the solution and the code
- You can watch several in a short time
- FisherCoder - LeetCode Solutions
Challenge/Practice sites:
- LeetCode
- My favorite coding problem site. It's worth the subscription money for the 1-2 months you'll likely be preparing.
- See Nick White and FisherCoder Videos above for code walk-throughs.
- HackerRank
- TopCoder
- Codeforces
- Codility
- Geeks for Geeks
- AlgoExpert
- Created by Google engineers, this is also an excellent resource to hone your skills.
- Project Euler
- very math-focused, and not really suited for coding interviews
Let's Get Started
Alright, enough talk, let's learn!
But don't forget to do coding problems from above while you learn!
Algorithmic complexity / Big-O / Asymptotic analysis
- Nothing to implement here, you're just watching videos and taking notes! Yay!
- There are a lot of videos here. Just watch enough until you understand it. You can always come back and review.
- Don't worry if you don't understand all the math behind it.
- You just need to understand how to express the complexity of an algorithm in terms of Big-O.
- Harvard CS50 - Asymptotic Notation (video)
- Big O Notations (general quick tutorial) (video)
- Big O Notation (and Omega and Theta) - best mathematical explanation (video)
- Skiena (video)
- UC Berkeley Big O (video)
- Amortized Analysis (video)
- TopCoder (includes recurrence relations and master theorem):
- Cheat sheet
- [Review] Analyzing Algorithms (playlist) in 18 minutes (video)
Well, that's about enough of that.
When you go through "Cracking the Coding Interview", there is a chapter on this, and at the end there is a quiz to see if you can identify the runtime complexity of different algorithms. It's a super review and test.
Data Structures
Arrays
- About Arrays:
- Implement a vector (mutable array with automatic resizing):
- Practice coding using arrays and pointers, and pointer math to jump to an index instead of using indexing.
- New raw data array with allocated memory
- can allocate int array under the hood, just not use its features
- start with 16, or if the starting number is greater, use power of 2 - 16, 32, 64, 128
- size() - number of items
- capacity() - number of items it can hold
- is_empty()
- at(index) - returns the item at a given index, blows up if index out of bounds
- push(item)
- insert(index, item) - inserts item at index, shifts that index's value and trailing
Similar awesome lists
build-your-own-x
Awesome-list of step-by-step guides to build your own tech from scratch
public-apis
Awesome list of public APIs — manually curated directory of free APIs across diverse domains
developer-roadmap
Developer career awesome-list — interactive roadmaps and guides for various tech stacks, including Claude Code
system-design-primer
System design awesome-list — learn to build large-scale systems and ace technical interviews