Recently, I’ve been getting a lot of questions from people asking for advice on how to navigate the internship/job market, so I figured I’d compile my thoughts here.
Before I start, a few disclaimers. I don’t consider myself an expert on the matter, but I’ve had a fair amount of success and have helped a few people through the process. Also, most of my experience has been in software engineering roles. I’ll try to generalize wherever possible so this is relevant even if you’re interested in data science, machine learning, or other adjacent fields.
Most of my advice centers around one main idea: getting an internship. In my opinion, that should be the number one priority while in school. It’s the best way to build real world experience and the most reliable path to a full time offer.
In terms of structure, I’ll format this like a Q&A.
What should I major in and what classes should I take?
In all honesty, your major doesn’t matter too much as long as it’s technical. For example, at UCSD, majoring in Computer Science, Data Science, Math-CS, Machine Learning, even Cogs-ML are all fine. Regardless of what you choose, you’ll be eligible to pursue software engineering, data science, etc.
Classes aren’t too important initially, most first year curriculum is pretty standard: intro to programming, data structures & algorithms, etc. After taking the core classes, you should have a much better idea of what subfield you’ll want to go into: frontend, backend, infrastructure, machine learning, etc. and you can pick your classes based on that. I would recommend having a solid breadth of courses, for example, even if you are interested in machine learning it’ll be useful to take networking, operating systems, and databases. It’s rare that your work will be in complete isolation, at the very least you will have to consider other parts of the stack.
What should I be doing outside of the classroom?
It’s extremely important that you gain relevant experience while you are still in school. There’s tons of opportunities on campus: teaching assistantships, research labs, technical consulting clubs, and project teams. These usually have a low barrier to entry (atleast compared to actual internships), but they’ll teach you a lot about working in a team. Additionally, they’ll give you relevant experiences that you can put on your resume, which you can leverage when applying to internships.
Aside from that, you should work on personal projects, just build something you would find interesting/useful. You’ll learn a ton along the way.
Is it possible to get an internship as a freshman?
It’s definitely possible, but it will be difficult since you’ll be competing with sophomores & juniors. There are some programs that are targeted specifically for freshman like NVIDIA Ignite, UberStar, Meta University, and Amazon Future Engineer to name a few.
However, I strongly recommend that you apply for internships when you are a freshman, just to gain familiarity with the process, such as taking online assessments. It’s not a huge deal if you don’t land one, just make sure you’re atleast gaining experience through on campus opportunities in the meantime.
By your sophomore/junior year, you should be very prepared and in a good position to land an internship. This is when it’s extremely important, since any internship you land can become a return offer and a path to a full time job.
What should my resume look like?
Don’t try and reinvent the wheel, use Jake’s Resume (learn LaTeX while you’re at it). It handles formatting, spacing, and is ATS friendly.
In general, your resume should have four major components: your education, skills, experience, and projects. In general, while you’re a student, education should be at the top. If you have an impressive experience (internship at a F500 company), go experience, projects, then skills; otherwise, go skills, experience, then projects.
This should go without saying, but your resume should be exactly one page, not shorter and definitely not longer. If you’re struggling to fill up space definitely work on getting some experience in the long run, but in the short term it’s definitely valid to include relevant coursework along with non-relevant work experiences (retail/service jobs). Eventually, as you have more and more to include on your resume, you can remove less relevant/impactful things.
Use ChatGPT to help write your bullets, making sure to follow the Action-Problem/Project-Result (APR) structure and quantify responsibilities with metrics where possible.
When, where, and how should I apply?
The recruiting cycle starts as early as June and runs all the way until April. There’s typically two major windows where companies will do their recruiting. The first one is in September & October, most of the quants, FAANG, and other big tech companies will open up applications and conduct interviews into November and early December. Hiring typically slows down around Thanksgiving & Christmas since many employees take vacations and finding availability for engineers to interview potential candidates becomes more challenging. After the new year, there’s another window in January-February, where mostly be smaller companies recruit.
In terms of finding job postings, there’s a ton of publicly available spreadsheets and GitHub repositories that scrape and compile job postings. A simple Google search should bring up a few.
When it comes to applying, most people will share one of the following strategies:
I think a combination of the two is probably the best. Before each cycle, select a few companies that you really want to work for, secure a referral, and as soon as the posting releases, tailor your resume and apply with that referral. For all other job postings, just apply as quick as you can. It’s important that you apply early, some companies start the process immediately and you don’t want to be in a situation where you don’t get an offer because they ran out of headcount.
Beggars can’t be choosers; until you have an offer, you should be applying everywhere. Obviously, once you have an offer you can be more selective.
This is personal preference, but I highly recommend keeping track of your applications. Just simple information like date applied, company name, role name, current stage (OA, first round, rejected, etc.), along with any notes related to interview stages. Firstly, it’s useful to refer back to; there’s been many instances where people have asked me about my interview process at a certain company and I can go refer back to my notes. Additionally, you’ll be able to track the rates at which you’re getting online assessments and interviews, if you’re not getting them at the same rate as your peers, you’re probably doing something wrong. Lastly, psychologically, it can be discouraging to constantly submit applications seemingly into the void. Having something tangible for each application you submit, even if it’s as trivial as a row in a spreadsheet can be beneficial. Applying is mostly about mental toughness.
What are interview processes like?
Each company will have a slightly different interview process. But, there’s three common things you’ll run into: online assessments (OAs), technical interviews, and behavioral interviews.
Online assessments are typically on CodeSignal or HackerRank and consist of coding questions in a timed, sometimes proctored setting. For software engineering roles, this is almost always Leetcode style questions. For data science or machine learning roles, this can still be Leetcode questions, but I’ve even seen SQL, Pandas, or conceptual questions before.
Technical interviews aim to understand how you approach and solve technical problems. For software engineering internships, this looks like solving Leetcode questions with an engineer. You’ll have to talk about your thought process, consider tradeoffs, edge cases, etc. For full time roles, there will sometimes be a system design components where you’ll have to explain how large scale applications (ex: Twitter, Fortnite) work. For data science or machine learning roles, this can be conceptual questions, case studies, SQL, etc.
Behavioral interviews are designed to understand you as a person: how you work on a team, how you handle conflict, and whether you are a good fit for the company. Beyond your technical capabilities, will you benefit the team?
How should I prepare for interviews?
For any coding questions, it’s just about practice. There’s a few popular problem sets on Leetcode such as the Blind 75, Neetcode 150, and the SQL 50. I’d recommend doing at least those (and maybe more) until you feel comfortable solving mediums you haven’t seen within 20-30 minutes.
The goal should be to truly understand the patterns and recognizing when and where certain data structures and algorithms are necessary, rather than memorizing as many questions as you can.
I think once you reach a certain level of comfortability, the marginal gains you’ll get from doing additional questions will be pretty minimal. At that point, it’s better to just do the company’s tagged questions for any interviews you have.
However, simply being able to solve questions isn’t enough. Part of the interview (arguably the more important part) is your ability to communicate your thoughts clearly and effectively. To practice this, have your friends mock interview you or talk out loud when you are solving questions.
For behavioral interviews, know your resume inside and out. Then, just search up the most common behavioral questions and practice answering them out loud. Eventually, you’ll build an understanding of which experiences you want to reference for each question. Again, have someone mock interview you.
How should I build my network and get referrals?
The easiest way to build your network is to put yourself out there. Get involved with clubs on campus and you’ll naturally meet people through them. Many of the people that have referred me have been peers & friends from highschool or UCSD.
Also, reach out to your parents’ friends or family members that work at these companies, it never hurts to ask.