There were two technical phone interviews, then three informal meetings with engineers from different teams. The two technical phone interviews were using an online collaborative code editor with a "Run" button enabled in the first interview, but disabled in the second. Enabling or not code execution seemed to be up to the interviewer.
The first technical interview started with the interviewer presenting himself and asking a little about my PhD work. Then he explained the problem I had to solve. He did not really want me to start coding before I had the best solution. I struggled 30 seconds to find a good solution, then he gave me a helpful hint and I could figure it out. I discovered later that my program had a bug, but the interviewer did not seem to notice it.
The second technical interviewer had a strong Chinese accent and was tougher for me to understand. He first asked a relatively simple array question and then told me to run my solution manually on a medium-sized example. This was long, painful, and not really insightful. I also was not sure if he did this because my solution was buggy. He then asked me a harder more mathematical question. With luck and intuition I was able to figure out a very efficient solution. I did not feel like the interview was a huge success, and the interviewer did not seem super friendly.
Finally I got to talk with engineers from 3 different teams: a static analysis team in Menlo Park, a very research-y team in Seattle, and a compiler team in Menlo Park. This was always casual and nice to talk with them. They let me pick the team I wanted, I chose the compiler team.