Working with people who don’t code very well is always a big anti-pairing boogeyman for folks, but working with people who don’t people very well is very much more difficult.
Is there a skill-factor in pairing well? Sure there is: it’s the skill your mom invoked when she said, "Use your words, honey, use your words." The hardest pair partners are the ones who don’t speak.
My favorite pairs are just like me, they say what they think, whether they’re the typist or not. They ask me what the hell I’m doing when it’s not clear to them. They tell me why the screen is suddenly showing blood in the gutters.
They tell me what the test they’re entering is gonna do when it runs. They tell me that the line they typed will pass this test but fail those other ones. They tell me when they are bored or frustrated.
The other thing a good pair has is confidence in the part of herself that isn’t in coding. Without that whole self, you get pairs who are too afraid to be wrong in front of you or paradoxically too afraid to be right in front of you.
Scared people don’t make good pairs. The most common source of scared people is the fear that if a person is mistaken it must mean that person is deeply flawed — weak or stupid or immoral or slow or what-have-you.
This goes both ways. When I’m mistaken, which happens a lot, my pair won’t tell me it’s right in front of my face. When I’m correct, which happens a lot, my pair won’t listen when I say they’re heading down a dead end.
I happen to be working with a crack team just now, 4 of us who are old hands at this game, and one poor bastard who’s new to this style of work and still learning it. Pairing with them is a delight. We tell each other what we think. We screw up and laugh, we kick ass and laugh.
So. Being a good pair does require a skill, the skill of thinking out loud. And it also requires a state, the state of knowing that a person is not defined by the presence or absence of mistakes made while programming.