“Are you serious?!” I screamed at the top of my lungs. “Let’s gooooooooooooo!” 

The only sound that came from the other side of the phone was laughter. I was definitely the first person to permanently damage a PayPal recruiter’s hearing while receiving an offer. If he had known what I had gone through to get this job, he would have understood. 

Four months earlier, I graduated from NYU and drove across America to settle down in Silicon Valley with no idea what career path I’d follow. I had both a Business and a CS degree, but couldn’t imagine becoming a software engineer — I had never even had a proper software engineering internship, how could I get a high quality full-time role? And even if I did get one, what if they gave me projects that I couldn’t build? To make matters worse, LeetCode easy problems took me well over an hour to get wrong and my friends told me that I’d need to answer medium/hard ones in fifteen minutes. On a whiteboard. In optimal time. In front of strangers. Fuck.

But they also told me that they had had the same fears before they got their first gig. And I knew the countless benefits of getting an engineering role — I’d learn skills that would help me build out my own ideas and I’d meet tons of smart engineers that I could work on projects with. My job would be secure, would pay well, and would give me flexible hours. The lightbulb clicked and I entered, with my typical obsessiveness, into a two month stretch that had a singular goal: get a software engineering job at a top tech company. And as the deaf PayPal recruiter knows, that’s what happened.

These learnings drove me to create this guide, which will walk you through every step of the job search and study process in order to get you a remote software engineering job at a top company even if you’ve never done a software engineering interview before. Let’s dive in.

Lining Up Interviews: The Top Twenty

In order to get a great remote job, you’ll need to ace interviews at companies you love. Therefore, the first step in this guide is to create a list of twenty companies that you want to work at. This list should consist of two types of roles:

  1. Roles that you love and are listed as remote friendly
  2. Roles that you love and are not listed as remote friendly

The reason that I suggest applying to roles that are not listed as remote is that almost all of the companies you’re interested in are currently remote, likely through the end of the year. This means that if you get an offer for a role that isn’t remote, you’ll have a few months to prove your effectiveness as a remote employee. This is more than enough time to prove that you work amazingly well outside of the office, which will enable you to convince your manager to let you continue working remote full-time. It’s also possible that after joining, your company will go the Twitter and Lambda School route of becoming remote-friendly. Of course, there is a risk to this strategy, so you’ll have to keep that in mind. 

Why twenty companies rather than casting a super wide net? The benefit of this approach is that with a short list, you’ll be able to focus on getting referrals to the majority of the companies you care about. This means that you’ll likely get as many interviews as you would if you sent in a ton of cold applications since they almost never lead to an interview (in my experience, less than 5% of the time). That means that the hours you’d spend changing cover letters and hunting through different websites only will get you a few interviews at companies you don’t really care about. At the same time, you’ve killed your morale by taking this approach by dealing with a daily storm of rejections from companies you aren’t very interested in. While this sounds soppy, morale really matters when it comes to the interview process as it requires stamina and equanimity — you don’t want to wear yourself out unnecessarily. Therefore, start with twenty companies and if none of them give you an offer, compile a new list.

You probably already have a good sense of the non-remote companies you’re interested in, so I’m not going to go into detail about finding those jobs. The only resource I strongly recommend using is TripleByte as it allows you to do two interviews and then get on-sites at a bunch of companies afterwards.

As you look for roles that are already remote, check out the following resources:

It’s also worth considering top startups that were founded recently as many of them have been forced to be remote because of the pandemic. Here are websites that will help you find these companies:

Enter all of these companies into this Google Sheet so you can track your progress with each one throughout the interview process.

Lining Up Interviews: Getting Referrals

Now you know the companies you’re interested in, how do you get referrals to them? In short, you’ll need to have conversations with people that work there. To start, reach out to people you personally know at those companies to see if they’ll chat with you about their experience at the organization and, if you feel comfortable, ask them a referral (note: when I was new to the interview game I thought it was a big deal asking for a referral. It isn’t, everyone has been in the same situation). After you’ve exhausted that network, type in each company’s name on LinkedIn and filter by people that went to your university. Reach out to each of those people with a variation of the following message:

  • “Hey {name}, I saw that we both went to {university} and that you work at {company}. It’s really cool that you were able to land {their current job} and that you {previous work experience} in the past. I’m currently looking for a job after {graduating college // leaving current company // etc.} and was wondering if you’d be free to chat about your experience at {company}.”

On this call, be ready to ask a bunch of questions about their background and their experience at {company}. Be grateful — they’re being nice by getting in touch with you, so you should tell them that you really appreciate that. Be friendly — these calls are naturally a little awkward, so put some effort into making it painless for both parties. Be curious — people like to talk about themselves, ask them intelligent questions about their experience and their company. Be prepared to pitch yourself — have an informal story prepared about your background and why you’re interested in their company.  

If the call goes well, it’s likely that quite a few people will offer to refer you to their company without you directly asking them. If they don’t, you can either ask them nicely or ask them if they have friends that you could talk to more about their company. By reaching out to their friends, you’ll have more and more of these calls and eventually.

Lining Up Interviews: Scheduling

The three big scheduling mistakes I made were:

  1. Interviewing at my dream companies first. I was at 50% of my full potential for my first three interviews because of nerves and inexperience. Therefore, it’s imperative that your first interviews are with companies you aren’t extremely keen on.
  2. Failing to “line up” my on-sites. Companies will pressure you to commit once they extend you an offer, so you want all of your most important on-sites to be within a week of each other. This will allow you to get multiple offers at the same time, so that you can play companies off each other during negotiations.

Studying: Getting the Right Books

Before you should start studying, you need to get your hands on the right resources. A big mistake I made was that I started hammering away at problems right away. The first step is preparing yourself to study well, which starts with getting the right resources. The reason this is important is because how you study and what you study is the whole game. To get those right, you’ll want to get your hands on:

  • Cracking the Coding Interview — Quite literally the Bible of interview prep. Don’t start going through it yet, just have it handy for when the time comes.
  • Deep Work — Essential reading. Don’t start studying until you’ve read this book. It teaches you how to do high quality work by optimizing the way you study. Cal’s blog is great as well.
  • The Art of Learning — Optional reading, but highly recommended. Fantastic read and gives you some great principles about how to learn.

Studying: The Study Plan

As I mentioned earlier, there is so much to do that it often feels overwhelming. Therefore, I really recommend making a simple plan that shows you on any given day where you’re at and where you’re heading towards. Here’s a Google Sheet template that you can use for your study plan. This plan is always going to be changing, but it’s essential that you have a document where you can check in and see the progress you’re making and see how far you are from important dates (such as interviews). This allows you to be in the weeds on a daily basis, but zoom out and see the bigger picture whenever you want. 

The study plan I’ve included below was created with medium/big companies in mind. Startups generally don’t go as hard on the algorithms and will instead ask you more project-based questions. In those cases, you want to think carefully about the role you’re applying for and research questions that are common for those positions. Adjust the below plan based on the companies you’re going for.

Big O

  • 20–40 hours practicing Big O. There are great problems in CTCI and all over the web. Without an amazing understanding of Big O, you will not reach your full potential. Big O is the tool that allows you to determine if your algorithm is good or not. It’s the tool that allows you to have great conversations with your interviewers regarding trade-offs. It is hard to overestimate how important this knowledge is.

Data Structures

  • HashMap implementation + practice problems.
  • Array/String implementation + practice problems.
  • Linked List implementation + practice problems.
  • Queue/Stack implementation + practice problems.
  • Trees implementation + practice problems.

Algorithms

  • Searching: Binary search, BFS, DFS
  • Sorting: Quicksort, Mergesort, Topological sort
  • Tree traversals (pre-order, in-order, post-order)
  • Dijkstra’s algorithm
  • Dynamic Programming: Longest common subsequence, Knapsack problem

System Design

Resources for Learning this Material

Studying: Working Efficiently

We now have the resources lined up and a great plan to execute, so there’s one thing left to do before you start studying — figure out how to study efficiently. This is what I’d recommend:

  • 1 or 2 sessions (2 hours each) of Deep Work per study day.
  • Study 3–6 days per week.
  • CTCI — write down detailed steps + and figure out Big O time of your solution. No coding or pseudo-coding because it takes too long!
  • CTCI — 10 minute timer for solving a problem, 20–40 minute timer for understanding the solution. Always work with a timer in front of you during your Deep Work sessions, it’ll help you get the most out of them.
  • LeetCode — great way to practice actual coding.
  • LeetCode — pay the monthly fee and do company specific problems.
  • LeetCode/GlassDoor — the week before an interview with a company you really want, go through all LC and GD questions related to it.
  • Mock interviews — 1 every week on an actual whiteboard if you’re nearing the on-site phase and on Pramp if you’re nearing the phone screen phase.
  • Mock interviews — I recorded my mock interviews using my iPhone and one of these.
  • Use this spreadsheet to track the problems you’re getting right/wrong. You can use this to improve over time and do quick weekly problem reviews. For these, you should quickly read through the problem statement and run through the steps to solve the problem in your head. This will help you retain your understanding of different problems. Additionally, you could use Anki flashcards as they have a spaced repetition algorithm that asks you problems just as you’re about to forget them.

That covers the step by step plan to getting a job, but I wanted to add a little section at the end to cover some other advice I have.

Recruiter Advice

I wasn’t aggressive enough in emailing recruiters and asking questions about the interview process. This led to multiple interviews where I was expecting algorithm questions and got memory management ones instead. I could have easily passed the interviews, but this mistake killed me.

So please, please don’t make that mistake. You can say something like this to recruiters and they’ll probably help you out, “I want to make sure that I can showcase my true abilities during the interview, so should I spend my time studying operating systems, memory management, algorithms, or…”

This guide is a work in progress, so let me know if you have any edits/improvements to make and I’ll update it accordingly. Thanks!