How To Have An Awesome Summer Internship
Last week I gave a talk at Rutgers about how to make the most out of your summer internship. Over the past few years I've worked at a fair variety of companies, and I've screwed up a lot in the process. Before heading out into the world of a full-time engineer I wanted to codify some of the lessons that I've learned in hopes that future interns will be able to avoid some of the pitfalls I ran into.
In case you randomly stumbled here and have no idea who I am: Hi! I'm Jonathan. I'm a recent Rutgers grad who now works as an Android engineer at Yelp. When I'm not doing that, I help make a Hacker News reader called HN and occasionally fix up stuff in the Github app. I also stay tuned into Rutgers by helping admin the Rutgers Hackathon Club, a Facebook group where students and alumni hang out.
Before getting started, I want to save people's time by mentioning a couple things that I won't be talking about in these slides. For one, I won't be talking about how to land your dream internship. The reason for that is simple: I don't know how to land your dream internship.
My strategy for getting an internship was to get really good grades and then apply everywhere that would have me. That turned out pretty well for me, but from what I understand that's not The Right Way to get your dream internship. Sadly, I can't speak to The Right Way, but a bunch of other people have written some awesome stuff about it. Check that out at the links above.
The other thing I won't be talking about is how to land a full-time offer after your internship, mostly because I think that's a misguided goal for the summer. Spending your summer focused on getting a full-time offer is putting the horse before the carriage in my mind. Instead, spend your summer focusing on how to improve your skills as a developer and then let good things follow. If you're curious about how to land a full-time offer, ask your recruiter about it, they'll be a way better resource than me anyway.
Cool, now that that's out of the way, time to get into some of the stuff that I will be talking about (the stuff that those puppies are really excited about).
2/3 of what I'll be talking about is inside the workplace stuff: what to expect, what you'll be learning, what to look out for, and how to make the most out of your time as an intern. The other third is stuff that I screwed up and how to avoid that yourself.
With that in mind, I suppose it makes sense to define what exactly makes an awesome internship. For me, the answer to that question is two-fold.
First and foremost, an awesome internship will set you up for a successful career over the long-term. Your first experience as a full-time developer can feel like an overwhelmingly important experience, but in the grand scheme of things it's just one small time slice of a much larger career.
Instead of treating your internship as a make or break moment for your career, look it as another opportunity to improve your craft. Focus on soaking up all the knowledge you can from your teammates and your environment. That way, when you get out of college you'll be able to make a solid decision about where to work full-time.
At the same time, an internship experience be super serious all the time (or arguably ever). During your summer You'll probably be getting paid heaps of money to run around an exciting city, possibly with support from your employer (if they have an official intern program set up). Having an awesome internship is just as much about experiencing the best parts of your temporary home as it is professional development.
Before you get started interning, one thing to realize is that many times during your summer you may feel like a dumb person in a room full of experts. THAT'S OKAY. In fact, that's not only okay, it's expected.
You're probably be put onto a team with a bunch of people who have 5+ years cutting code for a living. It would be ridiculous to expect that you'd rock up and be coding at their level after a month of experience professionally creating software.
You weren't hired with the expectation that you'll put out the same quantity and quality of code as experienced engineers. Rather, you were hired with the expectation that you'll struggle a bit and do some bumbling around before figuring out how things work.
So don't feel bad when you have to ask "how do I submit my code for review", or if it subsequently gets shredded on review. Those types of struggles are TOTALLY NORMAL and are part of the growing process. Even the superhuman senior architect on your team was once there too.
Although you aren't expected to have flawless development skills, you will want to take the opportunity to improve as much as possible and learn as much as possible about how to become a better developer.
The first half of improving your skills as a developer is increasing your knowledge of all the technical stuff that goes into making software. A lot of this will happen organically just because you'll be reading, writing, and getting feedback on lots of code. However, you can also take a couple of steps to supercharge your learning.
First: actually read documentation. By read documentation I don't mean "open up the docs and press CTRL+F". That's not reading documentation, that's playing the blind squirrel hoping to find a nut. I mean actually take the time to sit down and read them until you fully understand them.
It may feel weird and unproductive and weird to spend a full day reading docs. Again, DON'T WORRY, spending 6 hours just reading docs is TOTALLY NORMAL; hell, it's sometimes what you need to do to get your job done. Remember, you aren't expected to know everything when you get there, so the only way you're going to learn stuff is to read.
Secondly: use your mentor to get you unstuck on problems. Chances are you will have a mentor assigned to you, try to figure stuff out on your own, but when you're stuck, ask him or her where to look next.
At the same time, it can be a little bit of a guessing game when to ask your mentor for help and when to dig a little deeper. My general rule is to follow the method outlined in this blog post.
There's also the possibility that you won't have a mentor assigned to you, if that's the case just grab a friendly full-timer and ask them your question. Again, remember that asking questions doesn't make you any less of a developer, we all need help sometimes.
Third: ask your mentor big picture questions that will help you better understand how to develop large-scale systems. These are questions like "how is our X designed? Why is it designed that way? What are some limitations of that?"
One awesome strategy my friend Vaibhav uses to find these questions is to write down any term he hears that he doesn't understand down in a notebook. Then, once or twice a week he'd have lunch with his mentor and just pepper him with questions about his company's technology. Steal that or come up with your own strategy, but whatever you do, figure out a way to learn about software engineering from someone who has been doing it already.
The second class of things to learn during your internship is how you can improve your own tools and workflows.
During the course of your internship, you're going to run into a lot of people who do things differently than you. Constantly be on the lookout for these differences, and try to figure out how to steal the good stuff for your own workflow.
As a rule, if you see someone with something that looks useful, whether it's a cute keyboard shortcut or a random productivity tool, you should ask them what they're using and how it helps them work better. If their method seems like it would solve a problem that you're having, head back to your desk and make a note to try it out.
Don't let this list languish. Block out time every week to improve your own workflows. This time may be spent solving some of your own pain points or it may be figuring out how to use the new hotness that your mentor showed you last week. It may seem like a waste to not spend every hour working on your intern project, but any investment in your productivity now will pay big dividends over the long haul.
The other thing to be on the look-out for are the soft skills that other developers posses. You'll undoubtedly run into people who are awesome communicators and problem solvers. Many people who are great at these two skills have systems or tricks that they use to be great. If you find yourself impressed with how someone communicates, see if you can recognize those systems and incorporate them yourself.
The technical side of things is really only part of what you can learn and get out of your internship. There is also a wealth of non-technical things that you can pick up during your summer which will serve you well.
Once of the biggest things I screwed up during my first two internships was being asocial. I would show up to work, eat lunch at my desk, and then head home every day with barely a peep to my coworkers. Both times this turned out to be a terrible decision, as it resulted in me being burned out and dreading work by the end of my internship.
At Yelp!, I decided to flip the script and actually take some time away from my desk. I joked around with my teammates, played foosball with other interns, and staunchly refused to eat lunch at my desk, even if it meant eating by myself at 3 PM in the park.
The difference was massive. Every day I felt like I had energy to solve problems, and when I started to feel down I could always find someone who could help give my mind a break. Most importantly, I never woke up dreading going into Yelp, which was a huge boost for both my happiness and my productivity.
It can be tempting to spend your entire summer with a laser like focus on your terminal (especially if you're focused on getting a FT offer), but trust me, DON'T DO IT. Not only should be a FT offer not be the focus of your internship, but also you'll be happier and more productive if you step away from the computer every now and again.
Besides learning to take breaks, the most important non-technical thing you can learn during your internship is what matters to you in a company culture. It's easy to think of this as "is a company filled with cool people?", but there's so much more to it than that.
Culture is questions like "is this environment comfortable for me?", "if I feel uncomfortable, do I have an avenue to fix that?", "am I cool when/where/the amount I'm expected to work?”, and many more. One of the best articles I've read on this subject is Where To Work, which gives a great breakdown of the types of cultural values that are universally important.
If your company hits high notes on those types of big picture questions, then you'll have a good time working there even if it isn't filled with your BFFs. However, if you're working with a bunch of "cool people" with unsatisfactory answers to these questions, then it may not turn out well over the long haul.
Whether or not your summer is spent working with cool people, be on the look-out for whether you're working somewhere that has a culture that you fit with. Understand what it means to fit somewhere vs. not fit somewhere, and figure out what questions you can ask of future opportunities to figure out where you'd fit.
Internet blogs are riddled with stories of people who tried to be a 10x engineers and ended up a shell of their former selves. DON'T LET THAT BE YOU THIS SUMMER.
It can be tempting to fall into the trap of "I need to work all the hours to get a full-time offer." If you find yourself thinking this way, ask yourself: If you had to work this much for two years, would you still be happy? If not, then you probably don't want that full-time offer anyway, so killing yourself isn't doing much for you.
There is no magic formula for working sustainably, but as a general rule, you should be trying to work at a pace where you feel like you're able to focus throughout the day. If you find yourself sporting any of the signs in this article it may be time to scale back the number of hours you're working.
Every few months a post appears in /r/AskReddit basically asking "how the hell do I make friends after college?" This question seems silly if you're used to a university setting filled with casual interactions, but it highlights the fact that making friends out of school can be non-trivial, especially if you're starting from scratch.
If you're interning in a city where you have a bunch of friends from college then this probably isn't much of a problem. However, if you're taking an opportunity where you don't know anyone within 50 miles, you're going to have a bit more of a challenge.
Put yourself out there by organizing/attending events with other interns (most companies will have an interns chat room or mailing list, go hang out there. If one doesn't exist, create it). If you're a solo bandito intern at your companies, find local groups that do stuff that you're interested in and start regularly attending those events.
Whatever you do, don't let your summer be characterized by you sitting around in your apartment by yourself. Not only is this a bummer of a way to spend a summer, but your mental health will suffer pretty badly in the process.
So yeah, that's pretty much all my thoughts on internship. I'm sure that I could write another couple hundred words, but most of your eyes have probably glazed over by now, so that wouldn't do much good.
If you have any questions about anything I wrote here, or you just want to tell me that what I wrote was good/misguided/so terrible you can't believe they let me on the Internet, feel free to contact me at one of the links in the second slide. Also, I'll be organizing a couple things with Rutgers Hackathon Club peeps over the summer, so if you want to get in on that let me know.