Getting a Job as a CompSci Student: Things I Wish Someone Had Told Me as a College Freshman
Overview & Purpose
I recently graduated college with a degree in Software Engineering and was fortunate enough to land a full-time job at my dream company. The other day I had a younger friend in college ask me what kind of things he should be doing to prepare himself to get a good job in the field. As I started writing some tips for him, I realized that there are a lot of things I know now that would have been extremely valuable to have known earlier in my career. Therefore, I decided to condense my tips and knowledge into this guide for comp-sci students, so that other people don’t make the same mistakes I did.
This guide will cover:
- What to expect from your curriculum
- What you should be doing with your free time
- What employers look for in a candidate
- Internships and co-ops
- How and when to apply to your dream companies
- How to prepare for interviews
- Other random tips for college and life
Freshman & Sophomore Year
College is an exciting time, and an intimidating time for some people. Don’t let this guide overwhelm you. If you’re here reading this, that means you probably care about your future, and everything will be just fine for you 👍
Because college living can be such a dramatic change for some people, I usually recommend that you simply focus on getting acclimated to the new lifestyle during your first semester (or even year) of college. Get into a rhythm of going to class, doing homework, balancing social life, etc. Take time to solidify good study habits and self care. Once you feel like you’re comfortable with this new lifestyle, then you can start considering job preparation.
In the meantime, here are some general tip for success that you can put into practice from day 1:
- Surround yourself with people who are motivated and more experienced than you. — This is super important. If you only hang out with lazy people who don’t do any work outside class, it’ll be much harder to stay motivated and learn. On the flip-side, smart and motivated people will push you to succeed, and you can learn from their experience as well.
- Don’t compare yourself to others — No matter how accomplished you are, there will always be someone that accomplished twice as much as you at half your age. This might be especially obvious if you’re following the previous bullet point. Don’t measure your success against the success of others. Instead, celebrate when you meet goals that you set for yourself, and focus on your strengths. Set your mind on your future goals and where you want to be instead of dwelling on where you are now and where you came from.
- Make attending class non-optional — a lot of people come to college and find themselves with a lot of freedom they’ve never had before, including the freedom to skip class. Make it a personal philosophy to never skip class unless you’re sick or someone’s died... Even if it’s a stupid class and you stayed up all night playing smash bros. I’ve personally found, and studies clearly show that attendance rate is strongly tied to GPA.
- Learn from your mistakes — When you inevitably goof up and bomb a test because you didn’t study enough, or forget to turn in a project, don’t beat yourself up over it. It’s never the end of the world, and all that’s important is that you identify what you could have done differently, and make changes so that it doesn’t happen again. Live and learn 🌈.
- Get involved with ACM, if your school has one. — The Association for Computing Machinery is an international organization with hundreds of University chapters. It’s basically your school’s programming club, and it could be extremely beneficial to you. Show up to a meeting! Freshman year, you might feel like everything is going over your head, but you can at least introduce yourself and make a few older and wiser contacts at your school!
Sophomore year is where things start to really get fun. At this point, you should have taken at least one computer science class and be familiar with the basics of computer science (Object Oriented Programming, functions / methods, Inheritance, arrays, etc), and now you’re getting into the meat of things. If you tried attending an ACM meeting freshman year and it was too confusing, sophomore year is the time to jump back in.
Somewhere around this time you’ll be taking a course called something along the lines of “Data Structures” (depending on your university). At my university, it was called Fundamentals of Computing II. This class covers things like: Time Complexity (“Big O” notation), Trees, Graphs, Linked Lists, Search Methods (Depth First, Breadth First, etc), Recursion, and a few other things. This class is INCREDIBLY IMPORTANT. A strong understanding of topics covered in this class is crucial to landing a job/internship and succeeding in the curriculum. If you pay attention in any class, make sure it’s this one.
Also, once you take this class you should have enough skill and knowledge that you can start applying for internships and doing some really cool stuff outside of school! Which brings me to the next section…
What You Should Be Doing In Your Free Time
First off, I want to stress that it’s always important to maintain balance in your life. Don’t devote your entire existence and all of your free time towards getting a job. Relax and enjoy life while you’re in college. Go see movies, hang out with friends, go outside, etc. I promise you’ll be a better developer if you’re not making yourself miserable.
Aside from that… Side projects, side projects, SIDE PROJECTS!
This is really important. Not only do side projects look great to employers, but they also help you grow as a developer, and allow you to learn things you wouldn’t have learned in school.
How do I start on a side project?
That’s up to you! Get creative. Try and brainstorm an idea without thinking about how to code it first. Just think purely about how you want it to look and act. Then, think and do research about how to actually implement it and make it a reality. Devote a few hours a week to working on it, and do your best to bring it to life. Watch youtube tutorials, look at similar projects people have done, ask more experienced friends, ask for help on reddit, etc. You will learn so much, and hopefully at the end you’ll have a cool thing you made that you can show everyone! Make sure your project is on your GitHub when you finish!
One quick tip concerning ideas is that employers love when you have a side project that tries to solve a specific problem, especially if it’s humanitarian in nature.
Ex: “I made this app that reminds people to drink water on very hot days”
How complex should the side project be?
If you haven’t done one before, it’s best to start very small and simple. Something that shouldn’t take more than a couple days or weeks to finish would be best. Maybe something like a very simple iOS/Android app, or a simple website…
If you’re more experienced, feel free to be more ambitious! Tackle a semester-long project if you wish! Just try and make sure it’s something you can probably finish, because finished projects look better to employers, and it’s better for your confidence to have completed products.
What if it’s too intimidating to start a side project, or I can’t think of any ideas?
Go to a MLH Hackathon. Helping students create side projects is almost the main reason for their existence. This is so useful that it’s about to get its own section header…
What is a Hackathon?
If you’ve never heard of a hackathon, it’s a competition-style event where teams of programmers work together to create a new product over a short time period (usually a weekend). They are a lot of fun, but for some reason a lot of people have never heard of them.
There’s one organization in particular called MLH (Major League Hacking) that facilitates free hackathons for college students at universities all over North America and Europe.
I cannot say enough good things about MLH Hackathons. They are completely free to attend, you get free food all weekend, and you could even win prizes! But best of all, they facilitate rapid growth and learning for students, because you’re usually forced to learn a new language or technology to finish your project within the time limits.
One other benefit is that they’re great for networking and making connections, because every hackathon is sponsored by software companies looking for new talent. My senior year, I went to hackGT at Georgia Tech where I got to meet and hang out with representatives from Google, Lyft, Disney, Microsoft, Southwest, Qualtrics, Robinhood, and a few more!
What if I’m not skilled/experienced enough to do a Hackathon?
MLH intentionally creates a very inclusive environment at their hackathons, and programmers of all ability and experience levels are strongly encouraged to attend. Even if you literally have never written a single line of code, they want you to come enjoy yourself and learn something new.
I would encourage you to attend literally as many MLH hackathons as you can. Try to attend at least one per year starting freshman or sophomore year. If you can get 5 or 6 hackathon projects under your belt by the time you graduate, that’s half your portfolio right there. You can tell employers all about what your projects do, how you worked on a team to build them, and what you learned.
I strongly recommend applying for an internship or co-op while you’re in college. There are several reasons why:
- Every company that I interviewed with for full-time positions asked about my internship (it looks great on a resume)
- It allows you to get valuable real-world experience and learn things they don’t teach in school
- You can find out what you like most and what you dislike most about certain positions, and adjust your career trajectory accordingly
- You can make 💵 fat stacks 💵 to fund your late night Sonic trips
Applying for Internships
Applying for internships and full-time positions follow roughly the same process, so I’ve condensed them into a single section in this guide. If you wish to skip straight to that part, scroll down to the header that says “Applying for Jobs”.
Internships vs Co-Ops
Some universities have “co-op programs”. If you’ve never heard of this, it’s basically an extended internship with a higher level of commitment. Co-ops at my university involved spending 3 nonconsecutive semesters working full time for a company, alternating school and work semesters. With a co-op it is understood that the company’s goal is to eventually hire you. The company sees a co-op as a training period for a future full-time employee, provided you do good work.
The pros to doing this over an internship are that you might get slightly higher pay, and you have a higher chance of getting hired at the end. You also typically connect and interview with co-op companies through your university, which is nice. The con is that you usually have to commit to 3 semesters of work (good or bad) at the company if you ever want to put them on your resume.
Internships vs Undergraduate Research
If you’re at a school that has an undergrad research program, it might be something worth looking to. It’s a good learning experience, and it might be convenient for you since it’s part time and doesn’t require relocation. You could also potentially get your name on a publication in an academic journal, which would look awesome on a resume.
However, keep in mind that undergrad research is not a replacement for an internship, and it won’t give you the same experience of working in the industry that an internship will. It’s essentially a semester-long project with a professor, so there’s also a chance it won’t be interesting, or that your professor will assign you less-than-meaningful work.
Junior & Senior Year
By the time you reach junior year, you should have started an internship, or be in the process of looking for one. You should still be working hard on side projects, and attending technical conferences or hackathons to network. You can also begin to look for full time positions near the end of junior year, if you wish.
The first semester of your senior year is the best time to be looking for full time positions. Don’t wait until your last semester if possible. You need plenty of time to research, talk to companies, and actually interview. The interview and hiring process at certain companies *cough* Google, can take an especially long time *cough* 4–5 months.
At this point, you can start easing up on your personal projects, and start devoting more time towards applying for positions and studying for interviews.
Applying for Jobs pt. 1/3: Before You Start
Before you start applying for any kind of job as a software developer, there are some critical things you need to make sure you’ve taken care of first:
If you don’t a GitHub account already, sign up right this second. GitHub is where you should be hosting all of your side projects (assuming you’re not commercializing anything) and all major school projects.
Even if you don’t have projects to host yet, it’s a very important skill for you to be able to use Git, and understand version control in general. If the term version control is unfamiliar to you, here’s a pretty good video explaining what it is and why it’s necessary.
As much as I dislike LinkedIn, it turns out that it’s actually a necessary evil for getting a job. Until junior year, I didn’t think anyone actually used LinkedIn, but everyone does. You should fill out every field on your LinkedIn that you possibly can, get a nice headshot professionally taken for your picture, and connect with everyone you know. The whole nine yards. Recruiters and employers will actually read it 🙄.
Your resume is probably the single most important factor in you getting a job. Therefore, you should be getting experienced colleagues, university faculty members, or professionals to review it for you regularly. Here are some guidelines for your resume:
- It should NOT be more than one page
- Include your contact information at the top, and links to your GitHub, LinkedIn, and portfolio site
- Be very specific when listing past experience. List any technology or language that you’ve worked with before, and say exactly what your role was on every team you’ve been on.
- If you have a lot of past jobs, only list the ones most relevant to the job you’re applying for. Ex: If you’re applying to Amazon, don’t list your experience at Firehouse Subs over your experience freelancing web development.
- Include a section for achievements and involvements. Include ACM in this section if you’ve been involved at all, and any awards you’ve won at hackathons. Even if you didn’t win any awards, you can list hackathons you attended.
This one is a bit less important if you’re applying for an internship, or applying to a smaller company. However, big companies expect you to have a portfolio site, especially for full-time interviews. I would go as far as to say that it’s almost a dealbreaker for some if you don’t have one. Even if you’re not applying to a “Big N”, a portfolio website will make you look really nice as a candidate, and I encourage you to make one.
What should be on my portfolio site?
Most portfolio sites I’ve seen have a link to a resume, a list of projects that person has worked on, and a small biography section. I would say that’s a good place to start.
When listing your projects, it’s especially nice if you record a quick demo video for each project. Engineers and recruiters especially will not take the time to read through your whole site, and demo videos are a great way to quickly showcase what your projects do. According to Google Analytics, about 900 people viewed my portfolio site last year, and the average amount of time people spent on the site was only 1 minute and 40 seconds.
How do I make a portfolio site?
This isn’t meant to be a guide on web development, so I’ll leave that to you, but I can tell you that there are tons of resources and youtube videos you can watch to learn about it. One particularly good resource is CodeAcademy’s “Make a Website” tutorial. They also have a “Deploy a Website” tutorial for when you’re finished. There are also plenty of good click-and-drag websites like Weebly that you can make a portfolio on without having to code anything.
Applying for Jobs pt. 2/3: The Application
If I could go back in time to freshman year and tell my past self just one thing, it would be what I’m about to tell you…
Referrals. Are. Everything.
If you aren’t familiar with referrals, there are basically two ways to apply for a position at a company:
- Apply online through the company’s website
- Get someone who works at the company to refer you for a specific position
This applies to full-time more than it does internships, but getting someone to refer you internally increases your chances of getting an interview dramatically. When I was searching for a full-time job, I applied to several dozen companies all over the country, and out of the 4 companies that gave me an interview, 3 of them were because I had a referral from someone who worked there. I didn’t even hear back from the majority of the companies I applied to without a referral.
How do I get a referral?
Network, and network soon. Don’t be like me and wait until your senior year to start talking to people and making contacts. It’s never too early to make professional friends.
Ok, but how do I network?
This list is not exhaustive, but here are a few effective ways I can think of to make friends in the industry:
- Ask people at your ACM chapter if they know anyone at companies you’re interested in, and get their contact info.
- Attend hackathons, and visit booths of different sponsor companies. Get their contact info and connect with them on LinkedIn
- Another method is to use LinkedIn. Get on LinkedIn and find a company you want to apply for. Filter the employees of a company by people that graduated from your university. Reach out with a simple message along the lines of:
“Hi, my name is _____. I noticed that you also attended _____ University, and that you’re now an engineer at Company X. I’m interested in applying Company X, and I was wondering if you might have time for a quick phone call where I could ask you some questions about your experience. Thanks!”
When reaching out to strangers, it helps to try and find some common ground between you and them. Anything you can find to relate to that person will help you make friends with them, so that you can eventually ask them to refer you to their company.
Also, one quick note about the LinkedIn method: I’ve found that it’s much more effective to message engineers rather than recruiters at a company. Recruiters get a million messages a day, and it’s doubtful they’ll even read yours.
Should I even bother with applying the traditional way?
It can’t hurt. If you don’t have a referral at a company, you might as well apply online if you’re interested. The more places you apply to, the better your chances of getting somewhere you like, referral or not.
Applying for Jobs pt. 3/3: The Interviews
You’re so close now! But be careful: this is where the most people fail and get rejected, because they didn’t prepare.
In other industries, an interview typically just consists of a personality assessment, and a discussion about the candidate’s past experience. The employer then decides whether or not to hire. However, in the software industry, we have an extra step: technical interviews.
In technical interviews, candidates for software positions are asked to solve problems commonly referred to as whiteboard problems. These problems typically require you to write code and use fundamental data structures and algorithms to solve real life problems. They cover a broad range of topics, and could range from very easy to fairly complex. One thing to keep in mind is that top tech companies are more likely to ask you more difficult technical questions than smaller companies.
Do I need to prepare for technical interviews?
As intimidating as they may seem, you don’t have to be a genius to be good at whiteboard problems. The number one reason why people fail these is simply because they didn’t spend any time preparing for them. People think “oh well I just spent four years getting a degree, surely I can solve a stupid coding problem”… but that’s not how it works. Being good at whiteboard problems is almost entirely unrelated to being a good programmer. So much so that the use of whiteboard problems for hiring is widely controversial.
However, like it or not, this is how the industry works. If you want a good job, you have to bite the bullet and get really good at solving whiteboard problems. It’s not actually that bad though; it kinda feels like solving puzzles. If you’re like me, you may even enjoy it!
How do I get good at solving whiteboard problems?
Practice practice practice!
There are a ton of books and online resources to help you master these types of problems. To name a few…
- Cracking the Coding Interview is an extremely popular book written by a former google engineer and interviewer. It’s a really good resource if you have the time to go through it (it’s pretty long)
- Firecode.io is a really cool interactive site for learning
- Leetcode is a competition style site with lots of interview-like questions.
- HackerRank is my favorite resource for learning whiteboard problems. Specifically, HackerRank has an interview preparation kit that is really excellent. It’s a set of problems that were handpicked by the author of Cracking the Coding Interview. It covers about every type of question you might see in a technical interview, and has a discussion and answer page for each question. I recommend this one the most.
Along with practicing by yourself, it’s really helpful to get an experienced friend to do a mock interview for you. Ask them to pick a question they know well, and present it to you as an interview question. Try and solve it on a whiteboard just like you would in a real interview. This is really helpful, because for some reason it feels very different interviewing with another real person.
Tips for the actual interview
Ok, so you’ve made it to the technical interview. Hopefully you’ve spent a lot of time leading up to this moment studying and preparing. Here are my best tips, based on personal experience:
- First, it’s completely fine to not know the answer right away. Don’t panic just because you haven’t seen the problem before. Breathe, take your time, and take it step by step.
- Ask clarifying questions. The interviewer will be intentionally vague about details of the problem. They want you to ask them about possible constraints, limitations, and details of the problem that they’ve given you.
- Think out loud. Your interviewer is as interested in your thought process as whether you can solve the question. They want to know how you go about solving something you’ve never seen before, and what you’re thinking at every step. Even if you don’t get the most efficient answer, you might still make it to the next stage if the interviewer liked your thought process.
- If you have no idea how to start, simulate some very simple inputs by hand. Pick the simplest example input you can think of, and talk about how to solve it. Then move to a slightly bigger input. Hopefully, you notice a pattern or an algorithmic way you can begin to solve the problem.
- Use descriptive variable names. If you’re used to doing a lot of problems on HackerRank or LeetCode, you might be tempted to use short non-descriptive variable names to save time, but it’s very important that your code is readable, even if it takes a little more time.
- If you can’t think of the most efficient solution, start with brute force. Often times problems have an efficient way to solve them, and a very inefficient way. It’s completely ok to implement the bad solution first… Just make sure that you tell the interviewer that you recognize that this is probably not the most efficient way to solve the problem.
- Test your code when you finish. I don’t mean write test code, but walk through your code out loud with a few different inputs, and look for bugs. If you find a bug, mention it, and ask the interviewer if they want you to fix it, or simply talk about how you would fix it.
- Suggest possible improvements. Once you’ve finished the problem, talk about some ways you potentially could make it better for different situations.
Thank you for making it to the end of this rant.
I hope that you learned something useful, and I’d love to hear from you with any questions or comments you have about software, this guide, or anything at all. My email address is email@example.com
Best of luck!
All views and opinions expressed in this article are my own, and do not represent the views and opinions of my employer.