A Comprehensive How-To on Internships

* I'll try to keep this page updated, so expect semi-regular changes to anything you might see here.

Finding an Internship

When a company gives you an offer, they are offering you money to do a job. The core of getting an internship is proving that you can do that job successfully. There are a couple primary contributing factors to whether you can be successful at work (in no particular order):

When a company considers you for a role, they are trying to evaluate how closely you meet these 4 points. Your job, when looking for an internship, is two fold: meet these points, then prove that you meet these points.

Projects

Do personal projects! Personal projects accomplish a couple things:

Resume

There are lots of good resources out there for structuring resumes, but some good general rules of thumb are:

One of the more controversial resume topics is GPA. The general rule is to put your GPA if it's over a 3.0, but don't put it if it's below a 3.0. Personally, I don't think anyone in software should put their GPA, mainly because it's been proven unnumerably many times that GPA and skill at work at top companies are not correlated. As such, I would seriously hesitate to work for any company that still asked me for my GPA. That said, having a GPA above a 3.0 on your resume isn't going to hurt you, so do whatever you want.

Referrals

Don't be a referral beggar. A lot of people like to treat referrals as some kind of magic cheat code for getting jobs, but that is just not true. Referrals get you interviews. If you're good enough to get hired by a company, you will be good enough to get an interview from that company without a referral, so the referral really has very little utility in the context of getting a job. Further, begging for referrals (especially from people you have not even worked with) disrespects the entire concept of internal referrals. The point of the reference system is to help companies find good engineers through their current employees' connections, not for insecure programmers to get some kind of exclusive "in" to a company.

That said, if you have worked with someone, don't be afraid of asking for a referral. Under a time crunch, a good word from a referrer can help expedite the hiring process for you.

Recruiters are People Too

When you're talking to a recruiter, ask plenty of questions and go ahead and sell yourself, but don't waste anyone's time. If you're at a career fair and there's a long line of people waiting behind you, that is not the right time to launch into a 30 minute monologue on your life story and childhood struggles and your dog died and you hate long sleeve shirts because you find them stuffy and hate how the sleeves get rolled up under jackets and... see how it gets annoying? Remember, the recruiter is trying to hire someone for a technical role, so walk up, get the information you need, make yourself available to the company, and get out.

Conclusion on Connections

Connections are very useful, but you should be landing jobs by being qualified, not by making friends with hiring committees.

Where to Find Internships

Apply to just about everywhere. Career fairs are a great place to learn about companies you haven't heard of before (more on career fair etiquette soon), but you should also apply to a lot of companies online. Startups especially are less likely to be present at career fairs, so reach out to all the ones you're interested in.

Interviews

If a company likes your resume, you'll be asked to schedule an interview with them. Then, you'll be asked technical questions, usually solving a problem using data structures and/or algorithms. Make sure you're familiar with the big-O times of adding and searching for all the common data structures (e.g. binary tree, BST, directed and undirected graphs, hash table, hash map, trie, linked list, etc.). You likely won't be asked to recite attributes of these structures from memory in your interview. However, you will be asked questions for which one or more of these data structures will be extremely useful, so you should know when and how to use each of these data structures. Similarly, you should familiarize yourself with the well known classes of algorithms and practices (e.g. recursion, dynamic programming, all the well known search and sort algorithms) and when to use them.

Interviews are definitely something you need to practice for. Throughout the year, you should be meeting up with friends either on or above your skill level to interview each other. Being interviewed is helpful because you get experience solving technical puzzles as fast as possible. Interviewing someone else is also helpful because you start to see what a real interviewer is going to look for in a candidate.

Once interview season starts, you should also practice real interviews. If you get an interview with a company you don't particularly want to work for, don't just say "Nah, I'll find some other job. This isn't worth the effort." Interviewing is a learned skill, so go the whole mile. Research the company beforehand. Go to the interview. Crush the interview. It usually takes me a solid week of interviewing to ramp up to my full interviewing skill each year, so having a good number of these ramp up interviews will solidly prepare you for interviews at the companies you do want to work for.

Specifically, before each interview, you should:

During the interview:

Also, read books. Cracking the Coding Interview is wonderful and extremely comprehensive.

Choosing an Internship Offer

Note that everything in this section is just a general suggestion. The offer you go with will vary based on your situation. That said, here's the list of suggestions:

At Your Internship

Writing code in industry is entirely different from writing code at home or classes. More here soon.

Code Quality and Speed

Culture

Staying Focused on Improvement

TODO