Retrospective Facilitation

I facilitated my second release retrospective with the ProjectDX team yesterday. The first, back in October, went well enough given that I was asked to facilitate at the start of the retrospective and had no time to prepare; but yesterday’s retrospective went great since I knew ahead of time that I would be facilitating.

The activities we used during the retrospective mainly came from Diana Larsen and Esther Derby’s book, Agile Retrospectives. We started off with the “ESVP” (Explorer, Shopper, Vacationer, Prisoner) activity to find out what the group’s interest level was in relation to the work we were doing in the retrospective. Nearly everyone in the group said they were an Explorer via anonymous vote. With this group, I basically trust that outcome, although I did wonder if anyone may have given the answer they thought they were “supposed” to give.

Next, I had the team build a time line of events from the past release. Prior to the start of the retrospective, I drew the time line on our white board and divided it into sections for each iteration (our cycle is 2 3-week sprints followed by a 2-week, internal Alpha testing period and a 2-week customer Beta testing period). The result looked something like:

  |------------------|------------------|--------------|--------------|
  | Sprint 1         | Sprint 2         | Alpha        | Beta         |
  |                  |                  |              |              |
  |                  |                  |              |              |
  |                  |                  |              |              |
  |                  |                  |              |              |
  |                  |                  |              |              |
  |                  |                  |              |              |
11/03 ------------ 11/24 ------------ 12/15 -------- 12/29 -------- 01/09
  |                  |                  |              |              |
  |                  |                  |              |              |
  |                  |                  |              |              |
  |------------------|------------------|--------------|--------------|

During the retrospective, I had everyone take some time to think about any events during that time period that were meaningful to them in any way, write the event on a sticky note then stick the note on the time line in roughly the right spot. We spent about 45 minutes generating events, during which time we were free to look back at calendars and email as well as the commit logs from our SCM. Having set the time box to 45 minutes, I said it was fine for people to take a break if they felt like they couldn’t remember any more events and asked everyone to simply be back on time for the next step.

Rather than specifying that people work in pairs, I opted to have the team self-organize here. It was interesting to see how—at first—everyone seemed to work on their own, but as the more obvious events were posted to the board, people started working in groups to come up with more data. At the end of the allotted time, we had a white board full of events.

The area below the time line was intended for a graph of energy/emotion levels, which I’ll talk about in a moment, but JD Huntington had a great idea to also add to that area a rough bar graph of our commit volume as reported by GitHub’s activity graphs.

After everyone had a last opportunity to look at the board and add any last-minute stickies, I asked everyone to take a turn at the board and use markers to place a blue dot next to any event which they felt positive about and a red dot next to any event that they felt negative about. Then, I asked them to think about their positive and negative energy/emotion levels throughout the release and draw a line graph in the bottom section to signify their ups and downs throughout the release cycle. At this point, we looked at each iteration in the cycle and I asked the team to make observations about the data. Using bullet lists at the bottom of the white board, we captured the observations as further data points for analysis.

After a break for lunch, we used the “Patterns & Shifts” activity to generate insights about the data on the time line. We gathered around the white board where I asked each person to mark on the time line any point at which they felt there was a shift or transition of some sort and to draw lines between any events, graph points and observations that they felt were somehow related.

After no one was able to see any more connections, I asked the team to look for any patterns among the connections and the shifts. The first thing we noticed was that we felt like the real shift between iterations was constantly happening about 3 days after the actual time box ended. Rather than get into a long discussion about it when it was noticed, I asked the team to simply keep it in mind as a possible concern during the next phase of the retrospective.

The next observation was that we had a number of connections with long lines spanning two or more iterations. I asked everyone to focus on these connections and look for those where we may have noticed an issue early on but it wasn’t addressed until much later. In some cases it turned out that while that was the issue, the length of the line just signified that either the work took that long or there was a conscious decision not to address the issue right away.

Reflecting on the other cases led to an interesting discovery, however. Chris noticed that where the lines crossed the bounds of the iterations it was likely signifying a parallel cycle which we were attempting to force into our release cycle: specifically, we have both an explicit product release cycle and an inexplicit customer deployment cycle occurring at the same time.

After we were finished recognizing patterns in the data, it was time to discuss these patterns (and anything else on our minds) and come up with a few action items for the next release cycle. Here I ran the team through the “Circle of Questions” activity. In this activity, the group sits in a circle, and each person takes turns asking a question to the person on their immediate left. The question can be about anything they like (barring anything offensive or attacking), but it’s helpful to focus on the insights gained during the previous stage of the retrospective. The person to the left answers the question to the best of their ability, and then they ask the person to their left any other question (or the same question if they feel they’d like a better answer). This continues until the alloted time is up or you have gone around the entire circle twice, whichever comes last. Make sure you go around the complete circle: if some people in the group get more turns to ask or answer a question than others, it can send the wrong message.

The thing that I really like about the Circle of Questions activity is that when you have a mixed group of people—some of whom tend to dominate the conversation while others tend to stay quiet—it gives everyone a chance to ask their questions and have their opinions heard without feeling like the most boisterous people have the only valuable input. We certainly have a mix like that in our case, and this activity worked wonderfully.

In the end, we came away with a number of things to change for the next release cycle. It’s interesting to note that none of our action items were directly related to the insights generated from the time line. I think the insights are still valuable (and are contained in the notes which we post to our internal wiki), so we may still come back to them in the near future; we were running over on time and had to wrap up even though the discussion could have continued longer.

Before we held this retrospective, I think some of the team members felt that we would not gain much from doing a full-day retrospective this time around. We had made good progress on our action items from the previous retrospective, and the general feeling was that things were going basically well. What could we possibly need to change?

People, please don’t hold retrospectives only when your team feels like there’s a problem that needs to be dealt with. If you hold retrospectives on a regular basis, whether you feel like you “need” to or not, you will uncover issues before the become problems. In our case, we managed to uncover a number of issues during our retrospective that could easily have grown into much larger problems if we didn’t bother to think about them until the effect was obvious.

If you do have obvious issues, then you might choose a different set of activities than what we did for this retrospective. The time line activity is great for discovering potential improvements even when everything seems to be going well, so I suggest giving it a try the next time your team is tempted to skip a retrospective because no one thinks there’s any huge problems.

View Comments

2008 Year-End Review

Wow! Just…wow!

I can’t believe 2008 is already over. The older I get, the faster the years seem to fly by; I’m not sure I like the trend. The effect mainly tells me that I need to concentrate more on living my life intentionally, so that I have a better memory of my everyday experiences.

That’s not to say that I don’t remember 2008—this has been a year of big changes and lots of neat experiences. The year started off with a plan to take a job in Dublin, Ireland and move the whole family over there with me. For various reasons, that didn’t work out. We stayed in Portland where I opened up shop as an independent consultant. Finally, after working with a number of wonderful clients, I decided to accept a job offer from one of them; and I’m once again an employee.

Probably my most important achievement of 2008 was to completely, 100% quit smoking cigarettes. I had actually quit in the Fall of 2007, but I was using the nicotine patch, and it took me longer than it should have to wean myself off of it. But I did, and I’m now living completely nicotine-free.

I did not, unfortunately, stick to my exercise goals for the year. The new bike I bought this summer with a plan to ride several time per week has only been out of the garage a handful of times. In the Fall, I started the 100 Push-ups program and added on sit-ups, leg curls and calf extensions. I was doing pretty good for a few weeks, but then my schedule got thrown off when Misty went out of town, and I never got back on track. Boo.

Of course, no 2008 year-end review would be complete without a record of the Snowpocalypse which descended upon us during the last half of December. It almost never snows on the valley floor in Hillsboro or Portland. This year it not only snowed, but it stuck. We had well over a foot of accumulation by the house along with a half inch of ice. Since we’ve no infrastructure for clearing the roads, everything basically shut down. Of course, I enjoyed the hell out of it, because it gave me a chance to put the Jeep in 4-lo once or twice.

This was definitely a prosperous year for our family, and we’ve been able to do a number of fun extra things such as pay for my friend, Quentin Baker, to fly out for a few days this fall and for my dad and his wife to come out for a week during Christmas. We’re debt free except for two car payments, and we’re hopefully in a good position to weather the current problems with our economy.

2009 looks like it could be another year of changes. It’s definitely going to be a big change for our country as our new president takes office. Hopefully I’ll be able to bring some more positive change to my individual life as well. I plan to spend some time tomorrow thinking about my goals and resolutions for the next year.

For now, good-bye 2008 and happy new-year!

View Comments

Switched to Jekyll

If you’re seeing this, then you see that I’ve stopped hosting my blog on Blogger and am now using a slightly modified Jekyll. Jekyll is the engine that powers GitHub’s recently announced ”pages” feature.

I’m not hosting on GitHub, though. I simply installed Jekyll on the cheapest VPS from Slicehost, set up a git repository on that server to hold the contents of the site and then slapped together a simple post-update hook script for git that automatically publishes the site when I commit changes.

The changes also come with a new design.

Dragons are cool, so I am cool.

The stylesheets obviously aren’t fleshed out yet, so everything pretty much looks like crap. I plan to have it fixed up real soon.

Also need to slap together a new Atom feed for the posts.

All worth it, since I can now easily compose my posts in Vim using markdown syntax and have them stay editable in that format. MAybe now I’ll actually post more than once every couple of months. :-)

View Comments

Doing the Employee Thing Again

After working for myself as an independent consultant for the last 9 months, I've decided to accept an offer of employment from one of my clients. As of December 1st I will be a full time employee of TSSI and working with the team building ProjectDX.

This was not an easy decision to make, and I definitely went back and forth on it over the several days after receiving a formal offer. On one hand, I really enjoy working as an independent consultant and felt that it might be a mistake to leave that role after less than a year. On the other hand, I had a decent offer from a company that I really enjoy working with. In the end, the decision came down to this: If I turned down the offer, I couldn't expect it to still be there in a couple of months if I regretted the decision; but if I accepted the offer then later decide it's not where I belong, I can always return to independent consulting in the future.

My role on the ProjectDX team won't change a whole lot from what I've been doing the last several months—I'll mostly just be doing more of it. I will officially be taking over the role of scrum master and continue to serve as "technical lead" when it comes to helping the team learn and use agile engineering practices.

I'm excited to deepen my relationship with the ProjectDX team, because I've been impressed from day one with their adoption of the agile philosophy—both from the developers and the product owners and executive management. It's rare to find a team that works together so effectively, and I'm proud to be on board.

I don't plan to leave the consulting world altogether. I won't have time to get involved in any in-depth programming work, but I will still be available for occasional retrospective facilitation, technical review or other short-term engagements.

View Comments

OpenID, Finally

I’m finally getting a chance to play around with implementing OpenID on one of my current projects. Yeah, I realize I’m like the last one to the party: but most of the applications I’ve worked on the last few years were internal business apps where it wouldn’t make sense to use something like OpenID.

Looks like it’s fairly trivial to add OpenID support to a Rails-based application; I’m mainly pointing out these directions because the info I found on the web was a bit old. The basic directions are still the same as they were a year ago, but the old timestamps on the blog posts I found left me unsure at first as to whether the info was appropriate for the latest version of Rails (2.1.0 as of this writing).

Essentially, you install the ruby-openid library which is available as a rubygem. Then add the open_id_authentication plugin to your Rails application. Thankfully, this plugin limits itself to providing an API to make calls against an OpenID server and a little bit of behind-the-scenes ActionController magic that seems to stay out of your way—I hate plugins that want to add a bunch of views and models and crap to an application, so this was a blessing.

While the plugin supplies the API for authenticating against an OpenID server, it is your responsibility to add the correct logic to your controllers to determine when the request should be made and how to handle the results. The example in the README for open_id_authentication are pretty clear.

I was worried that adding OpenID support could be a bit of a time-sink, but in reality it’s very little work at all. If you have a public Rails application that allows users to sign in, there’s really not much excuse for not adding OpenID support.

View Comments