
Get the book "Elements of Programming Interviews in Python" by Aziz, Lee, and Prakash.
Work through the book, from the start to the end. What you need is a structure, and discipline.
Your structure is working this book.
Your discipline is the stick-to-it-iveness of actually committing to your goal of completely getting through the book, and not giving up, even if it means 2-5 pages a day for half a year.
Perseverance is everything. You have to actually care and then follow through.
And I don't mean reading the book. I mean typing out answers to the entire book.
If you do the whole book (read it, and solve it, and understand it), I'm pretty sure you will have a great shot at passing the coding part of any leetcode style interview.
If you DON'T understand it then, and still got through the book, then do the whole book a second time, and a third time if you still are not confident and capable. These guys explain it. It's not a secret. Books are how people transfer knowledge.
"A Data-Centric Introduction to Computing"
# Programming Language Theory
"Programming Languages: Application and Interpretation"
"Crafting Interpreters"
https://craftinginterpreters.com/
# Algorithms/Data Structures
* Pure C *
"Algorithmic Thinking: A Problem-Based Introduction"
https://nostarch.com/algorithmic-thinking-2nd-edition
# Competitive Programming/Interviews
"Competitive Programming book, 4th edition (CP4)"
"Elements of Programming Interviews in Python"
http://elementsofprogramminginterviews.com/
# Compilation
"Essentials of Compilation: An Incremental Approach in Python"
https://github.com/IUCompilerCourse/Essentials-of-Compilatio...
# Database Systems
"CMU: Intro to Database Systems"
https://15445.courses.cs.cmu.edu/
"CMU: Advanced Database Systems"
https://15721.courses.cs.cmu.edu/
# Calculus I/II & Real Analysis
"A Course in Calculus and Real Analysis"
https://link.springer.com/book/10.1007/978-3-030-01400-1
"A Course in Multivariable Calculus and Analysis"
https://link.springer.com/book/10.1007/978-1-4419-1621-1
# Physics
"Matter and Interactions"
https://matterandinteractions.org/
# Linear Algebra & ML
* A Series of books by prof. Joe Suzuki without using any external library for the implementations *
"Statistical Learning with Math and Python"
https://link.springer.com/book/10.1007/978-981-15-7877-9
"Sparse Estimation with Math and Python"
https://link.springer.com/book/10.1007/978-981-16-1438-5
"Kernel Methods for Machine Learning with Math and Python"
https://link.springer.com/book/10.1007/978-981-19-0401-1
# Discrete Mathematics
"CMU 21-228 Discrete Mathematics (prof. Poh-Shen Loh"
https://www.math.cmu.edu/~ploh/2021-228.shtml
# Mathematical Logic
"Mathematical Logic Through Python"
https://www.logicthrupython.org/
# CS Complexity and Theory:
Courses by Ryan O'Donnell at CMU
http://www.cs.cmu.edu/~odonnell/
# Cryptography
"Serious Cryptography: A Practical Introduction to Modern Encryption"
https://nostarch.com/seriouscrypto
# Problem Solving
"Math 235: Mathematical Problem Solving"
https://www.cip.ifi.lmu.de/~grinberg/t/20f
# Computer Graphics
* Also look up the course by @pikuma for a pure c impl without OpenGL *
"Computer Graphics from Scratch: A Programmer's Introduction to 3D Rendering"
https://gabrielgambetta.com/computer-graphics-from-scratch/
"The Ray Tracer Challenge A Test-Driven Guide to Your First 3D Renderer"
https://pragprog.com/titles/jbtracer/the-ray-tracer-challeng...
# Reverse Engineering
"Reverse Engineering for Beginners"
# SAT/SMT
"SAT/SMT by Example"
Also Hakan Kjellerstrand's z3 page:
# Game Engine Development
* 2/4 volumes out (no digital format for the 2 pending volumes due to the authors "piracy" concerns *
"Foundations of Game Engine Development"
https://foundationsofgameenginedev.com/
# Creative Coding
"Generative Design: Visualize, Program, and Create with JavaScript in p5.js"
http://www.generative-gestaltung.de/2/
Articles by Tyler Hobbs specially the one on "Flow Fields" :
https://tylerxhobbs.com/essays/2020/flow-fields
Articles by Sighack specially the one on "Watercolor Techniques":
https://sighack.com/post/generative-watercolor-in-processing
Also, if you need practice with interview questions, I liked Elements of Programming Interviews in Python: The Insiders' Guide.
Quick example of the "look and say" problem:
def look_and_say(n: int) -> str:
s = '1'
for _ in range(n - 1):
s = ''.join(
str(len(list(group))) + key
for key, group in groupby(s))
return sFor context, I hadn't coded professionally for ~8 years at that point, so part of the prep was getting back into that. Also, I never took any algo classes in college 15-20 years earlier, so that was another challenge. I actively avoided big tech companies for years due to difficult interviews and low confidence that I would pass, not to mention a general attitude of why the hell should I spend all this time preparing for something that does not reflect the day-to-day reality (and I still hold this view strongly). But as I learned more about compensation opportunities, I decided to bite the bullet and go for it. I quit my job and spent 3-4 months preparing mostly full-time, while also lining up interviews. Pro-tip here: if you get Google interviews, start them way in advance of all others. Their process is insanely long and after 3 months of interviewing, re-interviewing, getting downleveled, changing hiring managers, etc. I dropped out of the process because I was already sitting on two offers. For comparison, Facebook took 2 weeks from starting to schedule interviews to offer.
For coding, I picked up Python - unless you know something else really well, it's IMO the best language for interviews (never used it professionally, but had not great experience from a few years back interviewing in my language of choice of C#). I got a few books to learn and refresh on the data structures and algorithms: Algorithm Design Manual (good reference, but I didn't end up having time to really go through the material there), Cracking the Coding Interview (skimmed, basic to intermediate stuff here) and Elements of Programming Interviews in Python (skimmed, intermediate to advanced stuff here). I got lucky and recalled the general approach to my FB coding problem from the EPI book. Now for the most important part - create an account on leetcode.com and start practicing. I would recommend focusing on easy and medium levels. I imagine managers would generally get medium-level questions, engineers are expected to solve medium and advanced. My approach was to identify a list of topics, then for every topic read ADM, then CtCI, then EPI, then solve a few easy and medium LC problems, rinse and repeat. I've seen folks recommend that solving ~200 LCs is enough to get comfortable. I didn't have as much time as I would've liked and did about 60. The general idea is to be able to pattern match (e.g. this type of problem needs a hash table, this is a graph problem, etc), some people focus on memorization - I think that's a terrible approach, but most companies do end up asking questions from LC (except Google apparently). With limited time I was flying through topics towards the end, would not recommend. I did pay for Leetcode Premium for a few months - lets you focus on the types of problems that specific companies are asking, was worth it for me.
Coding aside, I actually spent most of my time preparing for system design interviews. Found that my knowledge of building large systems was not nearly sufficient for interviews. My approach here was to first purchase this course: https://www.educative.io/collection/5668639101419520/5649050... and read through the basics section. It really is basic, so I was supplementing by diving deep into each topic on my own. It's still a pretty useful resource for getting an idea of what breadth I should be targeting, along with https://github.com/donnemartin/system-design-primer. Then I read Designing Data-Intensive Applications (amazing book, but incredibly dense), and finally went through all the concrete design problems on the Grokking course as well as watched a bunch of relevant Youtube videos. Felt a lot more comfortable towards the end and I think did alright on those slots. I think the concept of consistent hashing rings came up in literally every single system design interview, so be super familiar with it and various implementations. My interview experience with these was that the really senior folks were more into depth, and the less senior ones focused on breadth. I'd suggest going for both, e.g. the Grokking course and System Design Primer have decent coverage of breadth of topics, but are absolutely not enough for depth. Maybe you could skate by on breadth alone (I'd say it's more valuable than depth), but why take the chance. Some examples of going deep I encountered were talking about different kinds of load balancers and balancing mechanisms, different ways of traversing a consistent hash ring, different failure modes and workarounds in distributed systems. I originally wasn't going to memorize common latency numbers, but it came up during Google's prep session (they offered one with an interviewer, to give feedback) when I embarrassingly struggled to convert 1 Gbps to 125 MB/s.
Of course most rounds were non-technical, so I prepared for those with as many questions I could come up with in advance and recalling various scenarios in detail - super important not to assume that these will just come to you during an interview. I also put together a 65-page summary doc of all the stuff I was reviewing, most of it system-design related, that I went over frequently to refresh myself. Finally, the Blind app and levels.fyi were instrumental in opening my eyes on the crazy compensation at those companies and I was able to do a better job negotiating with this info.
I was fortunate that I had the ability to take the time off to focus on interview prep, and I would 100% not have passed the interviews without it. My cynicism about the whole process only grew, as exactly nothing from my prep was relevant to the day-to-day job at Facebook. ¯\_(ツ)_/¯