Pair programming
I've pair-programmed a lot during my career, though it has only accounted for the minority of my time. I've also watched other people pair programming; the interactions between partners can make for very interesting viewing.
Before diving into what I think makes good pair programming, I'm going to describe what makes bad pair programming.
Back-Seat Driving Is Not Pair Programming
Because I've been doing TDD for a while, I'm used to deliberately letting my code go through a little bit of a worthless phase before it gets good enough to integrate. Maybe I'll leave out handling a failure condition until I see it fail or add that in at the end. Perhaps I can't think of what to call a method so will name it DoTheThing() until I've got a clearer image.
What I have to remember is that my partner might not work the same way. Yes, it's annoying to see an unhandled condition, or a variable that isn't named according to my preferred convention...