I went through Facebook and Google interviews (as well as others) back in early 2019 and eventually accepted an offer from FB for an M1 role (was previously a senior manager at a smaller company). At FB I had a coding slot, a couple of system design slots, and I think three behavioral. At Google I didn't get any coding, but it was because of a higher level role (L7) that I was interviewing for (and did not get).

For 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. ¯\_(ツ)_/¯