I want to preface this as my take. This is by no means an exhaustive list that resembles everything you need to know for interviews (as that list is never-ending), but I believe mastering these topics will position you well.
Big-O Asymptotic Time/Space Analysis
You should be able to analyze and measure the code you write. This is largely done by discussing run- and space- time complexities in Big-O notation. This helps measure how performant your code is, and if there’s room to optimize it.
You should be comfortable in defining code that runs/consumes space on the order of constant, logarithmic, linear, exponential, and factorial scales.
When considering these complexities, you should understand how the following scenarios fit your code:
- Best Case
- Worst Case
- Average Case
Data Structures
Data structures are probably the most important topic to master for software engineering interviews. Data structures are the tools you have at your disposal to solve a problem. Deep knowledge of data structures will play a vital role in being able to optimize your code, and will ultimately make solving problems easier as you’ve mastered all of the tools in your toolbelt.
The following data structures are very important to have a firm grasp on for interviews:
- Arrays
- Multi-dimensional Arrays
- Lists
- Singly Linked Lists
- Doubly Linked Lists
- HashMaps / HashTables / Dictionaries
- HashSets / Sets
- Trees
- Binary Search Trees - Queues
- Stacks
- Heaps
Some of these will require more effort than others to master. For example, you should understand the pros and cons of using separate chaining vs. open addressing for hash maps, how do you resize a hash table, etc.
Algorithms
There’s a myriad of different algorithms that you can add to your arsenal that make problem solving easier or more efficient. There will always be new ones to learn. Here’s my list of algorithms:
Searching
- Binary Search
- Breadth First Search (BFS)
- Depth First Search (DFS)
Sorting
- Quick Sort
- Merge Sort
Trees
- Pre-, in-, and post- order traversals
- Insertion/Removal/Deletion of a node in a sorted tree
Dynamic Programming
- Bottom-up (tabulation)
- Top-down (memoization)
Other
- Longest common subsequence (LCS)
- Kadane’s algorithm
Object Oriented Programming
You probably won’t receive many direct questions on OOP, but it’s important to have the knowledge on the topic.
- Static vs. Non-static
- Classes
- Interfaces
- Encapsulation
- Abstraction
- Polymorphism
- Inheritance
- Package vs. Public vs. Private vs. Protected
- Generic Types
- Heap vs. Stack
- Common Design Patterns
- Method Overloading
- Method Overriding
Databases
In any system you find yourself working on, you’re almost guaranteed that you’ll be working with information, and that information lives in a database somewhere. Even if the role you’re interviewing for won’t directly be managing and databases or directly have database connections, it’s important to understand how databases work.
- Indexes
- Clustered
- Non-Clustered - Primary Keys
- Foreign Keys
- Joins
- Inner Join
- Outer Join
- Left Join
- Right Join - ACID Properties
- Atomicity
- Consistency
- Isolation
- Durability - UNION vs. UNION ALL
- Transactional race conditions
- Multiplicity (Relationships between entities)
- 1:1
- 1:Many
- Many : Many
- e.g. a book can have 1 author, but an author can write many books. - SQL
- Limit # of results
- SELECT
- WHERE
- HAVING
- SORT BY
- GROUP BY
- sub queries
- Checks / constraints
- Getting unique values
- Tables vs. Views - Normalization
- Denormalization
- SQL vs. NoSQL
- How do they differ
- What are strengths / weaknesses of each
- When to use one over the other
Operating Systems
You’re either managing the machines your code runs on, or someone else is managing the machines your code runs on, but nonetheless, a machine, somewhere is going to be responsible for executing your bits. Because of this you’ll need to understand the importance of CPU and memory. Your code may also be best served a-synchronously, so you’ll want to have a general understanding of how threading and processes work.
- Processes
- Threads
- Memory
- CPU
Miscellaneous
- Scaling
- Horizontal
- Vertical - Asynchronous Programming
- Single threaded vs. multi-threaded systems - General understanding of how Regular Expressions work
- Understanding basic binary representation of numbers
- Model View Controller architectures
- Micro-Services architectures
- Client-Server architectures
Hopefully, I introduced some topics that you weren’t previously considering while preparing for interviews.
The number of topics that could be brought up in an interview are virtually endless. You can always run into an interviewer that asks about some data structure that is more uncommon than not (maybe a trie or a directed graph), or some niche algorithm that you wouldn’t know unless you studied it for a specific use-case.
Despite this, I believe I’ve highlighted a solid list of topics that will be covered in most interviews.