Software Engineering (SWE) is among the most desired jobs nowadays. It is a vibrant and dynamic domain that changed the way we do things, and that improved our lifestyle. It has its own peculiarities, though, with holy wars between groups of people who argue which programming language is better, with haters of JavaScript, scripting languages, and dynamically typed languages, with complete assholes as well as some very nice and considerate people (although this is not related only to SWE).
Even with a global pandemic, software engineers' workstyle changed only a little. There are many benefits to working as a software engineer, as well as there are downsides. But this article is not about the perks and drawbacks—you can find a myriad of posts on that subject.
There are lots of questions and answers online about how to get into one of the FAANG (facebook, amazon, apple, netflix, google) companies. This article is my experience and some recommendations.
Briefly About Me
I am a Full Stack Software Engineer with 10+ years of experience and a keen interest (and 8+ years of experience) in Data Visualization. I am a freelancer on Toptal, and currently, I work for PepsiCo.
My main stack is Python/Django [REST] on the backend, JavaScript/TypeScript, and all major JS frameworks on the frontend. There are many more things. If you are interested, this is my online resume.
The Beginning Of Search
Generally speaking, switching jobs requires effort. You must not only prepare for the interviews but also spend time on operational stuff like searching for companies to apply, adjusting your CV, etc.
In Jun 2019, while I had a nice job at a NY-based startup, but I planned to move with my family to the United States. And the easiest way to do that was to apply to some companies that provide an H1B visa. Due to some circumstances, we had to stay for at least one year at home, so I decided to slowly, but steadily plan my preparation for interviews at the big tech companies.
The Preparation Phase
After doing some research, I found out the most common stages of the recruitment process:
- technical
- behavioral
- management
- analytical
- system design
- object-oriented design
You might not go through all of them. It depends on the job position you apply and on the company. What you will for sure have are the behavioral and technical interviews. System design is often present, especially if you apply to a position that requires experienced candidates.
Let’s briefly describe each type of the interview before moving further.
Technical/Coding Interview
This type of interview aims at understanding your algorithms skills. Usually, you are given 1, 2, or 3 problems, and you have to solve them in the allocated time (usually somewhere between 15 to 60 mins, depending on the complexity of the problem), considering edge cases and time and space complexity.
There are many platforms online where you can practice solving such problems. Here are just a few to name:
- LeetCode
- HackerRank
- Codility
- GeeksForGeeks
I created a habit of solving at least one problem per day, and in almost ten months, I had solved 299 problems.
Another thing to note is that a candidate usually has several technical interviews: over the phone and onsite.
Behavioral Interview
This type of interview aims at understanding the competency and soft-skills part of your professional profile. How good can you get along with people, how do you perform and behave in different situations with your coworkers, etc. Some developers see this interview as a useless step (or one with minimal importance). That is a delusional thought. Developers have to work in teams the same way as people in many other professions, and understanding “the human” side of a potential employee is essential.
To prepare for this step, there are lots of resources online about behavioral interviews. _ “Cracking the Coding Interview”_ by Gayle Laakmann McDowell is a book that might help you as well. Actually, it is an exhaustive resource to prepare for interviews, so check it out.
Management Interview
I had this type of interview only at one company. It is about looking for examples of how you deal with different scenarios, usually around being a team player, helpful and engaging. I didn’t really see a difference from a behavioral interview, but it was explicitly labeled a “Management Interview,” so there it is.
Analytical Interview
This type of interview aims to understand how you work with data, how you make sense of it, and if you have made any data-driven decisions in your previous work. It has minor aspects of a behavioral interview as well, but more focused on your analytical skills.
System Design Interview
This type of interview is about designing scalable, distributed systems. It might be tough to prepare for because sometimes you might not have the experience of working on a distributed system. Therefore, you must learn the theory only, without having practical experience.
This step is also more challenging because there are a lot of concepts, use cases, and tools that solve various problems, and you need to know what those are to be able to design a viable solution.
To prepare for this interview, I took the long route (since I had plenty of time). There are many great (and free!) resources on GitHub, and here are the ones that I used:
- Awesome Scalability - a reading list on scalability, availability, principles of distributed systems, best case practices at different companies, and many more. I was reading five articles a day and was almost done with the relevant concepts in 7 months. It gave me a broad perspective on what tools exist out there, what problems other teams and companies face, and how to approach solving those problems.
- The System Design Primer - a similar resource, but much more concise, and focused on the theoretical aspects of the concepts more (rather than providing real-life examples from companies, as in the previous link). But the main advantage of it is that it has examples of system design questions and answers.
- Tech Interview Handbook offers full support in preparation for the interviews, but I used it for some hints only.
Object-Oriented Design Interview
In OOD, you have to design the interface of some API or class. It aims at understanding how you think in terms of code and how you structure it. There should be some resources online on the topic, but I haven’t prepared for this one additionally since that is what I do as part of my job.
Quitting And Searching
In March 2020, I decided to quit my job at the NY startup and enjoy some time while I was going to search for a job. I was okay financially and was quite confident I would get a job at some company. But then the pandemic hit, and I got a bit nervous.
Anyway, I needed companies that can sponsor a visa. That’s pretty much all big tech firms. Here is the list of companies and openings I have applied to:
- Full Stack Developer @ Google in Zurich
- Software Engineer, Core Languages @ Google in Munich
- Software Engineer, Engineering Productivity @ Google in Munich
- Senior Backend Engineer @ Airbnb in Dublin
- Software Developer - Frontend Tools for AWS @ Amazon in Berlin
- Software Developer Engineer - Backend @ Amazon in Berlin
- Developer Support Engineer @ Facebook in Dublin
- Enterprise Engineer @ Facebook in Dublin
- Full Stack Software Engineer - Python/JS @ Apple in Zurich
Out of these, I had referrals at all companies except Airbnb. So I got a reply from Google for the Full Stack role, both Amazon jobs, the Airbnb one, and Facebook’s Developer Support Engineer. The only email I received from Apple was the one in which they asked me about feedback on the recruitment process. That was weird.
So, it was exciting, and I was looking forward to it!
Interviewing
If you have worked for a corporation, you probably know that things there take time to progress. The most responsible and fast were Google and Facebook, followed by Airbnb, and Amazon being the least responsive and considerate.
The first step at all companies except Amazon was a phone call to discuss about my application. I perceived this step as an ice-breaker where the recruiter gets to know you, that you are a real person, and that you have intelligible English.
After that, there were coding rounds, but things started to diverge, so I’ll describe the experience with each company separately:
Google was among my favorites. The experience with the recruiter was among the best I had. Initially, we had a call to introduce myself, and the recruiter told me about the process.
The next step was a coding round with an interviewer. I was delighted about how it went. The code was well commented and organized in testable functions. I walked the interviewer throughout the whole thinking process by telling how and why I’m writing that code. I did introduce a small bug (incorrect upper bound in python’s range()
function) that the interviewer showed me immediately, which I fixed. Also, while I was close to finalizing the problem, I figured out some use cases that wouldn’t pass, so I clarified the expected outcome and did the corresponding changes. I even answered a follow-up question, but I didn’t get to code it because of a lack of time.
After waiting for one week, it turned out that I didn’t pass. And the feedback was a bit suspicious to me:
- the pace was a bit on the slow side
- I didn’t account for a bug (the one that he told me about the moment I did it)
- I didn’t think about the design of the algorithm and data structures at the abstract level before coding (this one is subjective since I did think and explain my choices)
Anyway, it seemed very unfair. The only thing I could do is to tell about this to the recruiter, so hopefully, other candidates will be evaluated more fairly.
Amazon
With Amazon, I had the least pleasant experience as a candidate. It took ages until they were responding to emails and moving with the recruitment process. So, after the intro call, I had two rounds of coding exercises for two jobs. I did those well, and we moved further.
For one job, I had a coding round with an interviewer. I have solved the task they gave me, but then something unexpected happened. We switched to the Behavioral interview right away. Now, usually, interviewers have to warn you about what you will be doing, but not this time. I was expecting a second problem, but I got behavioral questions. Thus, because I wasn’t prepared, I failed it.
For the second role, I had an Object-Oriented Design round. I had to design the UNIX’s find
command, which I used only once or twice in my life. I have obviously failed, as the interview’s stress doesn’t help at all, and I spent a third of my time asking about the use cases and syntax. Although I said I am unfamiliar with find
, I should have asked to try and design the grep
command, which I regularly use and could do a better job at.
Airbnb
It was my second choice after Google. I really liked the job and the company. So after passing two coding rounds (one without and one with an interviewer), I had to come to Dublin’s onsite interview, where they were planning to open a brand new office. But it was February-March, the pandemic kicked in in Europe and broke all the plans. I got an email from them that they put the recruitment on-hold and will most likely resume the hiring process in the second half of 2020. Well, as we know, they didn’t.
The hiring process at Facebook started to get weird somewhere at the second or third interview. Initially, I had a call with the recruiter to talk about the fact that I was considered for the position and explain the hiring process. Then I had a coding round, which I passed, after which I was invited to the virtual onsite interviews since things started to become remote due to COVID-19.
There was an Analytical, a Behavioral, a Managerial, and a Technical interview (which was some sort of an OOD interview). When I was applying for the “Developer Support Engineer” role, the Job Description was a bit ambiguous, but during the interviews, I started to realize that it is a support role with very little coding. On one hand, Facebook is positioning it as a developer-oriented role, but during all those interview rounds, I couldn’t shake off the feeling that the interviewers themselves were portraying about it as a job inferior to a developer’s job.
Anyway, at the last of those interviews, when I had to talk with the person who had to make me an offer, I kindly turned them down. I told them I am not interested and if they would like to have me as an SDE (Software Developer). They said to apply to other jobs, and that’s how we parted our ways.
Taking The Startups Route
After that, I decided to look into startups, and I was partially ready to give up the relocation idea, at least temporarily.
It was around the middle of April when I started to apply to startups and other companies. I used AngelList, Triplebyte, gun.io, ZipRecruiter, and a couple of other platforms that can match you to a job.
I interviewed only with two startups. At Globality (a Bay Area startup), I went all the way through and failed the System Design interview. It was my first SD interview, and it was totally different than I had imagined. I had completely different expectations and assumptions about it based on the online materials I was looking at, and hence I failed. Therefore, I highly recommend if you have an opportunity to practice an SD interview with someone who runs those, just do it.
At Swiftlane (a Bay Area startup), I had several coding rounds, a behavioral one, and a System Design round. I got an offer from them, but the compensation was not what I was looking for.
Finally Finding It
In parallel with applying everywhere, I started to apply for jobs on Toptal as well. Initially, I was reluctant to do it, as that would mean I would not be able to relocate. But the pandemic did its job in this regard, not leaving me a choice. Besides, restraining oneself to only a subset of companies reduces your chances of getting a job quicker significantly.
Therefore, I started to heavily apply on the Toptal platform since I had good credentials from my previous job. I have applied to around 20 jobs on Toptal until I got an offer at PepsiCo as a Full Stack Developer in the eCommerce division.
Overall, I have applied to ~50 jobs until I got hired. And even though I didn’t achieve my relocation goal, it was a great experience, and I have learned a lot in the process.
If you liked this article, consider subscribing below and following me on twitter (@iuliangulea).