Thoughts on Finding Software Engineering Internships and Interviewing
This post is targeted towards college students studying computer science who are looking to land internship offers and get a foothold in the industry. Getting an internship is tough, period. I’ve put a lot of time and mental energy into my internship search and have been fortunate enough to receive helpful advice from others along the way, so I’m writing this article about what I’ve learned so far as a way of paying it forward. I hope that these opinions and anecdotes formed from my own experience will be helpful.
As a disclaimer, internships obviously aren’t the end all be all. They’re nice to have and I personally think they helped me grow a great deal as an engineer, but aren’t needed for success in any way. I’m obviously not an expert on the subject matter. I’m sure that if you went ahead and picked a random uWaterloo student’s LinkedIn profile then it would probably look more impressive than mine. I have, however, interviewed a bit in the past year, so I hope that some of you might find what I have to say helpful. I also expect this post to end up pretty long and rambling, so I apologize in advance for that.
I’m writing this post now because I recently received an offer to intern at Ramp, a rapidly growing fintech unicorn that’s disrupting the corporate payments space. Everyone I spoke with was friendly, terrifyingly competent, and incredibly passionate. I’m beyond excited to join and it feels like a dream.
I remember walking into the engineering career fair as a wide-eyed freshman, spending a few hours lining up at crowded booths, and coming out empty-handed. At the start of my junior year, I had managed to shop around enough to get experience at local companies with small development teams, but was still unfamiliar with the typical interview process, as I had never done a formal technical interview. I was afraid that I wasn’t competitive enough as an applicant to get responses from established startups and more well-known companies. Now, with one semester of college remaining, I have three amazing internships lined up for this summer, fall, and next spring, and will be working at all of them before graduating. I definitely couldn’t have imagined that I would ever be in this position.
The one hesitance I have with trying to offer advice is the fact that there’s a lot of luck and external variables involved in the process, and people end up with wildly varying results. I personally got really lucky and had a lot of things going my way. I go to UT Austin, and the fact that it has a well-regarded computer science program has definitely helped. Some people are given interviews for certain companies and some aren’t due to factors out of their control. Interviews themselves can also feel like a coinflip of whether you get a nice interviewer and are able to answer a question that you’ve likely just seen the first time. So expect variance, and recognize that outcomes may not go your way in the short term, but things are bound to pan out well in the long run if you follow best practices.
With that being said, the first piece in the process is your resume. It’s important to polish it as much as you can because you can be the most qualified candidate for the role but your resume needs to reflect that in order to get a response after applying. There’s plenty of advice on resume writing out there so I won’t touch on this for long. Generally speaking, try to keep it somewhat visually appealing, and at the very least not downright ugly. Remove experience that isn’t coding related. When writing about previous experience and projects, don’t be shy about selling yourself and try to highlight the impact of your work and initiatives you took rather than merely listing your responsibilities. I’d personally recommend that you use LaTeX to format your resume. I’m currently using the AwesomeCV template for my own resume, which should be linked somewhere on my website if you’re curious.
If you’re a freshman, you probably won’t have much content to put on your resume, and that’s going to be the most important thing for you to work on. The initial hurdle for the vast majority of students is getting that first tangible bit of experience that you can put on your resume. Without it, it’s really hard to get responses in the first place.
What personally worked for me is applying to “no-name” local companies. My very first gig was at a small government contracting company during the summer after my freshman year, which I got by asking a family friend who worked there for a referral. I didn’t have to do a formal interview and only got the position because I was assigned to work alone on a contract that paid too little for a contractor or full-time employee to take up. In other words, bringing me on was a low risk move because I got a modest stipend, but I was able to generate a decent return on that investment by completing the contract with a happy end customer.
During sophomore year, I returned empty-handed from the career fair once again and started looking online. I applied to jobs for UT Austin students on Handshake and about twenty pages of results in, I got a response from a consulting company that matches students with local companies. I was matched with a company in Austin, and I had an informal hour-long interview with a few developers mostly talking about projects I did, my interests, and what I was looking for from the position. I think there were only one or two other applicants for the position. I ended up getting the job, and I’ve been working there part-time for over one and a half years now. Although it doesn’t provide much face value on my resume, it’s honestly been a great experience and I’ve been able to learn a bunch.
Another great option is personal projects. If you don’t have much experience yet, they can be a very important way to showcase your skills, and truly impressive personal projects can play an even larger role in getting your resume noticed than previous experience. You can also learn a ton by doing them. During my freshman year, I wrote this handy little script that interfaces with the Robinhood API and allows you to automatically execute trades based on a predefined strategy. It doesn’t make me much money, but I think it’s a neat talking point. If you’re unsure of what to work on, a good starting point would be to make or remake your personal website using a front-end framework such as React if you aren’t using it already.
Of course, don’t be afraid of applying to any particular company even as a freshman. Programs like Google STEP, Microsoft Explore, and Facebook University are meant specifically for underclassmen with little experience to apply to and have very high conversion rates for regular internship offers the next summer. Many people are still able to land excellent internships on their first go, so it’s worth a shot.
When it comes to applying for positions, if you’re committed to landing one then you have to send out a bunch of applications to maximize your chances. Apply early! While positions open up year round and it’s feasible to get offers in the months right leading up to the summer, many of them start opening up ridiculously early and it’s possible start getting offers by September or earlier, with most offers usually being extended some time around November, right before winter break. Here’s a list of positions already open for summer 2022. I’d advise that you keep an eye out for summer positions starting from June/July, and always try to be one of the first applicants to a position. This will significantly increase your chances of getting a response, especially for more competitive positions.
At the start of junior year, when I knew that I wanted to make use of the summer before my senior year to work at a solid tech company before I graduated, I applied to hundreds of positions online, well over the number in the Sankey diagram below (these were just the ones I tracked). Don’t worry if you don’t meet the hard requirements listed for a position, you should still apply because there’s still a chance you might hear back. I started applying in late August and sent most of my applications out in September.
This worked out fine for me, but I definitely should have started earlier. Applying online can really boil down to a numbers game, because as a typical student, your chances of receiving any kind of response to an application is generally quite low (my response rate during my junior year was around 10%, and much lower before that).
Realize that as you get closer to graduation, your chance of receiving a response increases dramatically. I’d estimate that juniors are at least 3x more likely to receive interviews than sophomores, who are probably around 4x more likely compared to freshmen. Because it’s a numbers game, I’d recommend that you try not to get attached to any particular company during the process at least until you have an offer and the luxury of comparing them.
In order to boost responses and get responses from specific companies that you’re eyeing, you can leverage your existing network and reach out to people who might be willing to help. Try getting referrals from people working there and attending events to talk to engineers and recruiters. Don’t be afraid to get creative in your approach. You may want to consider writing cold emails, especially to smaller companies and startups. I haven’t written any myself because I didn’t consider it as a possibility during the majority of my internship search, but I’ve heard many anecdotes about how they got someone’s foot in the door for an internship position, so I highly recommend it. If I were to go back in time to being a freshman or sophomore, I definitely would be sending out cold emails to try landing an interview.
The Interview Process
The interview process generally consists of 3 steps: online assessment (you complete an online coding test on a website that takes usually around an hour on a website such as hackerrank), phone interview (usually an hour long coding interview with an engineer), and final round/onsite (typically 2–3 hours and involves 1–2 more interviews with engineers and meeting a hiring manager).
Of course, not every company follows this template. I’ve been through the process with some that have a longer online assessment that is 2–4 hours long where instead of a short coding question, you’re expected to complete a larger scoped task such as writing a class or fetching and manipulating data from an API. These typically lead directly to final rounds afterwards. And some final rounds are just 1 hour and consist of one technical or hiring manager interview. After interviews, expect to hear back usually within a week, and don’t fret if you don’t hear anything for a few days since that’s natural.
Online assessments can be frustrating because they demand a lot of time early on in the process, and some larger companies seem to send them out automatically, so you might be resume rejected after completing them even if you solve them optimally. It sucks, but you can at least think of them as providing more practice.
When it comes to technical interviews, for every single company you’re likely going to be asked at least one coding question that tests knowledge of data structures and algorithms, the kind seen on websites like leetcode. I’m sure many others would agree that it’s not a perfect way to evaluate candidates, but it’s objective if nothing else. If you struggle with these types of questions, you’ll have to buckle down and practice until you’re ready to tackle them under the pressure of a live interview. From my experience, this list is a great set of problems that will give you a great breadth of knowledge on various types of questions that you usually asked.
There are also services like algoexpert which are quite pricey, but I think they might be worth it if you are still unfamiliar with data structures and algorithms or really want to be provided more structure in your practice, which comes in the form of a defined list of questions with detailed video explanations. Another great resource is the website pramp.com, which lets you do mock interviews with other people. I personally found it a great way to prepare for interviews, because I think there’s a big difference between coding alone versus in front of another person.
Interviews aren’t just about raw coding ability. You’re being evaluated on being able to communicate effectively with your interviewer, overall problem solving skills, and how you deal with being placed under stressful situations. Try to remain calm and positive even if you encounter roadblocks so you can showcase your best self as a candidate.
During technical interviews, try to briefly explain your general approach before you start coding, and be sure to test your code as well after writing chunks of it. Ask questions to clarify the input and output that is expected for the problem. As you write the code, be sure to explain your thoughts to your interviewer so they can follow along. Since talking and coding at the same can be tricky, I’d recommend getting into the habit of talking as if you were talking to an actual interviewer when you practice coding questions by yourself.
Another important thing is to remember that 99% of the time, your interviewer wants you to succeed! Interviewing is stressful for interviewers too, its not as if they enjoy grilling you with coding questions and watching you struggle. Don’t be afraid to talk to them and treat it as if you’re working through the problem together. You can always validate your general approach with the interviewer before you start coding, and I’ve found that many interviewers are kind enough to give a helpful nudge if you get stuck, especially if you’re already going in the right direction.
At the end of the technical interview you’re typically given some time to ask your interviewer questions. If you’re not sure exactly what the company does or what the position you applied for entails, it’s a great idea to do a bit of online research beforehand so you can come prepared with questions at the end and are able to talk about the company and role intelligently. Doing so showcases your interest in the position, which is a big plus.
The mental aspect of doing interviews is hugely underrated. If you’ve been able to land online assessments or interviews, you might feel quite nervous about doing them. I definitely was, because I was scared that I would fail them and would be essentially using up one of my limited shots at getting closer to an offer. I’ve also had interviews where I felt too nervous to even think when I saw the question and ended up flubbing them. I highly recommend watching this video by a youtuber who does an amazing job of defining the mindset needed to overcome anxiety surrounding interviews.
One of the things that is mentioned in the video that I think helped me the most was getting into the practice of taking frequent walks, which really helped clear my mind before interviews. Of course, I still get nervous, sometimes replaying interviews in my head days after they happen. But interviewing is like catching a baseball and is something that all engineers must do at some point. After all, the best way to get better at interviewing is the practice of interviewing itself.
So at this point you’ve sent out your application, prepared diligently, and did the interview. Now it’s simply time to wait. Be patient and expect to hear back within a week or so. If you don’t hear anything by then, I’d recommend sending a quick follow-up email to your recruiter.
Interviewing results can feel a bit random at times. I usually have a pretty good gut feeling about them, but there have been times when I thought I did pretty well but got rejected, and a few times where I absolutely thought I bombed it but still passed. Honestly, I feel that waiting for results can be more nerve-wracking than the interview itself, but I try to relax my mind. It’s good to remember that things are out of your control at this point, and you’ve already done your part.
My Experience During Junior Year
My own summer internship search for 2021 started off quite slow as I didn’t get any responses early on. I spent a weekend in late August applying to countless positions. I began to feel a bit hopeless but didn’t realize that most companies would take at least 3–4 weeks to get back to me, and so responses started trickling in by mid to late September.
I was happy to learn that my resume turned out to be good enough to get responses, probably by virtue of having a previous internship, even though it was a little-known company. I also continually revised my resume as I sent out more applications in September by reformatting it in LaTeX to look more appealing and rewriting bullet points. I still failed the resume screen at popular companies such as Google and Facebook. Hot startups can actually be even more selective than these tech giants. Because I was nervous about interviewing, I neglected my classes to some degree and spent many hours on leetcode and mock interviews. I did bomb some online assessments and interviews, but the practice paid off and I passed a decent number of interviews.
I suddenly had some weeks where I had to squeeze multiple interviews in as I moved onto next rounds and started hearing back from others. After getting my first offer in mid October for a company in Austin, I was able to breathe a sigh of relief knowing that I at least found something. But I honestly wasn’t very excited about it so I kept interviewing, now with a bit more confidence. I was lucky enough to get a few more offers.
I wanted to work on impactful projects as an intern, so I personally preferred smaller companies and startups where I could take more ownership of my work over larger companies such as Amazon, Bloomberg, and Redfin, all of which I had final rounds scheduled at some point but cancelled them after signing my offer.
I could have also tried pushing back on some of my offer deadlines so I could have tried getting more offers from these other companies, but at that point I was honestly super tired of doing interviews and wasn’t even sure if I would take any of them over what I already had in hand.
I ended up signing an offer for a DevOps engineering position at Schonfeld, which is funny because it was the only DevOps interview I did. Two companies that fell through after the final round that I also would have strongly considered were Optiver and Duolingo. I chose Schonfeld for the following reasons:
- I interviewed directly with members of the team I was being placed on and had good vibes
- I could see myself making an impact due to there given the size of the engineering team and the small internship class size, of which I was the only one working on DevOps.
- At the time there was still a possibility floating in the air of it taking place in-person at NYC, which is a cool place to be.
- I believe in optimizing for learning when it comes to choosing positions. Having spent most of my time working on more customer-facing features and typical full-stack shenanigans at my current role, I thought this was a good chance to expand my skills as an engineer and explore a role in infrastructure. Frankly, I don’t have much experience in this area, but am excited to learn and grow a bunch in the near future.
I didn’t initially plan on doing additional internships at the start of the semester. During my summer internship search, after interviewing for companies and seeing great opportunities out there, I realized it would be awesome if I was able to do an additional one in the fall. After all, as a student you typically only have three summers between your freshman, sophomore, junior, and senior years where you have a chance to do internships. And considering how tough it is to get one the summer after freshman year, it’s hard to do more than two before graduating. Once I realized this, I tried asking recruiters if I could potentially interview for a fall position or move an existing offer to fall, but I didn’t have any success with that. Still, it was worth a shot.
It was also a bit early to apply to fall positions. Fall positions for large companies such as Amazon and Facebook tend to fill up super early, right after the summer positions do, but mort positions typically come out anywhere between January and June of the same year. In fact, I’ve seen a lot of fall positions crop up in the last month for companies such as Nvidia, Datadog, LinkedIn, Coursera, etc. I figured that I’d have to wait a bit longer before searching for fall opportunities.
In early November, a week or so after I signed my offer at Schonfeld, I received an online assessment from TuSimple, arriving two months after I applied. I was surprised and amused to see it show up in my inbox this late, but figured that I might as well do it since the it took less than an hour and the company offered fall co-ops. I had two more technical interviews after that, and a month later, I received an offer. I decided to slate the internship from that August to January 2022, overlapping the typical Fall semester and winter break at UT Austin.
The thought of applying to a position for spring 2022 never occurred to me around that time, let alone seemed like a realistic idea. After all, I was already going to spend the Fall semester at TuSimple. In early April, I was reading Contrary Capital’s blog and saw a post about a startup named Ramp. I had stopped sending out applications since last November, but the position checked all the boxes that I was excited about so I took a shot in the dark and applied. That turned out to be yet another great decision, and I got the offer.
Overall, I ended up getting quite lucky to get both offers for the Fall and Spring with a 100% interview success rate. I debated on taking the offers versus staying in school. Staying in school was the “safe” thing to do. From a financial perspective, I figured that if I just stayed and graduated, I wouldn’t have too much trouble finding a job I was happy with and would probably end up with more dollars in my bank account in the end just due to the differences between full-time and intern pay, even though the intern offers were generous. I had already renewed my lease in Austin for another year so I wouldn’t be able to make use of it by living there if the internships ended up being in person. My family wasn’t exactly thrilled when I told them I was considering taking time off school either. In the end, I knew that these internships were too good of an opportunity to pass up because:
- Both companies have incredible growth potential
- They provide opportunities to learn from extremely capable and ambitious engineers
- I find the product spaces super interesting
When it comes to off-season internships (during the spring or fall semesters as opposed to the summer), I’d personally recommend considering the possibility of doing them. Even if you’ve already found something for the summer, I think this video does a good job of presenting an argument as to why it can be a good idea to do an extra internship during your time as a student. That being said, the decision to do off-season internships is ultimately a personal one.
In general, getting offers is like rolling a snowball, and momentum can be an important factor. Once you gain momentum by starting to interview and land your first offer, you become more confident and are able to use those offers to land even better ones. I recommend reading this article which has great insight into this snowball effect. This principle definitely held true when I applied to my fall and spring internships because I was already comfortable with interviewing due to my prep for the summer. I also listed my upcoming internships on my resume when I applied for the fall and spring because I wanted to show that I’d be able to take what I learned at the previous internships to show up as an even better performer.
One more thing I have to say is that I truly believe that the biggest weapon in interviews is a genuine passion towards coding and the work that you do, be that personal projects or previous internships. That, along with enthusiasm for the position, are two things that are really easy for an interviewer to see from you in an interview. It will practically leak out. And I’m not saying that it’s realistic to start off with this attitude towards coding. I personally wasn’t sure if I truly liked coding when I entered college but have grown to love it as I’ve been able to learn new skills, write code in a team, and deliver projects that make an impact where I work. At this point, I can’t imagine doing anything else.
On a personal note, in the near future, I want to be intentional about improving myself as an engineer and stay passionate about what I do. I’m resolved to make the most out of the upcoming year and absolutely crush it.