Return to Clarrus Home

About Us
Services
Workshops
Resources
Site Map


Where We'll Be

  

30 Jul: Our 19th Cutter IT E-mail Advisor: Cultivation

  

13 Oct: We've been selected to present 2 papers at the Pacific Northwest Software Quality Conference

  

Where We've Been

 

 Subscribe to the Compendium:

by e-mail or

RSS Feed:

 

 Clarrus proudly sponsors VanQ

Software Quality Assurance

 

What's New

 

6 Jul: Compendium 7.27: All That Jazz

 

29 Jun: Compendium 7.26: Faith in the Process

 

22 Jun: Compendium 7.25: Pet Tricks

 

Archives

Software Teamwork
Articles
Business Tips
People Tips
Process Tips
PM Tips
QA, Test, CM Tips
Analysis, Design Tips
Compendium Archives
Recommended Books

Process Tips

Faith in the Process (Compendium 7.26)

Generally in software development, process has been described as the steps we take to get things done, and is often captured as a specified approach to building our products that involves some sort of lifecycle, a collection of roles and responsibilities, a series of artifacts we produce along the way, perhaps some milestones, and some checks and balances to keep the whole thing going smoothly. There is more than meets the eye if we want our approach to be successful.

It is one thing to have a process defined by a small group of people that are leading the parade, yet another thing to have it understood and followed effectively by the masses. This requires far more than capturing the intended steps, or identifying the book or website that describes the approach to take. It even goes beyond educating the group more closely to ensure they can recite the approach as it is defined. What is really needed to internalize and have an effective approach within the team is for everyone to have experienced that approach enough so that they can trust that it will work. They need to have built faith in the process.

Without faith in the approach, it becomes far too easy to fall back on an old, trusted approach at the first hint of trouble. not only do we need to understand the steps in the process, we need to know, to have internalized, that the process will work even in the face of adversity. This is not something that others can tell us, this is something we need to experience. For those that are driving process in their organizations, or are consulting into shops as a process champion, this is a critical stage in the change cycle that we need to manage carefully. It is not something that can be trained or passed along in a lunch and learn session, it takes time and personal experience through the lifecycle.

This is true of any process, not just for software development lifecycles. As we run diagnostics in more and more organizations, I am always faced with skepticism that such a light approach can yield the sort of results we often see. I can tell people about the experiences I have had with other groups, and that is often enough to convince people to give it a try, but there remain those that are not fully bought in.

From the thinking perspective, I know that the combination of involving everyone, promoting open honest discussion, and allowing the team to drive their own conclusions about what reasonable next steps should look like is a formula that has been successful and repeatable from place to place. It is only after having run the diagnostic dozens of times, though, that I am at a point where, from the sensing perspective, I know it will work, and have complete faith in the process. It would be naive to assume that others will have that same level of faith without the same degree of experience, no matter how many testimonials I throw at them.

This faith in the process can only be built over time. If you are part of an SEPG or PMO or a Certified Scrum Master, you need to appreciate this as you work with your teams. Assume that while rote learning of the steps can be relatively quick, deep faith in the approach to the point where it will be trusted in the face of adversity, is not something you can pass along through a manual or slide deck or discussion. It has to be experienced. - JB [top]

Teaching Software Process (Compendium 7.19)

One of the many lists that I lurk on, the Agile Leadership Yahoo Group, became active a few days ago, with a thread that ranged from quite thoughtful to somewhat disrespectful, as these threads often do (which is why I generally only lurk). At one point, a question was posed: if you were teaching in, say, the Masters program at Carnegie Mellon, how much time would you dedicate to teaching about the past and how much about the processes for the future? I took a bite, here's a paraphrasing of what I had to say.

I would look at teaching development processes in a different way than past vs. future (to avoid that corresponding inappropriate implication that past = failed and future = successful). After all, some approaches developed long ago resulted in project successes, while some more recent approaches are contributing to project failures today.

A defined approach in itself is neutral, it is the application of that approach to a specific project situation that begets success or failure. Instead of past vs. future, I would suggest we have a lot to learn from all approaches over the ages, looking at projects where these processes have been positive contributors and where they have really just been barriers to success. There have been successes and failures in every approach, at least the ones that have survived to the point where they show up in the literature. There will continue to be failures as long as we believe that the right process, any right process, is a magical formula that allows us to stop thinking throughout the project, or that we can define the right process in advance of understanding the product and the stakeholders involved.

I see the history of approaches as an evolution of thinking, with a couple of key themes that continue to weave in and out over time. The most prominent of these is the hysteresis of process 'weight' over time, from little or none to way too much and back again (and I'm sure the pendulum has not yet stopped - back to those ongoing failures and the magical formulas above).

I would show how much of the 'new' thinking in processes has existed for decades, but I would also recognize that the rebranding and repackaging has made these practices more broadly acceptable, which is a very good thing. Each process has it's strengths and blindsides, it's area of focus and implied assumptions, and a challenge it was meant to address. The trick when studying processes is to recognize the relevance of an approach to a given problem, and make a conscious selection of the right path forward. Unfortunately, many process consultants, old and new, internal SEPG members or external consultants, come to the table with experience in one approach that worked well somewhere else, or feel obliged to identify a standard process for all forthcoming projects.

I would also highlight that there is currently a dangerous false dichotomy of thinking for many that there are successful projects and there are projects that are not Agile.

There is much to learn from the past, particularly that there have been many successes and failures to learn from. More often than not, it is not that the process applied was bad for failed projects, but that the process applied was not wisely selected, or that it was not followed in the heat of battle. We also need to learn that this is still going on today on many projects, and the results will be the same.

The most appropriate process is extremely dependent on the team, the culture, the client, the product and myriad other factors: it is dangerous to say a priori that this or the other process is the right one (or conversely, to say a priori that an approach should not be considered). As with anything, decide for yourself rather than listening to one salesman's pitch for their wares. Understand a range of different approaches, the relative value of each, and decide for yourself.

Perhaps the past vs future can be reframed as dogmatic process application vs a considered, tuned approach as the situation warrants. We have a way to go before the future is upon us. - JB [top]

Overcoming Resistance (Compendium 7.13)

It never ceases to amaze me how many different ways we can come up to fight change. Whether it is dropping a few pounds, kicking that nasty smoking habit, shutting off the lights as we leave a room or getting better at developing software, we are clearly at our most inventive in finding ways to just stay put.

This is a clearly identified stage in Virginia Satir's change model: Resistance. Even though our brains will be telling us that there is a better way to do things, a real opportunity to improve on our existing level of performance, something inside us holds us back. It is comfortable here, we tell ourselves, it's not so bad now that we are used to it. Let's just stay put - that's so much easier.

No learning, no disruption, no chaos. Just the current status quo, which in many cases is the devil we know. While the allure of this current way of doing things can pull us back from almost any stage of change, it's primary strength seems to be in keeping us from heading down the path of change at all! Resistance = inertia.

As agents of change, our most critical task is to understand all of the barriers to change that are put up, and to break them down. For many of these barriers, our job is to expose them for what they really are: excuses and rationalizations that won't hold up to scrutiny. It is one thing to present a better future, but a strong change agent understands that we need to sell to overcome the resistance.

In changing how we develop software there are many forms of resistance, but the primary ones fall into a couple of categories. We will often hear things like "we tried different ways of doing things, it didn't work", or "we don't have the time to learn new approaches", or my personal favourite, "we can't afford to do those things". There will be variations on these themes (the latest I heard was that the group was operating under spending constraints), of course, but these are the big three (and actually, the last two are different spins on the same resistance). Listen closely as people put up their barriers to doing things differently, there's a good chance that most of what you hear will fall into these areas.

Let's start with the second barrier, the 'there's no ROI in this stuff' resistance. This can take the form of not enough time, money or resources, but these are essentially equivalent for the purposes of selling change. It is interesting to note that most teams cite 'not enough resources' as the greatest issue they face, so it is worth starting there: even if it is not cited as a barrier, bring it out for discussion. In almost every situation I have come across, this barrier arises because it is the numerator that is not well understood. Even if we can clearly cite the value of the proposed changed practices, few organizations have at their fingertips the current cost of non-quality. We need to expose that blackened lung that incents people to quit smoking, or those jeans that won't button up to get people to shed pounds.

In software teams, this is the elephant sitting in the room that nobody talks about. Almost every team can quickly start to appreciate the costs associated with their current practices with a few nudges. Anecdotal recollection can be quite generous, but even then if we sit back and ask how often we deliver on time, or how much time we spend cleaning up messes, people will start seeing the potential for return. Then we can walk down the path of taking a few measures. Grab the first 20 or so defects you have in your defect tracking system, and count how many have their basis in something that could be reasonably have been identified in early-stage analysis (typically it is half or more). Get people to measure how much time they spend working on things they thought they had washed their hands of, even for a week or two (again, numbers around a half are not uncommon). On-time delivery? Unmanaged scope change? Employee turnover? Overtime and burning the midnight oil? Heroic efforts? Lost customers? Customer reported defects?

The list goes on. We can very quickly build a compelling argument that there really is a return to be had, it simply was not top of mind, and almost certainly was not being measured. Armed with this, we can have a rational discussion that addresses this barrier, and we usually get to the point where the discussion becomes "we can't afford NOT to change". The more real and more personal the data we can provide, the better.

That first barrier, the 'this stuff didn't work in the past' barrier, usually comes as a result of misdirected or overwhelming change that has been inflicted on the group in the past. Once incented to actually change, we need to be careful to identify the smallest possible change that will provide the greatest impact against the most relevant cost. Too many change initiatives take on too much, which dilutes the value of the return, increases the cost of the investment, deepens the chaos and lengthens the duration before we start seeing value. "We're going to follow the Unified Process" can literally destroy a business, and even "we're going to do Scrum" can inject too much change if the team is not ready for it. Better to go with something like architecting the system, or starting a daily status meeting, if those things are the ones that will provide the best value.

If we select properly, we can see dramatic returns almost immediately. This, in turn, reduces the likelihood of barriers cropping up next time around, as the team starts to understand that this change stuff doesn't have to be so bad after all. It's all about selling to overcome the resistance. - JB [top]

Core Change Principles (Compendium 7.12)

What we often call process improvement is actually change management. The fact that most process improvement initiatives fail or disappoint is primarily due to the lack of appreciation for what matters when attempting to drive change in an organization. It has nothing to do with suggesting new practices or telling people what to do.

In the software world, we have a bad track record of adopting wholesale change, or swinging this way or that way with fads that come and go. We can all chase statistics that would claim that the industry is not getting appreciably better or that the industry is doing a lot better than it used to be. Regardless of which stats we chose to believe, regardless of how successful we feel or what our bottom line is telling us, most teams struggle with how to change for the better. As an industry, we are looking at it from the wrong angle: it's about the people first, not the practices.

First off, we can't expect any change to be successful if we don't understand where we are moving from. Good or bad, our current practices, attitudes and results constitute a status quo. While the practices are easy to discern (though the perception of which practices are actually applied will differ, even within the same team), the attitudes will vary greatly across the team, as will the perception of the results (as very few teams quantify success in multiple dimensions). Some will feel that things are going OK while others will see the same projects as a disaster.

The better we understand all this, the better we are equipped to initiate change. With knowledge of the range of perceptions in the group and awareness of the motivating factors that drive the entire team, we at least have a chance of visualizing what a better future might look like. What is critical here is that better future will look different from each set of eyes. With each person that we neglect in this stage, our chances for overall success will diminish significantly. Everyone needs to be able to see where they are headed with the initiative, what is in it for them. Interestingly, there are times when the best alternative for change is not actually change itself, but driving a more consistent common understanding of what practices are currently in place: this will set the stage for an easier facilitation of change downstream, with fewer different perspectives to manage.

Anecdotally, we tend to perceive that things are going fairly well (or that those challenging spots are just the way it is in the software industry). When we compare that perception against the prospect of adding new practices into the fray, we have a strong bias towards keeping things as they are. We have an inertia towards remaining in our status quo. A key part of motivating the team, helping everyone understand what's in it for them, is to expose the inefficiencies that exist today. Few measure the cost of the weak components of current practices, often called the cost of non-quality, and without these measures we tend to see the world through rose-coloured glasses. In any team, even the most successful I have encountered, the existing costs of inefficiency will outweigh the costs of effective change.

Given baseline measures and an understanding of the range of motivations across the team (and knowing that for some, it is these baseline measures that are the prime motivating factors), we can start to identify what would be reasonable to do differently. If we have done our job well to this point, we have already lowered many of the barriers to change that would otherwise exist, and the challenge becomes more a matter of constraining the things we would take on at this point, through a triage of potential changes. We need to recognize that we won't go from the status quo to a perfect situation in one change cycle. The most effective route is to carefully select a few small changes, and the best way to do this is to help the group to decide on their own what makes sense to bite off.

Each potential thing we can change has its own cost-benefit relationship to what we are doing at the moment. Some will be highly disruptive to the team, and may actually result in a negative overall impact to our performance. Others, the ones we are looking for, will be a natural transition from what we are doing now, but will provide significant improvement in our results. It is impossible to identify the prime candidates for change without understanding the current situation: the practices, the results, the culture of the existing team. Despite this, there is no shortage of consultants that are willing to sell their pet approach to you without this knowledge.

The benefits of selecting a few small things to change need to be emphasized here. Culture shock is dramatically reduced, the time required to realize the benefits of the change is reduced, and these benefits will in turn demonstrate to the group that effective change does not have to be a painful experience (sowing the seeds for ongoing evolution). With the baselines that we have gathered, we can quantify the value of the effort, which will further motivate (and educate) those that would otherwise suggest that they can't afford to take the time for improvement.

Finally, we need to see these changes through to the point where they become part of a new status quo. This is the point where people recognize the value of these new practices, and will continue to work in this way, particularly when pressures rise on a project. How often have you been involved in a project where the deadline looms, and the team abandons all manner of practices in the name of meeting their goals? Peer reviews will be dropped, end-product testing will be reduced, even rigorous change management will be short-circuited. In situations like these, we haven't made it through the complete change cycle. We haven't improved until our new way of doing things is ruthlessly preserved, particularly when the pressure is on.

Overall, process improvement has everything to do with understanding the people involved and working to ensure their needs are met. Effective change management is all about helping people find their own path to a better way of doing things. - JB [top]

A Soft Skills Business Case (Compendium 7.8)

A colleague of mine posted a question on LinkedIn a while back about how to develop a business case for improvement in soft skills for developers. I was too late to weigh in on the question there, so I'll take a stab here.

Business cases and measurement of ROI are the holy grail for disciplined decision making in business, and proponents for almost any best-practice or new approach (and we all know how often these pop up) will cite the numbers or walk through a justification indicating that their pet approach is the one to tackle. Formal inspections studies often cite ROI numbers around 10:1, there are many reports that suggest that improvement in requirements analysis provides strong returns, while others suggest that agile approaches are the way to go. I just received an e-mail this morning suggesting that, based on the often cited and frequently maligned Chaos Report, weak configuration management practices are largely to blame for the two-thirds of software projects that fail.

For every practice, we will get justification of their value through studies or reports, even if those practices are in direct opposition to one another. And you know what? I would guess that each of those studies has a strong basis for pitching those numbers. For the groups involved in the study, for the practices that were implemented, some value was gained. In many ways, the Hawthorne effect comes into play, and the fact that groups are consciously aware of the new practices makes them better in the application, regardless of what that practice is. I would not be surprised (though I would be amused) to see a study indicating that making no specific changes whatsoever will result in an improvement in productivity. Making the practices top-of-mind, whatever those practices may be, will have some positive effect.

This is all to say that while any practice can be justified by a business case or ROI numbers, each group will get wildly different results in the application of new hard skills. While some groups may see a 10:1 improvement with the application of formal inspections, another might see a net loss in productivity due to the cultural barriers associated with exposing their work for external review. The citations might cover the mean, or the median, or sometimes the peak results from the study (depending on how rigorous the study is and how motivated and biased they are to show strong numbers), but they rarely if ever show the variability in the numbers.

Just like early-stage project estimates, it is this variability or uncertainty in the business case that is far more important than any single-point values cited. ROI for the application of hard skills massively depends on the context. That's where the business case for soft skills begins.

If we look at all the hard skills that can improve software projects, they can almost all be bundled into the category of collaboration tools. That is, while a technique such as requirements analysis or design or exploratory testing can be done by an individual, they provide greatest leverage when used as a vehicle for increasing the shared understanding on a project. Many techniques, such as inspections or pair-programming or daily scrums, are structured such that they don't make sense for an individual. Indeed, the more we think of software as a team sport, the more we leverage and apply techniques to coordinate the team to work together more effectively, the higher our rate of success.

The reason each individual hard skill can see such powerful value in some teams while showing almost no return in others is the difference in how the team collaborates. The stronger a team is in open and empathetic communication, in appreciating the strengths and motivations of others, in consciously working in congruence with their own values, and in resolving warranted conflict in a reasonable manner, the more effective any application of new techniques will be.

From my experience, every failure in application of hard skills has its basis in a weakness in some aspect of soft skills within the group. If Bob doesn't appreciate Fred's contribution to the team, pair programming is doomed to failure. If there is a history of bad interactions in the group, formal inspections can easily degrade into personal attacks. If the structure of the team has contributed to silos between different groups, specifications will be thrown over the wall rather than developed in a collaborative fashion. The ROI on the hard skills will be diminished in each case.

Here's an exercise to run with your group. Ask everyone to complete these sentences individually: "the characteristics of my best project experience were..." and "the characteristics of my worst project experience were...". There is a good chance that the majority of the characteristics cited are based on soft skills: "I felt I was being listened to", "we worked well as a team", "we had fun together". You will encounter very little about the application of specific techniques, and almost nothing about the inclusion of tools. Based on our own experiences, we know intrinsically that it really is all about the soft skills in a team environment.

While difficult to measure, I see the business case for improvement in soft skills to be quite strong. If you are interested in increasing the likelihood of adding value with hard skills, consciously focusing on the soft skills is where to start. Beyond the improvements in communication that will serve to help you better select which hard skills to apply, you will reduce the uncertainty in your results, and improve the overall ROI as well. - JB [top]

Lifecycle Selection vs. Effectiveness (Compendium 7.6)

The debate rages on about whether traditional approaches to software development are the best for a project, or whether the more recent agile approaches are better. I’ve always thought that the debate is the wrong one to have in the first place: pick your favorite lifecycle, and chances are good that the selection is moot anyways. Most projects, regardless of the lifecycle selection, are run in a way that the uncertainty and risk will overwhelm whether you have decided waterfall or scrum. At the risk of alienating zealots from all camps, here’s why.

Back in the day, traditional approaches advocated a waterfall approach to software development (never mind whether or not you still think that way – in some ways, I do – but bear with me on this). A big monolithic analysis phase, followed in succession by design, implementation and validation. Great in textbooks, but in practice it never goes that smoothly. Change happens, it needs to be accommodated. History has shown that many of these projects don’t go as well as expected: you could take it from the Standish Group that uses their stats to sell their services, or you could base it on personal experience. I know I can.

Dig a bit deeper, though, and we can start to understand that a big requirements stage doesn’t necessarily mean an effective requirements stage. Indeed, it is rarely the case that projects move ahead with an effective common understanding of required scope, it is more often a period of wandering about and asking the customer what they want, then timing out, signing a big fat document and finally getting on with the ‘real work’. Even a first draft of the SWEBOK asserted that requirements analysis is an overhead activity on projects (they got a real earful for that one!). I certainly know now that I had the title of analyst long before I had the proper skills to extract and analyze the right information from stakeholders. Excelerator and Software Through Pictures and Rational Rose helped me make syntactically correct drawings that were really irrelevant in the context of the problem space.

It is a rare university that actually has a full course on requirements in their CS or Software Engineering curriculum. That’s not what the industry is looking for in grads, so the inertia continues. We learn primarily from experience and our peers, working in companies that have traditionally muddled through this phase, and we learn and reinforce substandard approaches. That’s just the way it is, we say. With this less-than-stellar definition of scope that we’ve taken some time to build, struggling along the way, we then move on to a similarly managed design stage, then finally get rolling as we come into the niche we were actually trained in and implement the system. Most of the grief we encounter here actually has its basis in the earlier design and analysis stages, but we forge ahead, and finally ship something through heroic efforts, often late, with less scope, and to a quality level of, well, since we didn’t quantify our quality objectives, we get what we asked for.

In some ways, the whole agile movement is a big backlash against this ‘traditional approach’. Rather than spend all that time up front producing a sub-standard specification that will be subject to massive change anyways, let’s get busy building things in a way that we’re good at, and learn and refine based on our mistakes. Makes a lot of sense, in some ways. Clip off that big fuzzy front-end, use early validation of builds with our customer to converge on the end product. From that perspective alone, there is a good chance that selecting this lifecycle can give you shorter schedules than the traditional approaches.

Where this theory falls down, though, is the expectation that software development is a necessarily un-deterministic process – that discovery is rampant in all projects throughout the lifecycle, so agile approaches will be better in all cases. I strongly disagree. I think most projects are rife with discovery throughout because even if we spend a lot of time up front, we’re not very effective at it. While the practices of strong analysis have been understood for years, they are rarely applied effectively. Even more rare is the conscious consideration of which of these practices will provide the most value on a given project. Most projects I have seen, big or small, innovative or not, would have benefited from a more focused analysis of needs from all stakeholder communities.

Indeed, many of the successes of agile approaches stem from the fact that they are simply removing a big chunk that added little value, and saved some time overall. Agility has tempered expectations, but has not effectively managed them. They have cut waste, but have actually increased uncertainty and risk on their projects without recognizing it. Their implementation stage now takes the lion’s share of the overall lifecycle, but that stage is rife with as much discovery as in the traditional approaches. Arguably more discovery, as any value that the analysis stage would have brought has been removed, injecting more discovery into that implementation stage. But that’s our comfort zone, so we live with it, you may say. Problem is, that there have been projects where that additional discovery has overwhelmed any cost savings gained through elimination of an explicit analysis stage. Embracing change has become a nice way of saying we are going to live with even more uncertainty and risk than before, because we have thrown out the analysis baby with the bathwater.

And lo, development teams and agile consultants rejoiced everywhere. But sorry, businesses still aren’t getting the level of value they deserve.

Just because we’re pretty bad at doing something doesn’t mean we should stop doing it. While that is the easy way out (and a great selling feature), it is far more effective to improve our approaches for analysis, and to recognize that every project merits a deep common understanding to some degree. That point is deeper on most projects than we typically run with, and the value of doing so is the dramatic reduction of risk and uncertainty downstream on our projects. If you have selected your lifecycle before you made it to this stage, that selection has been made with insufficient information. Are you confident enough in your approach to developing software, traditional or agile (if you feel you must be in a camp), to bid fixed-price on a project after a brief analysis of the client’s needs? Do you think you can make money with this approach?

Most teams will shy away from this, suggesting that software is inherently tough to characterize in that way. While some innovative projects bring with them a large amount of risk, I think it is time to stop making excuses, recognize that almost all projects are run with an unacceptable amount of risk and uncertainty, and work to consciously reduce that risk and uncertainty early in the lifecycle. No matter which lifecycle floats your boat, you owe it to your stakeholders to get more effective at understanding their needs as early as possible. Trust me, you’ll stand out above the silly lifecycle arguments if you do so. - JB [top]

Choosing Approaches Below the Project Level (Compendium 7.2)

In the book Artful Making, by Rob Austin (who also wrote Measuring and Managing Performance in Organizations) and Lee Devlin, the authors present similarities between how a theatre company prepares for a performance and how agile software teams do their job. The authors identify a number of parallels, but I am most impressed in how they are careful to repeatedly make the point that the approach is not appropriate in all situations. In reflecting on what the authors say, it is possible that no one approach is correct or sufficient for any project.

Let me explain, as that last statement may not easily parse. I’m not saying that we can’t head into a project knowing how to approach the problem. I’m saying, rather, that most reasonably sized software projects are large enough, complex enough, multi-faceted enough to warrant a number of different approaches, for different aspects of the problem. I can’t think of a real-world software project that is perfectly tailored, in its entirety, for one specific approach. Not waterfall (...a few zealots go "yay!"). Not Agile (...a few older zealots go "yay!"). Nothing.

Let’s look at a concrete example. We’re tasked with building a real kick-butt first-person shooter game. Ask almost anyone in a game development company, and they’ll probably tell you this thing is perfect for an agile approach: build some elements, play with them, make them better. Evolve the artwork and the story as you go, and you will eventually converge on a winner. Cool, sounds like fun, but is this the right approach for the whole project?

Well, maybe not. Unless you want to develop the characters and story line from scratch, you are bound to the comic book/historic battle/sci-fi story that is the basis of the game (and much of this will become business rules to abide by, where you don’t have the option to deviate). What about the platform you are running on? Are you going to stick to the lowest common denominator of hardware and software capabilities and settle for lowest common denominator of sales as well, or really go for it? Do you head to the PC and it’s capabilities, or the gaming consoles? If you had started 2 years ago (or plan to start a couple of years from now), you have a new generation of game consoles and their not-so-subtle nuances to contend with. If you are going multi-console, how do you reconcile all of this without too much redundant development? All of this sounds like interface requirements and architectural considerations to contend with. While agility will help you with determining feasibility and selecting among different options, you probably won’t get away without some deep analysis.

OK, let’s go the other way. Many would contend that it would be insanity to head down an agile path for a large safety-critical product like an air traffic control system. There are lives at stake, we have good representation from the user community and they know what they want, and we just can’t afford to ship a little, learn a lot. Waterfall all the way, maybe big-chunk incremental, right?

Not so fast, buckaroo. No matter how big or safety-critical a new product is, if there is no novelty in its implementation you should really be asking yourself why you are investing all that money in the first place. Even if that novelty is under the hood as you port the system to the new platform while keeping the user experience nominally the same, there will be some areas that are ripe for experimentation, discovery, iteration. You won’t be able to nail everything up front, and agility will be required for you to adjust to what you learn. Feasibility issues in the platform you are using, novel algorithms that you will need to explore and tweak. If you are doing your job right, even with what might originally appear to be a vanilla port, there will likely be opportunities to tune the interface to refine the user experience, sometimes dramatically. While deep analysis and specification will be necessary to nail down much of what you need to build, there will be areas that require some agility.

If you can imagine an application that can be built most effectively with purely agile approaches, you probably have an interesting widget that doesn’t provide deep value to someone, or doesn’t interface with anything, or something that has mysteriously popped out of a lab, and not been devised with a clear vision of a problem to be solved. On the other hand, if you can imagine an application that can be built most effectively with purely traditional approaches, you are failing to push the envelope and extrapolate the possibilities for the user, or to explore possibilities before settling on one implementation. The key phrase in both these sentences is 'most effectively', as systems have been built, and success has been declared, from both camps many times in the past. I’m sure, though, that a better job could have been done with more balance.

Shades of gray rather than black and white. The industry is brutal for people taking sides in the battle over which development approach is the best. Some would suggest one approach is correct for everything, some would suggest it depends on the business or team. At the very least, in my books, it is project dependent, but more and more it makes sense to look at an even more detailed level. Even within a project, there needs to be a reasonable balance of flexible and rigorous approaches to be most effective.

The selection needs to be conscious and tactically considered in the context of the strategic goals and current information. This requires expertise in a range of different techniques and the recognition of the resulting value to the customer and the business. Let those in one camp or the other continue to shout about their 'best approach' and try to make everything fit, while you select the right techniques for each aspect of your challenge. A tall order, but worth working towards. - JB [top]

Disassembling the Nokia Test (Compendium 6.49)

The Nokia Test is a quick assessment of practices to determine if your Scrum implementation is up to snuff, based on how it is implemented at Nokia. There is debate about whether it should be more or less rigorous or flexible. My thinking is that it’s great if you are doing exactly what Nokia does, which is true for very few of us. Let’s take it apart to see if there are any user serviceable parts inside.

First off, I think that if you are not Nokia and you have decided to use this test as your golden standard, you have already missed the point about agility. No single defined approach will ever be optimal for all your projects in your organization. Any organization should have a step zero where they look at the proposed project, look at the team and culture, look at the business objectives, and consciously decide the most reasonable approach for attacking the problem. While some elements of Scrum can be generalized, not all of it can be. Nokia’s spin on Scrum won’t work for everyone.

Into the test itself. The first few elements identify whether or not you are really iterative.

Iterations must be timeboxed to less than six weeks. I think iteration is imperative, but I have a problem with a magic number in the mix. Most of us as developers have learned that a hard-coded number is a sure-fire way of giving us problems at some point, and this is true here as well. Six weeks might be fine for Nokia, but that might be the entire project lifecycle in some shops. Too few iterations and you don’t have enough visibility into true progress, or natural points for allowing feedback to improve the existing product. Too many iterations, and you run the risk of excessive overhead. Lose the magic number, be iterative, but select an iteration cycle that works for you.

Software must be tested and working at the end of an iteration. I’ll buy that, pretty well as is. The point here is that we don’t want a gradually increasing bow-wave of loose ends that totally consumes the last iteration or two. When you have implemented a feature, it should work. If there are any loose ends, there should be an understanding of where they will be tied up in a later iteration.

Iteration must start before specification is complete. This one is interesting. Without insight into the thought processes going on, the intent appears to be avoidance of analysis paralysis, and that is a good thing. The idea of the specification ever being complete is a powder keg, though. The iteration needs to have clearly defined goals (that can be objectively assessed at the business value level), but the details can and must be discovered during the iteration. Ideally, the backlog of features (or whatever terminology you use) is defined to a level where the scope of the next iteration (or the next few iterations) is understood before the current iteration finishes.

As noted in some of the discussions around the Nokia Test, another key part of iteration that needs to be explicitly identified is that the team actually takes the time at the end of an iteration to consider the results, and feed the learning into future iterations. A retrospective that impacts future development is imperative. It wouldn’t hurt to explicitly identify that anytime someone sees behavior that is at odds with project and team success, they should step up and address the concern. Retrospectives aren’t the only point for this.

The next few elements identify whether or not you are really doing Nokia’s idea of Scrum. I’ll look at these and try to generalize to be more widely applicable, as Scrum is not part of the lexicon in every software shop (please don’t be shocked at this).

You know who the product owner is. Another straightforward element that is critical for any project. Someone has to have clear responsibility for ensuring that the product delivers the value to the end user, and to the business. Done correctly, the expectation of what that ROI should look like is defined in advance, as part of the overall vision for the product. That’s an element that many product owners conveniently neglect to do (giving them an easier task of artificially declaring victory), and is the accountability side of the issue.

There is a product backlog prioritized by business value. The product backlog has estimates created by the team. I put these together because I think there is value in looking at this element of Scrum from a different perspective. Business value and effort estimates are two valid viewpoints, and I think both should contribute to the overall prioritization. There may be features that involve little work but provide moderate business value, and could easily be implemented in an early iteration to beef-up the early feature set. There may be high value features that are difficult to implement: the job might be made easier by implementing other components first. I would suggest bringing both perspectives to the table, respecting them as reasonable (see the next point), and having the important discussions.

The team generates burndown charts and knows their velocity. Very Scrum-speak here, but can be generalized to suggest that estimates from the development need to be credible, and based on past experience with similar work. This is still one of the weakest areas for most teams, agile or otherwise, in the software industry. To be fair, the business owners should be striving to be quantifiably defendable from their perspective as well. In both cases, this is impossible if you do not track performance (time or value) against categories that can be mapped to future work products. Scrum does a nice job of providing a simplified model for doing so and gives teams an easier opportunity for getting started, but this remains a glaring hole in most shops.

There are no project managers (or anyone else) disrupting the work of the team. Wow. The way I read this, there are some serious dysfunctions to be addressed in how project management is perceived here. Sorry, but it is not a matter of telling everyone to get the hell out of the way, we have some code to sling: we are trying to develop commercial-grade products, not get our assignments to compile before the deadline. The business and the customer should always have a voice in what goes on, and this needs to be balanced. If project managers are seen as disruptive, that needs to be fixed. Call them Scrum masters if you need to, but in any shop, the project manager needs to be there to facilitate the team’s ability to get work done.

I expect that Nokia never intended the Nokia Test to be an industry-wide standard, and can’t fault them for what they have done (though I sure wonder about the history behind that last point). Indeed, their consideration of these issues and crafting of this Test is an indication that they are mature enough to identify a rigorousness that helps eliminate what many would call Cowboy Agile. Hopefully with this disassembly, you will be able to identify more relevant standards for the products you create. Whether or not you use a branded approach, you can define practices that allow you to be agile. - JB [top]

A Consistent Approach, Where Needed (Compendium 6.42)

There is great value in having a standard way of doing things we need to do more than once. My wife has a way of dealing with the laundry as it goes from the hamper to washer to dryer to drawers, and she knows where the dirty clothes are and where the clean ones are. I’ve got my system for loading the dishwasher, to make sure I can pack it as completely as possible but still making sure they come out clean. We each have our own distinct way of getting the kids ready for school in the morning, and it is best to let one person take the reins if we are both around.

Our standard approaches have evolved over time, and with depth of experience comes efficiencies that we have made standard practice. We’ve grown our approaches, we are comfortable with them, and to some degree we are attached to them. They are ours, after all.

While we each have our way of doing things, there are clearly times this way is not well understood by others that may have to deal with it. I’ve been known to yell upstairs to to ask about the state of this or that pile of laundry, and while I’ve never been asked my opinion, there are times I’ll dive in and shuffle things around in the dishwasher. I’m sure I will learn the truth when my wife reads this entry.

As we develop software, especially when we are in an environment that does not provide an established and managed way of doing things, we come up with our own way of dealing with repetitive tasks. At the detailed level, we might follow our own approach to interacting with our CM systems, or for validating our code. If we’re charged with managing the daily builds for our product, in most places any automation is supplemented by a series of simple little manual steps that we know by rote (after learning the hard way). We develop a standard place we refer to for information about the latest part of the application we are building: while the ideal is to refer to well-managed and current scope or design information, the standard place is more likely to be the copy of the spec that we keep in our own space, or to go to the source (the analyst, or architect, or end user) for their latest opinion of what to build.

Many of the approaches we use to build software are carried over from our last jobs. Changing jobs or companies can be quite disruptive, and to bring with us our internalized approaches gives us that little bit of comfort, that jump-start of knowledge, that one less thing we need to learn here. There are even times where we simply assume that this is the only conceivable way these things could be done anyways ("Who in their right mind would think that the effort to build an automated test suite would save me time?")

Our systems give us individual efficiencies, but these rarely scale well to a team environment. I’m sure you have collided with other people’s systems when they were out of the office for a day or two and you had to pick up where they left off. For more than a few teams, there is one go-to person that can build the product successfully, or even manage the nightly backups without a hitch. When we need to swap roles, even temporarily, the challenges of individually built approaches to work become painfully apparent.

One of the things that I ask teams when I start to work with them is their approach to development. The response for almost every team has been the same, in that they are all inconsistent. While they may identify one approach over another, few teams are consistent in their understanding of how they get things done. Even when most people on a team suggest that they have adopted one of the agile approaches, or a variation of the unified process, or are CMMI-based (though I can’t quite comprehend how that maps to a specific approach), there are problems.

One problem is that it is only most of the team, not all of the team. There are always those that either haven’t subscribed to that party line, or haven’t been told what it is to begin with. The second problem, likely related to the first, is that once we dive into the details, even with a named approach, it has rarely been appropriately tailored, consistently deployed, and conscientiously monitored for application and effectiveness. Almost every team, when we get down to it, is ad-hoc.

If the team is small enough, this is not an overwhelming problem. If you can call over your shoulder to discover where that last build component is (or whether this load of whites should have bleach), you can still do well without much more fostering of consistent practices. Indeed, keeping the team small is one of the more credibly justified practices for project success, if it is appropriate for the problem at hand. As the team grows, so will the cost of the collisions associated with ad-hoc practices.

Given my experience, most teams would benefit from a bit more careful management of the approaches to getting things done. Individual perspectives can be leveraged to develop approaches that are both commonly understood, and eliminate the pitfalls of either of the earlier viewpoints. Team members become more interchangeable, and the bus-hit-the-hero corporate risks will drop. Most importantly, you will reduce the frequency of the phrase "What the heck were you thinking?!" on your projects.

As we start to recognize this, there is the danger that we go overboard in the other direction. There is no need to make every practice consistent, as long as the product of that effort satisfies everyone’s needs. It’s not critical to identify a dress code or a time when people should respond to e-mail, but issues like where to go for critical information, how to manage change, or what closure means for a piece of code being developed should all be carefully managed. If doing things in different ways will disrupt the project, it is worth making consistent. If the end result is still adequate despite a different approach being taken, don’t sweat it.

Now I need to get back to redoing that load of whites... - JB [top]

The Truth About Best Practices (Compendium 6.27)

It is likely that "best practices" is the most overused term in software development today. Anyone discussing what needs to be done to improve the situation on projects will use the term. It is the basis for almost any consultant’s pitch. We train in best practices, we study and promote best practices, and we still face challenges. What is it about these best practices that makes them so compelling, and why don’t they seem to work as well as consultants would suggest?

The term "best practices" is not new. The idea of activities or techniques that are the most effective at solving problems was bantered around in the early 1900’s. There are best practices in manufacturing and agriculture, among others. There are Generally Accepted Accounting Practices (GAAP) - while not quite best practices, they are an expression of the way things are done for accounting.

For any practice to become a good practice, it needs to be shown to be effective in the real world. To become a best practice, it needs to be seen as the most effective approach to accomplishing a goal, in a repeatable fashion over a large sample space. Let’s consider each of these achievements, good and best, in turn.

There are many practices that have been shown to be effective in the real world, with truly amazing results. Studies in formal inspections, for example, often show a return on investment as high as 10:1. A dramatic reduction in lifecycle costs, and improved delivered quality. Most other practices demonstrate less compelling results in studies, but many are still seen as worthwhile investments. Iterative lifecycles, change management, software reuse, prototyping, metrics programs. They are all good practices, and the overall list is far too large for this forum.

All of these practices have been shown to work on real projects. Certainly the literature leans toward publishing the results of successes in applying these practices. Quantified data from my clients indicates that there are strong correlations between many of these practices and improved performance on teams. Actually, this data shows that these practices have a stronger positive correlation to performance than any demographic element in the study.

But are these best practices? Because projects and project teams come in all shapes and sizes, it is never safe to say a priori that any practice is the most effective approach a team can take on. While formal inspections can provide tremendous value for some projects, cultural considerations may make this practice difficult to implement, or even counterproductive with some teams. You could easily make a similar argument for any of the practice that is discussed. From that point of view, when we are talking about software development in general, the term "best practices" is hyperbole.

Under the right conditions, though, many of these practices can be very effective. This is the key point, that any practice is only situationally valuable. Short agile iterations may make sense for some projects, while deep analysis and design would better serve other projects. Some cultures may easily embrace a flattened, distributed decision structure, while others thrive under a stronger hierarchy.

The fact that ‘it depends’ whether a practice makes sense to apply is generally lost in software development. Consultants will pitch their specific flavor of practices as the solution without regard for the client situation, and sometimes the results are disappointing (how often is the consultant held accountable?). On teams, we tend to accept the advice of consultants without deeper study of the ramifications of our actions. We try to apply best practices, and find we are often disappointed with the results. We conclude that this process improvement stuff doesn’t work.

One of the most widely exposed catalogs of best practices is in Steve McConnell’s Rapid Development. The last third of the book consists of 27 best practice chapters, each one selected as an effective way of optimizing speed on projects (indicating that there are other practices that optimize other factors). A critical part of each of these chapters is an identification of the situations where the practice is effective, the major risks associated with the practice, and the major interactions and trade-offs. Again, this information is often overlooked during the consultant’s sales cycle, and neglected by many practitioners.

This may be one of the reasons why Fred Brooks asserted in his No Silver Bullet essay that "The gap between the best software engineering practice and the average practice is very wide – perhaps wider than in any other engineering discipline." This assertion was made in the context of expert systems that could someday disseminate the "experience and accumulated wisdom of the best programmers" to inexperienced programmers. We’re still not there over 30 years later, and the gap remains wider than it should be.

(Don’t get me going on why even the most revered experts persist in thinking of practitioners in software as programmers. If we are doing our job right, programming is but a small part of what we do.)

So there are many good practices, each having merit in some situations, but the insight of how to select and apply them is not generally exposed or recognized. Schools tend to emphasize technical skills because that is what the industry demands, and many of the practices we talk about are largely ignored or simply covered in a survey course. Many development teams rely on technical skills and heroic efforts to complete their projects. For many of the good practices that have been identified, in my experience there remains an alarmingly low rate of adoption. There are very few teams with disciplined estimation techniques, there are generally glaring omissions in analysis and design on projects, there is little conscious selection of project lifecycles. Similar gaps exist for any practice I can think of.

On top of all this, it is important to recognize that there are other factors that drive project success. We can’t just build a product and automatically be successful. The product needs a market, and the message needs to find that market. There is as much science in all the other disciplines as there is in product development, and any aspect of the business can make or break product adoption. Some would suggest that luck and timing play a major role as well.

With all the factors outside of software development, the apparent cost required to select and implement practices that improve product development, and the experience of poorly managed change, it is no wonder that best practice discussion quickly fades in most shops.

There are no best practices, only good practices that may help you if the situation warrants. You need to be aware of the practices, understand whether it makes sense to apply them, and then apply them correctly. This entails a great deal of effort and discovery, but done right, the payoff is enormous. With all this, there are no guarantees of success, as the most effective practices for your situation may be outside the software development discipline altogether. - JB [top]

Deciding to be Agile - or Not (Compendium 6.24)

There have been a large number of companies that have decided to adopt one of the Agile Approaches to software development over the past few years. Indeed, some of these have been quite successful in making the transition, but there are some that have not, for a variety of reasons.

Since the Agile Manifesto was published in 2001, the hype and success stories have been enough to drive many organizations to try something, anything that would make software development more effective than the approach that has been in place.

While there were some considered reviews of what Agility was all about before diving in, many went from an ad-hoc approach to one that remained essentially ad-hoc, but at least had a name. Often, few of the practices in any of the complete, well considered forms of Agility such as Extreme Programming or Scrum were put into place. For some organizations, Agility has been seen as a failure because they weren’t really being agile after all.

For others, though, even with a thorough understanding of the new approach, Agility has not brought great success. For those companies, perhaps the decision to become Agile in the first place was the wrong decision, a decision made for the wrong reasons.

If you think about it, agile approaches work well for teams and projects that are structured in a certain way. Let’s look at some of those drivers that would make a team or project a reasonable candidate for one of these approaches:

  • Business Domain Knowledge – If the group does not have (or cannot expect to get) a clear complete picture of what the end product will look like, there will certainly be value in acknowledging that scope for the project will evolve dramatically over its life, and it makes sense to steer away from any plan-driven approach that would suggest a deep monolithic analysis up-front.
  • Technical Domain Knowledge – Teams with a strong knowledge of the technical domain are at less risk in moving to an agile approach, which typically reduces emphasis on up-front analysis and design in favor of exploration, and deferral of decisions downstream where possible. Youthful, inexperienced teams will often suffer from their lack of tacit experience in this environment.
  • Engagement and Participation – When the entire team is fully engaged and decision-making can be safely delegated across the group, there is less need for the rigid structures and the team can be much more flexible in how they achieve their goals.
  • Ownership and Commitment – Similarly, when the team members understand their roles, the relationships between them and are fully committed to taking responsibility for their actions, an agile approach can serve to unleash team members, empowering them to achieve great things.
  • Shared Understanding – On any project, shared understanding is critical as a prerequisite for successful decision-making. Given the relatively light demands for formal shared understanding on agile projects, there is a greater reliance on the team’s technical background and capacity to retain knowledge, and a greater imperative that the documentation that exists is up-to-date and consistent. To some degree, this informal approach drives the project size and duration to be smaller to avoid risk.
  • Governance and Control – With agile projects, there is generally a relaxed approach to governance and control, again relying on the maturity of the team to ensure the decisions that are made are vetted as appropriate. This will tend to make agile approaches less amenable to high risk projects.
  • Leadership and Direction – One of the key characteristics of agile projects is that while there is a vision of where the team wants to end up, the specific path to getting there is not clear, or extremely volatile. An a-priori plan of development would be difficult to construct, and many of the decisions to be made throughout the project are determinations of which direction is appropriate at that point to progress to the end as efficiently as possible.
  • Integration – A strong agile team is one that has a strong understanding of the strengths and weaknesses of all the team members, and works well with one another to leverage these strengths and compensate for any weaknesses. Cooperation and sharing of information is absolutely essential, and the trust that is built through familiarity and past successes is extremely valuable.

[Note that these drivers were devised by Rob Goatham, and are very useful for determining the effectiveness of a team for making decisions in general. I would expect you will see more about these in the future...]

As we see, a team that is a strong candidate for adopting an agile approach has strengths in some of these drivers, but in others it is the nature of these agile approaches that compensates for any weaknesses the team may have. If we tie an understanding of how the team fits in each of these dimensions to the factors surrounding the product to be built such as the size of the effort, the time involved, the consequences of failure for the project, the team can make a far more mature decision about whether it is appropriate to use an agile approach to solve the problem.

There are teams, managers, and organizations where Agile approaches are a strong cultural fit, but this is not always the case. Similarly, there are some products where discovery is an ongoing element of the journey, while others will suffer greatly with such an approach.

Made consciously, in the context of how effective the team is at making decisions and the nature of the product being built, the decision to adopt an agile approach can be an effective one. - JB [top]

Erosion (Compendium 6.19)

It seems to be pretty rare for people to consciously undermine any established system that has been put in place to develop software. At least, few will admit doing so. What usually happens is more subtle, an erosion over time of the good practices that make the software development machine tick.

A lot of software teams start off with wonderful intentions. There is a conscious decision to put in place a collection of practices that will help them build great software, within reasonable expectations of time and cost. Sometimes documented, sometimes not, but at least there was some gray matter applied to try to ensure the right things would be done.

Unfortunately, though, life quickly gets in the way. Erosion usually occurs in the name of time, with an unconscious degradation of quality.

There might be a quick patch needed in the field, and there just doesn’t seem to be the time to shore up the fidelity of the system afterwards. This can soon become a cascade of patches that undermines any fidelity the originally configured system may have had.

Perhaps the decision will be made to skip the peer reviews on this module: "Bob knows this part of the system inside and out and there's no way we could contribute." Actually, even those brand new to the organization or totally unfamiliar with the product can contribute significantly to a peer review. They’ll ask the naïve questions that expose the underlying assumptions that really need adjustment.

Sometimes it happens as people join the team without a deep understanding of the agreed-upon approach that has been established. When people start, there’s discussion of the business and product, but rarely an explicit discussion of process (except, of course, for how to make the coffee). This is where documenting your actual approach comes in handy (rather than pointing people to some theory that is never applied).

Some of the deepest erosion occurs when push comes to shove for a project’s schedule. "Let’s skip that big chunk of testing and hope that nothing bites us, the customer is screaming for the system". This can hurt you either way: if you get away with it this time, there will be some serious pressure to not even schedule the time for the next project. If you do get burned this time around, there can be some serious ramifications.

Regardless of how it happens, skipping steps that can save our bacon is rarely done with quality as a consideration.

There are often comparisons between a software development project and a manufacturing production line. For most software projects, though, the comparison should be to the design of the production line, not the line itself.

In a manufacturing plant, on a production line, it’s pretty clear what happens when a piece of the system is removed – the wheels can literally fall off (trust me, I know this first hand from a summer job of shuttling new cars across the border for Chrysler years ago). The production line is built to produce a quality product, and is optimized so that this product can be built efficiently. Once in a while one of the pieces of the assembly will break down, but nobody really thinks that removal of one part of the system, in the name of saving time, will turn out a good product faster – unless of course, they are consciously optimizing the assembly line.

So it goes in software. It is critical that we decide how we are going to build our software, and put in place some mechanisms that will allow us to ensure that this originally designed system remains intact. As we are tempted to make changes to how we build our product, we need to be focused foremost in the fidelity of the development process, rather than merely looking at how to get the product done more quickly. We need to build in checks and balances – retrospectives at the end to be sure, but also intermediate checks along the way – at key milestones, periodically if necessary, that check the fidelity of both our product and the approach we use to build it.

We need to avoid erosion of our system for development, regardless of the weight. - JB [top]

Idiot Lights (Compendium 6.18)

It is quite easy to justify doing nothing to improve how your organization develops software. Whether it takes the shape of "we don’t have the budget", or "we can’t afford the time, we’re just too busy right now", the point is the same. It can be paraphrased as "We have decided, consciously or not, that our current painful approach is preferred to spending the money or time to do something about it."

Management dashboards are all the rage these days, and the analogy to what we use to navigate our cars across the city is an apt one. In a car, a few dials and numeric indicators give us the information we need to arrive safely, and within the constraints of the law. The speedometer and fuel gauge are usually the most prominent elements, but even data staring you in the face can be insufficient, so automakers provide us with more.

We get idiot lights.

Sitting somewhere right beside the fuel gauge is a light that comes on when you are low on fuel. It’s one thing to see the gauge tending towards empty, it is an entirely different matter to be told "find a gas station now!" The "you idiot" is implied at the end of the message.

I have a nasty habit of running my tank fairly low, and often use the idiot light as the sign that the inevitable can be put off no longer. Indeed, I’ve been caught several times ignoring even this message for too long, with the obvious consequences.

With all my yammering on about preparedness, warning signs, and even metrics, why have I allowed myself to run out of gas, and continue to run ‘till the idiot light comes on?

It’s the same reason as for software development. I always seem to be in a hurry, and I get this absurd satisfaction out of stopping at the pumps as rarely as I can get away with (even though I know that it costs me no more time to fill up more frequently, and can potentially save me money if I time the pricing trends). The time and money cost of stopping for gas is pretty clear, especially compared with the hope that I can make at least one more trip on the fumes left in the tank, or defer that cost one more day. There is always that hope that fuel prices will plummet.

I have learned, though, after being burned, to pay heed to those idiot lights. I change my objectives and behaviour until my tank is full again. Finding a gas station becomes a high priority.

Let’s step back and see why idiot lights can be so compelling.

If things are generally going well, idiot lights only come on once in a while. The gauges on your car dashboard, like the trends that appear via any metrics program you have in place, are always there. Idiot lights are simple indicators, rather than trends that can take some time to discern. Their boolean nature is clear: if a light is on, you would be wise to take action. If the light is off, you can continue along in your semi-comatose state, lulled to sleep by all the metrics as they constantly whisk by.

So what are the idiot lights of software development? There are plenty, they are often tightly intertwined, and they are far too commonly ignored.

If you are failing to meet customer expectations, something needs to be done to understand their needs and better manage those expectations.

If you are working in a chaotic environment or doing a lot of things that aren’t expected, it’s time to step back and identify what really needs to be done on this project.

If you are missing delivery dates, especially if this missed delivery catches you by complete surprise, you need to get better insight into real project progress.

I would guess that you can easily add a bunch of your own. Chronic underestimation, massive scope creep, a never ending stream of defects.

Some companies could easily read by the glow of all the idiot lights.

These are all indications that things are broken, but we ignore the warning signs even though we know what is in store. There’s no need to dive into a comprehensive metrics program to tell you that you need to do something. Besides, there will almost certainly be pushback that you couldn’t afford to collect the metrics you would need anyway).

It is just like with that fuel light in the car. When these lights come on, if there is no change in objectives or behaviour, there can be no change in expected results. Are there any idiot lights burning brightly on your projects these days? How much gas is left in that tank of yours, anyways? - JB [top]

The Procedures That Ate Manhattan (Compendium 6.1)

Pretty early on in life, I came to the conclusion that large creatures move more slowly (relative to their size) than small ones. Bees appear to be perpetually caffeinated, elephants just lumber along. More mass, more inertia, that sort of thing.

I have since come to the realization that Newton’s laws of motion apply to businesses just as much as to nature. As there becomes more to move, it takes more effort and time. I first observed this as an employee in companies of different sizes, then in consulting to an even wider range of organizations.

In the last few years, especially in financial transactions with clients, I’m gathering physical evidence that confirms this assumption. The little guys can be all over the map in terms of payment speed, either because the invoice slipped through the cracks, or they are stretching their payables to finance operations. There is usually a quick remedy for this.

With the big guys such as government agencies and companies that are household names even where no geeks reside, it’s safe to say that payment will arrive, it’s just not clear when. More appropriately, it is usually a safe bet to say "probably not today". For the larger companies, the procedures that are in place are almost always the source of the problem.

With one particularly troublesome large company, I was forwarded a copy of their latest internal memo attempting to get things rolling (they are already quite late, again). Here’s an excerpt:

"You have received an approval message with date 10/1/2007/6:07. This is the fifth attempt to approve this overdue invoice.

As the invoice requires active approval all that needs to be done is to click the button "approve/reject invoice" in the down-right corner of a message dialog box and accept/reject the invoice.

Please approve/reject the invoice, the vendor needs to be paid."

Amazing. For want of someone in their own company clicking a little box on a form somewhere, even after 5 requests, they have frozen funds that would buy a Honda Civic. This, for an organization that uses an automated invoicing system, and processes on the order of 2 million invoices a year.

I wonder if the procedures and practices of the receivable departments in these large organizations are aligned with those of their payables departments. What are their receivable terms? I could easily envision a scenario where we agree on Net 45 terms, and at 9:01 on day 46, a couple of thugs come knocking on the door demanding payment or they’ll rip their equipment out of the office. This is far easier to envision than a scenario where they tolerate meek apologies in lieu of payment for the next 3 months.

Enough of the rant, I feel a little better now. On to the point of this note.

My first cynical thought was that floating that much money for 45 days or more could be quite an enviable revenue stream in itself. Alas, given what I am seeing about the number of people involved in dealing with this mess, I’m sure their payables department remains a painful cost-center for them.

I have to step back from my cynicism, though, and recognize that procedures do have their place. They can help provide assurances that the system is not abused, in this case that they don’t pay out too many bogus invoices. Procedures will give consistency of practice, which ostensibly provides improved predictability and a reasonable expectation of when something will be done.

That’s the theory, anyways. In reality, they have developed procedures that prevent good people from getting their job done in a timely fashion. They have created a monster.

In software teams, the most common equivalent to this absurdity I have seen is a standard period of time required to get formal review packages into the hands of the reviewers before the meeting. Usually it is 2 days, which is forcing the package being reviewed to take at least that much time (plus rework) to go through the process. Sometimes we see specific people having to approve elements of a project, and when they are not available and we feel bound to the procedures, work grinds to a halt.

On the surface, a standard time period would make sense, except of course for the situations we have all experienced: we get together for the review, after the requisite 2 days, and there are still a couple of people who haven’t taken the time to look at the package. The procedures have guaranteed that an additional 2 days have been added to the schedule, but have done nothing to ensure that the package is adequately reviewed. This is one of the strongest pushbacks against formal reviews, and one of the least necessary aspects of this extremely valuable practice.

On the other hand, I have seen cases where someone can grab a bunch of potential reviewers, solicit a few hours of their time that day, and get an extremely effective peer review completed, start to finish, before lunch.

Mandated delays as a vehicle for ensuring enough time to get the job done is patently absurd (except perhaps for a cooling off period before purchasing a weapon). Stopping work because a procedure has to be followed, does nothing to improve the output, and is an example of what not to proceduralize when you are trying to standardize. Another common folly is to build chokepoints into the process, and fail to ensure that there is a fallback position to be used if necessary – like having someone with approval authority that nobody can get a hold of.

We sometimes try too hard to build specific, step-by-step procedures so that everyone will do things the same way. In doing so, we eliminate flexibility, creativity, and opportunities that may crop up. Most procedures I have seen end up collecting dust as soon as someone recognizes that they don’t work, and future attempts to shore them up only tend to make them more stifling.

It is a far better approach to break up the work into two categories: that which absolutely must be followed in a specific manner, and the rest, which is more guidance and support. Simplify this into a checklist-based form that people can refer to as needed. Before they are unleashed, though, have a discussion with them to ensure they understand the objective of their tasks, the flexibility they have in completing that task, and when it would be appropriate to escalate problems that may arise.

Never build a set of procedures that can be used as an excuse for not getting the job done. - JB [top]

Resolutions (Compendium 5.53)

It’s that time of year again, when many of us resolve to start exercising (again), stop smoking (again), lose some weight (again), or get back in touch with people we have lost contact with (again). Give most of us a week, and we’ll return to our old ways.

I learned long ago that New Year’s resolutions are difficult to keep for more than a few days, and I’ve successfully resolved to stop trying to fool myself once a year. Indeed, these annual resolutions are handled by many people in the same manner as typical process improvement initiatives in software companies.

We know intellectually that many of the things we do are not in our best interest. It is not difficult to understand why those excess pounds are a risk, just as it is not difficult to recognize that all the time spent redoing things we thought we had completed can wreak havoc on our schedules. Rationally, it is pretty clear-cut. Emotionally, though, it is another thing altogether. It can be tough to resist diving in for one more chocolate, how many calories can something that small really be? Similarly, why do I need to write down what my completion criteria might be for this activity? It’s pretty clear to me, and I’m sure I can speak to the needs of others on the team.

We gain weight one chocolate at a time, we slip schedule one failed expectation at a time. Our resolution to simply fix things without addressing the emotional response that gets us into trouble is bound to fail.

A quick surf provides all sorts of statistics that New Year’s resolutions fail just as often as process improvement initiatives do. Not surprisingly, statistics provided by personal coaches or process consultants are far more alarming. Even without the statistics, we all recognize the folly of most of our attempts.

What to do? There are a number of very important mechanisms that we need to build into our resolutions or improvement initiatives to help make them stick:

  • Be as clear and explicit as possible about the current costs of your behaviors. It is one thing to know that current behaviors are counter-productive, it is an entirely different thing to understand how these behaviors are costing us, both at the present time, and in the long-run. What we need to do is build a sense of urgency, either through monetizing our behaviors, or exposing our long-term costs, or both. Costs can also include our comfort and sustainability, our credibility and ability to deliver on expectations. The more costs the better, and be as explicit and detailed as possible. Break the complacency with a compelling argument for change.
  • Visualize what a different future will look like. Just as we made it clear what our current behaviors are costing us, we need to be clear what the benefit to us will be for change. In doing so, it is useful to think of the resolution or initiative as a project, and define specific, quantified success criteria. Make them achievable, build them to align with your vision of a better future, and make them clearly distinct from the status quo. It has to be worth the effort to get there.
  • Pick minimal changes with the greatest impact. We have a nasty habit of biting off more than we can chew, and often it is a very few selected changes that can have phenomenal effect. In selecting our changes appropriately, we reduce the disruption to our current behaviors, which in turn reduces the pressure for us to all back into our old habits. We get an easier time in sustaining our changes.
  • Understand how you will make the changes work in detail. Go beyond merely stating the goal, break down the changes to the point where you have a clear understanding of exactly what needs to be done. The detailed steps need to be clearly practical, there can’t be any ‘and then a miracle happens’ stage somewhere along the way. The changes you make need to be carefully fostered through to the point where they become your new ingrained habits, replacing the habits that got you to the point where you decided a change was needed. These new habits need to be able to survive the pressures to fall back into our old comfortable (and dysfunctional) ways.
  • Use measurements to confirm progress and success. Assuming you did a good job at creating a sense of urgency, you will have some good benchmarks to compare to: your original weight or cholesterol level, the amount of time spent in rework, the number of shipped defects, for example. Continue to lean on measurement to track progress towards your quantified goals, and be sure to keep everyone aware of your progress.
  • Celebrate your success, sustain your results. When you have achieved your goals, be certain to celebrate, but not by falling back into your old habits. Don’t celebrate with a big slice of chocolate cake or suggesting that we can relax and get back into code-and-fix, if these were the things you worked so hard to replace. After the celebration, work to sustain the success over time – continue to set new goals, and reinforce the behaviors that got you to this envisioned positive future. Success is often fleeting, and we need to build into our behaviors a mechanism to keep tabs on what we are doing in an ongoing basis. Every New Year’s Eve or project retrospective is simply not frequent enough.

Changing our behaviors is not a one-shot deal. If we make sure we address these mechanisms, we will have a better chance at success. We need to think of this as an ongoing program of refinement, backed by a philosophy of continuous focus on quality. To see it as a once-in-a-while initiative is short-sighted, our bingeing can cause more harm than good.

No chocolates were harmed in the writing of this article. - JB [top]

Hope and Fear, but Mostly Fear (Compendium 5.47)

I just spent 2 days last week at the Agile Vancouver conference. The event sold out, attracting 150 people to talk about all things Agile. I attended primarily to see how thinking in this area had evolved. I’ve worked with groups that had adopted Agile approaches and had interacted with a few of the thought leaders, and was still looking for the meat. I even built a one-day survey course on agile approaches 4 years ago, ran it once, then promptly removed it from my list of products. The audience was expecting more fire and brimstone.

I expected to feel a bit like an outsider, and was not disappointed in this regard. I left with mixed feelings of hope and fear – but the overwhelming impression was fear.

There was a great deal of discussion of Agile as a product. Suggestions were made that it was on the verge of crossing Geoffrey Moore’s Chasm on his Technology Adoption life-cycle. Certainly we had a room full of the early adopters, and the question was posted as to how to get the points across to the Early Majority. There are indications that the buzz about Agile is making it into management circles. IBM seems to be diving in to the game as well, by all appearances Agile is well on its way.

Problem is, though, I don’t see Agile as a product. As Scott Ambler so eloquently pointed out at the conference, there are still a huge number of gaps that Agile fails to address. What about the Enterprise, the two ends of a complete product lifecycle, the relationships with other groups (even those so close as test and database teams), and a myriad of other areas? What about Architecture, and the corresponding quality attributes that are the key drivers for a strong architecture and should be discovered alongside the user stories?

If Agile is not a product, I don’t see any relevance to Moore’s adoption curve. I would suggest a more appropriate curve to ponder Agile is Gartner’s Hype Cycle. I see Agile still sitting at the top of the "Peak of Inflated Expectations" phase, a place it has been sitting for a few years, primarily supported by those that make a living by calling themselves Agile.

I have no problems with an idea that fills a room and gets people talking about techniques that help them be more effective. What I do have problems with is the over inflation of the value, or even the knowing neglect to correct some flawed assumptions about an idea, all in the name of further padding of the wallet.

At one point in the final panel session, there was the suggestion that teams starting down an Agile path should enlist the support of an expert for training. There were more than 2 of the experts that I counted at the front of the room that clearly recognized this as a “cha-ching” moment. This was expressed either politely as a satisfied smile and nod, all the way to the blatant Tiger Woods pumping of the arm for the hole in one. Who is the primary beneficiary of this Agile movement, anyways?

Consumer Tip: If any company or organization suggests a specific methodology, tool or framework as a reasonable solution for you before you can safely say that they truly understand and empathize with you, your culture, your challenges and your products, do your best to make the door hit them on the ass on the way out!

Even if that tool or methodology is what you called them about in the first place.

What is Agile, if not a fully fledged product? Perhaps an enabling technology, perhaps a series of patterns, perhaps a philosophy. Good stuff, but currently over-hyped.

What I saw at the conference was well beyond a philosophy, it was a religion, bordering on a cult. There was a common enemy that everyone could rally against, with an 'If you are not with us, you are against us' fervor. All things non-Agile were seen as bad, and generally lumped into the category of Waterfall or hacking. Plenty of ad hominem discussions about evil managers.

There were a large collection of ideas that were embraced by and expressed as Agile, even though the vast majority have been around and practiced in effective 'waterfall' projects for decades. Retrospectives are Agile. Estimation based on size is Agile. Estimation Poker is Agile (hello...Wide Band Delphi, anyone?). Early stage focus on test is Agile (and has been a well known approach for early stage validating scope for years).

Perhaps the current push extends some of these ideas a bit further, but there is nothing that I would call disruptive technology. Hell, we wrote what looks a lot like XUnit over a dozen years ago on a huge ATC project. Decidedly pre-dating Agile, but we did some smart things.

What is happening is that a group of people are re-discovering things that work, assuming that they can be generally applicable, and evangelizing a bit too aggressively. I wrote an article for the Cutter IT Journal in June of 2004 titled Beyond the Hype of a New Approach, a cautionary tale expressing many of the concerns I had then and still have, at the time in response to Jim Highsmith’s Agile Project Management book and the corresponding movement. Then and now, a lot of good ideas are being thrust upon us in a manner that will cause the mainstream to cringe rather than embrace. We need to understand the market before we can sell the product.

The argument is not that the ideas in Agile are bad, but that we technologists thrive in a Boolean world while reality is analog. The best answer before we have all the data really is "it depends." Euthanize the dogma, please. Don’t get me going on the suggested prospect for a Unified Agile approach. It’s not going to happen.

Steve Yegge (a development manager at Google) seems to have a similar viewpoint. He put out a recent Agile rant of his own in September (and declined a polite invitation to speak at Agile Vancouver) that was so widely read (and often misconstrued) that he felt compelled to follow it up with another.

Oooh...I love Stevey’s anagram.

There were some bright lights at the conference, particularly from a few invited speakers that discussed practices outside of the dogma, and there was a very nice series of comments in the final panel discussion. In response to the question of “How do I start?”, there were the following key remarks:

  • Start with a retrospective and focus on a pain,
  • Pick a few practices that will fit your culture, then move from there,
  • Don’t call it 'Agile'!

For a movement that claims to be so customer centric, then damages its own reputation by pushing packaged methodologies on unwitting clients before understanding their situation, it is good to see this light of wisdom in the panel. We need more of this.

Some strong opinions here, based on far more than attending a conference for a couple of days. If you disagree with me, you can choose to dismiss me as part of the 'non-Agile' camp, or you can choose to debate.

The principles behind Agile are all about being able to make practical decisions based on the best information available. I have hope that more people are waking up to this powerful idea, but I fear that there remains too many practitioners that believe we need special permission to act this way, and too many consultants living off the avails of clients by trying to anoint us with these privileges that are already our rights. - JB [top]

Greasing the Wheels (Compendium 5.44)

Change is tough on anyone. We’ll fight tooth and nail to avoid change, even if our current situation is untenable. Dealing with this human barrier is the key to driving effective change.

I’ve been working with a team where I had done 'drive-by training' in the past. Back then, 2 jam-packed days of bullets of information hit the group, but they sat listless, and nothing really came of the engagement. There was no opportunity to facilitate effective change of any kind.

I got a call about 6 months ago from the same group. They were now really interested in change. They had found an internal champion and a budget, and asked if I was interested in pitching in. Despite the past experience where I had sworn it just wasn’t worth the effort, I now jumped in with both feet.

We gathered some numbers from surveys, but were careful to not read too much into them. At the highest level, there was clear indication of pain across the team, and a significant gap in perception between the management and the technical staff. With management having a rosier perspective, there was concern that contentment could scuttle any real efforts, so we knew we had work to do there.

We also compared their responses to some industry benchmarks we had gathered, and there was another clear gap, where perception or practice (which is difficult to discern from the raw numbers) outside the group was much stronger. We found some opportunity to leverage.

Then we really got busy. We listened, to a lot of people. How they worked, the pain they were feeling, the suggestions they had for making things better. It was clear that everyone experienced significant pain, but everyone had a very different sensation for this pain. Different perspectives, so different ramifications of the challenges. We did a lot of cross-tabbing and correlating, and we started to see a picture developing. We had uncovered a root cause, and finally could start attacking the real problem.

We went back to the people. Face to face meetings to discuss the findings, both the strengths and opportunities within the team. We started to help them paint a picture of what a better world might look like. To do this effectively, with the different groups, we ended up painting a gallery of different pictures. One where there was predictable closure on projects, another where there was less disruption and chaos. We painted a picture where projects could happily co-exist without stealing resources, and the group as a whole could leap ahead against the competition.

We walked them down the path of how to get to these places. We had carefully selected the path of least resistance. There was little proposed disruption to the way they did work in the past. Indeed what we suggested was an infrastructure that would allow them to do the things they wanted and needed to do in an unfettered manner.

We then ran a significant amount of...well, not quite training, more like acclimatization. We reinforced the concerns that the pain was universal, walked them through the root causes we were trying to excise, and the changes that would allow that to happen. Everyone had the opportunity to express their challenges, and in seeing the broad range of perspectives, different groups started to bond. We worked with almost as many managers as we did technical staff, to reinforce that they had the critical role of removing the roadblocks that could get in the way (including some of their disruptive behaviors from the past). We worked with their partners that were across the globe, as the changes involved better, more managed communication across all groups.

There was universal support. Beyond engagement in the classroom, there was a buzz around the coffee machines that went beyond caffeine, and as the training progressed there was an increase demand. Lunchtime discussions were centered on looking forward to getting started, rather than 'anything but that training'. Criticisms were almost exclusively suggestions to go further with the implementation, but we were careful to ensure we could walk before we ran.

Compared to the reaction to the stock training 18 months earlier, it was a different group. Except that it was actually the same group.

Eighteen months earlier, there was relatively little investment, and virtually no value gained. We were merely helping them spend their training budget. Now, there was significantly more investment, but there is also an overwhelming upside. This turned out to be a strong business decision.

The difference is that we didn’t lecture or ramble on about what they should be doing. We listened, we coached, we solicited input, we facilitated. We helped the team find their own better place. We were greasing the wheels. - JB [top]

Structured Debate (Compendium 5.31)

In the halls and offices of many organizations, there is a great deal of misdirected debate taking place.

This project has to be Agile, that requirements tool trumps this one. Sometimes passionate discussions, but misdirected just the same.

All the time spent debating which approach to use, which methodology to follow, which tool to purchase, is time away from focusing on the real task at hand – completing the project that meets the client’s needs. There is an appropriate time to discuss these issues, but far too many shops continue this discussion for far too long. We’re too often deciding whether to use a hammer or a chisel, choosing between Makita and DeWalt power tools, we’re not getting our project done.

Heated methodology debates are a sure sign that the participants have gained just enough knowledge to be dangerous. There is an awareness of the value in the tools, but still insufficient consciousness of the cost of the ongoing methodology debate itself. We need to be careful to recognize that with methodologies, as in most other areas, perfection is the enemy of sufficiency.

The healthiest debate we can have on a project, and the debate that should consume the lion’s share of the time, is that which allows us to converge on the best possible solution for the client. Debating scope, architecture and implementation alternatives will lead to a refined product, and that is what we are here for. Debating the approach for too long is akin to the angels on the head of a pin discussion. We ourselves become pinheads.

Methodologies and tools are important, don’t get me wrong. They are so important that there should be time devoted to the beginning of every project where they are selected in a manner that allows us to focus on the appropriate debates for the majority of the project.

Indeed, this is the major benefit from the selection of the appropriate approach. Strong selection provides structure around our efforts so that our tasks are pointed in the right direction. Our approach should be put in place, then silently, invisibly do its job. If there is a conscious ongoing effort to determine the appropriate approach, or to remember how to use a tool, there remains a need to further standardize, familiarize and institutionalize these elements.

Selected appropriately at the onset of a project and refined as required throughout, a reasonable methodology will serve to help the team ensure they understand the breadth of issues to consider, provide appropriate insight into progress, and facilitate the creation and cross referencing of reasonable project artifacts along the way.

Just as it is safe to say that there is rarely one right tool for a specific woodworking job, and there is no tool that is adequate for all woodworking jobs, the same holds true for approaches to software projects. We need to look at the project we are dealing with today, and select the appropriate tools for the job (remember that this is something you will likely never hear from a tool or methodology vendor).

There are some tools that have shown to be consistently valuable, and will be used on almost any project. We need to become effortlessly fluid with these standard approaches, and the best way to do so is to continuously use them. Determining the vision and specifying scope should not require remedial clarification of the approach on any project, and to suggest you can get by without doing these things should be closely scrutinized.

There are some tools that are useful for unique situations that occur rarely – essentially the custom jigs. We need to be flexible enough to recognize when they are needed, and be capable of adapting accordingly. Scripting languages and esoteric modeling approaches can serve to get us out of the occasional jam.

We need to continuously hone our skills with the tools we know and use regularly, and we need to continuously seek to learn new techniques that could serve us well in the future, but we cannot let this effort get in the way of our prime objective – to best address our client’s needs.

Done right, this effort facilitates our getting the job done by putting appropriate structure around our debates. - JB [top]

The Big Picture (Compendium 5.28)

I find myself in a situation right now where I have a large strategic project on the go, in addition to the tactical engagements and the day-to-day operations around here. It is a significant undertaking, and will probably consume the bulk of my time over the next year. Fitting everything in is a difficult task, and there is constant juggling of priorities and adjustments that need to take place to achieve my goals.

Big deal – welcome to my world, you might say.

True, we all juggle a large number of activities on a daily basis, some of us more effectively than others. What I am finding interesting at this point