3 Things You Need to Know Before Applying for a Software Internship

1) Being an A+ student is not enough

Crazy, right? All your life you’ve been lectured on the importance of getting good grades so that you can get a good job and have a successful life. But it’s hard to read the news these days without coming across a story of some young college dropout founding a multi-billion dollar company, and that probably raises all sorts of questions in your mind – like is university and the debt associated with it worth it? Do I need to be a straight A student to be successful in life? Heck, do I even need to go to school at all?

Last year, Laszlo Bock – senior vice president of people operations at Google – when being interviewed about the importance of grades and GPA, said that there is “no correlation at all except for brand-new college grads, where there’s a slight correlation”.

So what’s going on? Well, computer science jobs are precisely about challenging the status quo. They are  highly biased towards problem solving ability – which means it is about applying fundamental concepts to solve novel problems – and they are highly meritocratic. There is a significantly smaller degree of subjectivity when measuring success and performance in jobs likes software engineering when compared to fields like consulting or accounting. In those fields, the easiest thing to do when measuring success is to place more emphasis on traditional traits and characteristics like years of experience, seniority and the name of the college you attended. With software engineering, you’ve either built a product that scales to handle 10,000 requests per second, or you haven’t. Simple as.

You want to get a job at Google? Well, show them that you have the skills to do the job (hint: getting an A+ is never listed on any of Google’s software engineering job specs). That brings me to my next point….

 

2) Build build build

Employers want to see evidence of your ability to create real world value. Most computer science classes are focused on theory and hypotheses and less on the practical. Unless you’re working on research, being able to produce real world software is a must for landing a software internship.

You don’t need to have built the next Facebook on your spare time, even just a slight modification on a tutorial based project shows passion and interest (of course, publishing something on an app store is even better).  Also, learning how to use industry tools like Git will also beef up your resume, even getting familiar with IDEs (e.g. Eclipse) used in your company of choice helps.

Show companies that you’re prepared to do more than the norm. The tools and tutorials available these days make getting a side project started a cinch and working on them shows companies that you love what you do, and that a career in CS is not going to just be a paycheck.

 

3) Know how to talk to people

This extends to both your cover letter and interview. Above all, you want to take the opportunity to convey your passion and interest in the company and its products.

I remember one internship I applied for a month or two ago where their main product was in computer networking. I got an interview and part of my own prep since I hadn’t done a networking class yet, was to blitz through a networking textbook so that I would be able to explain the basic theory of how their product works. Companies want to see that kind of determination and keenness. Working in CS doesn’t mean that you know everything there is to know about technology X, it just means that you are the kind of person who can seek out the necessary knowledge and apply it quickly and correctly.

And don’t just stop at the formal recruitment process when trying to engage with a company. There doesn’t need to be a limit to your interaction with a company. One of the questions that interviewers ask themselves when trying to find the right candidate for a job is, would I want to work with this person? The recruitment process should ideally be a dialogue between two interested and like-minded parties, not an interrogation.

As an example, a few companies I applied to didn’t have any information available online about their interview process but I’d gone to campus and recruitment events earlier on during the year and was able to capitalize on that information during the informal Q&A sessions after. Anything else I wanted to know I picked up by just searching for connections on LinkedIn. People in the tech world are generally extremely helpful. And when it comes to recruitment, everyone is always keen to help their company seek out new, talented engineers since they’re a rare commodity!

Competitions and Code Jams

Given the dearth of posts lately, I’ll be the first to admit that keeping up a blog is hard – who knew that going back to school would be so busy? With midterms and finals happening pretty often, it’s taken some getting used to going from coding (and blogging) everyday to, well not.

Don’t get me wrong, you can learn to be a better coder and computer scientist without writing lots of code (I’m taking an intro to probability class for example), but there’s no substitute for it. You don’t become a better runner without actually having your shoes hit the pavement. So one of the ways I’ve tried to make sure I code often enough is to place myself in code heavy situations: coding competitions that are held on campus, entering Google Code Jam, and also doing hackathons. Here’s what I’ve learned:

1. Microsoft Coding Challenge

A few weeks ago, Microsoft came by UBC and hosted a coding competition for an evening. If you’ve never done one of these before, it’s a great experience. If nothing else, it gives you an idea of where you stand relative to other people. The format that evening was to break up into groups of three and you were then give a couple of hours and 6 problems to solve. Along with the problems, some small sample input and expected output of your solution was provided. Once time was called, you were then given 10 minutes to run large inputs using your solution code, the output of which was sent to the judge. The team that solved the most problems in the given time won cash prizes. Who doesn’t love money and the bragging rights that go along with a win?

The types of problems we had on the night varied in difficulty. The hardest one (at least if you hadn’t done it before) was writing a Sudoku solver (I doubt many people could have done this in the given time frame without having seen a solution beforehand), while the easier problems were similar in difficulty to this one from Google Code Jam where you’re given some money and the price of some items in the store, and have to find the position of the two items that will match the money you have.

My team ended up doing ok, I think I may have cost us third place with my “accidental” edit of the large input before running it through my solution (don’t do that), but it was a great experience. I learned pretty quick that my coding skills weren’t as rusty as I thought, but also that there was still quite a lot I could do to improve my placing next time around.

2. Improving your placing in a coding competition

My top tips for doing well in a coding competition:

  1. READ and understand the problem description before even thinking about writing any code
  2. It can be useful to check your understanding of the problem by manually processing (i.e. doing by hand) a sample input or two, to make sure that what you think you should be getting, is what the judges want to see!
  3. NEVER edit the large input or output. TRUST your code! One of the problems I did involved text processing and while the sample input gave me something readable, the large/test input did not. I panicked, thought I’d done something wrong, and proceeded to edit parts of the large input thinking a whitespace character had killed my program. I was wrong. My program worked just fine. Gibberish was the solution! If your code works with the sample input, it will almost certainly work with the large input! DOH!
  4. Use a high level language like Ruby or Python. You don’t want to have to worry about static typing when you’re up against the clock. The only condition to this is that if your solution is being tested against very large datasets, then a lower level language can be a lot more efficient
  5. Make sure you’re comfortable reading and writing to files. This is how you’re going to be processing input and returning output
  6. Make use of pre-written snippets of code/libraries (if allowed). Output formats for a given coding competition don’t really change from year to year and you can save valuable time by having the code which goes “Case #1: <output>” written beforehand

3. Hang on a second, how good exactly do you need to be to enter a coding competition?

To enter a coding competition, not much since entry to the qualifying round of coding competitions is mostly free and without requirement. I’d definitely encourage you to enter, no matter where you are on the coding spectrum (just make sure you’re googling and stack overflow-ing ability is up to scratch!) –  you can learn a whole lot just by entering and participating in a competition. If you solve a problem, that’ll build up your confidence and you’ll be even faster next time. If you don’t and you struggle, that’s ok too. You’re going to learn what does and doesn’t work. In Google’s main coding competition, Google Code Jam (which is open to the public – albeit registration has closed this year), you can view any user’s submissions. That means a chance to learn from the best. Reading efficient code that gets the job done (especially when you haven’t quite been able to), is a great learning tool.

Most coding competitions that are open to the public have qualification rounds which aren’t too bad so definitely check those out. Google Code Jam’s problems in the qualification round (at least the first few) are manageable as long as you know how to read to and write from a file, how to write loops.

4. Forget entering, I want to win! How good do I need to be to win competition X?

I’m no expert, having a entered a grand total of two competitions but I’d say that the best coders who win competitions like Google Code Jam (where there’s $15k as the grand prize) are good. More than good, they are practiced. Since there are only so many ways to ask coding competition questions, it becomes a case of knowing certain approaches and algorithms, and being able to apply them to slightly novel situations in the minimum amount of time. For sure, the best guys and girls out there are practicing on sites like topcoder and I wouldn’t be surprised if a lot of them have put in thousands of hours of practice to get where they are.

Most of all, I think they enjoy it. As helpful as coding competitions are for helping you get noticed in the job hunt, you don’t have to place in a competition to land a job at Google or Microsoft. It helps but it’s not a requirement. After all, coding competitions test a very particular subset of skills. Most importantly, the limited time frame of a competition is not conducive to stylistically good and well designed code – vital where the cost of maintaining the codebase for a feature far outstrips the cost of its initial creation.

 

EA Careers Event

Today was one of the days I really valued being back at university. Sure, the education process at university can be a bit slow sometimes, what with the system of pre-requisites and other formalities, but it makes up for that with the relationships it has with big name companies.

Electronic Arts is one of the the big names in gaming. From casual games like The Sims and The Simpsons: Tapped Out, to more hardcore games like Battlefield 4, EA has got everything. Tonight’s event was a chance for students in the Vancouver area to find out more about internships and jobs at their Burnaby campus which focuses mostly on sports titles (ever heard of a game called FIFA?).

Due to its location, EA is big recruiter of students from UBC, where I’m currently a student, and it’s definitely somewhere I would love the chance to intern at. We started the event with a tour around the campus and it was… cool! I was impressed by the sports facilities on site. There was an indoor basketball court, a gym filled with TechnoGym machines, couple of yoga studios, and a full-sized football pitch.

EA's Football Pitch

EA’s Football Pitch

Sorry for the bad photo. We weren’t meant to take photos anywhere else on campus besides a couple minutes on the balcony. Even in the darkness, that’s one cool football pitch.

The talks were pretty interesting as well and I got one of the questions I’ve always wondered about answered.

How does EA engineer the same game for multiple consoles?

It turns out that there is a core EA tech team which develops software that sit on top of the various SDK (software development kits) for the different consoles. This software acts as a common interface that abstracts away some common tasks. For example, the software might have the feature of opening a file, to the user this is just a simple function, but in the background, the software is interfacing so as to perform the same task (but in different ways) for each console’s SDK. This means that engineers working on a game can focus on the game itself, rather than trying to make it work for each individual console.

There you go, you learn something new everyday. And here are the two main languages used at EA

Key languages  for a career at EA

C++ and C#