Hi everyone,
After finishing the interview process, I wanted to share my experience with the LeetCode community. Although it's protected by NDA, I think the important is the preparation and process itself rather than what problems I met.
Status: 5 YOE
Position: E4/E5 @ Facebook London
Phone Interview
A recruiter reached out 6 months ago and after a short call, we scheduled a phone interview for 4 weeks later (for me to get ready) . I knew I wasn't "in shape" so I wanted some time to prep with LeetCode and make sure I was as ready as I could.
During the 4 weeks of preparation, I focused on data structure first, making sure I have a deep understanding of each concept before moving to algorithms. I focused on easy + medium questions only, always making sure to understand solutions.
By the time the phone interview was there, I was mostly doing it for the experience: there are no chance I could make it.
Phone interview covered the following:
To my surprise, I resolved both problems on time, tested and mentioned the time and space complexity even though the interviewer didn't ask. We actually finished 5-10mins earlier, more time for my questions.
After couple days, I had a good feedback and we planned for a virtual onsite interview 6 weeks later.
Virtual Onside Interview
Those 6 weeks felt eternity, doing LeetCode problems for hours on daily basis, forgetting what I covered a week earlier. I also went through very different content (Cracking the Coding Interview, youtube videos for algorithms + system design, etc).
Half way through my preparation, I shifted the strategy doing less problems but making time to deepling understand each solution rather than timing myself and cover more.
In short, I wasn't playing the number anymore: instead of hoping to get a problem I visited, I prefered understanding any type of problem to fallback on a solution I fully understand.
Then the final interview finally started.
Regarding the Sorting problem, I wanted to go for QuickSelect because of performance rather than Heap Sort but the interviewer suggested to go with latter one. He was worried I wouldn't get time to fully code QuickSelect. In any case, I resolved both problems on time, covering tests, time and space complexity.
Even if I came to the interview for the experience, thinking I didn't know enough (algo + data structures were always my weak spot), I realized at that stage that I might have a real shot.
I had some trouble about the warmup questions: there were some in-depth coding language questions that I wasn't fully sure of the answer. Although, I saved it with the coding, and managed to finished both on time as well.
This is tricky because not all companies do it and there is no right answer, it's more a back and forth of questions with my interviewer. I prepared as much as I could, gave an overall approach, explaining each component its responsibility and some of tradeoff. However, it didn't feel perfect. I thought I had a 50/50 chance to pass this one.
Later on, I had the feedback I didn't cover enough in-depth of each component to give a full picture of the system design.
No surprise, it's a lot of questions and you better be ready. I prepared this one with a spreadsheet, going through each project I worked on with a STAR method. I don't think I shared all I wanted to, I would advise to prepare with a mock interview with a friend to get key sentences ready for you.
Overall
At the end of the interview, I felt I had a 50/50 chance: I had a good experience so far but it wasn't perfect and going through LeetCode past experiences, I really wasn't sure what to expect.
Some advises
A lot of other experiences mention it but communicating your thoughts is key. Ask questions, gives some insights about different solutions you think and choose the best one, avoid jumping on the code right away. That saved me on my first coding problem in regards of my interviewer's expectations.
Regarding the preparation, I would advise to play the long game: avoid doing as many problem as possible if you can't resolve them again or understand the solution. It's more important to have a deep understanding of what your code at all time, even if it means covering less problems, you'll get a better chance to fallback to something you know and show a real understanding.
Remember that you can't control everything. If I covered some key LC problems, I only covered 150 of them in 3 months, I was really worried about the one I didn't try. Somehow, I got lucky and got questions I understand pretty well. You might be not as lucky, and it doesn't mean you are bad software engineer if you can't resolve one.
Finally, it's not the end of the world if I don't get it. At least I've learnt a lot along the way, my datastructure + algorithms skills are way better now, I'll be able try again later on.
After couple weeks waiting for a feedback, I had the feedback I was too short for an E5 position (system design + behavioural didn't show I have everything it requires), so they would go for an E4 position. However, as many know, E4 are frozen at the moment across the whole SWE department, so they can't follow up on it either.
In short, I passed the interview but there is no opening for me for an E4 position at the moment, so my application is on a waiting list (kind of).
In any case, I'm grateful for the experience because I've learnt a lot along the way and thanks LeetCode community for all those experiences and solutions shared that help me go through.