Amazon SDE 2 [Reject] | Google L4 [Reject] | Facebook E4 - [Offer] | My journey
Anonymous User
12910

Hello Guys,

It's time to give back to the community. I want to share my incredible journey to Facebook. In 2020 January I started learning algorithms and data structures from ground zero, I didn't even know what heaps were, dynamic programming, etc. and today I got an offer from Facebook. So I want to share my journey of 3 interviews I had at Amazon, Google and Facebook. But I signed NDAs so I won't share the exact questions.

I have 4 YOE working in the Fin-Tech world in Subsaharan Africa. In my line of work, we don't use algorithms, data structures and the FAANG style distributed systems.

In January 2020 I started my journey. I took me more than an hour to give brute force solutions for LeetCode easy questions. I bought LeetCode premium and used the explore tab to give me the foundations of all fundamental data structures. This is first time I met Binary Search Trees, Graphs, Bactracking etc. I also bought this book - Database Internals by Alex Petrov and I gained insights into how data structures and algorithms are used in databases internally and in distributed systems. This helped me to gain an appreciation of algorithms and datastructures. This helped me build a natural passion for them rather than studying just to pass interviews. But when companies stopped hiring during the peak of the covid pandemic, I foolishly stopped my prep. Then in 2020 August I resumed my prep and I started applying. I got tips on how to write my resume from sites like RoofTop Slushie and I landed my first ever FAANG interview with Amazon in November 2020.

  • Amazon SDE 2
    Did my OA - Two mediums questions. Only 1 solution passed the test cases and luckly I was invited to a phone interview.
    Phone interview - 2 LP questions and 1 easy LinkedList question. I bombed this one because I forgot to handle obvious Linked List edge cases like when handling nodes at the head or at the tail of the list.
    I got a rejection email 1 week later.

I learnt that I needed to work on my fundamentals more. So I decided to buy Algo Expert and I really appreciated the video explanations there. After a few weeks I was able to comfortably solve difficult questions and this really encouraged me. I continued applying. And I got a call from a Google recruiter around Christmas 2020 and scheduled my interviews in February 2021. I started working on Google tagged questions on LeetCode. Mostly hard questions.

  • Google L4
    Phone Interview - A hard tree question that is not on LeetCode. I was able to solve it quickly within 20 minutes with no bugs. Got a strong hire here.
    Onsites:
    Round 1: A medium string question - something similar to how LZIP works. I bombed this one, I was slow and I had a bug plus I used an uncommon Java data structure that the interviewer wasn't familiar with. I also wasn't able to calculate the time complexity. Got a no-hire decision
    Round 2: A medium BST question - was able to code it but was slow. I couldn't answer a follow up question on it. Got a weak-hire decision.
    Round 3: Behavioral round. The interviewer caught me off guard by asking me how I would build a certain image processing feature. Since it was behavioral round, I thought he was asking about how I would approach it from a project execution perspective, but he was asking about how I would actually build this feature technically. We found ourselves talking about machine learning stuff, supervised learning etc. This was very strange for me because I don't have a machine learning background. This was taken as poor communication. I got a weak-hire in this round.
    Round 4: System design. Not your classic distributed systems question. It had some GSM (Cellular communications) components to it. It was my first ever system design question so I was unable to lead the conversation. Got a no-hire decision.
    Round 5: Coding. A medium grid DFS question. You needed to do 2-3 DFS traversals on the grid before getting the result. I needed too many hints to get the idea behind the first DFS round. Once I got it, this unlocked the whole problem and I was able to solve the problem pretty quickly. I got a weak-hire in this round.

Got a rejection call from the recruiter a week later. The feedback was mainly that while I have a good coding speed and style, I am weak in easy to medium topics while strong in difficult topics (the phone interview question). I needed to focus on more breadth. I didn't even make it to the Hiring Committee. She said she will be in touch and we can try again next year.

This was heartbreaking as Google has always been my dream company. I took 2 days to recover from the setback and I decided to work on my breadth, I started practising LeetCode easy string and array questions, and focusing on more topics, solving questions that I had solved before. I also decided to buy the book Cracking the Coding Interview to give me more foundation on my weak areas. I also knew that I needed to do mock interviews and spent a lot of time at interview.io watching the interviews. I got to know how to approach coding and system design questions. Immediately, I knew exactly why I bombed my Google interviews. I spent a lot of time here and I continued working on breadth, and solved several types of questions. I got a call from Facebook in late March 2021 and I scheduled my interviews for April and May. I started practising the Facebook tagged questions on LeetCode.

  • Facebook E4
    Phone Interview - 2 easy-medium questions. Tagged on LC. My speed was good, solved both quickly and we had 15 mins left. We chatted about Facebook.
    I got an email from my recruiter the next day that I had a strong hire in this round. Scheduled onsites 5 weeks later. I'm glad I meet a Director of Engineering at RoofTop Slushie that helped me do mock coding and system design interviews, though I had to pay him a lot for his time. I did more Facebook tagged questions over and over again. I also practiced on some non-tagged questions just in case.
    Onsites:
    Round 1: Behavioral. The recruiter had given me scenarios that they will be likely looking for. So I had spent weeks preparing these stories and refining them. These are the exact questions I got and I had all my answers ready. The interviewer dived deep into all my answers and since these answers are from my real experiences, and because I had prepared to answer all kinds of follow up questions on each answer, I killed it. Got a strong hire here.
    Round 2: System design. The mock interviews with the Director really did help me. I led the discussion this time, I touched every important component (CAP, Load balancers, DNS, Availability, Consistent Hashing, TCP/IP etc.), and I dived deep into the database storage engine, explained the algorithms and data structures that the storage engine uses on disk, and how it affects the whole system performance-wise (thanks to the Database Internals book I bought) and was able to calculate latency during disk reads etc. At the end, the interviewer said he really liked my design. Got a strong hire.
    Round 3: Coding. 2 medium questions. 1 array and 1 graph. Had seen some variations of these questions before on LeetCode. The interviewer insisted that I solved the array question in a particular way, we tried that but we saw that we would have a lot of code duplication. So we reverted and tried it my way and it was much shorter and cleaner with no bugs. Did the second graph question pretty fast too with no bugs. But we never had time to test the second question. Got a strong hire.
    Round 4: Coding. 1 medium array, 1 hard graph. I initially suggested a sub optimal solution for the first question, the interviewer asked me to do better. I quickly gave the more optimal solution. I quickly coded and tested it. Next question was a hard graph question. I explored a few options and came up with a combination of binary search and BFS. I quickly implemented it and the interviewer let me get away with not implementing some obvious helper methods. The interviewer suggested testing some edge cases saw my code had already covered all of them. The medium question is on LeetCode but I haven't seen the hard question here. Got a strong hire.
    Round 5: Coding. 1 medium tree question and 1 hard data structure design question. I quickly solved the tree question but I incorrectly called my helper function. The interviewer pointed it out and I fixed it. The next question was a hard data structure design question. This was a little difficult but the interviewer saw that I was on the right track. He gave me a hint that maybe I needed to use an extra hashmap. I quickly realized this and I was able to quickly code it out. For both of the questions, he asked me to test the code from the quality assurance perspective, not just dry running test cases. It took me time to figure out that this is the way he wanted me to test it, so I did it. Got a hire in this round.

Got an email from the recruiter after a week that my application had been approved and we scheduled a call to discuss the feedback and the next steps about compensation. Yaay finally!!

Learning Points

  1. Slow is fast, slow is smooth. You can see from my journey. In my first interview, I made it to the phone interviews. The next one I made it to the onsites, and the last one I got an offer.
  2. Learn from your weaknesses. Use your experience in these interviews and the feedback to learn on what areas to improve on. I see people here give tons of interviews at once trying their luck hoping one of the interviews goes well. For me I look at things differently. While I agree that some element of luck is involved in these interviews, I believe that your chances increase the better you are at coding.
  3. Do mock interviews! Interviewing is not just about being good at coding, interviewing is a skill by itself. But mock interviews can be expensive. However, you can watch mock interviews for free at interview.io and you can get an idea on how to go about coding and system design interviews.
  4. Learn coding for the passion of it, not just to pass interviews. Be excited to solve hard problems. This is very important, I can't stress this enough. I bought 2 books to help me gain an appreciation of algorithms and data structures by learning where they are applied in real world solutions. These 2 books are Database Internals by Alex Petrov (how databases use algorithms and data structures) and Linux Kernel Development by Rober Love (how the linux kernel uses various data structures and algorithms). After reading these 2 books, I gained a lot of appreciation for them and I wanted to learn them to be good at them, not just passing the interviews. This made my learning process feel more natural and smooth, rather than feeling forced and rushed for the sake of interviews. Even after passing this interview, I will still be coding algorithms in my spare time because I developed a passion for it.
  5. Don't chase numbers, chase quality. I have done about 330 questions (66 easy, 187 medium, 77 hard), but I have done a majority of these questions more than 5 times. This has helped me to strengthen my fundamentals. I marked the questions that gave me a difficult time in terms of implementation or even calculating their time complexities and I would revisit them some time later.
  6. You can do it too! Anyone can. I am from Subsaharan Africa, and when I finished high school, we didn't have a computer at home so I taught myself how to code in Java by googling stuff on my phone and writing code on paper with a pencil. It was hard! But by the time I was joining college, I managed to buy a laptop, met compilers for the first time and soon I was helping seniors with their projects. 18 months ago I didn't know what BSTs were, didn't have a clue what CAP theorem is, and now I'm heading to Facebook as an E4! And I don't have any friends who were also preparing for coding interviews that I could do mock interviews with. So I was pretty much all by myself. For those of you who have friends at FAANG or friends that are also preparing for coding interviews, how lucky are you! Take advantage of that. And for those that don't, it's harder for you but keep your head up and keep working on your weaknesses.
  7. It's easier to give up, but the results are worth all the disappointments that you get along the journey.

I want to say thanks to the LeetCode community. It wouldn't have been possible without your generosity.
Cheers!!

UPDATE
I had a call with my Facebook recruiter to discuss the offer. Apparently they have decided to level me at E5! A lower band of E5, according to what my recruiter said. It is just crazy! During the first call with the recruiter before the interviews, it was agreed that this was an E4 level position, but now they upleveled me. Is there anyone who is familiar with cases like this? Why does it happen? Anyway, I have been given an E5 level compensation and I accepted the offer immediately.

Comments (41)