|
Software Teamwork Articles Business Tips People Tips Process Tips PM Tips QA, Test, CM Tips Analysis, Design Tips Compendium Archives Recommended Books
Process Tips
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]
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]
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]
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 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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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 |