Posted by & filed under Road.

为自己转载。

原文:http://www.andrewmunn.com/2011/01/how-to-land-an-internship-at-a-top-tier-software-company/

How to Land an Internship at a Top Tier Software Company

Want to work on the highest profile software projects in the world? Want to get paid more per hour for an internship than the average CS grad makes out of school? Want TechCrunch to call you a genius? Then read on to learn how to land a killer internship at companies like Google, Facebook, Amazon, Microsoft, or Apple. In the following paragraphs I will teach you how to land interviews and succeed at technical interviews. This is the guide I wish I had three years ago when I was starting out as a fresh-faced frosh.

My Credentials

I’m Software Engineering student at the University of Waterloo in my third year. In the past two years I’ve interned at a startup called Xtreme Labs, Amazon.com, and Google. At Amazon I worked in the exploding industry of cloud computing – creating the next generation of Amazon Web Services. I worked on Elastic Beanstalk. At Google I contributed to the upcoming Honeycomb release of Android. In addition to these internships I have interviewed with many startups and established companies like Facebook, Microsoft, Zynga, Bloomberg, Hulu, and Qualcomm.

I still have three more internships to go before I graduate. I expect to learn even more about the interview and internship process in that time, so this is not the definite guide to software engineering internships. Feedback, corrections, and suggestions are welcome.

How to Land Interviews

Scoring interviews with respected software companies is difficult, but with an impressive resume it is possible even in your early years. The key is standing out. Your grades don’t matter as much as your side projects. If you submit a tight resume that boasts that you build websites, work on a start-up, and run an active github account, you’re almost guaranteed an interview with any tech company (Exception: Microsoft, they only interview upper year students). Once you complete your first internship, interviews are easier to get because once you work for one big software company, the rest want you.

Don’t have any side projects or notable work that sets you apart? Unfortunately you might not get a top-tier interview in your first few years of school. But maybe you’ll get lucky, especially if you follow my resume do’s and don’t’s.

Do…

  • List all side projects and open source contributions front and center.
  • List Notable languages and technologies you know. Emphasizing that you know some of the cool, hip languages suggests that you’re a passionate and smart techie. Things like Haskell, Scala, Node.js, and NoSQL databases. Experience writing iPhone or Android apps shows you are self driven and have an entrepreneurial spirit.
  • List notable skills, activities, and interests. They shows you have a life outside of computers, which many companies claim to look for. And Sometimes they will catch the eye of the reader or interviewer, which helps you form a personal connection.
  • Cut out hackneyed phrases. For example, you don’t need to mention that you have “Excellent written and oral communication skills” or that you’re a “team player”. Those phrases are boring and the poor resume reader will hate you. Let your team projects and previous work experience implicitly illustrate your strong interpersonal skills.
  • List your CS interests. Think scrum is the best thing since canned peaches? list it. Can’t get enough of path finding algorithms? Put that down. Convinced concurrency is going to revolutionize software? Mention it.

Don’t…

  • Describe the classes you take in school (unless they are noteworthy, i.e. taking a grad level course on compilers)
  • Make the resume too long. Brevity is awesome. Cut out the chaff and emphasize the wheat.
  • Be modest. A resume is no place to be humble. Describe all your projects and experience in the most impressive way possible. However, don’t lie. Even if you can fake it in the interview you’ll probably be out of your league in the job.
  • Make your resume look like everybody else’s. This is absolutely crucial. Make your resume standout by using a different font and layout than your friends. However, never sacrifice readability for a novel layout.

For some examples of resumes, checkout mine or my friends Fravic Fernando [PDF] and Derek Thurn [PDF].

Get a Recommendation

There is a better way to get interviews. Get a recommendation. I was recommended to Google by a friend of mine. If you’re not socially awkward penguin, this is the best way to ensure you get an interview. Full time employees will practically beg you to let them recommend you because of the generous referral bonuses most companies handout. Even if you can’t get a full time to recommend you (because you don’t know any), an intern referral can be just as good.

The key to getting recommendations is effective networking. Network at school and work. Meet people at conferences and hackathons. Befriend the recruiters of major tech companies. Effective networking is outside the scope of this guide, but it’s essential to a lustrous tech career.

How to Ace Interviews

Software engineering interviews test you on your ability to think in highly stressful situations, communicate your ideas effectively, and win over the interviewer with your charm and intelligence. Typically interviewers do this by asking you to quickly and efficiently solve algorithm and data structure based software questions while clearly explaining your thought processes.

This is actually incredibly hard. This is how Google, Amazon, Facebook, and Microsoft can claim they only hire the best people, by failing most people at the interview stage. Many qualified candidates fail, but that’s on purpose. It’s better to have false negatives than false positives. See Joel Spolsky’s influential essay.

Many online guides to interviewing at Google perpetuate the misconception that interviewers ask logic questions, such as “You have a weight scale and eight rocks. One of the rocks is lighter than the rest. How do you find the light rock?” You will never be asked a question like this, so don’t waste time practicing them.

Another misconception, that unfortunately my own school perpetuates, is that you’ll be asked soft skill questions such as “When was a time you resolved a problem with a coworker?” I have never been asked a question like this by a top tier company. Typically the only kind of question you will be asked are algorithmic questions. Note: startups and stodgy, old companies like IBM and Sybase will ask you soft questions.

Startups want to know why you really want to work for them. They’re looking for extremely talented and motivated individuals. Chances are they are only hiring one or two interns, so there is no margin for error. Y-Combinator startups generally want to see your github account and value if you’re somehow involved in the startup community. Side note: if you go for startups, be prepared to get paid less and work harder, without any guarantee of equity. It’s not for the faint of heart, but it’s one hell of a way to learn.

The first step to mastering interviews is studying core computer science concepts. Every question you are asked in a technical interview will involve at least one of these concepts:

  • Objected-oriented programming
  • Single and two-dimensional arrays
  • Single, double, and circularly linked lists
  • String manipulation algorithms i.e reverse a string, find the longest palindrome
  • Recursion
  • Hash tables
  • Stacks, queues, and heaps
  • Trees
  • Binary search
  • Merge sort
  • Quick sort
  • Linear time sorts (Bucket sort, counting sort, radix sort)
  • Depth and breadth first search
  • Pointers
  • Bitwise operations
  • Algorithm solving approaches (divide and conquer, brute force, dynamic, etc)

Other more advanced concepts that are nice to know are design patterns, graph theory, and map reduce. I recommend picking up a copy of CLRS, it’s fun to read (if you ignore the proofs) and covers most of the bases. Additionally it will probably be the book for your algorithms class.

Programming Languages

Usually you can write code in any programming language, but I’d recommend at least knowing Java and C/C++ to cover cases where no choice is given. For example, Qualcomm will often require you to write C functions. Google, Facebook, Amazon, Microsoft and VMWare will typically let you choose the language of your choice within reason. Occasionally you will be asked questions about assembly code. A decent understanding of how to use the stack, set registers and jump in and out of functions is important.

Python or Ruby are excellent choices for programming interviews because of their succinct and easy to follow syntax and powerful built-in features and the general familiarity in the software community. Knowing one of the “hip” languages can be useful. A friend of mine and his interviewer bonded over a shared love of Haskell, which secured him the job.

Practice, Practice, Practice

It’s vital that you are comfortable coding on paper or a white board. I was totally unprepared for the first time I was asked to code on paper. I was so nervous I botched a simple linked list reversal algorithm. Since then I’ve practiced coding on paper before every interview period at Waterloo. Get a bunch of friends together and ask each other questions you’ve heard in interviews or found online. It’s invaluable preparation.

Failure is not an Option… Usually

If you are asked a technical question in an interview and cannot provide reasonable answer in a reasonable amount of time you will fail. No exceptions. Most companies do two or more 45 minute interviews. In a 45 minute interview expect to answer two to three questions (occasionally one question if it’s very tough). If you only manage to get through the first question, you failed. If you don’t finish the second question in time, you fail. If you sit there quietly for too long you will fail. If you come up with an O(n log n) solution and don’t even realize there was a O(n) solution, you usually fail.

But… sometimes you get lucky. During an interview I came up with a O(log n + k) solution to a problem when the ideal solution was O(log n), but I explained that I implemented it my way for simplicity. After the interview I assumed I failed, but I still got an offer. This illustrates that it is critical to express yourself and your thought process clearly. if you can’t come up with fastest solution, at least explain that you’re aware that one exists and roughly how to implement it.

Hints

Sometimes you’ll need a nudge in the right direction to finish a question, and it’s acceptable to ask for a hint. For example, I was asked, “How can you implement a queue using only stacks and still achieve efficient dequeue() performance?” I started off by quickly describing the operations of queues and stacks, and then explaining the naive solution and how it would require O(n) time to dequeue an element. I was a bit stuck, so I asked for a tiny hint. My interviewer said, “what if you used two stacks?” “Eureka!”, I shouted and then coded up my implementation and described how it worked. Asking for that hint gave me enough time to answer the next question and move on in the interview process.

“Heard this one before”

One gray area of interviewing concerns what to do when you receive a question you’ve heard before. You can either lie and say you’ve never heard the question, or reveal that you know the solution. I’d recommend admitting you know the answer, because this establishes a bond of trust between you and the interviewer. Getting a job by lying isn’t the best way to start an internship.

This has only happened to me once. I stopped the interviewer mid question description and told him that I’d heard that one before, and I quickly described the solution. Instead of asking me a new question we just had a chat about life the company I was interviewing for. I got the offer.

Poker Face

The one aspect of interviews I hate and fear is the poker face. This is when the interviewer never lets on if you’re on the right track with a problem. He or she will simply frown at you, never revealing whether you’re making a complete idiot of yourself. You’ll finish writing code only to hear, “Are you sure that’s correct?” This is the most terrifying question an interviewer can ask you. Stay calm and carefully walk through your code and explain what it does. There is nothing else you can do. On occasion, post-interview, I realize I made a mistake or even misunderstood the question. It’s a terrible realization.

I’d estimate that about half of interviewers use the poker face technique. It is the stuff of nightmares.

Social Skills

Beyond pure skill at solving programming problems, social skills are critical to interviews. If you’re a socially awkward penguin and can’t imagine wowing an interviewer with your social skills I suggest reading How to Win Friends and Influence People by Dale Carnegie. It will teach you a great deal about how to get what you want and still make everybody happy in the process.

For example, in an interview I recognized my interviewer from a presentation he had given the year before. After introducing myself and shaking his hand, I mentioned how much I had enjoyed his presentation. This sparked a 15 minute discussion. When we actually began the programming questions, I only had time to answer one. I feared that I had failed, but to my astonishment, my interviewer brushed it off by saying we had wasted lots of time talking and not to worry about it. I later learned that the question I missed was a real doozy. That discussion might have gotten me the internship.

Confidence is king. Don’t constantly ask the interviewer if you’re doing it right. It makes you look weak. Act like you’re interviewing the company to see if they are good enough for you, as if it’s a forgone conclusion that the company would want you, and that you’re trying to decide between them and three others. Just like in dating, nobody wants to be around somebody needy. However, avoid arrogance. If the interviewer suggests something to you during a problem, by all means take their advice. Interviewers love it when you take their advice.

It’s OK to make jokes. Especially at a place like Waterloo, the interviewer will appreciate some humor after a day of boring interviews. It’s best to avoid self-deprecating humor. I once joked that I was terrible at recursion during an interview and despite answering all questions correctly I didn’t get an offer. Most importantly, never joke that the product of the company you are interviewing with is evil. Especially if that company is Sandvine. Apparently just because they make deep packet inspection technology doesn’t mean they told Comcast to use it. Learned that the hard way.

One area where social interaction can make or break the interview is the last five to ten minutes when the interviewer asks you if you have any questions. Start asking the interviewer what he or she does at the company, how long they’ve been there, and if they like it. You’ll have an interesting conversation that will make you stick out in the interviewer’s mind later. As a plus, you’ll learn a little bit about the culture and happiness of employees at that company.

Dress Code

Don’t wear a suit. Suits are overly formal for interviewing with hipster, west coast software companies. Plus, who wants to work for a company that expects a suit in an interview? Walk into the interview in jeans and a trendy t-shirt from threadless.com. For example, I showed up to an interview with Facebook wearing the three wolf moon shirt and my interviewer smiled, laughed and said that was the coolest thing he’d ever seen somebody wear to an interview.

Note due to reddit outrage: This advice only applies to laid back consumer products companies and startups. Dress formally for healthcare tech companies, banks, defense contractors and companies you aren’t sure about. When in doubt, go for business casual.

A rising tide lifts all Boats

Help your friends prepare for interviews. Do everything you can to get your friends good jobs. Recommend them for a position at your current internship. The more friends you have at good companies the more referrals you can get in the future. I have friends at every major tech company, which will help when it is time to apply for full time positions.

Even when you’re competing with your friends for the same job, help them out. Most top tier tech companies will hire as many interns as are qualified. Even if you’re friend does a better job in the interview than you, that likely has no bearing on the results of your interview. Plus, having friends with you on an internship is a blast. You can move across the country and live together. Last term I lived with six other Software Engineering students in Mountain View. It was epic.

Now go forth and prosper!

So there you have it. You should be now be prepared to succeed at applying and interviewing with top tier tech companies. It’s a lot of work, but it’s worth it. One final word of caution. I’m merely a know-it-all college student. Take everything I’ve said here with a giant grain of salt.