JOE MOORE: My name is Joe Moore, and I've pair programmed for almost thirteen and a half, almost every single working day. And for the last four years, I've pair programmed remotely using remote pair programming full time, out of those thirteen years. I work for Pivotal Labs. We're a Agile software-development consultancy. And I work remotely from Atlanta. There's two of you who didn't hear this. I'd love feedback at bit.ly dot com slash pairprogrammingama, it's totally anonymous. And, also, for the other people who walked in, there's a microphone here and a microphone over here. If you have questions, it'd be great if you could make your way that way and start, and queue up while I kind of blab on about some other stuff. If not, I'm gonna grab these mics and I'm gonna run around, and do a, I don't know, a Maury, maybe. I don't know who's, is he still around? Anyway. So, again, thank you for all, everybody for coming here. Who is familiar, at least somewhat, with pair programming? I'm gonna call that eighty to ninety percent. That's great. So, for those of you who don't know, pair programming is a software development technique, by which two programmers work on the same code, at the same time, solving the same software problem on the same computer. That's what pair programming is. And you can throw the word remote on there, and guess what, that's all that stuff, just using some remote collaboration softwares, such as video chat and audio chat and screen sharing and such. So what are the benefits of pair programming? I could have slides and slides and slides, but I'll just give you a few. It's everything from having a continuous code review to cross-training junior people and older people, or, or more experienced people. Cross-training people from different disciplines. You tend to introduce fewer bugs because you have two eyes on the same thing. You have differing opinions, which is really great, because that ends up raising what I call the whole team to what I call the highest common denominator. Because that kind of disagreement and such is really great. And it goes on and on and on and on from there. In general, the general principle, I think as most of us know, in almost everything, two heads are better than one when you're trying to solve hard problems. What are the challenges of pair programming? It's extremely, it can be very exhausting. Personality conflicts can be difficult when people don't necessarily get along. It's definitely what I would consider to be the most difficult software development practice to implement, both from a social point of view, from selling it to people on the ground people, to selling it to management that it's, not it's not just, it's not double the money and twice the time, et cetera. But it also, I feel, has the greatest benefits. So, it's the hardest, but it's got the biggest pay off, if you're willing to dedicate yourself to it. And this is the, one of the top three questions, so I thought I'd go ahead and take care of that now. When do you decide to breaks? When do you decide to go to the bathroom? And the answer is, whenever you need to go to the bathroom is the optimum time when you should probably do so. And it kind of points to, you know, you're just people working together. You know, you, you decide to take breaks when you're ready to take breaks. If you've been going for an hour, you've been going for more than an hour. Yeah, take a break. Stretch your legs. Play from ping pong. Use facilities. What you're kind of into. Take breaks. It's a super intense discipline. You, you do get tired, and taking breaks is super important. And do so whenever you feel like you need it. Need to. And with that, ask me anything. Who's got a question? Over here there's a question. QUESTION: So, my team has been doing pairing, but we find that, just subjectively, that it tends to slow things down by maybe fifty to a hundred QUESTION: In other words, things tend to go up to twice as slow when we do it. But we still use it for our hard things, like ramping up a new developer on a project, or laying the, the foundations for a new project. But not for a lot of other things, because of the time cost. And I was wondering if you could comment on how it effects your velocity and maybe we just need to look further down the road to see pay offs and velocity? Is it one of those things? J.M.: Sure. So, I'm hopefully not going. Raise your hand if you could not hear the question. Everybody could hear the question. That's great. Cause it'd be great not to spend time repeating. So it looks like the mics are working. So, you all heard the question. Velocity seems to slow down. I think that the empirical evidence has shown that, at least in a controlled environment, pair programming has been shown to slow down accomplishment of tasks by fifteen - one five - percent in a controlled environment. And I think that this is often with college students who are either paired up or doing solo. So that's certainly not fifty - well, five-zero - to a hundred percent. And there, there are other pay offs. But I guess my initial reaction would be, you know, pair programming is a tool, and the, you know, the, I would call it the lower-case agile toolbox. You know, not the, you know, it doesn't, it's not necessarily mandated. But there are other things that you might be able to apply if you find that things are just going really slow. And that is identifying the issue. And maybe you've already done this. You've already identified, this is taking twice as long and here are the five reasons why. And they're insurmountable reasons. So, I would say, you might want to use, you know, what's called a retrospective, or investigate, you know, dig deep into why things are taking too long. Are you arguing about stuff? Are, are the pairings so unbalanced that the senior people are constantly trying to pull up people who are, are, are more junior? Are there differing opinions and people are just constantly arguing? Those are, you know, there could be many, many reasons, so identifying the problem is the first step to figuring out maybe why it's taking that long, because in my experience, it should, potentially be a bit slower, on the metric of from moments on the keyboard typing the first characters to maybe doing a commit. And that's not what encompasses done software. That's just two people coming up with the best solution. And you can have other pay offs further down the line, such as your code is not as buggy. Your code is hopefully better-factored because two people are coming up with the design versus just one, et cetera, et cetera. So I would encourage you to dig deep into why you're having these problems, and see if you can address those problems. And then try it again, and, and measure again. Thank you. QUESTION: Just as a, kind of following, my big impression is that, in many cases, the tasks are relatively straight-forward, and so it just, you know, wouldn't take a single person much longer to do them. J.M.: Sure. QUESTION: And then, so the other person is kind of, you know, avoiding, helping avoid typos and, and, you know, that sort of thing. But maybe not adding as much value as they might be doing. J.M.: Right. So we've, we've had clients decide that, you know, they measure, you know, we use a particular project management tool that lets us estimate stuff. And it's called Pivotal Tracker. You don't have to use it. Cards on a wall. Whatever works for you. So we tend to estimate things sort of on like a one to eight scale. And we've had clients who have said, after they disengage with us, you know, anything that's a zero or a one, I guess I should have said zero to eight, they choose not to pair on those things, cause they find they don't get much value. That's, that's great for them. But they have made a rule that, well anything that's more of a, than a zero to a one on an eight point scale, that that must be paired. And so then maybe you re-evaluate the twos and the threes and then ah, looks like maybe the threes, they have, they're, those are getting pretty buggy. So let's bring pairing back into that. So that's a strategy as well. Let's go over here. QUESTION: If you could clarify, I have another question, but, if you could clarify just for a moment that fifteen percent increase, was that compared to one developer doing the task? Or was that compared to the relative work that two developers would do, you know, each individually, right? So, one developer doing a task takes this much time. Two developers doing the same task takes fifteen percent more time? But then that other developer isn't doing any work, right? So there's actually less benefit than might, might be- J.M.: Right. So the, I believe it was against a solo programmer- QUESTION: Right. J.M.: -working by themselves. QUESTION: OK. J.M.: But there, you know, but I, there were lots of other measures that showed, you know benefit of pair programming- QUESTION: Sure. J.M.: -above, you know, it sort of out, in the opinion of the report, outweighed this, this particular slow-down. QUESTION: So I, I think that kind of plays into my, my main question, which was how do you quantify to other stake-holders, particularly in the business, even other developers, and maybe measure the benefits of pair programming? I'm trying to incorporate it into our process more, but getting some resistance. We, we've given it enough to like experiment with, but how do we actually measure the benefits and say whether it's, you know, working for us? J.M.: That's a great question. Measuring the benefits and selling it to management, or your team. Selling it to anybody is I, I feel one of the hardest things to do. And even when I've been going over the empirical evidence, even the empirical evidence has said, like, more studies need to be done. More sort of metrics for measuring this, this stuff needs to, need to be developed. It's, it is really, really hard to sell it, because the math is just too easy. One plus one equals two. You just can't, like, fight that math. It's going to be, take twice as long and it's gonna be twice as expensive, right? And why would anybody ever do that? And I think, yeah, and in my experience, you, you know, I could, I could, we could try to come up with some metrics and we could look at, you know, I could point you towards these empirical studies and they have particular measures of how they measured, you know, different kind of factors. And I, I find that stuff it, it bounces off people. You're like, ah, yeah, that's all neat. But you've heard of one plus one equals two, right? And I think that this is an unsatisfying answer that I'm about to give you. There's a leap of faith that needs to happen, and I think you can kind of come back to like, let's pretend we're in a world where we can still do TDD. In a world where we did TDD, that was a leap of faith, too. Because it's like, that's twice as long. Why would you, you can't test something you haven't written yet. And that's gonna take twice as long. And I'm willing to bet almost everybody in this room has had that argument with somebody who doesn't practice, like, not just TDD but any kind of testing. It's too slow and it takes twice as long. And, finally, you're spouting all this stuff when you're talking about all the things that you, make almost, I'm willing to bet everybody in this room, love testing, to somebody, and it's just bouncing off and it's just bouncing off. And finally you're just like, ah, you just gotta, you gotta try it. You're going to see the benefit, I swear. And then finally they do, and usually you win them over. But actually, and I'll turn this around, because I know that there's lots of people in the audience here who have been more on the sales side of pair programming than, than I have. Has anybody, would anybody like to comment on success stories they have had selling management or clients of your consultants on how they've addressed this issue? Anybody? Maybe in this row here? Could I encourage anybody? Does anybody have anything to say? I've got a mobile mic. Ah, excellent sir. Don't break your ankle. AUDIENCE MEMBER: Hello, hello. J.M.: Does that work? AUDIENCE MEMBER: So one the, is this working? J.M.: Could I get this mic, this hand-held mic on? V.O.: It's on. J.M.: Oh, OK. AUDIENCE MEMBER: Hello. J.M.: Excellent. AUDIENCE MEMBER: That's better. One of the easiest ways that I've found to, to get pair programming into a team is to talk about the benefits of bringing, increasing your ability to absorb junior developers into your team. A lot of, I'm from San Francisco. A lot of companies in San Francisco are hiring their first junior developer. Like, right now. And so, one, a lot of discussions I've had recently have been along the lines of, OK, so we're bringing on our first junior developer. Everything we do has to change, because we need to vocalize a lot more things that we used to. And, so, what I tell them, oftentimes, is like, OK, one of the ways you can practice that, before the junior developer shows up, is by pairing amongst yourselves. Getting used to this idea of, like, vocalizing your thought process, understanding how you talk about writing code with each other, and then you can bring someone in who's in a very different place, and you'll be better-equipped to talk to them about it. J.M.: Thanks a lot. Thank you so much. Excellent. So, go ahead. AUDIENCE MEMBER: I had two things to say. Part of like, selling pair programming, like, for me, as a developer, it's been really awesome, just cause it forces you to get out of your own box of thinking and see how other people think about writing code and sort of, like, maybe you thought this one practice of how to do something was bad because you got bitten by it once, but maybe you can be convinced that, oh, no that's actually worth doing. It's a great way to like just share knowledge about gems that someone found on another project if you're coming into something. And then, like, to the junior developer point, like it's great cause you're there and you know, you ask, have you seen this part of the code yet? No? Then you go through and you explain, like, everything about it, cause you, you know, have, you write it and you can, or you understand it, and so that helps bring them in more than just sort of looking through all this code that may not have comments or was written by someone who left the company later. So those are my, like, big selling points. Like, I think it's made me much better and much more open minded developer, and like, made it much easier for me to collaborate, which yields, I think, like better code, and like, you know, over all makes your, your group better cause you're just better at collaborating and sharing ideas. And it sort of tears down the barriers of like worrying about, about bumping shoulders in communication. We'll get kind of heated, like you said, like and we'll just get through it, and in the, in the end come to an agreement on what will hopefully be a better idea or revisit it My question was kind of around pair rotation. So, like, if you're working on, on a team in an office or, we work with one of, we work with the clients' developers separately, like remote pairing, like we'll spin up an EC2 instance and we're trying to sort of figure out, like, proper pair rotations, so like, on a particular feature, two developers won't be the only ones like, who work on it, know it, and make, like, to some extent make all the decisions. And I'm curious, like, what your thoughts are on that, and like sort of, what you have found to be a good way of pair rotation, if, if you've practiced that at all. J.M.: Sure. AUDIENCE MEMBER: And things like that. J.M.: Yeah. Absolutely. So pair rotation. Super important. I think, several things can help encourage pair rotation. So one, yes, we do rotate pairs on a regular basis. There are extremes to this. There's something called, I've never done this, but it's been dubbed promiscuous pairing. I don't know if anybody has heard of this. And it's where you pair many times per day, like, on a timer basically. And there's been a little bit of evidence to show that that can be very productive. It's also shown to be disruptive and exhausting. So I think that, give it a, give it a try, perhaps. But for us, for practical purposes, what we tend to do is, it, it ties into the art of breaking down work. So we call our, the stuff we're working on, we call them stories. And we've gotten quite good at being able to break down deliverable stories to small enough pieces. This is all, in almost every case. To small enough pieces that, ideally, our pair developers will be able to get one or two of them done per day. And a long story, we'll say a big story, that's gonna take a long time, quote on quote long, that might be several days. Two days, maybe. Three days. So what I'm not saying is, this is going to take three weeks to do. Now, maybe there is a giant track of features, a huge feature set - the entire profile page rewrite. That might be weeks of work. But getting that link photo upload thing, just that small thing, that might be a day's worth of work or less. And so we tend to rotate pairs every day, if we can, at our morning stand up meeting. And, because ideally people will have completed one or two things the previous day and they're, they're ready to move on. And if they're not, and if they didn't complete it, there's, like, just a little bit left, and you could wrap it up with a new pair the next day and, and go on from there. What will happen, sometimes, is that pairs will request to stick, we call it. We're working on this thing, it's really long. We have a lot of context. We'd like to stick on this. OK, second, you know, that's the next day. Cool. Then the, you know, the third day comes around. Like, we still. We're almost done. We'd like to stick. And the whole team collectively is like, hmm. Maybe. OK. Maybe. OK. Go ahead. Fourth day rolls around. We're really almost done, I swear. And then at that point, like we, as a group, agree as a team collectively, like, we should get somebody else in. Often, at that point, the pair will say, one of us is gonna swap out. You know, Bob's gonna stay on. Let's get, who's available? Sally, you're available. Jump in. Fresh pair of eyes. They're probably stuck. You need a new perspective. And so we will force rotation that way, too. And just maybe taking it a step further, something that will often come up after this is, yeah, we rotate very often, but it's kind of like the same people, like. We're the same people on the time and kind of the same four people just kind of, like, go around and around and around, what you can do to combat that kind of a situation, where there's, there's rotation, but it's not balanced amongst the entire team, is you can just start tracking it. Just, you could do a white board. Like, keeping track of who's paired with who how many times, all the way to, there's even a website called pair tricks, I believe. Where you can sign up your company and, and you can put all the pairs in and it'll randomly assign people and do weighting based on how long, how long it's been since they've paired and things like that, but. So you can do something like that, like, every, or just keep track of it on a white board or a Google doc or something like that. K. Good questions. AUDIENCE MEMBER: Kind of a follow-up to that. H.M.: Sure. AUDIENCE MEMBER: How do you combine that with, like, sort of junior developers, like, sort of making sure that they're not going through so much context-switching that they're not really getting anything out of it, they're just sort of starting a feature and then, like, you know. So like, in our case, we'll start something and it won't, won't be done in one day, and then sort of, they'll switch and it's just kind of like, well like, I'm kind of like lost. Like I- J.M.: Right. Right. AUDIENCE MEMBER: I was barely beginning to grasp, like- J.M.: Sure. AUDIENCE MEMBER: -that part of the code that I was working on. J.M.: So I think just being flexible, you know, just because it's nine o'clock the next day doesn't mean that, you know, the judge comes in and, you know, breaks everybody up or something like that. And I think that if, if the team decides, you know, hey, it seems like this junior developer, they're three-quarters of the way, the, the senior and junior developer, they're three-quarters of the way through this task. They're trying to complete, yeah. Let them. Let them complete the task. And, because they're gonna get a lot of benefit out of seeing it from beginning to end. So don't be, I'm personally an advocate of just kind of playing it by ear. Just kind of seeing how it works out. Don't be so strict that you're being too disruptive, but don't be so, don't let people stick so long that you get these little sort of knowledge cylos and ownership and such. Great. AUDIENCE MEMBER: Thank you. J.M.: Sure. AUDIENCE MEMBER: A few questions on, I guess, team dynamics with pairing. This one's kind of a follow onto this one. J.M.: Sure. AUDIENCE MEMBER: I guess I'll spit them all out. J.M.: Go for it. AUDIENCE MEMBER: Monopolize things a little. One is, do you have any thoughts on, if you have a group of, a spectrum of people at different experience levels, are, can you talk about sort of the pros and cons of going with, like, senior senior, junior, junior, people at like levels, or to go junior senior to get more mentoring. Have you had any barriers with tools, where people just would be incompatible, say one guy likes Vim and one guy likes Sublime? And then, thirdly, do you have any, any wisdom to share on adding a test or QA person to a pair to get that person involved early in what role a, a QA engineer would play throughout a, a, working on a story with a pair. J.M.: OK. I may have to refer back to you to remind me what all those are. But I believe they were, experience level pairings, tool conflicts, and adding, like, a QA or a support person to the team. So let's do, let's do experience level pairings. I, I like, personally, I don't, I don't consider it being a big deal to mix up almost any kind of experience level pairs. Except the junior-junior situation. I wouldn't just randomly, personally, do that. So the obviously one is senior and junior. Those can be great pairings, right. Just, especially for the junior person. And that, maybe, a lot of people talk about pairing and say, oh, you know, we pair when we're wrapping somebody up. And they'll kind of use that as the only excuse for pairing. You know, we're wrapping up this junior person. But, that can put a lot of burden on the senior person. If they're always ramping somebody up. You know, if they're, if you get a new person every so often, then they're, if they're a senior person they might feel like they're always wrapping somebody up. I'm gonna encourage everybody to have the attitude of, well, one, share, share the load. Like, the junior person shouldn't just stick with the same person all the time. And also have the attitude, if you're a senior person, or have your senior people have the attitude that, they can always learn the junior person. On the last project I was on, you know, I've been doing software development for sixteen years. And I was pairing with a guy who was fresh out of college. And he didn't even have a CS degree or anything. He was just, well, you know, one of those smart people who just graduated from college, and he was doing something that was clearly way below his skill level. We're like, you should probably do some programming. Here, get over here. And, I learned something new from him every single day. You know, and I, the supposed expert, and everyday he's like, oh, did you know about this? Whoa. No. That's really cool. I would usually write it down. I kept trying to keep track of the things I learned each day. And then people at the same experience level, that's, that's great as well. You do sometimes have to watch out for people, especially senior, senior people, who maybe, let's say they once had the word architect on their names. Sometimes people are gonna be extremely opinionated and not want to budge from ideas. It's something to watch out for. People kind of, we call it thrashing. Junior-junior. Should you ever pair junior people together? And I think the answer is sometimes yes. Especially if they've both been through multiple, been through multiple pair rotations. They're kind of, maybe one of them has kind of been on that, let's make up the user, new user profile rewrite or something like that. And that junior person has kind of bounced between pairs, all kind of in that area. And they're kind of getting pretty good at learning some stuff. It might be good to swap in and have a junior person who doesn't have any experience in that area pair with this newbie but newbie with a lot of context. And then you can really help them exercise what it's like to have them own something. You know, own's a bad word. But whatever. You know what I mean. Tre- you know, bringing this other person up to speed. Transferring that context. And it, I've always found it amazing how, when I feel like I don't really know anything and I'm really relying on this other person, and suddenly the person I'm relying on kind of drops off, and I have to explain it to somebody else, it really forces me, personally, to dig deep, understand the problem much better. And I almost always surprise myself, both in how much I actually do know, and how much I don't know. So, once in awhile, having those junior people pair up and, and yes, struggle, like, have problems. Have to figure some stuff out, the way we all used to have to do when we were working by ourselves. OK. So that was a lot of that stuff. Tools. Wow. If you could see the email threads go around at our company, these guys know. These guys know. Key bindings. Tools. Vim versus RubyMine versus, versus Sublime versus TextMate versus frikin' Decorak. I mean, give me a break. Come on people. Yeah. That, that's, that's, it's a, it can be a huge struggle. And you can go to an extreme, that I don't really know of anybody else doing. Maybe some of you do this. I don't know. But we pretty much standardize on a particular kind of keybinding, and often an editor. It, it evolves. It isn't like, the manager doesn't come down and say, today we're a Vim company. The, the team ends up, you know, adopting, and the people who are kind of holding onto those other texts, they inevitably kind of like, OK, fine. Fine, I'll do it. And I did that, because I used to work out of the San Francisco office. Now I'm working out of the New York office. And they use different tool sets. It just evolved that way. And rather than stomp that out, we've let, we've let it evolve. And it's been great. My advice on that front would at least be this. One, be open to learning new things. Two, if you have your super awesome custom setup that's just for you, and your own, your precious, Vim bindings, don't stomp the defaults. Because maybe that person who doesn't really know Vim very well, they might at, or, or RubyMine or whatever your editor or tool of choice is, they may not know your thing. But they may know kind of enough of the default settings, that they can kind of get around and maybe, maybe they start adopting yours. Or maybe they say, yeah, I don't really use that key binding for this, I use it for something else. And, and be open for that. But people can sometimes be too closed minded about, you know, they build this little ecosystem just for themselves, and, and not want to, to change, and I encourage people be open to change, but leave the defaults. And be open to trying other stuff. But there's no silver bullet unless you mandate, our office is an X office and everybody just learn it. OK. Integrating other people into the team. Like, QA folks. And if you don't mind, I'll sort of mutate that question into pairing across different disciplines, or integrating anybody of any other discipline into the pairing structure. I'm a big fan of that. Be it a QA person, design people, design, you know, front end design or visual design, designers. Even your product owners, product managers, whatever you want to call them. I think that that's great. One, it builds up a lot of empathy. Just from a person to person point of view. Two, it can be super practical, especially with, say, visual design. And, and actually QA as well. Like, that last mile, I've always found, of say a visual design, where, you know, you've pretty much got all the assets in. Let's say you're building a web page. Got all the assets in and you're, you're tweaking the css, and all the stuff that came from visual design, it's pretty good right now, but you know that field, or that area of the page that looked great with lorem ipsum, that only had like twenty-five characters. If somebody puts in a thousand characters, and they can, the whole thing goes blah. Right? Crazy. Getting visual design in to say, hey, like, the, the last bit, let's just sit here and work on this. And then you can just, especially if you're using, like, web, if you're doing web development, and you can literally tweak it right there on the screen together. That could be super powerful. And I've even been in situations where you'll, they were so good that they were working on this thing and were like, moving stuff around. They're like, ah, now that we've moved this from here to here, those icons look terrible. Hold on, and they're like, somehow spew out an icon out of their fingertips. And they're like, OK, now pull in this icon. And wow, it's just. It's like the most rapid changing finalization wrapping up of, of something I've ever worked in, and that was one of the best experiences I've ever had pairing was with this person who was not technically a software developer. QA, as well. I think, like, a really good QA person is worth their weight in, in gold. I think if anybody here is kind of tied into the capital A Agile community, or at least extreme programming, you know, somehow this strange notion came up that, like, you don't need QA. We've got tests for that. And it's like, nah. Those are two different things. So, integrating QA people can be really good, especially if you're, if they're in a mode of, maybe you've got a big release coming up, and they're hammering the site and finding all these bugs, and you know, pairing with them as you're fixing the bugs, as they're like pressing, you know, trying all their different attacks on the system. They're saying, OK, well you fixed that one, but that makes me think of this other thing. Oh, look. It's broken. OK. Try this. Try this. And just, like, just kind of, you know, purpose, purposeful pairing when it's needed can be super valuable as well. Now I haven't, say, just, you know, like, where, hey, we're making an android application and today I'm doing some, you know, a big feature, and it just pair with a QA person instead of another software developer, in the middle or at the beginning of the development process. I haven't done that. But give it a shot. All right. That was three. I hope they were good. Cool. AUDIENCE MEMBER: Quick comment about the cross-tooling, or cross-editor, there's a tool called Floobits - F-L-O-O bits, which lets your Vim people work with your Emacs people, and the idea is, like, one of them's got their computer and the other one's got their computer, and they're each running the same damn thing, but it's all synced and good and there's a fall back, which is like a diff shipper for other apps. So it's- J.M.: OK. Cool. Floobits. AUDIENCE MEMBER: Yeah. J.M.: I've heard of it. I haven't, well, I did, I technically did try it when it was early. And it didn't really work very well, but I'm gonna try it again, cause people- AUDIENCE MEMBER: Yeah. It's, it's still- AUDIENCE MEMBER: -fairly early, I think. But the promise is there and more plugins would probably help it. But. J.M.: Excellent. AUDIENCE MEMBER: So, a couple questions. One, when you're driving, how much vocalization do you do to the other person explaining your thoughts? And the other one is, when you've got a senior developer paired with a junior developer, there's, you know, I frequently find, I'm the senior one on this side. And there's, I know I need to let them work through it, but at the same time I want to rip it out of their hands and type it, you know, it's like, how- J.M.: It's hard. AUDIENCE MEMBER: -what tools do you, techniques do you use to combat that and work with that and help them to learn? J.M.: Sure. So, the first question was. Wow, this is really terrible. What was the first question again? AUDIENCE MEMBER: Vocalization. J.M.: Vocalization. Yes. Ironically. So vocalization and then being a keyboard hog, right? I'm that, like, I'll, I'll, I'll take on a trip with that one. Cause I'm, I can be that way. Or, at least, letting new people struggle through something when you already know the answer, for example. Vocalization. I vocalize a lot. Especially because I do remote pair programming. And I lose a lot of the, a lot of the visual cues and physical cues that you might pick up sitting side-by-side. I lose a lot of those. So, when my whole view into somebody is from, say, the neck up, you know, or like the midsection up, it's harder for me to say, see anybody's hands. I almost never see anybody's hands. So are they reaching for the keyboard right now? Are they reaching for the mouse? Are their hands on their laps? You know, what are they about - are they about to do something? I don't really know. Well like, when you pair side by side, and out of, you know, right now I can still kind of see you over there. And if I see this hand going out then that's a cue for me to be like, oh, it looks like they want to do something. I wasn't in the middle of doing something, so I'll kind of back off. So, maybe a little bit less verbalization, consciously verbalizing, anyway. But, when I'm remote, I'm constantly saying things like, I'm gonna grab the mouse. Can I look at this? Would you like to drive? Do you mind if I drive? All that kind of stuff. And, you know, to the point where, I've pair programmed with, remote paired with people, and they've told me later that they, they found themselves doing that much more when they were pairing side by side, and they felt it made them a better programmer, or a better pair anyway, because they found themselves being more vocal even when they were in person. Which was, which I thought was great. AUDIENCE MEMBER: What about vocalizing, like, OK, now I'm making this case statement because of such and such, do you go to that level, or? J.M.: Yeah. We, I will sometimes go to that level if, if I feel like that it's needed. Often, yeah, I'm kind of like, constantly talking. And I've recorded myself doing it, so I could show, like, for a presentation or something like that. I actually kind of hate listening to myself do all that. But I, I think it's valuable. And I find that often, my pair will in, sort of call me out when I'm not doing that. You know, I'll be kind of, like, in a zone and kind of going and like the thoughts are coming out and they'll say, like, well, what, what, what do you, what are you, what are you doing? And I'll realize, ooh, I haven't, I'll realize I haven't been, I haven't been saying anything. I haven't been vocalizing it. And so, you know, that, I think, is also kind of a tick mark in the be more vocal column. Were those the two questions? AUDIENCE MEMBER: Junior developers. J.M.: Junior developers. My god. AUDIENCE MEMBER: Letting them- J.M.: What's happening to me? AUDIENCE MEMBER: -work through the problem when you know it. J.M.: Yes. So, techniques for trying to let the junior people drive more when you're more senior. It's certainly hard. Some people never get it. Some people, it can be especially bad if you have a person who is, let's say, naturally, or professionally more passive, and somebody who is naturally or professionally more assertive. Tricks for that are just both sides trying to be more honest and vocal about things. Like, oh, in saying, like, hey, do you mind if I drive now? Would you like to drive? I have physically sat on my hands. Like, underneath my thighs. And when I feel myself, like, pull my hand out, I'm like, ah, get it back in there. Sit down. And ping pong pairing, if people haven't heard of that, is a great sort of structure to, to implement, to kind of enforce a rigidity in the bounce back and forth. So, again, this is testing, test-driven development. So if you're doing test-driven development, you can have one person write a failing test, and the other person implement the code to make it pass. And then they, the second person, writes a failing test, and the other person writes the code to make it pass. And you can sort of enforce that rigidity while you need it. And it was, it can actually be a not-so-subtle cue, that somebody is being a keyboard hog. And I encourage people to do this if they maybe don't want to be confrontational about, like, gimme the damn keyboard. But if somebody's kind of going, or let's say, if you're going along, and your coding and everything is great, and then your pair says, hey, how about if we do some ping pong? Like, oh. Hmm. Maybe I'm driving too much. Or you can, you can say, like, oh, let's ping pong this one. What do you say? Like, that can be a, maybe a less assertive way of saying let's balance it out. Trace, you have something to say? AUDIENCE MEMBER: Oh, just, I'm really glad you mentioned. Thanks. I'm really glad you mentioned ping pong as a, a technique to help manage that. When I first started pairing, it was definitely something that was very hard for me to do, and I had to do the same thing. I sat on my hands for three weeks. I, I saw people like, you know, when I sat side by side with someone, I'll see their hands come near the keyboard, and my will always leave. Or if their hands leave the keyboard, I'm, OK. It's my time to speak. And I'll raise them up. So I've heard of some of the other paradigms, like driver-navigator, for example. What are some of the other pairing patterns in addition to ping pong and when might they be good to use, and what are their names? J.M.: Oh, let's see. Yeah, driver-navigator is sort of the, the canonical pairing structure people think about, where one person is literally driving and one person is literally saying, oh, OK, well you missed this and, hey, maybe, you know, let's use an if and not an unless there, and that kind of a thing. And they're kind of also kind of looking over the rest of the code and say, like, hey, how about we extract, you know, finish that up, but let's extract that as a method next. And kind of a thing. As far as, those, that's the one I'm most familiar with. The, and, and that can be great. I think that's kind of the natural mode of most pairings. Is like, one person is like actively engaged and, and driving, the other one, or, actively engaged in typing, the other person is, is doing more navigating. I think that the challenge can be figuring out when, when to switch. Testing really helps for that. And if you don't do testing, let's say you don't, then maybe you can use some other kind of bounds. Like, you know, you just wrote this method. OK, now the next guy writes the next method. Or, you know, you're doing a bunch of refactoring and extracting classes and, and methods or something like that, then, you know, you bounce back and forth between the thing you're extracting, for example. OK. We gotta couple minutes. One minute actually. AUDIENCE MEMBER: The most useful thing that I ever did for stopping myself from over driving was getting a chess clock. So that we could actually see how much time I spent driving. And so when I'm looking at the clock and I'm forty-five minutes ahead, it, it's very helpful. J.M.: That is excellent. AUDIENCE MEMBER: And another technique is to just turn your keyboard over if you have two keyboards. Just make it so you can't type. J.M.: That's a really good one, too. OK. Forty seconds, go. AUDIENCE MEMBER: Based on your experience, can you share what you consider to be good habits and effective habits in pair programming? And then can you, are there, are there pitfalls that people tend to fall into that, are there commonalities that you see in, in? J.M.: Sure. In twenty-five seconds I will, I'll put it this way. I think it's, the main thing is to remember that we're all human, and that it's not really about technology or, really, about programming, per se. It's about being patient and having a good attitude and building trust. So as long as we all have a good attitude with each other, trust each other, are patient with each other as we're all learning, I think that's really the key to pair programming. You can apply that to almost any situation, but especially this very strange and extreme version of software development. I hope that helps. That's it. We're out of time. Like I said, thank you.