I Applied To 13 Top Tech Companies In Silicon Valley — Talked To 9 — Got Onsite Interviews At 5 — And Offers From 3 Of Them
Summary
I applied to 13 companies — Google, Amazon, Airbnb, Dropbox, Uber, Square, Twitter, GitHub, LinkedIn, Slack, Lyft, Apple, and Facebook — ended up moving forward with 5 of them — and eventually got offers from 3 of them.
During my time prepping for interviews, my Airbnb recruiter sent me at article by Xiaohan Zeng, which I really related to, because I was going through something similar. Although I didn’t get offers from all five onsite interviews, I still wanted to write about my experience. I’m not going to tell you what you need to study or how you should prepare for the interviews. There are plenty of resources out there already for that. Instead, I am going to document what I went through the past several months and what I learned from it. I hope it will provide new insights for others preparing to go through a similar process.
This post is very long, so feel free to skip certain sections and only read the parts that interest you.
Overview Of The Process
First off, I applied to Square, GitHub, and Airbnb directly, and got automated rejection emails shortly afterwards. For the rest of the companies, I asked for referrals, either from friends I know who are currently working there, or from friends of friends. I later realized I knew someone who works at Airbnb and reached out to him for a referral. I got contacted the next day and my Airbnb process went all the way to the onsite interviews. Having a referral can go a long way, so if you know anyone working at a company that you want to apply to, don’t hesitate to ask.
Secondly, even with a referral, I never heard back from Twitter and Apple. I later discovered that my Twitter referral wasn’t fully submitted, but I was already late in the process when I found out, so I decided to stop the Twitter process. I didn’t make it pass the initial phone screen with Lyft and I didn’t get pass the technical phone interview with LinkedIn.
I got to the onsite interview stage with five companies — Google, Amazon, Uber, Dropbox, and Airbnb. At the time, I was pretty overwhelmed juggling between studying algorithm problems, talking to all the recruiters, scheduling my phone and onsite interviews, and working full time, so I decided to stop the process with Slack and Facebook.
Out of those five companies, I received offers from Google, Amazon, and Uber.
Why I Did It
I will talk a bit about myself and my experience in the industry. I was interested in programming since elementary school, but after taking a couple of Computer Science classes in high school, I decided that I didn’t want to spend the rest of my life doing this. Instead, I went on to college to pursue a business degree, and later got a job as an Internet Marketing Manager. I managed a third-party web development team who was rebuilding our corporate website and ecommerce store. While I was managing that project, I realized that I was still very much interested in computer programming and wanted to be able to do all of the development myself. I want to be able to build anything I can think of.
I quit my job, moved from New York to San Francisco, and attended Dev Bootcamp in 2015. Many of my friends and family thought it was a huge risk, but I was confident that I will be able to successfully become a Software Engineer. I put in 110% of my efforts into the boot camp, learned Ruby on Rails and JavaScript, and landed a great job at a startup called Sensor Tower, even before I finished the boot camp. Sensor Tower is a tech startup with an awesome product and amazing people, many of whom are now my close friends.
After working there for three years, I felt that my rate of learning had begun to slow down. When I attended Dev Bootcamp, I was crammed with a lot new knowledge in a short period of time and it was very exciting. I learned how to create web applications very fast and was able to build a working application of anything I can think of within a week. When I joined Sensor Tower, I was exposed to my first production-scale codebase and infrastructure, along with so many new technologies that I have never seen before. I grew a tremendous amount as a Software Engineer over the past three years.
I want to continue to be exposed to new technologies, use new frameworks, meet new people, and learn new methods of solving problems, so I began to search for my next opportunity in October 2018.
The Study Process
As someone who learned software development from a boot camp, I wasn’t exposed to algorithms and data structures that much, and these aren’t things I needed to think about on a daily basis at work while developing new features and products, so I knew I had a lot of studying to do. I picked up Cracking the Coding Interview and solved a bunch of problems on HackerRank, but it was difficult for me to really focus and set aside time for it.
I decided to find an online boot camp to help accelerate my studying, so I signed up for Interview Camp, which provided a 4-week action plan to go through all the algorithm and data structure topics, along with videos, solutions, and homework problems. I held myself accountable to their recommended schedule and spent the entire month of October studying.
They divide their problems into “building blocks”, which make you focus on the core problems and master them. I found that most algorithm problems are modified or more complicated versions of these core problems, which made it really easy to reuse them for interviews. Mastering the “building blocks” allowed me to easily identify what kind of problem I was given, which data structure makes the most sense for it, what techniques I can use to solve it, and what the most efficient time and space complexity is with a fully optimized solution.
The course also included a lot of great material on system design (scalable web application components, sharding strategies, databases, distributed file systems, distributed processing, etc.). There were also weekly live online sessions in the evening walking through a example system design (i.e. E-commerce system like Amazon, ride hailing service like Uber, messaging service like WhatsApp, etc.). One thing that Interview Camp lacked was preparation material for other design questions. They provided a lot of good material on high level system design and related topics that go deeper into each component of the system, but I received more questions focused on database and API design during my interviews.
I worked full-time during the day and studied Interview Camp at night (8:00 PM — 2:00 AM on weekdays and all day on weekends). Every Sunday for two months, I met up with a friend who works at Amazon. He conducted one to two mock interviews using problems from CTCI. The mock interviews were really helpful because they allowed me to practice coding on a whiteboard, explain my thought-process out loud, and walk through my solution to the interviewer. I also conducted the mock interviews several times, which allowed me to observe as an interviewer and helped me understand what the interviewer looks for when a candidate is solving a problem.
During the month of November, I continued to do some light studying while researching companies to apply to and asking for referrals. By this point, I had major studying fatigue. I tried to solve five LeetCode problems every day, but ended up solving only ~50 total problems during the entire process. Two days before my onsite interviews, I skimmed through all of the problems and solutions on Interview Camp and came up with a short list of about 10 out of the 50 topics that I wasn’t as confident in. I started practicing re-solving those problems, as well as a few related LeetCode problems, but stopped halfway because I was tired of all the studying and felt that I was getting diminishing returns.
The Application Process
After a month of intensive studying in October, I started applying to companies and asking for referrals in November. The momentum really picked up during the first week of December. I had a lot of recruiters from the companies I applied to reaching out to schedule an initial phone screen to learn more about me, my background and experience, and what I’m looking for. I didn’t think it would happen, but I eventually got really good at talking about myself and favorite projects that I worked on.
It was difficult to manage talking to ~10 companies simultaneously, with each company at a different stage of the application process, so I used Trello for project/application management.
I made columns for:
- Need To Apply
- Asked For Referral
- Application Submitted
- Waiting For Next Steps
- Online Assessment
- Initial Phone Screen
- Technical Phone Screen
- Onsite Interview
- Offer
- No Offer
I made a card for each company I applied to, which contained information on the position, team, job posting link, and recruiter information. I documented every activity I had with the company in the card — phone calls, discussions, technical interviews, scheduling, etc. — and moved them to the appropriate column when their status changed. Looking at the Trello board really helped me keep track of which recruiter was for which company, which stage of the interview process I was on with the respective companies, what their interview process is like, which companies I haven’t heard back from for a while, etc.
I scheduled most of my 15- to 30-minute phone screens during the mornings, with a few of them scattered throughout the day, and all of my 1-hour technical phone screens as early in the morning as I could. Being a Software Engineer who starts work later in the day really helped a lot in having the interviews not interfere with work. My days were packed with phone screens and technical phone interviews during the morning, work during the day, and more coordinating and scheduling during the evening.
Then, the holidays kicked in, and the momentum went to a dead stop. Most recruiters went on vacation and stopped responding to my calls and emails. Airbnb was completely closed for two weeks. Google had an interview freeze on the last week of December. Facebook was waiting for new headcounts. When January rolled in, everything started to pick up again and I had to get back into the interview mindset.
It was a bit of a challenge scheduling all my onsite interviews, but I managed to schedule all five of them within a two-week span in January. I already live in San Francisco, so I didn’t need to fly out to the Bay Area. Throughout this process, I was really transparent with all of my recruiters on which companies I was talking to and where I am in the process with the respective companies. This helped me align the stages of the process with all the different companies from a timeline perspective.
Note: I didn’t hear back from Google for an entire month after I applied. I thought it was pretty much a no-go, but then something miraculous happened. A Google recruiter proactively found me on LinkedIn and reached out to me; asking if I was still interested in them. She said she tried emailing me and decided to give it a shot on LinkedIn. I hopped on the phone the same day for an introductory call. It was mid-December and I was already in the middle of the process with several other companies. The next day, my Google recruiter told me I can skip the technical phone interview because they “wanted to remain competitive with my other offers from a timeline perspective and the feedback they got from my referrer helped make that decision”.
I asked for a referral for Facebook a bit later than the other companies (mid-December). There was some mix up after the initial phone screen and my application went to a Solutions Engineer recruiter. He put my application back into the Software Engineering pool and then they were waiting for 2019 headcounts to be finalized. By the time a Software Engineer recruiter at Facebook expressed interest, I already had offers from other companies, so I decided to stop the process with them. It was my fault for applying to Facebook so late in the process.
The Interview Process
Most of the companies I applied to have a similar process:
- Initial phone screen with a recruiter
- Online assessment — sometimes (1–2 questions, 45–60 minutes each)
- Technical phone interview (45–60 minutes)
- Onsite interviews (4–6 interviews, 45–60 minutes each)
Some Things That Were Different:
- Slack’s online assessment wasn’t an algorithm problem, but a code review on a pull request. I was evaluated on my understanding of what the pull request did, my ability to find issues and styling inconsistencies, and how I relayed that message in the code review. This article talks about their ideology on what a good code review looks like.
- LinkedIn did the initial screening via an email questionnaire. I went onto to the technical phone interview stage without ever talking to my LinkedIn recruiter on the phone.
- Google urged me to do my onsite interviews in JavaScript when I mentioned that I wanted to do it in Ruby. The recruiter’s reason was that she had a hard time finding hiring managers and interviewers that were willing to conduct the interviews in Ruby. It was pretty shocked because all the other companies allowed me to use any language of my choice, even if their interviewers don’t know it.
I had online coding challenges and or technical phone interviews with Amazon, Airbnb, Dropbox, Uber, and LinkedIn. All of them told me I did a really good job and moved me to the onsite interview stage, except for LinkedIn.
Onsite Interview Experience:
Google (Wednesday — 5 hours)
I loved Google’s interview process. All five interviews were technical interviews with unique and creative technical problems that I have not seen before. Every interviewer was from a different team working on different projects. I was able to learn more about some of the interesting things that Google is doing and get various perspectives from different Googlers.
Amazon (Thursday — 6 hours)
Amazon’s interview process was draining. They focused a lot on their Leadership Principles. All five interviews that were either split between the leadership questions and coding questions or all leadership questions. Each interview had a list of what felt like 10 questions that go like this: “tell me about a time when you did something that showed [insert leadership principle]”. David Anderson posted a great article that really goes in-depth on each of their 13 Leadership Principles.
Between the 5 interviewers and 10 scenario questions each, I was not able to always come up with unique scenarios to talk about. I ended up repeating scenarios for some questions and telling them I don’t have a good scenario for other questions. Most of the time, they were really focused on typing down the scenarios I was describing, and then moved on to the next question. On multiple interviews, the leadership questions ran a bit long because they really needed to get through their assigned list, which led to less time on the coding portion. My brain was completely fried by the end of the day.
Uber (Monday — 5 hours)
I had my Uber onsite interviews the Monday after Google’s and Amazon’s interviews. By then, I had already heard some good news from Google. Half of me wanted to cancel the rest of my interviews because I was so tired from all the studying and interviewing. But I pushed on because I had already made it this far and I wanted to give every company a chance. It will also allow me to gain more interview experience and having additional offers will give me more options to choose from.
I really enjoyed Uber’s interview process. The coding problems were a mix of being on a whiteboard and on a shared coding environment on my laptop. The technical interviews had pretty standard coding questions and the interviewers did a great job guiding me towards figuring out the solution without giving me the answers. Every interview seemed to run a bit long, but they still gave me ample time for me ask them questions.
Dropbox (Tuesday — 6.5 hours)
The Dropbox onsite interviews were the longest out of the 5 companies. I had 6 interviews (not including the lunch). Just like what I read about them, their technical problems involved topics related to locks and mutexes and thinking in bits, topics I glossed over when I was studying. During the Architecture interview, the interviewer dived really deep into the system I designed and asked very specific questions on certain components.
Almost every Dropbox interviewer I met worked there for around four years, which is surprisingly long. Many of them are on their third or fourth team within Dropbox. They said it was really easy to switch teams and work on something they are interested in. Dropbox’s ideology is “if we don’t let you switch to a team you like, then you’ll just switch to a company you like”.
Airbnb (Thursday — 5.5 hours)
I received good news from Uber the day before my Airbnb onsite interviews. At this point, I was completely drained from all the previous onsite interviews and could not wait for the last one to be over with. Airbnb has one of the most beautiful office buildings I have seen. Each meeting room is designed after a real Airbnb home, but I had my all of interviews in a little pod that can barely fit two people and a tiny desk in between. It felt super cramped to be in there all day.
Out of the five companies, Airbnb gave the hardest technical problems. All of the previous interview problems I was given were LeetCode Easy-Medium problems. Airbnb asked me all LeetCode Medium-Hard questions. The interviewers didn’t seem to be paying any attention while I was implementing the solution that I had walked through. I wasn’t sure if they were taking notes or just doing something else.
Post Interview Process
Two days after my Google onsite interviews, my Google recruiter called me to congratulate me. She said I had done really well on all of my interviews. I was surprised to hear her say that because I was sure I did poorly on one of them and not so okay on another one. This shows how hard it is for you to gauge your own performance in a coding interview. You are only gauging how well you did based on how hard the problem was to you, but your interviewer is gauging how well you did against all the other candidates.
Google’s post interview process was really slow. To my knowledge, after the onsite interviews, my package will get sent to the hiring committee who will review it and make a hiring recommendation. If I get recommended for hire, my package will then go to a committee of regional directors and VPs for sign off. During the executive committee phase, I will also be going through a team matching phase. Once that is done, the compensation committee will come up with the offer details.
To my surprise, my recruiter said that Google switched the order recently and that candidates now go through the team matching phase before the hiring committee phase. I enjoyed Google’s team matching process. Hiring managers that were interested in my profile would reach out to my recruiter. She would send me a summary of the team and what they do. If I was interested in the team, she would set up a call between me and the team’s hiring manager so I can learn more about the team.
Around this time, my Uber recruiter called me and let me know that they decided to extend an offer to me. Interestingly, they do not share offer details and breakdowns until I am ready to make a decision (a.k.a. when I heard back from all the companies). Airbnb was really quick and immediately told me a day after my onsite interviews that they decided not to move forward with me. Shortly after, I also heard back from Amazon that they will extend an offer to me and that she should have offer details within several days. I was just waiting on Dropbox now.
My Dropbox recruiter said he should have an update a couple of days after my onsite interviews, but I didn’t hear back from him. A week later, I reached out to him for an update and found out that he is out of office for the rest of the week. I was pretty disappointed because I had already heard back from all of the other companies and was just waiting on Dropbox. I eventually emailed another recruiter, who apologized, gathered some information and told me that they decided not to move forward with me.
Google was the first company to congratulate me. They were also the last company to officially extend an offer. There is a hiring committee meeting every day, but my hiring package kept getting delayed for some reason. At this point, every additional day of delay felt like a lifetime. My package eventually got scheduled and my Google recruiter called me immediately after the hiring committee meeting to tell me the good news. They recommended me for hire. The rest of the process went moved quickly after this. On the very next day, my package also went through the offer committee and the compensation committee. It took 2 days after my onsite interviews for Google to tell me that I did well, and additional 13 days for my offer to actually become official.
Negotiations
I’m not going to dive too deep into my negotiation and decision making process, but there are a couple of things I want to say.
It was very hard to get actual numbers from Google and Amazon. They both gave me an estimated total compensation, but kept waiting for the other company to give me compensation details and breakdown first so they can give me a better offer. My Uber recruiter gave me the compensation details verbally and said that they do not send out a written offer until I am “ready to accept” it. It was kind of frustrating trying to get all of the companies to give me a written offer first so I can compare all of them with each other before I start the negotiation process.
Compensation was not my primary deciding factor, but it was definitely a big one. Learning opportunities, interesting technical challenges, and company culture were my other important deciding factors. Competing offers are very important if you want to get the best possible compensation. Having multiple offers makes it a lot easier negotiate.
Afterthoughts
The interview process takes a really long time. I crammed all of my studying in one month, which is really hard to do, especially with a full-time job, and really put a lot of stress on me. I originally thought I would be able to get the whole process over with in two and a half months, but it ended up taking four months (beginning of October to end of January). The holiday break put a damper on the timing.
During this period of time, I did not have any social life. My life consisted of studying algorithm problems, working out at the gym, talking to recruiters, going to work, and doing interviews. I didn’t have too much time to spare for friends and family. I want to thank my girlfriend for being extremely understanding and supportive during the past four months.
I am really grateful that my initial Google recruiter went out of her way to find and message me on LinkedIn when there was seemingly no communication between us for a month. That, and the fact that they let me skip the technical phone interview — which could have been a single point of failure for me — allowed me to keep Google within the same timeframe as my other interviews.
I would have happily worked at any of the companies I had onsite interviews with. All five companies have very smart people, products that I believe, different technical challenges, and a lot of opportunity for learning. All of the recruiters I talked to were really great to work with. They guided me through the entire process, gave me preparation materials to read, and genuinely wanted me to succeed in their interview process.
This post ended up much longer than I originally anticipated. Thank you for reading about my journey.
If you have specific questions, feel free to send me a message on LinkedIn.
Update (2/27/2019): I don’t know why I left this out originally, but a lot of people have been asking me which company I decided to go with. I decided to go with Google and will be starting with them soon!