Early this year, I gave myself a try and interviewed a lot of companies. In the end I got 8 offers including Twitch(Amazon), Aerohive, Rally Heath, Postmates, Zendesk, VMware, WeWork, Uber. I passed the LinkedIn hiring committee review and was in the team match pool but chose to pause the team match so I counted it as 0.5 offer. They are all mid-level software engineers roles. But I also failed the onsite interviews with Apple, Coinbase, Dropbox, Google, A9(Amazon), Microsoft, Atlassian, Confluent, Blend, Airbnb, Zume. I was invited for onsite interviews with Facebook and Houzz and a few other startup companies but chose not to move forward. I failed phone interviews with Stripe and a few other startups.
It was indeed time consuming.
How did I get those interviews?
I have to say LinkedIn is amazing. Blend is the only one of the few companies I applied online and most of the interview opportunities were from LinkedIn messages magically either from company recruiters or some other platforms like Vettery.com or Hire.com. Startup opportunities are usually from some external staffing agents that also found me through LinkedIn.
What is the process?
The process is almost standard for software engineers’ interviews in Bay Area. First you talk to a recruiter and then schedule one round of coderpad/hackerank live coding phone interview and then go onsite. Onsite interview usually has 4 to 6 rounds and each round is about 45 to 60 minutes. It usually has at least two rounds of coding interviews where you need to write codes on whiteboard or a laptop and one to two rounds of system design interviews. Some companies have so called behavior question interviews but most of them would have one round with hiring manager or director. Lunch is usually provided and sometimes the feedback does not count. It is for you to relax an take a break.
How to study the interview:
Algorithm, Data Structure and Software Engineering Basics. Most companies would have one or two rounds of algorithms and it almost only focus on solving a algorithm problem. But it is still important to understand the basics of computer science and software engineering so you can always answer the basic questions like what is thread vs process. They are rarely asked though, but it will be very embarrassing if you don’t even know the answer.
For algorithm, I studied leetcode. I believe that is the best source to study as its company tags indeed have almost the same problems. For example, Facebook or LinkedIn. It is important to understand the algorithms first before cracking the problems. DFS vs BFS trade off? Graph traversal? Topological sort? Dynamic programming steps, etc. Once you have the basic understanding, I would suggest working on problems in topics. Like Linked List, Tree, DFS, BFS, Graph, Dynamic Programming, etc. It is also very important to go over the company tags. Some companies do give problems from the tag.
A common mistake about preparing for white boarding is only focusing on the solution part. Interview is a process. Many times, it is far more important to present your through process and clearly present your solutions to the interviewer. Giving an optimal answer without clear explanation does not really help in many cases. That can be practiced by mocking interviews.
In terms of system design, it is important you follow the steps. A detailed link on how to approach system design questions can be seen here: https://docs.google.com/document/d/1v3_sJeM8UwBtIufdVRzcEbEz4VShLvr46e41kfOG-zo/edit
There are many factors that determine the final compensation. You have to know your leverage. Sometimes it is important to have multiple offers so that you can negotiate to maximum compensation. But it can also be a hit or miss. Know your bottom line and alternative: Can I just walk away?
I found this link very helpful: https://www.freecodecamp.org/news/how-not-to-bomb-your-offer-negotiation-c46bb9bc7dea/