English

An Exercise for Defining Done for Scrum Teams

In this post, I’m going to share an exercise you could try for helping a team start their journey towards a clear and shared definition of what it means to done with a feature in a software product. I’m looking at this from the perspective of agile development with Scrum, but my guess is you can use this even if you’re not using Scrum. I’ve taken a core exercise I’ve used many times to help teams form a first definition of done, and combined it with some debriefing practices I’ve learned over the years. If you want to use this exercise, go ahead. If you run it a couple of times, you’ll be able to improve on it: then I’d love to learn about how you improved it.

Scrum has taken some flak because many perceive the model as lacking a clear focus on solid development practices such as automated unit testing, refactoring and code or design quality in general.

It’s true that Scrum does not supply us with a detailed definition of exactly how software should be developed. What we get instead are some general admonitions. From these, we need to create our own set of practices that are suitable in our specific context. Here are the general rules that Scrum gives us:

  • Every sprint should end with a done product increment
  • Done means having something potentially deployable, something of business value
  • Potentially deployable implies a well designed and well tested solution, documented with user manuals if those are needed for the product to be usable

As a quick sidenote, let’s explore why we like to say “potentially deployable”, rather than “deployable”. Adding that extra word - potentially - gives us a useful, albeit sometimes risky, window of flexibility. What it means in practice is that, if by the end of the sprint we realize that we could gain from deploying, we should be able to do that deployment with just a little extra work. In an ideal world, we would be able to deploy directly - and some companies can do this. However, a company just starting out with Scrum probably cannot do this. They need to improve the way they develop software until they can be “more done” every Sprint, thus acquiring the ability to capture potential business opportunities by deploying early and frequently. The risky part: some will be satisfied with building “good enough” product increments, forgetting that in the long run, insufficient quality very easily turns into terrible quality.

How does a team move from Scrum’s general definition of done to a detailed description of what done means for them? The team can get there over time, by inspecting and adapting every sprint. If for example, we notice that planning meetings take too long and are fraught with hostile discussions, we might want to explore if we really agree on what it means to be done with something.  If you and I are in the same team, and your definition of done is “if it compiles, ship it” and my definition happens to be “refactored, well designed and thoroughly tested”, we’re bound to have frustration and misunderstandings. If this is the case, a clear and shared definition of done will be very helpful.

Let me describe an exercise I often use in my classes and workshops. It builds on several ideas to help a team get going with their work on defining what done means to them. The ideas I’ve built the exercise upon include these:

  • When asked if we agree on something, we sometimes say yes just to avoid exposing a conflict, so we need to find a way to safely expose disagreements that prevent us from working well together
  • Agreeing on a definition of something is often hard work, so we could use some help to get going and to avoid some common pitfalls
  • Simply stating that you agree is not as powerful as when you actively participate in the discussion, so we can use a setup that entices as many as possible to step in and actively participate

Over the years, I’ve tried some different approaches to this. Let me give you a step by step description of the exercise the way I myself will do it the next time I use it. I think it will work well, because the core of it is about really activating participants and in getting the discussion going in an effective and safe way.

Preparation

  1. On a set of regular size pages, type out a list of items that might be included in a team’s definition of done, such as: “Code is refactored”, “Automated unit tests written”, and so on. Take care to express things clearly. I have a set of four or five pages with things. Some of them are quite uncontroversial (“Code written”), some are things that typically need to be discussed and refined (“Full performance test run”).
  2. Format the pages so that each thing stands on its own line, a couple of centimeters (an inch) high, with large type. Add horizontal separators between each line, so that the sheets can easily be cut into slips.
  3. Add an extra page with blank lines that the team can fill in themselves
  4. Print these pages and bring them - and a couple of scissors - to the workshop.

The Exercise

  1. Invite the team and set the room up so that everyone can work together comfortably around a large table.
  2. Explain that you are about to engage in an interactive exercise together, and that the purpose of it is to see if we can find a shared definition of what being done with a product increment means to this specific team in this specific project. If the team is new to Scrum, a mini-lecture about how defining done fits into Scrum’s iterative and incremental way of working will also help here.
  3. Hand out the sheets you prepared, and ask the team to cut them up into strips with the scissors you supplied. I prefer letting the team do this work, because doing something physical is an nice way for the them to slowly “warm up” for the hard parts of the
  4. Explain that the blank slips can be used to add missing items, if needed.
  5. While the team is doing the cutting, prepare a flip chart on the wall. On this flip chart, draw a vertical line down the middle, so that you get two columns of equal width. Over the left column, write the heading “Every sprint”. Over the right column, write “Before release”.
  6. Wait for the team to end their cutting, then ask for their attention. Explain the flip chart. Tell the team that you want them to take this flip chart and put it on their table. Say that you want them to sort their strips into the two columns. In the “Every sprint” column, they are to put every item that they agree should be performed by the team during each and every sprint. In the other column, “Before release”, they are to put items that they think are important, but that for some reason cannot be done in every sprint, but that definitely must be done before the product can be shipped out. There is typically no need to go into why something might end up in the “Before release” column, but if the question comes up, briefly explain that for technical or economical reasons, it can sometimes be hard to fit some things into the sprint, and that this may or may not be true for the current team.Defining done

  7. Explain that what comes next is very important. Once you have the full attention of the group, reveal that they will do the sorting under complete silence. This is usually quite surprising. Tell the group that they are to work in silence, until it is absolutely impossible to keep working silently. When this happens, but not before, they can start talking to each other.
  8. You also need to explain how the participants should handle differences of opinion during this part of the exercise. Explain that all participants have the right to place any slip in the place they think it should be. If anyone sees a slip that is in the wrong column, they can just move it to the right column. If you see someone moving a slip you just placed, just move it back again. You’ll notice if some slip keeps moving back and forth a number of times. If that happens, just place it on top of the line separating the columns, and keep working on some other slip. Don’t start talking when this happens, just keep going. When everything has settled down and you can no longer work in quiet, that’s when you can start talking about how to handle those hard to place pieces.
  9. Sit back and watch the team get to work. It’s quite fun. Take this time to practice your skills of observation - look at expressions, gestures, movements and think about what they might mean. If someone starts talking too early, gently remind them to work in silence for just a few minutes more, until most pieces have fallen into place.
  10. After some time, the team will notice it can get no further unless they start talking to each other. When this happens, most uncontroversial pieces have typically found their place, even though you can be sure there’s still no agreement. Depending on the team, you might need to facilitate this lightly. One way to do that is to ask some questions, like “I notice you’ve placed this slip here (point to a slip) - how did you decide on that?” Some teams naturally take to discussing, others need more help to get started.
  11. Let the team take its time working on the sorting. Remind them that we’re searching for a shared and usable definition of done, something that they could potentially use in their current project right away.

The Debrief

  1. With the slips sorted into columns, hand out some tape and ask the team to fasten the slips to the flip chart they’ve been working on, then to post the whole thing on the wall.
  2. Ask the team: “You’ve created your first definition of what it means to be done with a product increment in a sprint. What are your thoughts now?”
  3. Write down the reflections that come up, exactly as they come up, on an empty flip chart.
  4. Next, write the heading “Suggestions” on a blank flip chart, then ask the team: “What are your suggestions on what you as a team should do next?”. Clearly explain that we’re currently only after ideas, that we’re not deciding anything yet.
  5. Help the team do a silent brainstorming to identify as many suggestions as possible . My experience is that a silent brainstorming results in more and more-varied ideas. To do this, just hand out sticky notes and ask participants to write one suggestion per sticky note. Set a time for this, perhaps five minutes, or maybe ten. I usually go with five, then ask if more time is needed when those five minutes are up. When the time is up, let those still writing finish their notes, then ask participants to take turns posting and reading their suggestions.
  6. With all suggestions up on the wall: do a quick dot voting to gauge the group’s thoughts about the suggestions. Ask each participant to place exactly five voting dots on the suggestions he or she thinks has the greatest potential in helping the team perform better. Explain that they can place the dots any way they want, all on one suggestion or distributed over several sticky notes. Explain that this still does not mean we’re deciding anything - we’re just trying to get a feel for the group’s overall interest in the suggestions.
  7. When the suggestions have all been posted, write the heading “Next steps” on a fresh flip chart and tell the group that the time has come to see if they can decide on some next steps to take. Ask the group: “Can you agree on some next step?”. Someone typically shouts out one of the previously posted suggestions, or something that is a synthesis or rewording of one of those suggestions. Help the group formulate the next step as a clearly stated action. Ask the group if they agree that doing this action is desirable. Use thumb voting if needed: thumb sup means agree, down means don’t agree, sideways means “I don’t care, so I’ll go with what the majority decides on”. If someone shows a thumbs down, work with them to modify the suggestion or create a new one, until agreement is reached. If no thumbs are pointing down, the group has decided.
  8. Ask for more next steps, until you have enough to see that the team will take some clear next steps to keep moving with the work they’ve just done on defining done. If everything goes well, the team will suggest activities that relate to incorporating the new definition of done into the daily work. If things go less well, they might not - but this is also information, and you should be glad that it comes up now and not later, when you’ve tried to build a product without first agreeing on how to work together. Don’t be surprised if the team comes up with really inventive and ambitious ideas, and choose to act on them - my experience is that this happens more or less every time I work this way with a team.

The first definition of done agreed upon by a team in an exercise like this will not be the final one. Whatever you do, don’t print out and laminate this definition. As a team learns more, builds more capacity, and learns to work better together, they might realize that they can improve their definition of done. A team using Scrum then implements these improvements, and it does this in a way that ensures that the whole team is in on the changes.

A word of caution. You might think this whole exercise seems like a waste of time. After all, how hard is it to create a solid definition of done and just hand it to the team? In fact, if you’ve been in the software business for a few years, that’s not hard at all. However, creating that list does not mean that the team will use it. Defining done is more about finding consensus than it is about listing an optimal set of practices. I’ll take a less impressive but widely shared definition of done over an ideal but ignored list any day. If we know where we stand, we can always improve from there.


A Stack Exchange on Scrum

Intrigued by the possibilites of the Stack Exchange platform, I’ve proposed a site for questions & answers on the topic of Scrum. On the Stack Exchange platform users:

  1. Post questions and answers
  2. Vote answers up or down, depending on how helpful they think the answers are
  3. Grow their ability to moderate the site as they engage more with it

I like how the creators of the platform aims to put the community in the driver’s seat, and I’m hoping this will take off. We’ll see about that: first, we need a number of early adopters to help define the site. Then we need a whole bunch of people to commit to working with it. If we get that, we’ll have a nice place to go for questions and answers from the Scrum perspective.

Is this something? If you think it is, you should go and check it out now.

Use Improvement Stories to Make Your Retrospectives More Effective

I love to use the user story format when I help teams plan their work. It can sometimes be hard to break user stories down into useable chunks, but their format is very easy to use: As a <type of user>, I want to <do what with the product>, so that <this value will come about>. There are different ways to format stories, but the essence remains the same. Use a simple format to quickly shake out some key information about a given requirement.

Maybe you’ve noticed that it’s not just during planning that we have hard time putting our thoughts and desires into words. Teams that do retrospectives frequently find that it can be very hard to get valuable output from these meetings. One cause of this, which is easy to remedy, is the use of inexact language.

If you’ve brainstormed improvement suggestions with your team, you might have seen a suggestion like this (written on a post-it note): “Better test”. Or maybe even terser: “Cooperation”.

These notes are a good start, because there’s an interesting story behind them. The problem is that we might have to spend considerable time pulling that story out. There is a simpler way to get there.

Nowadays, I use the story format not only in planning meetings, but also in retrospectives. Whenever I ask a team to brainstorm improvement suggestions, I ask them to do it using a template I supply. I ask them to write Improvement Stories.

An improvement story is quite easy to write, and looks like this:

Because <description of problem or situation>

we should <description of suggestion>

so that <description of desired result>.

I find that asking teams to supply their suggestions in this format results in contributions that are well considered, easy to understand and quick to process.

Have you tried using improvement stories? Drop me a note in the comments section!


Ackoff’s 95% (Cannot manage them the same way)

I’m currently cleaning up my trusty old Mac Mini G4. I’ve been cleaning out old stuff I don’t need to save, and a few days ago I installed a cheap 1 gig of memory. That upgrade did not make the machine notably faster. Today, however, I ran a bunch of maintenance tools, which seemed to do the trick. There’s a noticeable improvement in the speed of the little things, like how long it takes to fold out a menu. There was a delay before, and now it seems to be gone. Hope it lasts.

Energized by my success in speeding up the old can, I started another round of file cleaning. I found an old NeoOffice file called “Russ Ackoff - 95 Percent”. Because NeoOffice has always been extremely slow on this old machine, I wanted to see how fast I could open it. That, and the fact that I’m always interested in Ackoff’s teachings.

NeoOffice turned out to be as slow as before, but the file contained pure gold. Not new gold, but pure gold. In it was a little piece of knowledge that I’ve been using in my scrum master classes for a few years, ever since I came across it on the web.

Here are the contents of the file, which I remember transcribing from a sound file as I listened to it:

“http://www.open2.net/systems/practice/rus12.html

1900 – 95% of the people in the US could not do the job as well as their bosses could.

If the foreman retires from a group, you pick the best man to become the new foreman.

He can thus do the job better than any of his subordinates.

He will continue to rise as long as he is the best in the group.

All managers thus rise to the level of their own incompetence.

Today, 95% of the people can do their job better than their bosses.

You cannot manage them the same way.

Don’t manage what they do – manage the way they interact.

Requires different organization, and a different type of management.”


Thank you, Jerry Weinberg

Jerry, we’ve only known each other for a couple of years, but look at all the things you’ve managed to help me with already. You’ve helped me:

  • See that consulting fits for me, because trying to understand the world and improve it is what makes me tick
  • Become a better consultant, by using more of myself every day
  • Start to understand coaching technique, by watching (very closely) when you do it
  • Become better at helping other people learn, through your wonderfully designed experiential workshops
  • Feel welcome even when I was the only swede at AYE
  • Believe in myself and have the courage to ask for what I want and say what I think
  • Communicate more congruently, so that I more often get the results I desire
  • Not feel threatened by resistance, but really be able to see it as a source of power
  • Understand change better
  • Not blame others all the time
  • Not blame myself all the time
  • Meet loads of intelligent & friendly people at PSL and AYE
  • Make better business
  • Understand how to write more and better

I’m not sure you knew, but as far as I can see, we’ve had quite a partnership going. Thank you, friend. I want it to go on longer.


8 Steps to Getting Feedback

Forget everything you know about agile, about any methods, about any kind of tool you’ve mastered. If there’s only one thing you should do, it has to be this: ask for feedback.

It doesn’t matter what you do or how you do it. If you don’t stop and ask the people you work with for feedback, you’ll never know exactly how bad you did until its too late.

It’s not complicated to get feedback, but it can be hard on you. Here is one way to do it.

First of all, you find a person who can provide you with some feedback. It helps if this is a person you trust. To this person, you present your desire for learning about how you’re doing, and ask if that person is willing to give you some feedback. If the answer is yes, you make sure you sit down in a comfortable environment where you both feel safe and relaxed. Then you ask for feedback on how you’re doing with something.

You could word it like this: “How do you think I’m doing when it comes to the TPS reports?” Then you sit silent and wait. And wait. You will always get feedback, even if the person you’re asking says nothing at all.

When you get the feedback, you might be tempted to think that you’re both done. You’re not. You might be tempted to blurt out a defense, because what you’ve just been told seems so offensive. Don’t. Instead, when you’ve heard what the other person thinks, stay silent. Think. Think about what that feedback might mean. Quietly formulate your interpretation of what that feedback really means, then tell it to the other person and ask if your interpretation is correct. Then go quiet again.

Either the person will say that your interpretation is correct, in which case you can say you’ve received the feedback. Or the other person will correct your interpretation. If this happens, you listen and think some more. Then you present your interpretation of the feedback again, this time incorporating the corrections you just received. Then you listen again, and repeat the process until your feedback giver tells you that you’ve understood things correctly.

Note that even complete silence can be treated this way. Silence as a response to a direct question is a kind of feedback, which you can try to interpret. If you do, it becomes doubly important to check your interpretation with the other person, because it now comes solely from within your own head.

If this procedure seems cumbersome, that’s only because it is. It’s not as slow as it seems when its broken down like this, however. Communicating clearly is hard work. We almost always go wrong in some way when we try to communicate with someone else, and it’s often due to the fact that we think we’ve understood the other person, when in reality we haven’t.

Do I always do it like this? No, and neither will you. In fact, if you’re like me, you’ll do like this far too seldom. Sometimes, we simply lack the energy to go through all the work that’s needed to communicate well. For me, that means I’m least likely to get good feedback when I most need it. It’s at times like those that I get into trouble, and that’s why I have to keep reminding myself that feedback can be scary, but that’s just because I don’t ask for it often enough.

To summarize:

  1. Find a potential feedback giver
  2. Ask for help
  3. Find a suitable environment
  4. Ask: How am I doing [with regard to something specific]?
  5. Listen.
  6. Think.
  7. Present your interpretation of the feedback.
  8. Repeat 5-7 until you get to hear you’ve understood correctly.
Will you give me some feedback? Was this post helpful to you?

A Visible Pile of Favorite Fieldstones

I’m a programmer at heart, even though I no longer program professionally. Why? Because I love to program. It gives me satisfaction. So, from time to time, I have to think up little hobby projects that are simple enough for me to handle, but engaging enough to still my lust for coding for a few hours. Here’s my latest one.

As a writer, my intuitive style of writing has always been to just sit down and start writing. From time to time, I suddenly boot up my Mac, fire up a plain text editor and start writing. Shortly thereafter, I have an article ready.

Sounds great, right? The problem is that it happens very infrequently. In fact, it happens so seldom that I’m still a pretty inefficient writer. If I was efficient, I would have published my first book by now, for example.

So, to increase my efficiency, I try to use Jerry Weinberg’s fieldstone method. In its essence, it is very simple. You make sure you always have pen and paper nearby to capture thoughts, ideas, quoutes, facts and other pieces of data and information that come your way. You work regularly to structure these “fieldstones”, and in the end use them to build your final text.

The method gets its name because, apparently, this is pretty much like building a fieldstone wall. When you build such a wall, you don’t go around looking for the next perfect stone that will fit right into the wall. Instead, you gather all stones that might be useful. Then, once you have a reasonable pile to work from, you build the wall using the stones. Without this method, you would probably be looking for the next perfect stone forever. Or at least for too long, like I do with my writing-only-when-inspired style of writing.

To be clear, using the fieldstone method does not mean writing about things I don’t feel inspired by. In fact, this is probably Jerry’s main lesson in his book about the method - Weinberg on Writing: The Fieldstone Method. Write only about things you want to write about is a piece of advice that makes perfect sense to me. For me, the fieldstone method is a way of making sure I have the stuff I need right by my side whenever I feel the inspiration coming on, like it just did when I decided to write this blog post.

Here’s my current inspiration. For handling my fieldstones, I use a tool called Dropbox for backup and synchronization. Dropbox makes sure I have my fieldstones handy on any computer I log on to. I write in a plain text editor, TextMate. However, today I realized that my collection of text snippets could use a bit more transparency. They lie there in their folder, all silent and waiting, and I sometimes forget that I need to wake them up from time to time and shuffle them around and improve them a bit. So I decided to pretend to be a programmer again for a short time.

I recently installed GeekTool, which I use to show Twitter postings from people that I follow right on my desktop. It occured to me that I would like my fieldstones to communicate with me in the same way. I want them to show up on my desktop, so that I am reminded of and inspired by them. My idea was to write a little script that could process my fieldstone collection, find the most recently changed files, then find the most recently added headlines in those files, and post them on my desktop. I mark up my texts with Textile, a very simple markup system. Headlines for example, always start with the h1, h2, h3 or h4 tag, followed by a dot and a space. I typically add a timestamp as the last part of the headline. So, it shouldn’t be too hard to filter out the most recent headlines and show them in a neat little desktop feed.

While programming this script, I started looking at my fieldstones with more awareness of how I structure them. I discovered that I use headlines without timestamps quite often. Because of this, I changed my mind and decided that simply listing the ten most recently edited fieldstone files was quite enough. While doing this, I also learned that something in my solution doesn’t handle Swedish characters well. For now though, my on-screen list is good enough, even though å, ä, ö, and some other esoteric characters are garbled. It reminds me of which files I’ve been working on most recently. A small thing, but I think it will help me find more fieldstones that fit well with the writing I’m most focused on right now.


#!/usr/bin/env ruby -wKU

require 'find'

fieldstone_folder = "PATH_TO_MY_FOLDER_ON_DROPBOX"
files_to_show = 10

fieldstone_files = []
recent_files = []

Find.find(fieldstone_folder) do |path|
  if FileTest.file?(path)
    fieldstone_files << [path, File.ctime(path)] unless /Fieldstones.tmproj/.match(path)
  end
end

by_change_date = Proc.new {|x, y| y[1] <=> x[1]}
paths_only = Proc.new {|i| i[0]}

recent_files = fieldstone_files.sort(&by_change_date).first(files_to_show).collect(&paths_only)

recent_files.each do |path|
  match_file_name = /#{fieldstone_folder}(.*)(?=\.txt)/
  file_name = match_file_name.match(path)[1]
  puts file_name
end

Theory of Software Development

In today’s Computer Sweden, Ivar Jacobsson plugs his company’s latest offerings and requests a theory of software development. I haven’t tried his latest products, so I won’t comment on them. They might be great. However, one thing that puzzles me about the article is the absence of anything concerning useful theories applicable for software development.

Ivar Jacobsson rails at the prevalance of practices but, at least in this article, doesn’t even come close to touching on any relevant theories. Instead, it seems to me that he promotes even more practices. I’m sure things will clear up for me once I get my hands on his latest toolbox. Unless, of course, I have to pay a lot of cash to get it, in which case I probably won’t get my hands on it.

In that case, I might just spend my time by learning a bit more from those who seem to come closer to a set of working theories useful for understanding software development work. Like Gregory Howell and Lauri Koskela, in their provocatively titled paper “The Theory of Project Management is Obsolete”. Or like Don Reinertsen, who uses queueing theory to understand certain aspects of getting stuff out the door. Or like Mary Poppendieck, who also likes lean thinking and has made her own attempt at translating those thoughts to our world. I’m not sure these three would necessarily agree with each other if they met, but they are trying to find new ways of understanding the theoretical underpinnings of development work.


Learn about congruence and blaming

Tomorrow is the last day of the Problem-Solving Leadership that is being held this week outside of Uppsala. Participants in the workshop will learn many things through their interactions with each other, themselves and the hosts - Jerry Weinberg, Esther Derby, and Johanna Rothman. It’s a fabulous five and a half day workshop which I myself participated in last March, in Albuquerque.

One of the key concepts in Jerry Weinberg’s teachings is that of congruence, a concept from the family therapy theories of Virigina Satir. Here is an article by Jerry and Jean McLendon on the topic of congruence and the blaming style of communication. I highly recommend it.