October 2008 - Posts

Appropriate for the Environment – A “Done” Criterion
31 October 08 12:06 PM | Anonymous | with no comments

When we create a work artifact on software project, we usually create it with the understanding that somebody else will need to use it. The who, when, and where of that somebody has a huge impact on whether or we can consider our work “done” or not. To be done, we must determine if the work is Appropriate for the Environment in which it will be used.

Think of two teams: Team A and Team B. Surprisingly, both are working on the exact same product, using the same technology, and the same development lifecycle. Team A has been working together as a team for about five years. They are co-located and have deep knowledge of the technology and the customers.

Team B, on the other hand, is a bunch of new hires straight out of college. They still have not all moved to headquarters yet so most of them are telecommuting. Team B has a basic understanding of the technology and has heard of the customer.

Since we are working on the exact same product, etc. you might expect that they should produce the exact same work artifacts. In fact, you might be able take a work artifact from one team, substitute it for the same artifact on the other team, and nobody would notice.

Absurd you say? Rightly so, but why?

You point out that Team A can probably take a bunch of shortcuts that would be dangerous for Team B. Why can Team A take shortcuts? Because I made Team A different from Team B in the two areas that are critical for being Appropriate for the Environment: Competency and Distance. The more competent you are, the less detail you have to have in your communication to get your message across; the more distance, the more detail you need.

Competency here is not about how smart a team member is, it is how much knowledge they have about the technology being used and how much knowledge they have about the needs of the customer.

A student in one of my seminars was a great example. He was a PhD in Geophysics that went on to get a Master of Software Engineering. He was responsible to create software for other geo-scientists. During the seminar he stated that when he gets a requirements specification from the non-software scientists, he would scan it, ignore most of it, and build what they needed. His customers were delighted. Since he understood both the technology and customers needs, he would get the the gist of what they were looking for and could move forward.

Contrast that with a client in telecommunications which was outsourcing to Russia. The client would send a specification to the Russian body shop, Russia would code it to spec, send it back, and it wouldn’t work. Russia understood the technology but not the customer. The client put more detail into the next specification it sent to Russia but it came back with the same problem: exactly to spec but not useful. Only when they reduced the detail and sent a designer (somebody who knew the customer) with the specification did they get useful software.

As competency–knowledge of the technology and the need–increases, the need to put detail into communication decreases. Team A, with abundance of both, probably has far less detail in its project plans, specifications, and even code comments. Would it harm Team A to put all the detail in? Probably not directly but much of the detail would be wasted effort and may impact morale (taking time to produce not needed stuff).

Distance, a second critical area, can be measured in at least four dimensions. Physical distance, of course, but also time, culture, and team size. One of key lessons that organizations have learned with distributed development is the inability of work artifacts alone to solve the distance factor. For example, bringing the team physically together at the start of a project is considered a best practice by many companies. Leading companies invest in telecommunications and travel to deal with distance issues.

It is somewhat ironic that we see a rise in Agile programming practices with an emphasis on little to no distance in the team and at the same time a rise in distributed development (some outsourced) that has a high distance factor. Enter the somewhat oxymoronic “Distributed Agile”. Sure, we can bring collaboration solutions to help lower distance issues, but Agile at a distance requires higher detail in our work products than co-located Agile.

The size of the team has a distance impact. As the grows, it is more and more difficult for each member share a common set of information. While a team of 100 may be co-located on the same floor of the same building, it is unlikely that they actually share a common understanding of the work at hand. In a sense, the large number of communication links creates distance.

Both Team A and Team B have to deal with the last two critical areas of Appropriateness for the Environment: Criticality/uniqueness and legal/regulatory. If there is a law that says you must, well, there you are. Criticality/uniqueness is a bit more subtle. If the item in the work product is critical for success or is different than what we have done before, then it is worth the time to put in more detail. Leaving the detail out, even competent people may assume that it is business as usual.

An example was some work I had done to remodel a bathroom with a contractor. The contractor, assuming business as usual, had quoted and planned to install a standard 24” towel bar. I had to make sure it was very clear that I wanted three towel hooks (three daughters) instead of a towel bar.

To say a piece of work is “done”, we must consider if the amount of detail is Appropriate for the Environment. To do that, we must look at

  • competency in the technology and the customer needs,
  • distance: physical, time, cultural, and team size,
  • legal/regulatory requirements,
  • and the criticality/uniqueness of the item.

How do you determine the right level of appropriateness? That is far more of an art than a science. Often it is a matter of trial and error until you find the right spot. However, as a thought exercise and a discussion point, it can help you contextually determine when something is “done”.

Like this post.

Filed under: ,
Sufficiently Complete - A "Done" Criterion
10 October 08 08:27 AM | Anonymous | with no comments

A helpful way to think about a software project is to see the project as a series of decisions about what problem or opportunity the software will solve/implement and the solution itself. Theoretically the decisions start out large and granular and get refined and detailed as the project progresses. Code becomes that last place to make decisions before turning it over to the compiler. Of course in reality, software projects are more likely to see almost random decisions made at multiple levels of detail. At least most projects still tend to wind up at that last decision point—code.

With a serial decision making model of a software project, one criterion in defining “done” is to ask if the work item under consideration is sufficiently complete to make the decision the team or business needs to make at a particular point in time.

Here is an example. Let’s say I am at a point in the project where I need to make a reasonable commitment to the cost and duration of the project. What would need to be “done” in order for me to do that? A simple answer would be the requirements, the design, and some sort of staffing plan. But do I need all the requirements done and all the design done? Probably not. If I had

  • identified all critical features with their key non-functional criteria (maybe also critical out-of-scope features identified as well)
  • selected an overall architectural approach
  • worked out key design elements
  • secured commitment from critical staffing resources
  • created a list of top risks

I could probably make a reasonable commitment. I do not need all the requirements completed to the last dotted “i”. I do not need every part of the design worked out in advance. I do need the work to go to a certain level of depth and refinement where the information is sufficient enough to make the decision at hand.

Sufficiently complete is about creating the information needed to make decisions at different points in the project. Could I have done all the requirements work before making a cost commitment? Sure, but much of it would be nice-to-have rather than truly needed for the decision. Also, given that much of that requirements detail will be out of parity with other work detail (like design), it is highly subject to change and may mislead the decision at hand. Think of the sufficiently complete criterion as creating just-in-time information.

The question you must ask to determine if a work item on a software project is sufficiently complete is, “What decisions do we want to or need to make on this project?” The decision points are often closely related to the software development lifecycle you have chosen. For a sequential project, I might need to make a decision if the requirements are sufficiently complete to start design. On a more incremental and iterative project, I might need to decide if a story would fit within my iteration length. To make either decision, I have to do some requirements work but not all the work. The requirements work will be sufficiently complete when I can decide the story will/will not fit the iteration (and a little design work will be needed too) or that my risk at starting design on the sequential project is low enough to proceed.

Some common decisions that any project must face are

  • Why put our effort on this project rather than some other project?
  • What are the problems/opportunities do we want to address with this project (and which ones do we not want to address)?
  • Who should be a part of this project?
  • What technologies/strategies should be bring to bear on this problem/opportunity?
  • Does this project still make sense given the business case and what we know now?

And we don’t make these general decisions once but over and over again at various levels of detail or abstraction. At each questioning, some amount of work needs to be accomplished to get the information to make the decision.

Once you have found your decision points, identify what you must know in order to make that decision. When you have identified what you need to know, you then have the information to judge if your work is sufficiently complete.

Filed under: ,