An Experiment in Remote Pairing
August 12th, 2008
Recently, my employer, Integrum Technologies, has allowed me to work from home one day a week. This is due to rising gasoline prices combined with my distance from work. It’s great for me as I’ll save quite a bit of money each week as well as reduce my overall emissions. However, this has presented us with a slight dilemma: how do we remote pair effectively?
Pair Programming
Integrum subscribes to a variety of Agile practices. Perhaps the most prominent is working in pairs, a.k.a pair programming. I was first introduced to the idea of pair programming around 1999 when I was at the University of Arizona learning how to completing my BS. At that time we simply learned the theory from a professor, but didn’t actually try it.
About 16 months ago I was working in a contract position with my friend and phoenix Ruby on Rails developer, Josh. Toward the end of our time at that contract we attempted pairing and found it worked really well. When we were hired as contractors at Integrum we paired on a project form start to finish and then later, when we went full-time, we paired with the rest of the team members. These positive experiences with pair programming have convinced me of it’s usefulness.
Now that I work a day from home, how will I pair with my various teammates?
Remote Pairing
I’m sure there are many, many ways to pair remotely, but here I will describe our first attempts at pairing remotely. It may help that we’re an all Mac shop, but we found it rather easy to get up and running quickly.
Systems
At home and at work we are using iMacs running OS X 10.5.4. The built in iSight and microphone are great for what we need right now.
Complaint: Noise. It’s everywhere, seriously. The mic picks up everything.

iChat
Yep, that’s right, iChat – video chat specifically. We simply fire up our iChat instances using our Integrum Jabber IDs and request a video session. Seriously, that’s all we do. The sound and video quality have been more than adequate for pair programming 7 hours a day.
Our first attempt at this was flawless, well… until it just stopped working that is. After a little research we found that I probably needed to open the right ports to maintain a consistent connection (this post on iChat Routing Problems helped). After I did that we haven’t had a problem.
Complaint: Video chat over iChat can sometimes lag or have artifacts, especially during peak times. It’s good enough, but would be nice if it were smoother and clearer.
Screen Sharing
While we’re pairing we share the screen on one of the computers. When we’re done we turn it off. This allows us to both have control of the keyboard/mouse if we need it and has helped immensely in making us feel like we’re both working. We take turns driving while the other gives advice or comments and we can smoothly transition from one driver to the other.
Complaint: From my end the connection latency can sometimes hinder progress. If I hit one of the Exposé areas of the screen and all the windows separate it can almost bring rendering on my side to a halt. There also seems to be a problem with select via the mouse. When I click and drag to select some text the screen jumps to the top or bottom immediately, selecting all text between. I’ve had to get better with the keyboard.
iSight + built-in microphone + iChat + Screen Sharing = Adequate Pairing
I do have some complaints about the current setup, but I’m willing to keep going until we find better solutions. Perhaps we should try using Xbox Live as I’ve heard some people suggest.
I think the next steps are to secure some good microphone headsets that will reduce the noise and allow us to hear one another more clearly. Then we can look at replacing iChat and Screen Sharing.
As tools for remote pairing progress I can see more developers turning to this as a solution to save money and time while still retaining their communication with their team, especially with their pair. Pairing remotely can reduce cost for the developer and the company, save time and reduce emissions because the developer no longer commutes. And if their whole company is remote then all the better!
Everything I Need to Know About Pair Programming Etiquette, I Learned From My 4 Year Old
August 5th, 2008
The folks at Integrum recently had a discussion about avoiding distractions while pair programming. We all know how many distractions there are in today’s world, everything from email to blogs to Twitter. It’s hard to not get distracted by all of these things, as they have become so prevalent in our lives. We want to be in the know and there are many tools out there that let us do just that. They constantly run in the background or popup, they email us, they text message us, they demand our attention…
Look at me, I’m a tweet!!
No, I’m working.
But I’m a direct message from iJustine!
Well… okay, just this once!
But it’s not once, it’s all the time… constantly interrupting (seriously Justine, stop, I’m not going to respond). When someone is paying you for your time, they don’t want to be competing with all these distractions.
So what’s appropriate etiquette for a person working in a pair programming environment? I asked my 4 year old over dinner to see what he thought.
The Interview
me. Do you know what it means to work in a pair?
ethan. When 2 people are working together.
me. Good. What about focus? Do you know what that means?
ethan. Stay on track. Concentrate. Keep an eye on what you’re doing.
me. How about respect, do you know what that means?
ethan. Be nice?
me. Okay good, let’s get started.
me. When you’re working with someone as a pair is it okay to check your email, instant messenger or twitter?
ethan. No.
me. Why is it not okay?
ethan. Cause we might lose focus.
me. If we were working together and I was having trouble solving a problem, how could you help me?
ethan. I could tell you how to do it.
me. What if you didn’t know how to do it?
ethan. We could think of an idea and do it.
me. Should we think by ourselves?
ethan. No we should talk and hear… and choose what we want to do.
me. If were working together and I get distracted, what should you do?
ethan. Daddy, what are you doing? Please pay attention. You made me distracted and I don’t know what I was working on.
Conclusion
This interview proves beyond a doubt that my 4 year old knows what it takes to work in a pair programming environment. He was polite, but forceful in his remonstration of my lack of focus. His answers were not overly complex, he kept it simple. Which is as it should be since it really isn’t all that complex – there’s a reason the acronym KISS exists.
So there you have it, think like a 4 year old and you’ll do just fine in any pair programming environment :)
First Fishing Trip with Ethan
March 23rd, 2008
This weekend my Dad and I took my four year old, Ethan, on his first fishing trip. He had a blast and even caught two fish!
Creating a Backyard
March 23rd, 2008
My latest project around the house is to turn our dirt-pit of a backyard into a nice space for Kelly and I to relax and for the kids to play. We started last weekend and should be finished by late April. We’re doing it all ourselves with the help of my Dad and whoever else wants to help. I’ve created a Flickr set to follow the progress of the backyard over time.
Let me know what you think!
Gravatar Problems
August 25th, 2007
When I switched the blog to Mephisto I had installed the Gravatar caching plugin. It seemed to be working fine prior to deployment, but once in production it was not working as expected. Today I finally tried to track down what was wrong. hopefully this will fix any problems with Gravatar images, creating comments, etc. I won’t be so bold as to say this will work for everyone, but it works for me :)
My first problem was that Gravatar images were not displaying at all, even when the email address had an associated Gravatar and the plugin had cached the file. I could navigate to the image directly and see it was correct, but the plugin was not finding it. After some debugging, I noticed the file exists check was using a relative path. By changing this to an absolute path I was able to see images. Woohoo!
lib/mephisto_gravatar_cache.rb (line 14)
- if File.exists?("#{GravatarAPI.cache_dir}#{md5_email}.gif")
+ if File.exists?(File.expand_path("../#{GravatarAPI.cache_dir}#{md5_email}.gif"))
Next up was an annoying error message that was appearing whenever someone posted a comment. It looked something like this:
Cache Gravatar for => somebody@gmail.com => gravatar NOT FOUND at www.gravatar.com Content-Type: text/html; charset=utf-8 Status: 302 Found Location: http://millarian.com/2007/8/22/striving-for-100-percent/comments/121#comment-121 X-Runtime: 8.55324 Cache-Control: no-cache Content-Length: 146 <html><body>You are being <a href="http://millarian.com/2007/8/22/striving-for-100-percent/comments/121#comment-121">redirected</a>.</body></html>
Same thing happened even when a Gravatar image was found… Nobody was safe from this problem. I did a search in the source for where “gravatar NOT FOUND” was being output. This message was being logged and put to the console, so I simply wrapped it in a conditional to output the results only in development mode, like so:
lib/gravatar_api.rb
def self.explain(msg)
# create a new logger if it doesnt already exist
+ if ENV['RAILS_ENV'] == 'development'
log.info(msg)
puts(msg)
+ end
end
This seemed to solve that problem.
While I was exploring the Gravatar cache plugin I also rewrote the cache_gravatars rake task to be a little more efficient and, since I exclude the explain for production, to output a listing of what’s happening.
tasks/mephisto_gravatar_cache_tasks.rake
desc "WGET all gravatars for all email addresses in contents table (comments). Call with RAILS_ENV=production (else defaults to development env)"
task :cache_gravatars => :environment do |t|
# get all the comments that have an email address
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
- comments = (Comment.find :all).collect {|c| c if c.author_email?}.compact
+ comments = Comment.find(:all, :select => "author_email", :conditions => "author_email IS NOT NULL AND author_email != ''", :group => "author_email")
+ puts "Caching Gravatars for:"
# try caching a gravatar for each comment
comments.each do |comment|
+ puts " - #{comment.author_email}"
GravatarAPI.cache_gravatar comment.author_email
# be nice to gravatar.com, wait a second before next request
sleep(1)
end
end
Please let me know of any other oddities using the information in about. Thanks!
Server Failure
June 27th, 2007
Yep, my home server’s hard drive crashed about a week ago. As you can see, the site is back up and in tip-top condition. In fact, it may be even better than it was previously. Well, that’s not really hard to imagine is it?
I have moved to a hosted solution through Hosting Rails. So far, they have been awesome (and cheap). If you’re interested in trying them out, they gave me an affiliates link for referrals.
I have also switched over from Wordpress to Mephisto. I had wanted to try it out and this seemed like the perfect opportunity to jump right in. So far I am enjoying playing with Mephisto. Because it’s a Ruby on Rails application, I feel pretty comfortable digging into the source code. I think I have everything back the way I want it, but I welcome any suggestions for improvement.
Let me tell you, when that hard drive crashed (click, click, click… grrrrinnd) I was not all that concerned because I do fairly regular backups. If you haven’t backed up recently, I suggest you take the time right now to do so. I only lost a few posts and I was able to get those back from Google cache (Thanks Google!). The few pieces of data I was unable to retrieve were a couple of recent comments, so if you left a comment recently, then feel free to enter it again! If you haven’t left a comment recently, then now is the time to start.
Inspiring
February 17th, 2007
An inspiring story about pursuing your ideas. The end is not yet written…
The case against nofollow
February 14th, 2007
I just read an article by Loren Baker called 13 Reasons Why NoFollow Tags Suck. I don’t know much about it, but the theory is that search engines will look for nofollow on a link and not count it as a valid link to content. Thus spammers do not get any search engine benefit from leaving stupid comments. I also know Wordpress has nofollow enabled by default for comments.
While I am completely open to the possibility that nofollow is not working as intended, the reasons given in the article lack substance. I’m also a little disappointed that Robert Scoble is waffling on his support of nofollow. Below, I outline my thoughts on the 13 reasons given in Loren’s article.
- NoFollow = NoWorky – The basic premise here is that other things are more effective, like Akismet, for blocking spam. But from what I understand nofollow isn’t about blocking spam, it is about preventing spamdexing, a technique used to increase a sites ranking in search engines. With the nofollow approach, if a link gets through then it is tagged with nofollow. This point also claims that nofollow “does nothing to discourage comment spammers” but offers no evidence.
- Bloggers should moderate comments – A lot of people do this, including me, but I for one do not follow every link that people post in a comment, including their own website link. Additionally, this is one of the reasons that Wikipedia took the approach of nofollow, i.e., there is too much content being generated to have a “human inspection” on everything posted. Again, nofollow is for stuff that gets through.
- Wordpress has nofollow by default – and therefore nofollow sucks? Sounds like a complaint against Wordpress to me.
- NoFollow = NoValue – This one poses a hypothetical question and uses the hypothetical answer as an argument against nofollow.
What if they made the Yahoo! directory nofollow? Would anyone continue to purchase listings? Obviously the value of that directory would be zero of nofollow tags were applied to the listings.
Obviously! Isn’t the Yahoo! directory something you apply for? Something that goes through the “human inspection” suggested in #2? I don’t see how this has any relation to a user-driven site like Wikipedia. Remember that moderators on Wikipedia are volunteers, unlike the Yahoo!s that accept or reject directory applications. You have mountains of data added to Wikipedia everyday and the volunteers cannot keep up with it.
- NoFollow = NoTrust – If you link to someone and add nofollow, yes it is certainly a sign that you don’t want to give them an incoming link to boost their ranking. This is a personal choice. However, a commenter adding a link for their own gratification has nothing to do with me linking to them. Since I don’t know what they are linking to it is safer to add the nofollow.
- NoFollow sucks because of lack of standards – Finally a good point. I agree, if this is to be used effectively, then it must have a consistent approach that can be followed by individuals and software (e.g., Wordpress) alike. But just because you have a standard approach doesn’t mean people will follow it. There are tons of standards that people already ignore, so why not throw another on the pile – standards like this cannot be enforced.
- NoFollow is the result of search engine failures – Funny, I thought it was a result of spammers. It’s a proposed solution (or at least a stopgap measure) to get more accurate page ranking because of a natural inclination to game the system. Everybody, except spammers, benefits from more accurate page rankings because that is what determines your search result relevancy.
Search engines should be able to develop a method of identifying and devaluing links to spam sites which were placed in blog comments. Why should everyone who posts in blog comments suffer from the actions of a greedy few spammers.
There are so many things wrong with this statement that I don’t know where to begin. First, there are a lot of things that people, companies, software, etc. should be able to do, but they don’t. This is akin to saying the staff at Wikipedia should be able to document all human knowledge on a wiki. While they could try, I doubt they could keep up. This is where we come in – the crowd. Why not use our wisdom to help out? Brilliant idea! The same logic applies here. Search engines need our help to make things better. If/when they/you come up with a better idea then we can all remove nofollow and have a good laugh about it. Trying to downplay the seriousness of the spam issue by talking about “the actions of a greedy few spammers” is laughable. Looking at Akismet right now shows a report stating 94% of comments filtered are spam. The greedy few indeed!
- Comments = Relevant content – Comments don’t necessarily add relevancy.
- The wiki concept is to blame – Again, I thought spammers were to blame. Let’s see, how could Wikipedia prevent spammers from adding content… aha! Remove the ‘Edit’ link of course. Doh, it’s so easy, why didn’t they think of this before?!?
- Ads + nofollow = NoSense – This might be a whole other topic: Are ads relevant content? I have no answer at this time.
- Matt says it’s bad – That’s not really what he said. He said he was glad they tried it even though it didn’t work out like they hoped. This is not necessarily a failure of the idea, but of the implementation/uptake of the idea. He also states that “comment and trackback spam is 100 times worse now” (without a citation for the 100x). If you believe that, then does it imply that spam blocking tools like Akismet are also failing? I don’t think so. Why is there more spam? I can come up with two possible reasons off the top of my head. More people online means more spammers generating spam. Also, spammers need to spam in volume to make up for what they are losing because of tools like Akismet, SpamKarma, and, yes, maybe even nofollow links. Whereas before spammers could get 9 out of 10 spam comments through, they can only get 1 in 10 or less because of advances in spam blocking/filtering. And even the spam that gets through might not benefit them because of the nofollow link. Just a theory; I have no data to back any of that up.
- Search engine implementations are inconsistent – This tends to happen when something new is proposed. Look at CSS as an example – browsers still don’t implement it consistently. This is not a failure of nofollow, but of the companies that said they would honor the principle.
- NoFollow Sucks. Check It! – He couldn’t think of a 13th point…
It seems to me that there should not be an all or nothing approach to this issue. Why not retain unadulterated links in comments from trusted sources (e.g, whitelists)? When you prove to me that you are a worthy contributor to my content and I feel comfortable giving you a nod for that, then I will remove the nofollow by adding you as a trusted source. I would expect the same treatment for comments I place on other people’s blogs.
What are your thoughts?
Confusion
February 11th, 2007
I recently read a blog post by Alex Barnett about the phrase “I’m confused.” His take was that people who say this are actually saying something like “I’m smarter than you, and what you just said doesn’t make any sense to me.”
Uh… okay. Sounds like a case of inferiority complex to me. I know it’s difficult to fathom, but maybe they are genuinely confused. In fact, maybe they are confused because you’re not expressing yourself clearly. Having been a Computer Science tutor for three years dealing with students in the first three classes of CS, I’ve seen a lot of confusion. I think it’s better to say you’re confused than to nod and pretend to understand. Whenever a student expressed confusion, either explicitly or in their body language, I tried to explain things in a different way. Sometimes I would explain something three or four ways before I saw the confusion disperse.
So since he hasn’t heard it in a while, I will utter the phrase. Alex, I’m confused. You think “I’m confused” is a confrontational phrase, yet your responses are
X: “I’m confused”
Alex: “I know.”X: “I’m confused”
Alex: “I see. What part of the word “x” didn’t you understand?”X: “I’m confused”
Alex: “Not for the first time…”X: “I’m confused”
Alex: “I’ve heard that about you”X: “I’m confused”
Alex: “So am I”X: “I’m confused”
Alex: “You know, I’m not sure this is the appropriate time to discuss personal issues.”
Nothing confrontational there… Your job title also confuses me. What exactly does a “Community Program Manager for the Data Programmability team” do at Microsoft? Sounds like a pointy-haired manager title to me.
Alex: “My readership is decreasing – I’m confused.”
Me: “Yes, you are.”
Blogroll Cleaning
February 1st, 2007
I recently wrote about the problem I was having with my blogroll – it is getting too hard to keep up, especially after a 2 month absence. I have whittled the number of unread posts down by a few hundred posts, but more importantly I have axed fourteen blog subscriptions. It was almost relieving to see my total subscriptions number fall below 60. I am currently two over what I had planned on removing, but I can see myself removing more. It’s like a free-for-all… and you could be next!
Stick Figure Animations
November 21st, 2006
If you enjoy stick figure animations, such as Xiao Xiao stick figure kung fu, then you may like these as well.
Animator vs. Animation
The second one was released recently over at Atom Films. View it there:
Hey, when you’re working 100 hour weeks, you gotta take a break sometimes!
Internet Explorer 7 Tests
October 20th, 2006
Ross from Zimbra has an interesting post comparing tests he performed on IE6 vs. IE7, the latest offering from Microsoft. His results are encouraging for Microsoft, but he also says that IE7 is still behind Firefox 1.5. He has not yet tested against Firefox 2.0, but I’m sure it is only a matter of time before he does.
Millarian.com is best viewed in Firefox :)
Subscriptions updated
October 13th, 2006
A small change, but one that could be significant in the long run. All subscriptions (RSS, Atom, etc.) now go through Feedburner. This allows me to keep track of subscribers and associated statistics on traffic. It looks like a great service and I have seen many other blogs using it.
Read/Write Web has an interesting post about RSS.
So subscribe already!
Tidying up
October 11th, 2006
I’ve spent a little time cleaning up the blog as well as adding plugins and widgets. I think it is pretty clean—the look I was going for. Please let me know what you think.
Also, if you are interested, here is a list of some of the plugins and widgets I have used:
- Comment Live Preview: plugin that allows you to see your comment as you type it, including processing HTML tags (by Iacovos Constantinou)
- Image Counter: plugin to display a counter as image (by Vanguard)
- Spelling Checker: checks the spelling of my posts and allows you to check your comment spelling (by Brian "ColdForged" Dupuis)
- Social Bookmarks: displays XHTML compliant graphic links to popular social bookmarking sites (by Apostolos Dountsis)
- Subscribe Me: displays subscription buttons for RSS and popular aggregators (by Denis de Bernardy)
- WP Contact Form: displays the contact form on my contact me page
- WP License: displays the Creative Commons license at the bottom of the page (by Nathan R. Yergler)
- Widgets: allows me to add widgets to my sidebar (by Automattic, Inc.)
Of course, not all of these installations went smoothly. Many of the plugins and widgets that I have installed and activated needed to be massaged to work on this site. It gave me a chance to brush up on my PHP, JavaScript, and CSS skills.
Update: The e-mail icon on the sidebar is from FamFamFam’s Silk Icons set.
Update: A few more entries into the category of useful plugins:- Feedburner Feed Replacement: forwards your feed traffic to Feedburner (by Steve Smith)
- Google Sitemaps: generates a Google sitemap and submits it to Google (by Arne Brachhold)
- WP-Cache: very fast WordPress caching plugin (by Ricardo Galli Granada)
Update: I have switched blog engines from Wordpress to Mephisto. The entries above are only valid for Wordpress. Maybe someday I’ll compile a list of the plugins I use for Mephisto…
Stop me if you've heard this one...
October 9th, 2006
I am a software engineer turned entrepreneur working on a stealth social networking startup. And I’m looking for funding. Oh… you have? Well, it seems that scenarios like this are all too common. So how did I find myself in this situation?
It all started in June 2006 when my best friend came for a post-graduation visit. He informed me that he had an idea for a company and he was going for it. Then he proceeded to offer me the chance to be a founding member. For me, it seemed like a great opportunity.
At the time, I was planning a move to my current location and looking for a job in the area. I liked his idea and I had kicked around the option of starting a company before he approached me. After some debating I decided to do it. And thus was born my first company…yes, I said first…
Needless to say, things did not work out. But I did learn some valuable lessons. These may be useful to other aspiring founders and I may expound on these under separate posts in the future. The company dissolved and I was left pondering my options. Should I start a new company and continue my work? Should I start a different company and throw away the three months of work I had already done? Should I get a “real” job?
In the end I decided to start a new company. I am already jobless and penniless, so why not go for it. This blog will attempt to follow this phase of my life and may include posts on technical or business aspects, current news and events, or just random thoughts. I look forward to writing it and I hope you will enjoy reading it.
BTW, I am still working on getting my blog in order, so please let me know if you see anything amiss.