Remote Pair Programming Resources
Pair programming is widely regarded as a software best practice. But what if your entire team is remote? Every day more software projects embrace the benefits of decentralization. But along with the benefits come a few obvious downsides, worker isolation and communication barriers perhaps being the largest issues. Fortunately, with the right (free) tools, remote pairing can be not only practical but actually pleasant!
I've been doing day-to-day remote pairing work for a recent consulting client over the past month or so and have been enjoying it quite a bit. By having two sets of eyes on any given piece of code, especially at design time, you end up with different, and in most cases, higher quality code with fewer bugs.
[ NOTE: for more information on pair programming itself, including links to studies about its effectiveness, see the Wikipedia link above. ]
In any case, I thought I'd take the opportunity to put together a list of resources for anyone else investigating remote pair programming strategies for their own projects. After trying a few different things, we've settled on a combination of three or four different tools that make up an ideal toolbox:
1. Web-Based Project Management. This one is a given and you're most likely already using some form of task management / bugtracking tool regardless of whether your team is local or remote. These can be separate packages but are often most effectively packaged together. Being a Rubyist, I like RedMine, and also Trac for free DIY systems, and there are dozens of low-cost hosted options too.
By keeping these tools up to date, it should be clear at all times what you and your pair are tasked with, and where you stand with those tasks so there isn't any confusion anywhere else in the team (even if the team is just the two of you!) Clearly assigned goals and the ability to easily track daily progress is important in any work environment, but particularly when you're not seeing your peers face to face every day.
2. VoIP / RealTime Communication. It's important to keep realtime communication open during your coding sessions in order to maximize input and realize the true benefits of the process. Skype works great for this. Chat software can be useful too, for sharing links to relevant online resources, but nothing is a substitute for realtime communication. iChat is an option too here, if you're a Mac user, and combines with the built-in screen sharing for a nice one-two punch.
Speaking of screen sharing...
3. Screen Sharing. This is the real meat of a remote pair setup. Just like in a colocated environment, you need to be able to see what your pair is working on and jump in when needed or when trading off driver / observer roles. VNC and remote desktop are traditional alternatives to iChat for non-Mac users.
My favorite option though? We'll get to that in a moment...
4. Common Shared Text Editor or IDE. No matter what software you use to establish the link, it's important that both users be familiar with the same editor or IDE in which you'll be working. There's simply no substitute for familiarity with a toolset. If you're comfortable, you do better, faster work, and you're able to spend your best cycles on the problem at hand rather than struggling to remember what key combination you use to jump between the test suite and the class you're refactoring.
Some people like Eclipse. Others are big NetBeans fans or IDEA / IntelliJ supporters (I hear RubyMine is nice!) To be honest, my programming editor of choice is still Vim. What can I say? Vim is love. Of course with VNC, this choice really doesn't matter as much as long as both partners agree on it; you can work in any text editor with ease.
My favorite way to remote pair is to combine Vim with the GNU Screen command to create a shared terminal (or series of shared terminals). This configuration is extremely lightweight, realtime (even the fastest of the VNC-type environments have at least minor connection lag and screen refresh hiccups), and incredibly flexible. If you're not a Vim nut like me, this may be less than ideal. But if you're lucky enough to be pairing with someone else who is also a Vimmer, it's about the best remote pairing experience you can have. But then, I'm biased :).
There are other options here too. I know people who regularly use SubEthaEdit for collaborative document authoring. It's a slick, intriguing system that is particularly well-suited to working with multiple authors editing a single document. However, in practice, when pairing, only one user is actively typing at once, and the lack of editing features and environmental difficulties make it a non-starter.
Anyway, to recap, I'm currently using Redmine, Skype, and Screen with Vim for pair programming (occasionally trading the latter in for iChat screen sharing depending on who the remote end of the pair is). It's a nice reliable system, and I'm learning new things every day, with the help of a pair.
Have you done any remote pair programming lately? If so, what solutions work best for you? Are there other options I should be exploring? Thanks in advance to anyone who cares to share!