in which the effects of distance are reduced

Since joining Sonian in April, I've been part of a distributed team that has grown to four Clojure programmers all living in different states of the US. While it's been great to be able to draw from a wide pool of talent, working with a distributed team has its challenges. While we had everyone in Seattle for a week we got to do lot of pair programming, but after everyone went back home we were left wondering how we could emulate that over-the-shoulder atmosphere without all being physically in one place.

We tried VNC, but it was simply too laggy. Then we tried shared screen sessions. This worked out pretty well. The defining characteristic here is that both participants see exactly the same thing. Only one can edit at a time, which is usually not a big deal when you're pairing. Since it's shared on a per-session basis rather than a per-document basis, it means you can share things like the woefully under-appreciated M-x erevision feature, which is fantastic for code reviews. But it still feels a bit restrictive and out of the regular groove. We also use mobile Internet connections a lot, and unfortunately port forwarding is not permitted by most mobile ISPs.


Then I discovered Rudel, an Emacs client for the Obby protocol. Years ago I'd started my own implementation of this called Ebby, but I wasn't aware of the more nuanced implications of the protocol, so my implementation was never very robust. Rudel, on the other hand, does a great job of allowing us to share documents among collaborators in real-time.

Now we use Rudel for our main solution and then fall back to screen whenever we want to do something that involves synchronizing the whole screen. While you can run shell or SLIME sessions in Rudel, it's a bit awkward since only the original publisher of the document can actually interact with the subprocess. The other person can enter commands, but they can't run them, since pressing enter will simply insert a newline. I have been playing with the idea of using the Obby chat functionality as a side-channel to perform these kinds of things, but I haven't written any code for it yet.

One thing you've really got to be careful with in this situation is communicating who's responsible for committing. Otherwise you could easily get conflicting commits. SIP works great for talking through this vocally, though unfortunately mostly at work we're using Skype, which has a fairly lousy client for GNU/Linux.

I'm working with Jan, the Rudel author, towards an 0.2 release (quite soon, it looks like) which should improve stability pretty significantly. At that point I should be able to bundle it up for ELPA, though if you're running an Emacs that's older than October 2009 you will still need to install the eieio library by hand.

Anyway, if you work on a distributed team, you should give it a shot. Until 0.2 is released, you'll have best luck with the development version:

bzr branch bzr:// rudel

Then in your Emacs config:

(load-file "/PATH/TO/RUDEL/rudel-loaddefs.el")

Once you've got a Gobby server running, M-x rudel-join-session should get you connected, and C-c c s will let you subscribe to a new document. Have fun!

Update: A few months after writing this post we switched to using shared tmux sessions for our collaboration. At the time of this writing Rudel wasn't 100% reliable, but we also found the requirement to share one buffer at a time to be fairly awkward. The cross-editor aspect is theoretically nice, but no one has implemented the protocol for Vim yet. The fact that you can't share shell buffers or repl buffers is a pretty serious drag. There are some downsides with tmux, but whenever you have two people comfortable with the same editor it's a pretty compelling way to work.

Update: This is even better using tmux with tmate.

« older | 2009-10-03T22:37:47Z | newer »