Remote Pair Programming Tips Using RubyMine and Screenhero

I had the opportunity to spend the entire workday remote pair programming from my office in Maui with a San Francisco client from Cloud City Development. We used our normal tools of RubyMine, Chrome, and iTerm2 on a 27” Cinema Display shared via Screenhero. While remote will probably never be 100% as good as true in-person pairing, it’s getting very close! Here’s some tips for effective remote pair programming. Scroll down to the bottom for the TLDR if you’re short on time. Overall, I would highly recommend remote pairing with RubyMine on a full 27” Cinema Display, using an iPad with a Google Hangout for eye contact!

Here’s a very detailed video of how to do remote collaboration:

Telepresence Using Video Chat on iPad

Per the recommendation of Tim Connor of Cloud City Development, I started using an iPad for telepresence for only the video, using Google Hangouts, muting the microphone on the Hangout, and using the audio on Screenhero. While one can run Google Hangouts on the laptop, it can really suck up the CPU. Note, an iPhone or probably an Android phone or table would work equally as well. In terms of the audio, the microphone and speakers are better on the computer. If one is using the laptop for the telepresence video, and using multiple screens, it’s key to use the camera on the screen where one will be looking at the Hangout, and not at the Screenhero screen. As shown from the below pictures, it’s key that it’s obvious when the pairing partners are looking at each other versus at Screenhero. Incidentally, Screenhero did not suffer from any degradation when combined with the Google Hangout, regardless of using the Hangout on the laptop or mobile device.

In the below images, note where our eyes are focused.

Talking to each other, making eye contact

Talking to each other, making eye contact

Screenhero

We both used Screenhero on Macs. I’ve done plenty of remote pair programming using Google Hangouts, but typically only one person sharing the screen drives the code. Screenhero allows true screen sharing such that both programmers can do the typing and mousing. With the shared screen being a 27” Cinema display, I set my Screenhero window to full screen and the resolution was nearly perfect. Yes, when scrolling and switching apps, there is a slight delay, but it was extremely manageable to the point that I almost would forget that I’m working on a computer 3000 miles away. Although there’s a slight slowness in seeing keys that you type, it’s minor enough that it’s not a nuisance. The dual cursor support works great. Here’s a video demo of the dual cursor support.

RubyMine IDE

Both I and my pairing partners were already using RubyMine, so using RubyMine was a natural choice over trying to pair with the conventional remote pairing setup of tmux and Vim. RubyMine combined with Screenhero, the same size big screens, fast computers, and very good broadband resulted in a productive pairing setup. One thing I hear about Vim setups is that pair programmers tend to not customize their Vim keymaps. With RubyMine, that’s not an issue thanks to a feature called “Quick Switch Scheme” which allows very fast switching of keyboard bindings. I’m a Vim user (IdeaVim), and I would have been crippled without my favorite RubyMine Vim bindings. I like the “Quick Switch” feature so much that I made a short screencast on this feature, displayed below.

Fast Broadband

I use a combination of the fastest cable and the fastest DSL I can buy in Maui, served on a load-balancing ZyXEL ZyWall USG 50 Router. DSL is far slower than the cable service, but I still keep it for the one day that cable is not working right. As an additional backup, I have a Verizon LTE tethering plan for my iPhone 5, so the chances that I’m totally out of Internet are low. Here’s a screenshot from http://www.speedtest.net/

Same Big Monitors

We both used Apple 27” Cinema Displays. On the receiving side of the share, I’m using a 2012 loaded Retina MacBook Pro with SSD.

Audio Setup

I use a Blue Yeti USB Microphone Silver Edition mounted on a Heil PL-2T Overhead Broadcast Boom with a Blue Microphones The Pop Universal Pop Filter. (At the time of writing this article, the pop filter is only $25.22 on Amazon Prime, regular price $79.00, totally worth it!). This is the setup I use for podcasting so it’s more than adequate for pairing. I use the audio from the Display Monitor (Cinema Screen), as that’s behind the mic, so as not to cause any echoing. Naturally, this only works in a private office. In a shared office, it’s critical to have a very good mic/headset combo or a good mic. The Blue Snowball mic does a pretty good job of filtering out background noise.

I did a quick search on Amazon to see what’s available for headsets. If budget allows (and if you’re spending a fair bit of time pairing), I’d consider the V-MODA Crossfade LP Over-Ear Noise-Isolating Metal Headphone (Gunmetal Black) plus the V-MODA BoomPro Gaming, VoIP Headset Headphone with Mic, Black as both have a very high number of 4+ reviews. It’s suspect that with the right audio setup, the avoidance of distractions for an in-office/remote pair combo might be superior to that of the in-office pair combo. Please post into the comments if you have advice on the best headset for pairing.

TLDR Miscellaneous Tips

  1. Use Screenhero for screen sharing.
  2. Use Google Hangouts or Facetime on a mobile device to share video of each other. Prefer that over using Google Hangouts on your computer due to CPU usage of Google Hangouts. I really like the iPad mini with the Apple folding cover. It fits right under the Cinema
  3. Use large screen for screen sharing, an tablet for Google Hangouts.
  4. Don’t be afraid to try your regular tools, such as RubyMine.
  5. Use fast broadband, fast Macs, same size monitors.
  6. A good audio setup is well worth it.
  7. If the computer sharing the desktop has multiple monitors enabled, then the remote sharing viewer might not be able to use command-tab to switch applications. This problem went away when there was only one monitor on the computer doing the sharing. It might depend upon whether the cmd-tab is showing on the shared screen.
  8. If using RubyMine, install your pair’s keybinding into your RubyMine preferences. You can copy the keybinding xml file located in ~/Library/Preferences/RubyMine60/keymaps and then restart RubyMine.
  9. Consider putting Screenhero in Full Screen mode to avoid any compression of the window pixels. This is especially important when trying to click or drag on the remote machine, such as resizing the chrome inspector area.
  10. Don’t forget to take a break for water, stretch, etc. every so often!

Finally, click here for OMG, LOL, on an alternative reality of working from home.


This is a companion discussion topic for the original entry at http://www.railsonmaui.com//blog/2014/05/06/remote-pair-programming-tips-using-screenhero/

My favorite tool is Zoom.us if you want to have video. Screensharing still is crisp, even when adding video. And I can do it from my ipad. It will also support 2 monitors if you want to (since most of us have more than one) but scaling doesnt do that feature justice.

It's not clear if that tool offers the ability to control the presenter's computer in the way that Screenhero does. The double cursor of Screenhero is brilliant. I updated the article to show this.

That's really cool. My previous experience trying to pair using screensharing and Rubymine didn't go as well. Maybe Screenhero was the missing part. I will try it again if given the chance

i would suggest the Steel Series Siberia V2 headphone, I'm OG for cloud city and remote pairing :)

and yes, I'm wearing them in this profile pic !

It's either one person or the other, but not the double cursor, which is brilliant. But I can control the other persons computer and we can go back and forth as the presenter.

Also, I have used facetime on a phone or an ipad on the desk next to the computer to offload the sound and video. The video quality and sound quality was superb with that. At that time I was using join.me for sharing. I will attempt with ScreenHero sometime. (most of the guys I pair with lately have android though, sigh)

Here's a list of some things that I'm going to try for the next article update:

1. Simultaneously using a google hangout or facetime. I did try using a google hangout while sharing a 1080p monitor and using ScreenHero and it worked SO MUCH better than using either hangout or ScreenHero alone.

2. A way to quickly switch which machine is the main sharing machine. I'm going to out Hitch (https://github.com/therubymug/... to see if that helps. Otherwise, I might try out having each side of the pair having a feature branch and then doing some merging when switching.

Simultaneously using google hangouts for video of face to face while screen sharing using ScreenHero is beyond amazing for pairing.

I'd recommend giving https://floobits.com/ a try as well. It's a bit rough still, but it allows each pair to use his own editor. @panozzaj and I have been pairing together on https://github.com/panozzaj/ge... for the last few months using Floobits, and it allows him to use vim + wacky customizations while I use Sublime Text with my own tweaks.

Just to be clear -- I also use and love Screenhero. Just throwing an alternative out there!

Just to be clear -- I also use and love Screenhero. Just throwing an alternative out there!

Hello! Just to be clear, since we haven't done a good job of highlighting this feature—Screenhero also permits you to quickly switch whose screen is being shared.

Thanks for the love for Screenhero! This is a really thoughtful article, and you certainly have our (Screenhero's) attention!

Reading this, I am wondering, since we are considering adding video chat, how hard it would be to automatically launch a video chat on your iPad, instead of requiring you to sign into two services on the two devices…

D.E., it would be super awesome to not require a separate sign-in to Google Hangouts. The big problem is when somebody does not have a separate Google account. This would mostly make a difference when wanting to quickly share something with somebody new.