I get asked this a lot, especially from freshmen and sophomores who hold a lot of ambition and carry tremendous motivation. You’ve taken a couple of CS courses, know basic Java or C++, and want to make sure you don’t waste the most glorious three months of the year. You know you want to be productive, and become more skillful, but are not sure how. This post is for you — a gentle introduction to what your options are and hopefully help you evaluate each of them.

Me

If you don’t know me, or are wondering why I am making these recommendation, I am a junior at the University of Washington in Seattle studying Computer Science. I am extremely interested in the state of computer science education and have opinions about how it can be improved, which I’ll try to keep out of this post. I did a year-long research project (I wrote about it, too), interned at LensKart.com (a startup in India) and then at Google. I’ll work with Madrona Venture Labs in Spring 2015 and then spend summer back at Google. I also worked on my own startup which we shut down recently because of a lack of traction.

So, I think, I am in a good place to give my own recommendations and suggest some options that all CS students should consider for their summer. I’ll try to give both advantages and disadvantages for anything I recommend, most of which will be based on real-life experiences of mine and my peers.

If you have any questions or comments, feel free to reach out to me.

Internship

To be specific, internship at a medium or a big established company — some of the best options here are Google, Microsoft, Amazon, Facebook, Twitter, Palantir, Twilio and the list just goes on. This will be the best way to spend your summer, working with some of the best and the brightest engineers, designers and managers in the world, solving problems that you can never face in an artificial (school) environment. You will have a chance to bond with other interns that make up a very diverse demographic, that you won’t get to experience in any other place.

Getting a great summer internship should absolutely be your first priority, nothing else will beat the things you’ll learn and experience. The amount of impact you’ll end up having cannot be matched easily, especially as a student. For example, take my friend Katie, who interned at WhitePages in summer 2013 and within her first month there she wrote a Python program to extract an unused data from a Postgres database, massage it, and load it on to a Solr search server. In her second month, in order to make this process repeat daily for 500 million data points, she parallelized the code and switched to using six Solr servers. She then wrote a Chef recipe to set up the servers on AWS and robustly recover from failure. In short, Katie made a system that keeps the companies core databases in sync and fresh no matter what — being a data company, the code she wrote supplied oxygen to the heart of the company. Imagine the impact she had on the company and its users.

The first step to getting an internship, is to apply. A lot of people I know are just too afraid to apply, even to companies they really want to work at because they are waiting to get to the perfect resume or to take that one class. Even though companies like Google and Microsoft hire thousands of interns, there are many tens of thousands of applicants, so the positions tend to run out (for summer internships) usually around January of the year. Before your interview, make sure to brush up the fundamentals — basic data structures and algorithms, problem solving, string manipulation — and practice a lot.

Startup Internship

I have heard people say that, compared to an internship at a big company, their experience was exponentially better at a startup. The trick is to chose a startup that you admire, and whose mission speaks volumes to you. If you cannot empathise with what they are doing, you’ll have a hard time working there. Take Tosin Afolab who was a front end developer at Kivo, redesigning and implement UI for their core product. “It was a great internship but startups are hard in the long run. There are a lot of ups and downs and you need passion in the product to get through the lows. Passion makes it feel less like a job and more like a mission. it makes the late nights worth it.”, he says.

But when you do find “the right one”, it almost feels like magic. Another friend Tejas Manohar interned as a software engineer at Populr, a startup helping communicate your business and sales messages beautifully with web pages. During the internship, he worked on a variety of things from migrating the WYSIWYG editor to spam prevention to Slack integration. When I asked him why he thinks others should intern at a startup, he replied, “At an early-stage startup, you’ll have a large impact in the direction of the company, learn the internals of operating a company, and get the opportunity to explore multiple areas”. At Populr, apart from the software side of things, he also delved into business, sales, and marketing via open team discussions and Populr’s strong emphasis on the product and customer rather than technology.

The takeaway? Startup internships can be extremely demanding, as you fill in multiple roles, and work on multiple projects during the summer. They are great if you know you work hard, and if you have a “whatever it takes” attitude.

The first step here also is to just apply. “But I don’t know which company to apply to”. Sure you do. A lot of apps you use, websites you visit or products you put to work are made by startups (Medium, the website hosting this post is a startup☺). The point is, startup are everywhere — you just need to be curious and mindful. Get in touch with the companies whose products you love and use, and think you can make better. Send them an email telling them about yourself and how you think the product can be improved. Ask if they are hiring awesome interns. If that sounds too much work, Hacker News posts a “Who’s hiring” thread on the 1st of every month, where startups post their job openings. Watch out for that and get in touch with companies that you like there.

Research

Almost all schools with a strong CS program have excellent researchers working on cutting-edge projects, needing research assistants. That’s your in. Look through your schools website and find the researchers or the projects that you like, send them an email saying you want to help them out and, usually, they’d be happy to take you under their wing. The good thing is, most of them do not expect students to have a ton of experience or skills. As long as you are willing to learn and help them, they’ll guide you along.

My friend, and fellow UW CSE undergraduate Sunjay C, worked on a research project called Triceratops, under UW’s SPARTA team. Triceratops modifies Android apps to prevent malicious apps from doing malicious things. Given a set of policies (e.g. “Only allow internet access when ‘upload’ is pressed in SnapChat and at no other time”) and a possibly malicious app binary, Triceratops directly modifies the bytecode of the app so that the policies are enforced. The practical real-life applications of this project are massive, and valuable to a ton of companies and indie developers.

Here’s a sample email you can send:

Hi <name>

I was browsing our CS website for interesting research projects and stumbled upon <project name> which caught my eye.

I was wondering how you <insert a question related to the project>.

I would love to learn more about the project and potentially get involved with your lab. Would you be open for a quick chat this week? I can come by your office on Tuesday at 3pm.

In either case, I hope to see more great projects from your lab!

Thanks

<your name>

The point of this email is to be gentle; remember, most faculty and graduate students are extremely busy and tend to ignore long, pointless emails. This email works because

It shows you did your homework, and were genuinely curious enough to ask a thoughtful question

You are willing to open a discussion without coming off as desperate

Closing on a happy note, irrespective of their response

I would highly discourage you from spamming a dozen people with this email. You only want to email those who you admire, and who you really think you can work with.

Start a startup

Running a startup is a full-time commitment that requires blood and tears. If you start a startup just to pass a summer, please don’t — no one will benefit from it. You cannot, and should not, run a startup when you know in three months you’ll be back in school. Paul Graham has an amazing essay explaining in more detail why, so I’ll leave that out. You should, however, do side projects.

Side projects

If you are unable to find an internship or a research project, do not be disheartened because you still can be productive and continue learning. I am a huge proponent of side projects; they keep you on your feet and give you a chance to tackle problems in a (for the most part) self-help environment. Working on side projects is a tremendous excuse to learn new and upcoming languages or frameworks and stay ahead of the curve.

When you are beginning, learn to learn horizontally rather than vertically.

Instead of working on random projects through the summer, work on open source projects that make you more marketable. What do I mean by that? Well, say you want to learn Python. Don’t just learn Python, learn its web frameworks too. Or the graphics processing library. Or the scientific modules. Since you probably do not know what you like yet, I’d suggest you play with as many niches as possible, and spend the summer really defining your interest areas, and learning invaluable skills that schools usually don’t teach.

I recommend open source because you can build a public portfolio that you can point future employers or anyone else to, and I think learning and doing anything in public puts a sense of accountability in you (more on this in next paragraph) Moreover, you’ll do actual good for the ecosystem of software. I cannot think of any product that doesn’t use open source technologies; heck, most programming languages are open source. Some fellow students I’ve talked to are intimidated by open source, it just feels like a gigantic organism that is too hard to poke. But really, it’s not.

But because there is no formal commitment to any organization or person, being motivated enough for months to work for yourself, is hard for most people. So I recommend that you find other people to work with and collaborate with on whatever projects you are/want to work on. Once you feel accountable to others for whatever you want to do, motivation kicks in. Moreover, the team player skills you learn will stay with you forever and help you grow even outside of engineering.

Conclusion

Well that was a lot, right? These are just some paths that are most common to CS students that I have seen. I hope I was able to give you a balanced picture of each option, with input from my friends. But maybe there’s an unheard path that you know of but many others don’t. I’d love to hear about it.

Have a great summer!

Thanks to Skyler Kidd, Sunjay Cauligi, Katie McCorkell, Tosin Afolabi, Tejas Manohar for reading drafts of this.