I am frequently asked by friends of friends on how to prepare for interview for software engineer position (mainly at Google). Here is a summary of my opinions.
Note that this is my personal opinion and does not stand for any party. And personally, I do believe that the opinion works for other good software companies as well.
I think Google in general respects a person's background and interests so the first thing to prepare is the candidate's previous experience. Though the decision of hiring has nothing to do with what a candidate has done previously, how well the candidate was doing and how clearly he/she is able to explain a complicated project will affect the hiring decision.
Second, Google always emphasizes on "codibility". Everyone from Presidents and CEO to the frontline engineers has to know how to code. (Eric, the Google CEO, was the author of lex.) So, the candidate is expected to be able to code in some programming language. The particular kind of programming language does not matter, as a good programmer can quickly learn, the way the code is written does matter. The "way" refers to algorithm, data structure, design trade-off and etc.
Third, a particular team in the company might have particular interests, which often match the candidate's background/interests. For example, platform team might have some particular interests in particular areas such as kernel, device driver, and etc. So, the candidate might expect to get into the details of the deep understandings of some of these topics if the resume shows relevant experience.
Finally, Google cares the personality of the candidate. So, the candidate might want to go through some Google-related websites (e.g. google.com/about.html) and understand some Google culture (vaguely called "Googley") to see if there is a fit.