I applied for internships at several tech companies this year, including Google, Facebook, Foursquare, Dropbox, Twilio, Bloomberg, and Fog Creek.

Below, I describe the interview processes of all these companies. To potential applicants, this article will provide all the questions I received in these interviews, and it should be a helpful resource for interview preparation. For all coding phone interviews (where I didn’t sign an NDA), I include the actual code written during the interview.

I can only provide anecdotal evidence, but I believe my interview experience at these firms provides insight on their hiring philosophies.

This is a long post (~3000 words), so feel free to skip the companies that dont interest you.

1) Google

# of Interviews: 3

Position: Software Engineer Intern

Experience: I applied online at the Google website, then received an email from HR about three weeks later setting up two consecutive 50-minute phone interviews (with a 10 minute break in-between). I signed a non-disclosure agreement, so I wont give the exact questions. Both of these interviews were very different from my experiences with other companies.

In the first interview, the interviewer called me 20 minutes late, so the 50-minute interview became a 30-minute interview. He asked a low-level coding question involving UTF encoding. When I first heard the question, I had no idea how to know to answer it. I didnt have much experience manipulating individual bits, so I slowly anddeliberately repeated the question back to him, to make sure I understood what he was asking. I quickly Googled how to use bitwise operators in C and found this wonderful code snippet on StackOverflow that made the problem easy to solve. I wrote a solution with time to spare, and the interviewer seemed content with my answer.

(UPDATE: To address the concerns of some readers who brought up the ethical concerns of using Google in a phone interview, I have a point of clarification. After I finished that UTF encoding problem in my interview, the interviewer asked where I got the check-bit macro (he saw me paste it in). I told him I got it from StackOverflow. It didn’t seem to concern him.)

In the second interview, I spoke with a Google employee who managed a server farm and worked on the firmware for Googles proprietary server hardware. During the interview, he did 90% of the talking, taking most of the allotted time explaining how awesome his job was. In grandiose terms, he described in full detail the facility where he worked, and explained how petabytes of cached searches were stored in his servers. He only asked me a couple questions, and they seemed to be questions aimed towards Electrical Engineers (E.g. questions about decreasing power consumption in his hardware). I used my meager knowledge of physics and EE to give vague answers, but he responded well to them.

After the phone interviews, I wasn’t happy with the questions asked. I didn’t think they allowed me to demonstrate my knowledge of Computer Science. There were no questions about data structures or algorithms, and the only clever thing I managed to do was quickly Googling an answer to one of the questions. I was hopeful, but not very confident about my chances.

A couple weeks after these two interviews, HR contacted me again and,to my surprise,they told me I made it to the final round. My recruiter sent me this email explaining how the last round works:

As a brief overview, the next stage in the process is to find a project for you. This process can take three weeks to complete and there is no guarantee that we will be able to find a project or extend an offer. We promise to do our best to match you up! As part of the project matching process I will share your information with our intern hosts. The intern hosts will review your information and will notify me if they feel you are a potential fit for their project or team. Provided we receive host interest I will schedule you for a 30 to 45 minute host interview. This interview will be via phone and is intended to explore how strongly your skills are matched for the project. While hosts conduct these interviews in different ways you should be prepared for this to be a technical interview (as many hosts do wish to further explore how your technical skills map to their projects).

The way this next round works is unique to Google. All applicants who make it to this stage are put in a matching pool. What this means is that all of these applicants (their resumes, candidate profiles, scores from past interviews, etc.) are put into a database. Potential hosts can search through this database, filtering results by programming languages, GPA, scores, etc. Each host gets to pick the specific intern that he wants to be matched with for the summer. Often, this host will select a bunch of applicants for a third round of interviews, then choose an intern out of that batch.

I was in the matching phase for over three and a half months before a host selected me for a third interview, not the “three weeks” my recruiter described. Being matched with a host was a huge relief; during my period in limbo from November to mid-February, I decided to turn down another offer for the chance of getting a Google job.

In the third interview, I spoke with an engineer who worked on the HTML5 video interface for YouTube. He asked me to write a simple DOM selection function in Javascript, and then we had a short discussion about event delegation. It seems the interview went well. About fifteen minutes after this last interview, I received a call from my recruiter offering me a position at YouTube in San Bruno, CA.

Googles interview process is clearly a flawed system, and the absolute worst part of their system is the matching phase. It seems this matching pool is very useful and convenient system for the hosts; the hosts get to select interns that have skills tailored to their needs. However, the matching phase is an agonizing process for the interns. After about a month in the matching phase,I turned down another offer (since the deadline passed), taking a huge risk in order to have a possibility at a Google internship.After turning down the other offer, I was in the matching pool for another ten weeks, at which point I had given up all hope on getting a job offer from Google. Somehow, things worked out.

Offer: Yes

2) Fog Creek

# of Interviews: 6

Position: Software Engineer Intern

Experience: After applying online at their website, I received an email response from HR setting up a phone interview within 2 days. I had two 45-minute coding phone interviews using EtherPad, after which HR sent me an email inviting me to the New York office for an in-person interview.At the Fog Creek offices, I had 4 separate 60-minute interviews with Fog Creek developers.

Fog Creeks questions were the most mathematical and data-structure heavy out of all of the companies where I applied. All the interviews involved ANSI C coding questions, and they involved building some pretty cool functions. Here are some of the questions asked:

[redacted at the request of Fog Creek]

Onsite Interview 3: Write itoa. I was surprised they asked this since it was explicitly mentioned in Joels Guerrilla Guide to Interviewing as a good interview question.

Fog Creek had arguably the best interview process out of all these companies. HR responded to emails quickly, their questions were challenging but doable, and they provided great amenities when I visited the office. Their system was methodical and thorough. Even though I didnt receive an offer, I believe I demonstrated my skills as a programmer the most accurately in Fog Creeks interviews. It makes sense that Fog Creek would have an outstanding interview process: their CEO Joel Spolsky has literally written a book on hiring tech talent. Im not surprised they consistently create awesome products.

Offer: No

3) Bloomberg

# of Interviews: 3

Position: Financial Software Engineer Intern

Experience: I applied through the Campus Career Center website and had a 45 minute on-campus interview. Then, I was asked to go to the office in New York for an onsite interview, which ended up being 2 60-minute sessions. All the coding questions were small C string manipulation problems. Nothing required more than 8-10 lines of code. Example questions:

Write a function that transforms a string such that sequences of consecutive underscores become a single underscore. E.g.\ (_hello___world__ => _hello_world_)

What is the difference between the stack and the heap?

Given a char* string, write a function that returns the index of the last occurrence of the most frequently occurring character.

Write a function that takes in a char *string and converts series of consecutive identical characters to the number of consecutive characters and the character itself. E.g. (aaabbbbcccccdde => 3a4b5c2de)

All the questions they asked at Bloomberg were of the variety you would find in Programming Interview Prep books. As a company, this is a dangerous practice; using well-known questions increases the probability of bad hires. A mediocre programmer could memorize the examples given in Programming Interviews Exposed and do very well in a Bloomberg interview. To make things even worse, I was asked the same first question in both my on-campus and in-house interviews (it was the consecutive underscore question). It took me a few minutes to solve the first time, but of course the second time I wrote down the answer immediately. For a large company like Bloomberg, that is simply lazy. I doubt it was a coincidence; I bet Bloomberg employees are given a booklet of sample interview questions to ask applicants.

Offer: Yes

4) Dropbox

# of Interviews: 0

Position: Software Engineer Intern

Experience: Going into the year, I wanted to work for Dropbox more than any other company. They are growing at an incredibly rapid pace, I use their product religiously, and they solve a computationally interesting problem. I applied online and didnt receive a response. After two months of waiting I dug around the Dropbox website and found the emails of two recruiters. I emailed them both, sending a specially written cover letter and my resume. I got nothing back. Not so much as an email acknowledging my existence. Such a bummer.

Offer: No

5) Twilio

# of Interviews: 2

Position: Software Engineer Intern

Experience: I applied at the Twilio website and received an email back from HR the very next day. I had two 30-minute phone interviews and didnt receive an offer.Example questions:

Create a Tweet Search Engine that allows you to insert Tweets into a database and search for Tweets by word or phrase. No relational database should be used; all data structures should be stored in memory. Code

Describe different types of database indicies (primary, unique, index, etc). When do you use each of these indicies and how do they differ at the data structure level.

Describe database normalization: what are the requirements, different normal forms, why is normalization important, etc.

I didnt get very far through Twilios interview process, so I cant comment much on the topic.

From what I experienced, their questions focused less about data structures/algorithms and more about web development and databases.

Offer: No

6) Foursquare

# of Interviews: 2

Position: Software Engineer Intern

Experience: I applied online, and about a month later, HR contacted me to set up a phone interview.

The first interview didnt involve coding; it was more of a technical discussion. First, the interviewer and I each gave 5-minute introductions describing own backgrounds and the projects we were working on. Then, for the next half hour, we discussed a several CS topics. A couple things we touched on:

Transactions in database systems

Deadlocks, lock granularity

Concurrency, Petersons solution

The next round was a coding phone interview. In this interview, they asked me to implement a Foursquare leaderboard in a scripting language. Essentially, I had to create a class that stored the number of points a user earned in each of the past 7 days, implementing methods addPoints(user, points) and getTotalPoints(user).

My first solution was a seven-bucket array that stored the number of points the user earned in the past seven days. When a user earned points, those points would be added to the 0th bucket in the array. At midnight, a cron job or some other function would shift all the point values to the right and a 0 point value would be placed at the 0th index.

After seeing this, the interviewer explained that as the userbase gets large, running a daily cron job would be computationally expensive, and asked for a better solution.

I added a property that saved the timestamp of the last time a users point-array was updated or read. Upon a new read/update of the point-array, a method would calculate how many days has passed since the last read/update and shift the point-array accordingly.

A couple weeks after the second phone interview, I received an offer.

Offer: Yes

7) Facebook

# of Interviews:

Position: Software Engineer Intern

Experience: I applied online in the first week of October. Over two months passed and I didnt receive a response, so I reached out to my friend who had interviewed at Facebook the year earlier. He gave me his recruiters contact information and I reached out to her. Immediately, she responded saying that they had too many applicants, so I would have to solve a timed 45-minute programming challenge on InterviewStreet as a pre-phone screen.

I expected the challenge to be easy since it was, after all, a pre-phone screen. I thought it was pretty hard, but you can be the judge yourself (Facebook Interview Question). I started answering the question in PHP for 20 minutes, at which I realized I had more experience coding these types of data structures in C and decided to switch over. It was a poor choice. I didnt finish the problem in time and didnt get a next round.

Offer: No

Takeaways

Here on a few of the lessons I learned through the college interviewing process:

Interview preparation books are good, coding for fun is better - Most of the questions interviewers asked me were not types of questions covered in interview prep books.Really good questions will involve some data structure or function you’ve never seen before. In my Fog Creek interview, the interviewer asked if I had heard of a Gap Buffer before. When I responded “no”, he said “good”, proceeded to describe a Gap Buffer and asked me to implement one. Interviewers want to see how you handle something new. This is why coding for fun is valuable; when I build something new for fun, at least 25% of my time is spent on Google and StackOverflow learning how to do X, Y and Z. Through this practice, you learn how to learn new things quickly.

Apply early and dont be timid - My sophomore year, I didnt apply for summer internships until February. By that point, a lot of tech firms had already made their summer hires and I didnt get a job at a top tier tech company. My junior year (this year), I sent in all of my applications by the first week of October. If the companies dont get back to you, find the email of a recruiter and send them a message. Use any contacts you have. Does your cousins half-brothers uncle work for Facebook? Reach out to him and ask for a connection to HR. You have nothing to lose by asking.

Have a side project - I know, everyone says this. But seriously, do it. Every company above asked me to describe an interesting past programming project. Having a side project will make your introduction spiel more interesting, it will show you are passionate about programming, and it will give you experience solving real problems. Talking about my side project (ClosetPilot, a Poshmark bot. Learn how to be a better seller with these Poshmark tips.) never failed to impress interviewers.

Conclusion

I hope you enjoyed my inaugural post in the blogosphere. I haven’t seen any articles outlining the differences between tech companies’ interview processes before, so I decided to write one myself.

If you’re wondering, I decided to accept the offer from Foursquare.