The Hashrocket Way: Pair Programming
To use an idiom that Bryan Liles effectively coined at this year's Ruby Hoedown, at Hashrocket, we "pair all the fucking time". It is a vital part of The Hashrocket Way, our internal philosophy of how to most productively service our clients:
The photo above captures a normal morning at Hashrocket headquarters, where every desk is set up for effective pair-programming: 30" monitor, dual keyboards, dual mice. Carmelyne Thompson and Wes Gibbs are the pair in the foreground.
Veez Remsik, my inspiration for this post and one of Hashrocket's Rescue Mission experts, gives us a must-read personal account of pair-programming as a way of life:
Hashrocket has a few core philosphies that are essentially required for team members. Agile development processes, an adherence to ruby and rails best practices and idioms, and a firm belief in pair programming are three of the biggies. Of these three, pair programming is the technique that has changed me most, and required the most change in my thinking. And not surprisingly, pair programming has proven the most critical to my success at Hashrocket.
Veez has a traditional software development background (unlike the one that several of us 'rocketeers cultivated at places like Thoughtworks). I like the way he describes himself pre-Hashrocket: "You know, the one who does his best work in the morning with his headphones on and drinking an obscenely large coffee. The guy who types madly for a few select hours a day and, during those few hours, produces as much as regular-speed developers do over the course of a day."
Durran Jordan and Matthew Bass pair on our latest 3-2-1 Launch project. Quite often, one of the keyboard/mouse sets is replaced by an actual MacBook Pro in conjunction with the most excellent teleport utility from abyssoft.
Most Rails people I know profess adherence to Agile practices and principles, yet judging from the anecdotal evidence I've collected at conferences and comments made by our guest stars, pair-programming is still very much the exception. Make that real pair-programming, in the extreme programming sense, where all production code is produced by two developers sharing control of one workstation.
Getting a chance to truly pair for the first time is turning out to be one of our "guest stars" favorite experiences at Hashrocket. In the pic above, I captured Paul Barry and Hampton Catlin getting their first taste of pair-programming the way it's supposed to be done.
There are certainly challenges to making pair-programming part of normal business practices. Starting with the fact that it implies keeping an even number of people assigned to a project on a daily basis. Even at ThoughtWorks, where Agile is an important part of the culture, management did not necessarily make this aspect of pairing easy for us — as the principle "resource manager" of Hashrocket, I have to juggle the financial needs of our clients with our need to work in pairs. It's occasionally very tricky, but when you do it all the time, I assure you it gets easier.
I'm trying to get back into blogging on a regular basis. The "Hashrocket Way" is a term that has gotten much traction for us internally as a catch-all description of what makes us special, and I plan to write about different aspects of that as much as possible.








I've managed to trick people into pairing nearly everywhere I've worked since 2006. I've also had a lot of frustration evangelizing pairing. The minute you get the hang of it, you're sold, but nobody ever wants to try it. We need an "experience pairing" session at RubyConf or RailsConf much more than we need presentations.
(Or at Voices That Matter, hint hint.)
Posted by: Giles Bowkett | August 12, 2008 at 11:00 AM
It's awesome that you're supporting pair programming so well. I've really enjoyed the opportunity to work at a company where pair programming is a real possibility - it's definitely one of those things like TDD that, once I tried it, I was completely sold. In particular, I've been impressed with the way that pair programming can bring two developers to a state of knowledge parity in a short period of time.
Posted by: Avdi | August 12, 2008 at 11:50 AM
P.S. Say hi to Paul for me :-)
Posted by: Avdi | August 12, 2008 at 11:50 AM
@giles: love the pair experience idea. let's brainstorm how it should work and I'll make it happen. the number one challenge is figuring out what code assignments to give people that would accommodate a wide variety of skill levels and personalities. maybe allotting a few hours or a whole day of a room with pairing workstations and letting people take turns or rotate with each other?
Posted by: Obie Fernandez | August 12, 2008 at 12:48 PM
I strongly like pair programming, but I believe when it comes to innovate, you better program alone. It's my opinion.
ps: good to know about teleport! I was using Synergy, but its text interface sucks!
Posted by: Pedro Pimentel | August 12, 2008 at 01:38 PM
Getting the real pairing experience was a great part of the 3-2-1 experience for us. You can imagine that as a 3-man consultancy, proper pairing can be difficult to stick to.
It can be difficult to get into, and it can sometimes be maddening. But it's amazing what comes out of pairing. I can't recommend it enough.
Posted by: Yossef | August 12, 2008 at 09:16 PM
The more advanced people are, the more likely they'll have some ideas for stuff to work on. The pedagogy, I don't know. How do you introduce people to it at Hashrocket? I've sometimes been very sly about it. Like one place, a consultant had a lot of info to brain dump, so I got him to explain it, and then said, oh, so I can probably do this, and coded something which didn't work, and he said, no, that won't work because XYZ, so then I adjusted my code, and pretty soon we were pairing.
Anyway I think the best thing is to come up with very solvable problems with many small steps, and maybe in two or three tiers of challenge level, and then above a certain threshhold the challenges can get pretty interesting. I'm pretty sure I could get people at the LA Ruby group to give me ideas there, probably even a good place to do a test run. We have a good wide range in skill levels.
Alternatively there's a strong chance people new to Ruby at Voices will still have experience with other languages. There's absolutely no reason not to let them use whichever language they work most fluently in.
Posted by: Giles Bowkett | August 19, 2008 at 01:38 AM
What I am curious about is that keyboard?
What do you guys use it for? or is it just for relaxing?
Posted by: Diego Scataglini | September 29, 2008 at 11:29 AM
shudder....paired programming is an abomination....if someone mentions agile one more time i'm gonna bite their head off...i need some coffee, too early in the morning to even vent properly...have to write some code too...fcuk it, i'll just hack it, it's not like i work for NASA or something...shit breaks so what :)
Posted by: ranjit | December 01, 2008 at 08:15 AM
How do you use 2 keyboards and 2 mice effectively? Just plug 'em into the same box?
Posted by: Elliot | January 08, 2009 at 08:06 PM