There were several steps to my interview process: an application, a programming quiz, a short quiz over the phone with a recruiter, and a longer quiz over the phone with an engineer.
I applied online. After a week I got an email from a recruiter asking me to complete a programming quiz. The quiz was easy: 10 multiple choice C programming questions where you had to identify potential problems in code as it was written. The only thing C++ about the quiz was that one question used a "new", everything else was plain C. The quiz took less than 30 minutes to complete.
After I completed the quiz, the recruiter and I arranged a time for a phone call. The recruiter missed the call at the time we had agreed on, and it took a followup email from me to arrange another time.
The recruiter didn't miss the second time completely, but the call was still 10 minutes late. The call with the recruiter was brief, maybe 20 minutes, but it was surprisingly technical coming from the front lines; I had to answer several programming and data structures questions, "what is the running time of such-and-such algorithm" and "what does this keyword mean" kinds of questions, the kind where you need to provide a short answer and you either pass or fail. I answered them all well except for a C++ question, which was enough to get me onto the next round of interviewing.
The next part of the interview happened the next day. It was a one hour phone call with a software engineer working on the same project I'd be working on. This call was more of a measure of the breadth and depth of my programming and computer science knowledge.
The call began with me describing the most interesting programming projects I had done in the last few years. I told the engineer about some numerical programming I had done as part of a school project. We eventually got into discussing possible issues with floating-point numbers, things like how you can lose precision when you're performing certain operations with values close to machine epsilon and so on. This process continued for about 20 minutes, with me describing the major programming tasks I'd accomplished and the potential problems with the techniques I used.
He then quizzed me on some data structures, asking me the definition of so-and-so structure and how it might be implemented. It was just my luck that he happened to pick one that I'd never studied before, and I missed the question completely. You really needed to have studied something like the big white algorithms book (CLRS) cover to cover and have most of the concepts in your memory ready to go to be able to pass this part of the quiz, because I feel like he could have asked me anything and expected me to give a deep response.
There were other questions ranging from features of C++ and OOP design patterns to computer architecture, which were hit and miss for me. Again, I felt that I needed to have read a solid textbook cover to cover on these topics and have the knowledge readily available in my mind to have been able to pass this part of the interview; the questions can come from anywhere, and they expect very deep answers to every question. Being more of a C guy I really struggled on some of the C++ questions. I might have had a better chance of succeeding had I taken the interview closer to graduating college.
After the phone interview, the recruiter got in touch within a few days and told me that I didn't pass the last part of the process. Had I passed, however, the next stage would have been a 6 hour programming quiz and then an onsite interview in Redmond.
Overall I had a positive experience. I'm glad they provided feedback on my interview, which means that the process wasn't a total waste of time. I've interviewed at other companies (one started with an A) who provide zero feedback at the end of it all. This interview, however, showed me the weak points of my knowledge and left me wanting to improve myself.