“Waste”—it’s an ominous word by itself, and in the world of Lean principles, it’s the one thing you’re striving to eliminate. Waste can be defined as that which adds no value to a project; i.e., those things that you are spending time and money doing, but they don’t move the project forward. Software projects are often full of waste, and in such an imprecise discipline, it can be difficult to identify the sources of waste. In fact, a lot of times we end up running in circles, attempting to clean up the symptoms rather than the causes.

In my experience, the one largest source of waste that can be eliminated or reduced to add immediate benefit to a project is rework1. Rework falls into two major categories:

Technical debt refers to those shortcomings in the design of the software that we accept that we will have to address at a later date. This often comes as a result of running out of time in any given iteration; as we cut corners, quality suffers, and technical debt mounts2. Defects, on the other hand, are unintended consequences or misunderstood requirements; that is, they are unforeseen problems with the software that must be addressed immediately. The ratio of the two varies from project to project, but since defects often require immediate consideration, they tend to have a disproportionate effect on the deliverable date.

Of course, the obvious solution is to write bug-free code. That’s what we want to do anyways, right? Admirable, yes, but not practical in the least. It is impossible to write code that is free of defects, as it would at its very base require a product owner and development team that are somehow psychically linked as well as infallible. However, it is possible to reduce the number of defects by following some very simple principles. This list is by no means comprehensive, but it should give you a starting point.

Limit work in progress. Each developer should really not be working on more than one or two tasks simultaneously in most situations. Focus increases reliability.

Reduce “crunch.” It should be obvious at this point to both developers and managers that there is a diminishing return on hours worked. Try to take on realistic commitments for each development iteration and avoid working large amounts of overtime if at all possible.

Pair programming. This is a highly useful tool not only for developers to check each other but also a developer and a quality/business analyst to check each other. Your team will think you’re weird at first for asking for such an odd pairing, but I’ve done this before, and it can be highly valuable to have someone who understands the business and requirements working with the developer up front. This also increases utilization of QA resources that often sit idle until the end of an iteration.

Engage QA earlier. Frequently in agile environments we fall into the trap of doing “mini-waterfall.”3 That is, we do a design and specification phase during sprint planning, then the coders spend a bunch of time doing heads-down work to meet sprint objectives, and then they finally throw their deliverables over the wall to the QA team at the very last minute. If you find this to be a frequent problem, then break your tasks down into even smaller chunks that can be completed and delivered without utilizing the entire sprint for each one.

Inclusive design. Always strive to include the entire team in design and specification meetings. It’s a simple fact that if more people are involved, more problems are likely to be uncovered before development even starts. The team as a whole should have a keen understanding of the entire project, even parts they may not be responsible for. If you find that this inclusiveness is eating up too much time, it’s most likely because your team is too large or your meetings are not staying focused.

Daily updates. The daily status or “stand up” meeting is one of the core principles of Scrum. Even if you’re not practicing Scrum (or any agile methodology for that matter), I highly recommend daily updates. A focused, repeated meeting to keep everyone up-to-date on the team’s progress can help the team be aware of its progress as a whole as well as help identify and address problems mid-stream rather than at the end.

Visibility. Another principle of Scrum, task boards and burn-down charts can also help the team with understanding where it is. Whatever the actual implementation, it should be a highly visible cue into everyone’s projects and the overall health of the project. Increased visibility reduces one of the most frustrating defects—items that we just plain forgot about.

1Software Development and The War on Muda
2Commit to Sprint Planning or Definition of Done, Not Both
3How long should a sprint be?

posted on July 27th, 2009 at 9:00 am

← Back to articles