In agile development methodologies, pair programming is considered a key practice. Pair programming involves two programmers (in any combination of novice and/or expert) working together to write code. Advocates of agile methodologies outline a range of advantages of pair programming, and I’ve always thought that, in theory and as a relative outsider to the code writing process, it would be a great approach to development. I’ve never worked on a project where there was budget or resource available for pair programming though.
In the past 12 months or so, practitioners of the various design disciplines that I’m interested in have been talking more and more about agile methodologies and how they might apply to design processes. There’s been a lot of talk of collaborative design and rapid iteration, but I’ve not seen anyone talking much about ‘pair designing’.
In my experience, designing can often be a rather lonely activity. If you’re fortunate enough to be able to integrate real users into your design methodology then that can break it up a little. If you’re working within a team of other designers, perhaps you’ll be able to get them to review your work from time to time and give you some feedback. Working in a ‘pair design’ environment is, however, quite rare.
I’ve been fortunate enough to work on a few projects where we’ve taken a ‘pair design’ approach (in fact, I’m working on one right now), and I’ve been pleasantly surprised that the benefits that the agile advocates outline for pair programming largely hold true for pair design.
Using the list of benefits set out by Wikipedia, here’s a run down of what I’ve found.
- Increased discipline. Pairing partners are more likely to “do the right thing” and are less likely to take long breaks. Whilst I like to think that I ‘do the right thing’ when I’m designing solo, I have certainly found that working with another designer does heighten your focus on the task at hand and, even more importantly, lengthens the time that this level of focus can be maintained.I’ve also found that in pair design, you tend to design more away from the computer, instead using flip charts and pencil and paper, and post it notes stuck all over walls and drawings and user flows that you’ve mapped out on paper.This is good design practice but, even better, keeps you away from the distraction of email, and bloglines, and all the other kinds of distractions that you find on your computer. It keeps you focussed on the design process.This makes you design better, and makes you more efficient.
- Better code. Pairing partners are less likely to go down ratholes and tend to come up with higher quality designs. I don’t know about ratholes… But I do know that when designing in pairs there tends to be a more rigorous approach taken to design decisions. This is because you have to be able to explain each decision you’re making, or design approach you’re taking AS you make it, not in retrospect. Each decision needs to be justifiable. And, because you have someone there designing with you, you get to actually discuss the benefits of each approach rather than just doing what you think is best (or worse… what you can do most easily in Visio because you have a template already set up that way…. Oh, come on. You know you’ve done it.)On the ‘going down ratholes’ issue though, if you happen to be designing with your client, then you are able to check really quickly whether the approach you’re taking has a hope in hell of being adopted by the client. This means that you don’t waste time designing something that will never be implemented, and that what you do design has a much better chance of adoption.On that note – designing with your client means that they understand the rationale behind every design decision. So, if you’re just a temporary resource on the project, you leave behind an evangelist for your design – again, making it more likely that what you’ve designed will actually survive the development phase.
- Resilient flow. Pairing leads to a different kind of flow than programming alone, but it does lead to flow. Pairing flow happens more quickly: one programmer asks the other, “What were we working on?” Pairing flow is also more resilient to interruptions: one programmer deals with the interruption while the other keeps working. For me, getting stuck into designing IS flow. But see above re: increased discipline and below re: less interruption. Both of those definitely mean you get lots more flow time, which is all good.
- Improved morale. Pair programming can be more enjoyable for some engineers than programming alone.As I mentioned before, designing solo can be a lonely business. When you crack a really curly design problem, there’s no one to celebrate with… well, no one who really gets it. With pair design, you have a celebration partner. This is good :)
- Collective code ownership. When everyone on a project is pair programming, and pairs rotate frequently, everybody gains a working knowledge of the entire codebase.OK. This has been a little less relevant to me, as a consultant, but see above re: designing with your client and gaining and evangelist.
- Mentoring. Everyone, even junior programmers, possess knowledge that others don’t. Pair programming is a painless way of spreading that knowledge. This is almost certainly true when you have an expert/novice pairing, but even when you have two designers with similar experience there is a lot to be learned.How often do you get to actually watch the process that other designers go through and how they approach their work? Not often, I’d guess. This is a great opportunity to say, ‘so hey, here’s how I do it… how would you do this?’ and pick up some handy new ideas or approaches or Visio tricks. (Hey, none of us know everything, do we!)
- Team cohesion. People get to know each other more quickly when pair programming. Pair programming may encourage team gelling. Yep. Pair designing is definitely a great icebreaker :)
- Fewer interruptions. People are more reluctant to interrupt a pair than they are to interrupt someone working alone.Now, this one is DEFINITELY true, and don’t underestimate how important this is. You can get an awful lot of design done in a couple of hours if that’s ALL that you’re doing. But how often do you actually get this much time to do nothing but the design you’re working on? In my case, not that often. Two people in a room makes you MUCH less interruptable!
- One fewer workstation required. Since two people use one workstation, one fewer workstation is required, and therefore the extra workstation can be used for other purposes. Well, in our case we abandoned workstations all together and took over a small office/war room. So, I guess there have been a couple of free workstations!
Choosing the right co-designer is pretty important. I’d be loathe to pair design with someone who knew nothing about interaction design… it would be way too much mentoring and not enough designing, which isn’t practical or appropriate on a ‘project’ based design. i would however suggest that if you find a client who has people with the right skills, you do what you can to try to get them involved. This is much more likely if you’re applying other agile methods that involve rapid designing and iterating.Now, it would be unrealistic to suggest that pair design be adopted for all design projects, it’s never going to happen, and in many situations would be unnecessary.
But, if you do have the chance to work this kind of methodology into your project, then I’d encourage you to go for it. I think you’ll find it a very rewarding experience.
Have you experienced pair design? I’d be really interested to hear if you’ve had similarly good experiences, or if there are some horror stories out there!