|
Software Teamwork Articles Business Tips People Tips Process Tips PM Tips QA, Test, CM Tips Analysis, Design Tips Compendium Archives Recommended Books
QA,
Test, CM Tips
I wrote a couple of weeks ago
about what can happen when a team agreement is hastily put together: it can
actually be worse than no team agreement at all, and can serve to tear a team
apart. It is one thing to observe this and note that the team agreement was part
of the root cause. What tests can we apply to our team agreement to determine if
it is good enough to pass muster to begin with?
As we are developing the team agreement, there are a few questions we can ask to
determine its robustness. First off, we need to be sure that the agreement is
not filled with empty platitudes. While every team I have worked with has
expressed the desire to have fun as they work together, capturing this as part
of an agreement by saying 'we will have fun as a team' is not enough. You can't
just tell your kids they have to have fun on a family outing and expect
miracles, but you can make sure the event is interesting engaging and
stimulating to them. We need to be careful to craft an agreement that helps us
achieve our final objectives, rather than simply expressing our goals.
A team will have an environment where there is an opportunity for fun only if
they can avoid the stressors that often derail teams: bogging down with
difficult decisions, working at odds with one another, proposing alternatives
that are counter to the goals and value systems of others on the team. We need
to build an environment where we won't step on each other's toes. The agreement,
then, needs to be based on a solid understanding of the goals and motives of
everyone in the group, and this understanding becomes a critical precursor for
success. We can't just write an agreement, we all need to understand each other
first. Strengths, interests, goals, motivations. The makeup of the team drives
the content of the agreement. Behaviors that are offensive need to be identified
in the agreement as taboo.
If there is nobody in the team with natural assertive tendencies, the agreement
should identify mechanisms to establish how the team will focus on goals and
adhere to task at the beginning of each activity. Ditto if there are gaps in
analytic (how do we make sure decisions are driven by the right data?) or
altruistic (how do we ensure everyone's needs are being met?) traits in the
team. An effective team needs strengths in all these areas, and if we don't
cover our gaps through explicit mechanisms we have identified in advance, when
the need arises for our missing traits to shine, the team will often feel pushed
into a position that is stressful. Again, it is the structure of the team that
drives the content.
As an example, if you are a naturally altruistic parent, you can deal with kids
and traffic in two different ways. If you find yourself pushed into assertive
behavior as you urgently jerk your child back from oncoming traffic, that
application of behaviors that are outside your comfort zone will result in a lot
of stress. If, on the other hand, you consciously sit your child down and
assertively cover the rules of the road, you can avoid the stressful situation
and maintain your composure. You get far less stress with a little forethought
and conscious application of non-standard behaviors in a proactive manner.
As the team works in the context of this agreement, there are several additional
tells that will help us identify flaws that need to be adjusted. Despite any
precautions we might take, there will be times when toes are stepped on, when
the beginnings of conflict become apparent. Left unchecked, a vicious circle
drags the team down until trust is eroded, and can quickly get to the point
where it is difficult, if not impossible, to recover. The team agreement needs
specific practices to break the circle of conflict before it gets too deep. Is
there a mechanism to safely indicate that stress is rising, that you were
offended by what has just happened? After you have signaled your concern, then
what? Is there a mediation mechanism identified to clean up the concern?
How will the team resolve differences to the satisfaction of all participants?
Majority rule will rarely work, and should only be seen as a last resort.
Consensus is far better, if more difficult to obtain. In most cases, there will
be some criteria that can be identified as the basis for selection of the right
approach, a strong agreement will help a team decide how to decide for specific
situations.
Surrounding all these elements is the team's attitude to the agreement itself.
Is it recognized by everyone as a critical guide to behaviors that facilitate
success, or yet another piece of documentation that is preventing the team from
getting to what they see as the real work to be done? Does it remain top of mind
with the team, reviewed periodically to reinforce its content or left to wither
like an unused specification? Is it modified when the team discovers that
unwarranted conflict is not adequately addressed by the guidance, and it is it a
tool used to accept new members to the team? Is it adjusted to reflect what this
new member brings to the group? Is it respected as a valuable tool for the
group?
The tests of a team agreement come as a reflection against the team itself. If
it is biased to accentuate the strengths of the group and shore up the
deficiencies, if it serves to protect the interests of the group and prevent
unwarranted conflict among the team, it will serve its purpose. If you look at
your agreement and don't see this reflection of the personality of the team, you
are asking for trouble. Rather than generically identifying goals that any team
might have, a strong team agreement helps ensure that the team actually gets
there. - JB [top]
After working with a group on requirements issues over the past couple of days,
one person queried me on a particular challenge they were having. It seems they
build their products in phases, and in doing so they generate a separate
requirements document for each phase. Three phases would generate three separate
documents, each with the information from the last phase, plus any new feature
for the latest one. This generates quite a bit of duplication, a lot of copy and
pasting from the first to the successor documents. What to do?
One of the challenges with documenting each phase separately is that there ends
up being a need for cross referencing to ensure you have got all the
requirements you need, or to make sure you are not tripping all over yourself as
you build phases 2 and 3 of the system. As you are really building one system,
in phases, I would really lean towards a single requirements specification that
grows over time, in those same phases. That way, you have a single document to
deal with (where all the information is), and you get the added bonus of
increasing the likelihood that the requirements are actually top of mind for the
implementation stage, as that document is still open and being revised for
future phases. The information is at hand to be used as a basis for the
implementation.
This also avoids the issue about the copy and paste concerns, which can be a big
problem. I don't see putting all the requirements in one document delaying phase
one in any way. What is needed is some system of annotating where each of these
requirements first appears in the implementation, perhaps something like a [1]
or [2] in a margin or at the beginning of each requirement to indicate this.
Another approach would be to indicate the phase of implementation in a separate
table or prioritization worksheet (f you are using an industrial strength
requirements management tool, much of this conversation becomes moot, though
other challenges may arise). When we have established all the requirements for
phase 1, we baseline the document, use it as a basis for phase 1 development,
but keep evolving it as we discover additional requirements for downstream
phases.
This is how you typically implement the system as well: you complete and ship
phase 1 of the executable system, then you build on that baseline and keep
moving forward. Your baselining system can be used to express the applicability
of the document. Like your source, the document will always have the same title,
but will have versions such as 'phase 1 baseline', 'phase 2 draft', 'phase 2
baseline', and so on, and this document can continue to live and support
maintenance of the system as well. Placed into a configuration management system
(or Sharepoint, which can also support this), anyone can fetch the phase 1
baseline version if they need to refer to that.
Fundamentally, if you have one system that you build and evolve over time, you
should be thinking the same way about the documentation stream as well. The
labels we use when we baseline the system should encompass both the source code
and the documentation that supports it. We should be able to go to our system at
any point in time and fetch 'Phase II, Version 2.3' (or whatever), and get all
the source and supporting documentation for that complete version of the system.
This is critical, because the system that we have developed is all of this
information, not just the executables. If someone suggests that the only valid
documentation is the code, they probably have not supported reasonably complex
systems that have been developed by others.
Any reasonable product will be far more than the source code, there will always
be several documents or other sources of information to refer to for the
complete picture of the system. There will be a 'bounding box' or justification
for building the system to begin with, the analysis models that were used to see
how our translation from the voice of the customer evolved into a technical
understanding of what was needed, there may be a specification for the detailed
requirements of the system, and we would likely also have design models,
architectural elements, source code, test artifacts, training materials and a
wide range of other things to look at. It is not avoidable to have all these
different perspectives of the system. What is important is that we have the
ability to know what is the current slice through all of this information, and
what was the slice through all of this for every baseline in the past as well.
What we want to avoid is the problem of having multiple concurrent versions of
any of these things around at the same time (or, more practically, for too
long). Remember, we're still building one system that evolves and grows over
time. Through appropriate labeling and versioning, we should always know what is
the latest version of anything. We should also be able to 'go back in time' as
well to see what the current thinking was at any point in the past if we need to
understand the root cause behind a reported defect for one version of the system
that is in the field, even if we are two versions ahead in our current thinking
of new functionality.
We all know how messy things can be if we don't carefully
manage branches in our source control environments. We're even better off if we
understand that this same principle applies to the entire stream of artifacts we
produce. - JB [top]
Quite often in working with clients, questions will pop up in a vein that
fits into the general theme of "How much of this should I do, how many of these
should I have?"
The questions cover a wide a range of topics. How much work in requirements
analysis is enough, what’s the right number of testers to hire, how many
documents should we develop, how do I know when I have a reasonable amount of
regression tests in place?
In each case, it would be easy to hunt down some industry study that provides
what is suggested is the right answer, but this would be a huge disservice to my
clients.
It would also be easy to fall back on the standard consultant right answer of
‘it depends’, but that doesn’t help much, either (and you would have to have an
insane billable rate to make that statement worth your time...).
If you simply ask an architect how much it would cost to build a 4-bedroom
house, you would get ‘it depends’, and it would feel very appropriate, but then
you would enter into a conversation geared towards understanding your situation.
Software teams and projects, like homes, come in all different shapes and sizes.
Varying product spaces, a wide range of mission criticality, and different
cultures, skill sets and collaboration approaches all drive different responses
to the questions above.
Is there a way we can go further down the path of understanding how much is
enough without the handholding of a consultant or architect?
Perhaps a better way to look at the problem is from the other direction. Rather
than asking whether I have enough of this or should we do more of that, ask
yourself if you are satisfied with the current results of what you are doing. If
you are like most shops, you will probably respond that there may be some minor
room for improvement. Perhaps you might respond that there is no way but up from
the current situation. Likely somewhere in between.
Assuming there are opportunities to be had, then ask yourself if the particular
practice you are considering can add value, or reduce the friction, of the
current environment. If so, there is potential value in doing more of it than
you are now.
Remember, though, that there are a number of things you could do more of at any
point in time, and things you could do less of as well (which may give you the
time to do more of the desirable stuff). Rather than forging ahead with the
first idea that pops up, take some time to consider the breadth of things you
could be doing differently. Pick the low-hanging fruit, do a little more of it
than you are doing now, and reap the benefits.
Let’s take an example. Regression testing is a topic that popped up with a
client last week. They don’t do any to speak of at the moment, so the question
was asked: "What is the right amount of regression testing to perform"?
Questions back to them, in order:
- In the grand scheme of things, are they plagued by some areas of the
application breaking when they make fixes to the code, particularly in areas
that don’t appear to be related?
- How painful is this compared to other issues such as troublesome
integration, unpredictable schedules, incomplete functionality, or the wide
range of other issues that hinder any software organization today?
- In that context, is this the biggest issue? Can the magnitude of this
issue be quantified in some way?
- Are there certain areas of the system that are hit by this issue more than
other areas?
- Is there an understanding in the group of how to go about building
regression tests and automating them?
- Can someone be committed to tackling the problem, in this project cycle,
for the specific areas of most concern, in a way that the benefits of the
effort can be clearly identified (in terms of time savings, reduction of
escaped issues, schedule predictability, and so on...)?
If the answers are yes, huge, yes, yes, yes, yes and yes, then it seems pretty
clear that building some regression tests for that particular area will likely
be beneficial.
Note that we haven’t answered the original question of how much is enough (where
the right answer is likely “more than you are doing now”), but we have recast
the question to determine where we would most benefit from a change from the
status quo.
To try to define in advance what the right mix of practices should be is
dangerous and error prone. If I was to say that we needed a set of 100
regression tests to cover the system adequately (or 1000, or 10,000), there
would be some serious pushback: we can’t do all that, the schedule won’t allow
it! Chances are nothing at all would be done.
If, on the other hand, we see value in doing at least a little of something
different, we get less pushback, we identify something that can be accommodated
by any project, and we reap the benefits within that project cycle.
Think incrementally – add a little bit of what looks promising, see if there is
the benefit you expect. If there is, but there’s still room for more benefit,
add a little more. It’s not "How much is enough?" that you should be asking, but
rather "Is the current mix of activities giving me the results I am after?". - JB [top]
Last week I mentioned a
particularly nasty bug from way back that held us up for weeks as we were trying
to implement an RS422 protocol between two devices.
This was a typical lab environment, with the two devices sitting on a bench,
surrounded by oscilloscopes, logic analyzers, other test devices, and nervous
managers. It seemed that no matter how rigorously we devised our tests, the
system would seem to work well one minute, fail the next.
One of our standard sanity checks for the software was to use a loopback plug on
one end of the makeshift cable to confirm that a specific set of tests worked.
Unfortunately, what sometimes happened was that even when we removed the
loopback connector, the loopback tests still worked! We pored over these tests
and the operational code with a fine tooth comb.
Our cable was a bunch of loose wires, perhaps 4 or 5 feet long, so we could
connect the two devices together. When it was time to try a loopback, we would
pop the cable off the receiving device and attach the loopback to the end of the
cable. How could anything possibly change in that situation?
We were making the rash assumption that these wires and connectors would work in
a consistent manner for our tests. It turns out that when we carefully ran the
cable across the bench, the wires were close enough together so that the signal
on one wire could be sensed on another wire right next door, effectively closing
the loop. The software had actually been working as expected for quite some
time, and when we introduced a properly built cable, our problems were resolved.
What had cost us all that time? We were making an assumption that what worked
once would continue to work in the future, and there was no need to worry about
it further.
As we work on a product for a period of time, we will make assumptions. Early
discoveries or decisions become assumptions, which is a reasonable mechanism for
us to have the capacity for new issues that we are dealing with. This works for
most of the issues, which makes this a valuable mechanism to use, but it is not
100% effective.
Every time we add to an existing system, there is a finite chance that we will
perturb some part of the system that is already in place. This is true for new
work, and even more so when we are fixing defects in the system (studies have
shown that the likelihood of injecting a new problem is 10x as likely when you
are fixing bugs). When this happens, the system has regressed.
For that reason, we can’t assume that tests that have worked in the past will
still work. This is one of the key drivers for building tests that can be
maintained over time and managed in a regression suite.
Beyond a regression suite for software, though, it is important to capture your
assumptions that have been made along the way. To some degree, a well managed
set of requirements and design decisions can serve as a higher level regression
suite. Without this information captured in a reasonable form, assumptions
become implicit. Possibly internalized by those that were involved at the time,
but invisible to everyone else. A dangerous way to proceed.
One great way to expose assumptions in your system is to get as many fresh sets
of eyes looking at the problem as possible. Often, when I run inspections
workshops, people will claim that new employees or people that are more junior
will not add a great deal of value in an inspection or peer review, but I have
found just the opposite to be true.
Without fresh perspectives into the problem, it can be easy to fall into a
group-think trap. With new eyes, we get the naïve questions that will surface
the assumptions that have been ingrained into the group. You may be surprised
how often there is value in rethinking and correcting those old assumptions.
What we get is a great deal more innovation in our solutions, while at the same
time distributing the knowledge of the system, reducing the dependency on
heroes.
Back to that old bug we had, it was someone just walking through the lab that
looked over our shoulders and pointed out our problem. She didn’t have a strong
engineering background, but she asked the questions we were all assuming to
already answered.
Are you making any assumptions today that could use a sanity check? - JB [top]
There are many organizations, and plenty of
pockets of resistance within organizations, that don’t leverage the value of
peer reviews in any form. Individuals create their work products on their own,
possibly taking the time to step back and have a look at them from a different
perspective or running a few tests on them, then the product is essentially
tossed over the wall to the next consumer.
Even in cultures that advocate test driven development, when the author of the
work product is also the author of the validation suite for that product, there
are internalized assumptions that can lead to trouble. In any environment, for
any work product, it should be considered mandatory for some level of review by
another set of eyes.
Usually, the arguments around not reviewing work products before passing them on
center around the lack of time or resources. This, though, is a rationalization
that rarely stands up to scrutiny.
While formal inspections do require a significant investment in training,
infrastructure, planning and implementation, numerous studies show that the
payback for running this as a formal program is tremendous. The return on
investment cited is usually around 10:1. Yes, even for all that pomp and
circumstance, for every dollar invested in all that effort, organizations find
that they save ten dollars downstream in reduced rework. This is a direct time
savings, and doesn’t take into account the incredible value of reduced
uncertainty of delivery, increased quality of the product, reduced risk of
reliance on individuals, and improved culture where everyone gets more time to
work on new features.
Any reasonable business person would gladly donate several eye teeth for an
opportunity such as this. Most software teams don’t see this. Indeed, as
schedule pressures increase, the value of inspections as a time saver and risk
mitigator become more valuable, not less. Rushing the construction prolongs the
overall effort.
Unfortunately, many just aren’t comfortable with that formal setting, some are
not aware that the opportunities exist, others would suggest that it just
doesn’t fit with their agile approach. A formal inspection program can be a hard
pill to swallow.
That is why it is important to recognize there are other forms of medication for
what ails most software teams. Formal inspections lie at one end of a broad
spectrum of different peer review techniques. As we move down the inspection, we
peel off layers of what many see as an onion. We pull back on the need for
running a formal program and capturing the metrics, we get participants to
bundle up some of the distinct responsibilities, we can eliminate the need to
formally plan the effort, we can back off on the paperwork.
With that in mind, we get away from the boolean impression that we can do formal
inspections or we do nothing. We can leverage the shades of gray.
While it is good to know how to apply formal inspection techniques for improving
the quality of our work products, it is more important to recognize the
imperatives of applying some form of peer review to improve everything we
produce, and using an appreciation of risk exposure in determining how formally
we should review our work.
We need to look at everything we build, including the intermediate products such
as requirements or user stories, designs or prototypes, and assess the potential
risk we need to mitigate. If the product is part of the core of our application,
if it has been constantly hammered by nagging bugs, if it is being implemented
by someone that is new to the team or using a new technology, there is value in
moving further up the formality spectrum for reviewing the product. Greater
effort, to be sure, but also a more exhaustive review of the product.
If we plan for a more formal review of the high risk items, which implies the
conscious identification of these areas in advance, we can allocate the time and
resources to do this properly. If time is not budgeted, it will never happen.
For everything else, identify how you can lighten up the effort, but never go to
the extreme of building something and passing it along with no peer review
whatsoever. That is assuming, of course, that you don’t enjoy wasting your time
later.
Formal inspections are valuable, but more importantly we need to build a culture
where it just doesn’t feel right to let anything go without another set of eyes
going over our work. - JB [top]
Generally, the suggestion that you should never
argue with the data is a good one to follow, but there are clearly some caveats.
There may be challenges with the measurer or the subject being measured, or
both.
In scientific experiments, the instruments used for measurement are periodically
inspected and calibrated. This ensures that the number being displayed or
captured is indeed representative of what is being measured. In addition, in
well controlled experiments, the subject is carefully managed to minimize the
environmental noise, maximizing the signal and the overall value of the data.
In comparison, assessors, evaluators and any other human ‘instrument’ may have
received an initial inspection resulting in some attained qualifications, and
may even have periodic calibration in the form of ongoing maintenance of their
credentials. They all have biases, however, that no certification program can
completely remove. Some of these may be internal biases, some may be a function
of the certifying organization. Who audits the auditor?
On the side of the subject, there are all manner of issues that we need to
consider. If the measurement is something that can be taken without any
conscious action by the subject (such as having one’s temperature taken), it can
be relatively safe to assume that we have a reasonable level of objectivity. If,
however, the data we are gathering is part of a survey or involves responding to
questions of some sort, we have to be careful to consider what is going on
behind the curtain, in the person’s mind.
As they answer the questions, they may have biases based on any number of
drivers. Are they:
- Responding to demonstrate that they know the correct answer, or to ‘win’ the
perceived competition?
- Racing through the question set to get their name into a draw, or merely to get
back to work?
- Biasing the responses in a certain direction, or to be safe, responding out of
fear of reprisal?
Or are they trying to respond with considered, thoughtful responses in order to
objectively learn from the experience?
Any collection of data that has been gathered in an unmanaged, open interface
should be subject to intense skepticism, for we have failed to address any of
the potential biases of the subject. We just don’t know how they are looking at
the questions. Open queries over the internet, for example, may generate a great
deal of data, but how do we discern the signal from the noise?
We can easily gather a great deal of data to use, but we have to understand
whether that data is useful. It needs to be relevant for the questions that I
wish to answer, and collected in an objective, carefully managed form.
In his book Measuring and Managing Performance in Organizations, Robert D.
Austin argues quite convincingly that the measurement process needs to be very
carefully managed. Even the most defendable data gathering methodology can
degrade over time as the respondents understand how the data is being gathered
and what the data is being used for. This is done, consciously or not, to steer
the results towards each person’s individual agendas.
Quantification can sometimes be a poor argument for validity, or even
reasonableness. Without a disciplined, active and evolving approach for managing
the sanctity of the data being gathered, it can become just another bucket of
numbers. - JB [top]
I grew up in Southern Ontario, where everyone
had at least one relative or close friend that worked in the automotive
industry, if they didn’t themselves. There was always a strong sense of
brotherhood, and the oil crisis (the one a few decades ago) was not an easy pill
to swallow. If someone worked at Ford or Chrysler and showed up driving a
Nissan, there were times when that car could be flipped or torched just for
being on the lot.
Even though there was a strong commitment to the local brands, there was also an
understanding about the product and the business. Nobody would buy a car that
was built on Monday morning, and partnership wasn’t a word you would use to
describe the relationship between the unions and management.
Fast forward 30 years or so and the landscape has changed. While there can still
be some animosity towards foreign car makers in areas that have been hit by the
downturn that North American automakers are facing, there has been a steady
growth of acceptance of the foreign cars here. Not only have these foreign
automakers opened plants on our soil, they have grown to a point where most of
their cars that are sold here are built here, with parts from this neck of the
woods, and with North American workers.
I’m driving around in a Mazda that was built in Michigan. The engine block comes
from a Ford foundry in Windsor. When I travel in a rental car, though, I am
constantly reminded that there remains a significant difference in the quality
of a car from an American manufacturer and one from a Japanese one.
Before going further, it is important to say that there are hits from North
America, and duds from Japan. We had to replace the engine block in our Toyota
minivan after only a couple of years. Not everyone that works in a North
American factory is indifferent of the work they perform. There is a big
difference across the genre, though, and it goes beyond the soil where the
manufacturing plant is built. As we think about outsourcing our software
products abroad, can we learn something when the shoe is on the other foot?
As the Japanese outsource the construction of their products to North America,
they do so not because the labor or material rates are significantly lower than
in Japan, but because of the ‘Built in America’ demands of the consumers here.
They have identified a business challenge to manage, and they have done so very
successfully. The domestic brands continue to lose market share, the foreign
brands continue to rank higher in terms of quality and customer satisfaction.
One of the things that the Japanese have done very well is to outsource the
attitudes around building their product, the same attitudes that made them
successful initially in Japan. As a plant opened here, it was originally run by
Japanese management, whose style is quite different than that which is
traditionally North American. Everyone contributes to quality, all employees are
respected and there is a strong sense of working together to build a strong
product. Only when the attitudes are institutionalized and the quality
approaches are ingrained are the reigns turned over to local management, and
only those that are carefully groomed will get the job.
The big 3 automakers here would like to suggest that there is an unfair
advantage, that without the higher wages driven by unions and the huge legacy of
pensions, the newcomers are too agile to catch. One way to look at this is that
while the workers get reasonable compensation and flexible pension plans, these
were crafted as a partnership rather than out of being overpowered. Management
has been able to succeed in building both a quality product and a sustainable
business at the same time, and there is an ongoing conscious effort on both
aspects.
It is interesting to compare this to my experience over the past couple of days
as I moved to a Mac from a long line of Windows based machines. I speak about
the transition in the past after only 3 days, even with the change of platform –
previous transitions from one Windows machine to the next would often consume
weeks before I felt settled in. The ease of learning is better, the ease of use
is better. Far superior integration of the applications (and yes, I’m using
Microsoft Office on the Mac), installations are cleaner, and I haven’t had to
reboot yet (though I tried it once so far just to see how long it would take).
I understand why there is such a cult around Mac users, I’m already feeling the
tug, the growing intense loyalty to the product. My perspective was always that
Apple screwed up a long time ago by not opening up their hardware specs to the
free market, but that viewpoint is changing. They may not own the lion’s share
of the market, but they haven’t had the challenges resulting from the wide range
of quality on their platform of evolving standards. My thinking now is that
Apple may have recognized the risk of losing control of product quality.
The interesting thing about this comparison here is that the only words on the
front of the box of documentation that came with the MacBook are “Designed by
Apple in California”. The device was assembled in China, but Apple has done well
to manage the outsourcing risks.
Outsourcing is not simply a function of geographic boundaries, though many will
cling to that notion. Successful outsourcing involves the active management of
the transfer of values and attitudes. If quality is on your radar, and if this
is consciously transferred to your team, success will follow. - JB [top]
I can’t think of an industry where there is as
narrow a perception of what constitutes a critical practice as the software
industry. In most shops, and for more than enough ‘industry leaders’, developing
and managing requirements is done when we have time. Estimation practice looks a
lot more like target practice, and project management is akin to herding cats,
with little or no semblance of pragmatic, proactive effort.
Measurement is something that few of us do
well, if at all, in this industry. This unfortunately includes many of those
that would like to suggest that measurement would be a good thing to do. There
is little wonder that the industry continues to be plagued by many of the issues
that were first raised decades ago, as most of us are left to our own devices to
discover the same things that everyone else has experienced in the past.
Our anecdotal recollection of past performance
is often way off the mark. We all have a tendency to be more generous with
recollections of our own performance, and our perspective of others is strongly
biased in one direction or another based on our past experience with them
(whether or not that bias is justified). Anecdotal recollection is too far
removed from reality to be used as a basis for rational decisions.
This is not news to people, but we still don’t
measure.
In principle, most of us have a strong aversion
to measurement. Taking the time to capture how big something was, how long it
took for us to do something, or how much it cost is the kind of closure that few
of us will take the time to do – we’re far too busy forging ahead with the next
task on our list to deal with this triviality.
Layered on top of that is the fear that actual
measurements will be used against us. I’ve seen timesheets used to insinuate
that some people aren’t pulling their weight, or used to drive more work in less
time as overtime is conveniently neglected. I’ve seen inspections decay into
discussion of local sports teams because of the knowledge that any issues found
would be reflected on annual performance appraisals. In some organizations, the
fear of measurement is quite justified.
For these reasons, measurement is the last
thing that most of us would want to spend our time on. With care and nurturing,
though, we can build an appreciation for the value of appropriate management
while holding the dysfunction at bay.
Take the time to consider where measures might
add some value – identify the activities that you really don’t know how long
they will take, or how much they will cost. Repetitive tasks are good; think of
elements that you perform on every project or periodically, or that you could
capture on a weekly basis to identify trends over time. Think about how you
might capture some of these measures – what to count, where to store the
results, when and how they might be used again.
There is a very strong chance that after a very
brief period of time, on the order of 3-5 measurement cycles, you will gain some
new insights that will surprise you. Over longer periods of time, you will be
able to use this information for predicting future outcomes with much more
credibility.
Done right, measurement is not evil at all, and
it is an absolute necessity. There are a variety of data points that I capture
on all aspects of the business to drive operations that I would be lost without.
Yes, there are times that the data has not provided great news, and there have
been strong urges to bias the results to sweeten the deal, even knowing that I
would only be lying to myself.
I have learned, though, that even bad news in
the form of unbiased, defendable data is extremely powerful in allowing me to
make reasonable decisions in a clear manner. Measurement has become a core
practice for driving a business that has spilled over into other areas (just ask
my wife about the spreadsheet for timing her contractions), and for me, the loss
of being able to effectively measure and base decisions on this insight would be
a far greater evil. - JB [top]
In working with a large number of different
organizations over the past 8 years, primarily focused on helping them become
more effective at getting software out the door, there has been a continuing
effort to crack that challenge of measuring the value of our improvement
efforts. Many would argue it just can’t be done – most groups don’t have the
benchmarks, there are so many factors that influence the overall results, it can
be too easy to differ in the interpretations as to which factor contributed the
most – or to interpret that the change is merely a function of noise.
While there has been some success in
quantifying value for some organizations, there has also been a nagging problem.
Some companies that would seem to score well on the quantified results continue
to struggle to get their product out the door, while others that score
relatively poorly – even some that will not show marked improvement quantifiably
– show dramatic change and remarkable results with their efforts. Something is
there beyond the data.
In retrospect, it appears that what is missing
from the hard numbers gathered thus far is how well the organization can look
inwardly and recognize that there is room for improvement. Call it openness for
change, or an ability to be reasonably self-critical.
For some shops, improvement just won’t happen.
It’s the equivalent of that unanswerable question “Do these pants make me look
fat?” – the messenger will be damned for telling the truth, and will make no
progress with a lie. Others will gladly lap up any feedback they can get and act
on it accordingly.
It is quite easy to take a list of clients and
place them somewhere on the continuum between totally closed and totally open to
an external perspective of their performance. This is a phenomenon that starts
at the top, and as it trickles down the chain it manifests itself in various
ways.
When having an open discussion about practices
and the resulting performance, some teams will be open and engaged while others
can’t seem to wait until the meeting is over. Body language gives great insight
(which is one reason why these sessions are most valuable face to face), and the
same managed session can be as short as 45 minutes with some groups, and more
than 3 times as long with others. Perhaps there is a new metric to be gathered
here…
In particular, senior management engagement
tells volumes. Some don’t bother participating or even attending at all, and
others will argue that the information discussed is irrelevant for their
organization. On the other end of the spectrum are those that are interested in
the results, actively involved in the discussion, and solicit the input from the
rest of the group in analyzing the information presented. Bravo!
To some degree, an assessment of an
organization’s ability to be self-critical would be a key leading indicator of
the success of any improvement engagement. It is one thing to change a few token
practices for a team, it is another thing entirely to change habits and
internalize appropriate practices so that they will be applied when the pressure
is on. To be able to look inwards to identify potential changes that are within
our own sphere of influence is essential. We all have room for improvement, all
the time.
We need to find a reasonable balance in the
continuum of self-criticalness. In working with a large number of people to
improve their organizational skills, it has been fascinating to see those that
are content to live in a physical environment where they can’t see their desktop
and visitor’s chair for the piles of paper, or in the electronic equivalent
where everything remains in their Inbox or their Desktop. Others are fastidious
about staying on top of things, to the point where there’s angst when the
stapler isn’t placed in the right direction. Somewhere in the middle lies the
sweet spot where efficiency and control is maximized, busywork and stress is
minimized, and the most real work gets done.
There is value in recognizing the degree to
which we are open to acknowledging that we could improve, and the corresponding
openness to hearing the feedback from the outside without defensiveness. While
it may be one thing to maintain a public persona of strength that can border on
puffery, it is another thing entirely to retain that boastful image internally,
where it can often be interpreted as denial.
Being able to recognize our ongoing potential
for change, and to reasonably act upon it, is an
extremely valuable strength. - JB [top]
The only thing that bothers me more than
companies saying they’re in the Web 2.0 space is teams saying they are doing
Agile – both bandwagons are getting pretty crowded these days…
Don’t get me wrong – I think that the latest
Web technologies are way cool, and there is a lot of merit in the Agile
approaches – both have their place. That stated, the rolling of my eyes is
becoming involuntary – despite all the admonitions, neither of these movements
is going to eliminate world hunger or cure cancer, or even completely supersede
their predecessors - far from it. The newest approach is not necessarily the
most appropriate for all situations.
The Agile approaches have been getting strong
press for 5 or so years now, enough time for the major tool vendors to catch up
and suggest that their suites fully support this game. What Rational did several
years ago with the RUP, Microsoft is now suggesting they can do with their
latest version of Visual Studio Team System. They provide a process tailoring
environment that is admittedly version 1.0, and a process enforcement mechanism
that can drive your artifacts through specific states and gates. First out of
the gate are CMMI and Agile – I almost wonder if these were selected using a
del.icio.us tag cloud to pick the approaches that generated the most buzz?
Problem is, building a generic CMMI process
model for enforcing the development of software is like talking by building a
sentence model around Webster’s Dictionary. Trying to run an Agile project
around a state driven enforcement mechanism is simply an oxymoron – the whole
point is to be able to adapt to the situation, and the last thing you want to do
when the situation changes abruptly is to dive back in to change the defined
process model. It seems that in our zeal to jump on the bandwagon, some of us
seem to be missing the real point.
There appears to be a growing arrogance among
the advocates in these camps, that the early demonstrated successes are proof
positive that we are witnessing a new world order. Anyone can put together a
mashup of public washrooms in San Francisco, and some companies are even
starting to solve real business problems with new technologies. There is a
wildly popular Waterfall
2006 conference website (including its own incomplete sections and bad links
– nice touch, Mike…) that spoofs the early attempts at defining a standardized
process, but after a few quick chuckles it all seems shallow (at least waterfall
would be easy to model and enforce with Visual Studio Team System…). It’s a
pretty safe bet that something will replace Web 2.0 in the future, and someday
more people will begin to realize (maybe they’ll even teach it in schools, Oh
My!) that a single branded Agile approach won’t solve all your problems.
It’s all got a deeply carnival feel about it –
everyone is proudly displaying their affinity du jour, tool vendors are flogging
their latest features and consultants are branding themselves accordingly. No
doubt as soon as the luster wears off, people will flock to the Next Big Thing
that comes along. I’m reminded of Monty Python’s spoof of religion in the Life
of Brian:
- Brian: You've got to think for
yourself! You are all individuals!
- Crowd: Yes, we are all individuals!
- Brian: You are all different!
- Crowd: Yes, we are all different!
- Single voice from within the crowd: I'm
not.
- Crowd: SHHHHH!
The technologies and the approaches we use are
simply a means to an end, not the end in itself. Rather than saying "we’re
Agile", or "we’re Web 2.0", wouldn’t it make more sense to brand yourself by
saying "we deliver great products, and we do it in a way that is most
effective"? While it is nice to have focused expertise, it is dangerous to
pigeonhole yourself – be appropriately flexible.
Me, I’m content to watch this wild parade pass
by – I’m sure there will be plenty of new floats on the way to keep me
entertained. - JB [top]
It has been variously argued that the notion of
Quality Circles has been around for perhaps half a century, and that Kaoru
Ishikawa, he of the Fishbone or Cause and Effect Diagram fame, is known as the
‘Father of the Quality Circle Movement’. Common in manufacturing environments
and ISO-based quality initiatives, Quality Circles bring a small group of people
together voluntarily to solve their work related problems or improve their work
environment. Handled appropriately, the shared participation fosters teamwork,
cooperation and more broadly effective solutions.
All good stuff, to be sure, but it is safe to
say that solutions through peer collaboration are a bit more than a 50 year old
concept.
For hundreds of years, North American
Aboriginals have been managing affairs through the use of circles of various
kinds, such as healing circles as a means of supportive improvement and recovery
and sentencing circles to develop consensus on fair and reasonable consequences
to crimes. A little research shows that these long-standing practices have a
number of strengths that would make them valuable to adopt as a means of
managing change in software organizations.
One of the key elements of these circles is
that everyone is involved in the decision, and the party to be changed (either
healed or sentenced in the circles above) requests to participate in the circle
process – it is not something that is mandated down. When participating within
the circle, an environment is provided where it is safe to speak your mind
without recrimination – openness and honesty are critical for success. All
participants are empowered in the process, as they all have a voice and a shared
responsibility in finding constructive resolutions for change.
Beyond the strengths of circles to address
immediate problems, the shared decision-making process helps build a sense of
community and capacity for resolving conflict, and it promotes these community
values.
Indeed, it appears that sentencing circles
include healing circles for the victim and offender, as well as follow-up
circles to monitor the progress of the offender, providing what appears to be a
much more comprehensive solution that the systems we are accustomed to, and can
be effective at addressing the underlying causes of criminal behaviour, rather
than just punishing that behaviour or simply masking the symptoms.
Many changes in software development would
benefit from a similar holistic approach for change. In the small, as we address
changes to the software product through Change Review Boards, broad
participation is critical to ensure that impact is appropriately analyzed and
disseminated, and significant changes can be effectively fostered through to the
rest of the team. Maintaining an environment where any change can be voluntarily
brought to the Board in a proactive basis will tend to reduce the need for the
more severe form of ‘sentencing and recrimination’ that would be used to address
situations where the build is broken and needs repair.
For more significant changes (to the product or
the process), broad participation will promote buy-in across the team and
dramatically improve the quality of the ideas that contribute to the change
process. Collaboration and shared awareness improves the sense of community,
which can only serve to improve or sustain team dynamics over time.
Whether you follow the lead of the Quality
Movement or acknowledge that the principles of collaborative problem solving
have much deeper roots, there is great value in leveraging the practices of
circles within your teams. - JB [top]
In almost any sport, the first things a pro
will talk to you about when you take lessons are about body position, focus, and
the notion of strong and consistent follow-through. It’s a fundamental skill.
While you can still play the game without a strong follow-through, you will
never become world class – never. The pros and the better amateurs drill on the
follow-through until it is second nature. In some sports such as archery and
golf, many pros believe they can leverage the follow-through to continue to
influence the trajectory after the arrow has been released or contact has been
made with the ball – they aren’t done until the target has been hit.
In martial arts, we are taught to kick or punch
through the target, not to simply meet the target. From the physics perspective,
striving to simply meet the target drastically reduces the momentum and
effectiveness of the punch. Without follow-through, we’re more likely to bruise
our knuckles than impact the brick, but with proper focus beyond the immediate
target we pass right through that target as though it wasn’t there – the first
time you do it, it is surprisingly effective and painless.
Follow-through allows us to think beyond the
immediate target and recognize the extended impact of our actions. When we think
about the follow-through, that range of possibilities concerning what ‘done’
means quickly narrows, and we drastically reduce the likelihood that there will
be a difference in expectations, and a corresponding disappointment with the
results. We gain a deeper understanding of the breadth of impact of our
practices, a wider appreciation for the true lifecycle of the influence and
interdependence of our actions.
It’s like putting a new roll of toilet paper on
when you’ve used the last piece. It’s like starting a fresh pot of coffee in the
office when you’ve taken the last cup. It’s about managing the expectations
beyond the context of ourselves.
We’re not really done requirements when the
document is saved; we’re not done the project when the product is installed at
the client site.
We don’t go through an analysis phase to simply
produce a requirements specification; we capture the information needed for us
to successfully complete the remainder of the project. We are developing the
information that drives the schedule, the design and development effort, the
validation effort, and we need to ensure that we have adequately addressed these
goals. Having produced the document is merely making contact with the target,
and all too often, that target is only superficially impacted.
We don’t produce code so that it compiles, we
produce code so it solves a problem – it’s not about unit test, though that is a
strong part of it. It’s not even about integration test, but that’s part of it,
too. It’s about ensuring that the end user’s experience is complete and
satisfying. It is the follow-through that we must focus on to ensure that we
have accomplished our goal.
Spend the next day thinking about your
follow-through in everything you do. It’s a safe bet that you will find a number
of situations where you can complete the activity with simple things that will
drastically affect the overall quality of the outcome. It can be as simple as
saying ‘please’ and ‘thank you’ and ‘you’re welcome’ – and meaning it.
Don’t swing to simply make contact with the
ball. Swing for the fence. Ensure your actions have the strongest impact
possible.
Follow-through. - JB [top]
Even without going to the dietary extremes
taken on in the documentary Super Size Me, we can certainly tell when we’ve had
too much to eat, when we are hungry, or when we have eaten something that
doesn’t agree with us. Despite my acknowledged cravings for sweets, I know that
I’m not going to be happy after the fact if I indulge in something that’s not
good for me. It’s not too different in software development, where the adage of
‘garbage in, garbage out’ is an unfortunate fact of life that few of us heed.
It would be too easy to beat the dietary
metaphor to death, but the bottom line is that as a system that produces
software, a software team needs to be efficient and effective. We need to
recognize the quality of our downstream artifacts are going to be directly
proportional to the quality of their predecessors. It is interesting to note
that while most software teams obsess over their source code and a growing
number of teams show interest and concern over quality design artifacts, still
relatively few groups respect the value of the specification of their products
(and the ongoing management of that specification). We are creating an
environment where we will be lethargic and sloppy in producing the very thing we
care about the most – our source code.
Here’s a quick litmus test for you.
Considering the overall lifecycle of products
that are produced for your projects – the specification, the design, the source,
the test artifacts – your order may vary given your chosen lifecycle, of course.
To what degree do you manage these products from the following perspectives?
- There is planned time in the schedule to
develop the products
- There is some form of peer review of the
products, and validation that these products are adequate before advancing
- These artifacts are retained under a
configuration management system
- These artifacts are baselined and controlled
for change, ensuring that there is a system in place so everyone knows they
have access to the latest version
- There is traceability (for completeness and
consistency) between these products and the other products up and down the
chain.
If you do all of these well for all the
components of a project, it is a pretty safe bet that you are in good project
health. If you aren’t doing some of these, or not doing them as thoroughly or
consistently as you know you should, there is a good chance that these
deficiencies involve the earlier stage products, such as your specs. If you
weren’t even aware that you should be developing and managing all these
products, then it is likely that software development isn’t nearly as fun as it
could be. Some projects forge ahead with nothing more than a quick list of
features and rarely meet expectations, some companies don’t explicitly design
their products and suffer as the product evolves – both self-inflicted maladies.
Skimping on the early stage artifacts for a
project essentially means that you are missing major portions of your diet.
While you may feel you can make do without them, you will almost certainly
suffer from a lack of efficiency, and there is a good chance that your results
will be disappointing. Jumping straight to the dessert can seem appealing, but
it is certainly not a sustainable approach - the guilty pleasure of something
that tastes great but we know isn’t the best for us in the long run can be quite
compelling and addictive.
How’s your software diet? Do you plan your
meals or try to scarf down some techno-fast-food and skip your fruits and
vegetables, only to suffer from ongoing bouts of indigestion? Would your
development practices resemble a planned, balanced diet of healthy foods, or a
mad scramble of Big Macs, pop, and a resulting expanding waistline? - JB [top]
It can be an interesting exercise to walk a
group through a distillation of the key elements of effective projects. Most of
the time, these elements consist of suggestions that the project team enjoys the
experience, that reasonable planning takes place, and that communication is open
and forthright. It is quite rare for a group to suggest that a key element for
project success is strong adoption of technology. Perhaps the reason for this is
that as we focus on bringing technology into our teams we lose sight of the real
reasons for doing so.
Now, before labeling me a Luddite, let’s make
it clear that I think technology can indeed be a good thing, but balance is
required. If most groups tend to agree that clear communication is a must for
successful teams, then this becomes one of the primary criteria for determining
whether technology is a valuable thing to add. We need to remember that we’re
best served not by simply adding technology to a project, but by carefully
leveraging technology to improve our likelihood of success. Many tools can
provide semantic and syntactic checks to eliminate one class of issues, for
example, but they are certainly no replacement for good old gray matter.
Technology for its own sake rarely works, and
most apparent advances will require some shaking out (and careful fostering by
the early adopters) before they are effective for the masses. Remember the hype
surrounding automatically generated code from the object models we produce in
the design phase? While successful for a few disciplined teams that thoroughly
understand their design and are comfortable living in that space, it requires
vigilance to work within the design even when the product is being integrated.
Despite the promise of CASE that has been around for 20 years, the full benefits
will never hit the mainstream until the general population is as comfortable in
the design space as they are in the implementation space. As it stands, many
teams still don’t even explicitly emphasize design in their products.
While standing up in front of a group could be
a prime opportunity for communication, technology has bogged us down here as
well. A standard expectation from conferences these days is that the speakers
provide their PowerPoint deck well in advance so that copies can be made for
their participants, and more often than not, presenters lean on this deck as
their sole source of information, many simply paraphrasing (or worse, reading)
the text up on the big screen. I’ve been caught in this trap as well - a slide
deck can be an addictive way of getting a presentation done rather than as a
tool for effective communications. It can be interesting to stand up in front of
a group without a presentation deck – walking without a safety net will force
you to actually work to connect with your audience, and it will often be a
refreshing experience for all.
Polished reports and clean drawings can easily
provide the façade of professionalism and defendability. As computer usage grew
in the home, it was the students that used technology that had a clear advantage
with their projects – regardless of the content. We can easily get so caught up
in the details of how a diagram looks or formatting issues that we can miss
glaring holes in the information that we are actually presenting. While we
originally had whole departments whose responsibility was to gather all the
information in document form, that responsibility now lies with us – the ones
that used to be responsible for the content only. With little consistent
training in the presentation side, document formatting or even word processing,
this polish side of the equation often consumes far too much of our focus.
The document has been the preferred solution to
capturing and disseminating information for quite some time, but with the
evolution of technology, perhaps the traditional document is too large-grain for
our communication needs. Hypertext and collaboration spaces such as Groove and
Share Point allow us to capture, disseminate and change manage more, smaller
discrete items, which can foster improved communication and clarity.
Unfortunately, most of the time we continue to focus on the document as a large
entity that we must build, rather than working to ensure we build a shared
understanding through a collection of discrete (but interconnected) ideas. Share
Point can be far more effective than simply an online folder of documents, as
most implementations seem to be.
These days, as we try to summarize more and
more information into digestible summaries (especially as we push the
information higher up the management chain) it becomes too easy to focus on form
rather than function. This summarization can bring the important information to
light, or can be used to obfuscate what is really happening – just ask any
‘victim’ of a dysfunctional management dashboard.
If we were to look at the quality attributes of
the solution space for the communication problem we are trying to solve, we
might perceive technology in an entirely different light, and the value that we
gain from leveraging technology can come from unanticipated directions. We can
improve clarity by using more, smaller pieces of information rather than
building up huge, indigestible documents. We can focus on ensuring that key
points are commonly understood through the use of feedback, which requires
listening from both sides. We can leverage tools to facilitate common
understanding, to automate the mundane tasks, but we must continue to ensure
that we focus on getting our points across.
Be careful when trying to solve a problem with
a technology solution – you may be muddying the waters rather than clarifying
them. - JB [top]
The essence of consistency in a team
environment is to ensure that everyone knows what the important things to do
are, and to make sure they get done.
The standard operating procedure for driving
your car usually does not include a thorough walk around and check of all
essential features before getting in and heading down to the corner store – we
simply hop in and head out. Technology has evolved to the point where cars are
quite reliable, and the root cause of the vast majority of problems we have on
the road is driver error. Take the same car in for service, though, or look
through the owner’s manual and you will find a checklist of maintenance items,
the things that should be done against a prescribed schedule to ensure that
mechanical problems we don’t worry about on the road remain unlikely.
For aircraft, even though technology is at
least as reliable as in cars, the magnitude of the consequences associated with
a mechanical failure at altitude is generally much more severe. Despite
maintenance schedules being more rigorously adhered to, all pilots, both
commercial pilots and the private pilots I have flown with, go through a
rigorous checklist and walk around before taking off. It would be foolhardy not
to.
There are all kinds of situations where there
are a list of things you need to remember to do, whether they are one-off
situations like a grocery list, or repetitive situations such as flying a plane
or ongoing automobile maintenance. Checklists are effective, concise memory
joggers to help ensure that nothing falls off the plate.
In software development, there are many
situations that lend themselves wonderfully to the use of checklists. Whether it
is a list of items that need to be considered when initiating a project, design
paradigms to be aware of, elements to watch out for when coding (or reviewing
code), test cases to consider, or steps required to build or release the
software, a checklist keeps the key information all in one place. When used as a
supplement to a more comprehensive form of sharing understanding such as
policies and procedures, checklists carry the essence that can be tacked on the
wall and referred to repeatedly, and can also be maintained tactically to remain
relevant.
Unfortunately, all these efforts of capturing
and disseminating what is to be done are for naught if there is a risk that the
tasks are going to be neglected anyways.
Watch closely before you take your next
commercial flight, and you will find there are a number of signatures that are
made. Up in the cockpit the pilot and co-pilot are signing off their pre-flight
checklist, and the last thing the flight crew does before the door is closed is
to sign off the manifest of the passengers that are aboard, then they go through
their cross-checks and other pre-flight checks. Even most public washrooms will
have a piece of paper by the door, initialed by the attendant that was in there
to keep the place clean. The act of putting your name to a piece of paper
attesting that you have done things can be quite compelling.
With software, though, we rarely see this.
Document signoff has often become an administrative activity, and many
organizations (even those with fairly weighty defined processes) have very
little accountability associated with activities such as checking in code or
even releasing software. While CM systems can be used to forensically identify
the check-in culprit, few organizations have mechanisms in place to enforce a
‘standard’ list of pre-check-in activities such as peer review and unit and
regression testing. This is interesting, as the ramifications of failing to
follow the right steps in software development can often be closer to the
results of an in-flight failure than to an empty toilet paper roll. The cost of
putting simple accountability in place is far less than the cost of relaxed or
uneven enforcement. An ounce of prevention.
If you can distill the intent of most
comprehensive approaches for software development, especially those that are
regulatory-based such as ISO and FDA, it is all about stating what you are going
to do and showing that you have done it. Policies and procedures and templates
can serve to support the letter of the defined approach, and can keep most
auditors at bay as well. When you really get down to it, though, checklists and
signatures can go a long way towards documenting and verifying that the intent
has been properly achieved. - JB [top]
Getting a great product out the door requires a
great deal of initial activity to ensure that the right product will be built.
There has to be a solid understanding of the market need to be addressed, which
has to be thoroughly analyzed and specified to the point where the development
team can go forth and build the desired solution. To deliver in a timely
fashion, that specification needs to be the basis of a credible schedule,
progress needs to be closely monitored and changes need to be managed through to
project completion.
Before the product can go out the door, though,
you need to validate that the product will truly meet the end user’s needs –
that the product has been built right. Some companies will take it as a given
that whatever they will build will satisfy the end user’s needs, and they are
often surprised by the feedback they get from the market (which is sometimes no
feedback at all, because the customer is off looking for someone else that will
better resolve their problems). Others will exhaustively test against the
specification to ensure that what was built is what was expected to be built –
they generally will receive fewer surprises from the field related to features
that don’t work properly, but they are still susceptible to omissions and errors
related to addressing the original market need.
An important aspect of exercising the product
that these companies have missed is the practice of ensuring that the delivered
product actually meets the high level needs of the end user. In an ideal world,
if project artifacts are derived from their predecessors properly, this would be
a no brainer – the need maps to the specification, which maps through the design
to the implementation. But in real life, there are just too many translations
and implicit assumptions along the way. Has the spec actually been validated
thoroughly against the needs or simply signed off based on its thickness or
because the reviewer had far more pressing issues to worry about? Has the
product evolved from a solid spec that addresses client needs, or has it been
driven primarily by schedule pressures or the latest interesting technology
choices?
There are plenty of side roads the building of
a product can take, any of which can distract us from actually addressing the
end user’s needs, so the final validation of the product before release must
explicitly addresses this concern. While it is good and important to ensure that
the product has been implemented as specified, it is critical to step back to
the original problem and identify – in a quantified form if possible – whether
or not the product solves the problem. If the intent was to optimize workflow in
some manner, does the product measurably reduce time, improve accuracy or
facilitate deeper insights? If the intent was to improve the user experience,
can we unambiguously state that we have a more enjoyable product, or that it is
more compelling to use?
There are two key ways of making this happen.
The first, something that any organization could do, is to initially specify
quantified goals for the system to meet that will determine whether the end
user’s needs would be met. Identify tests that are constructed to validate
whether the initial needs are indeed met, and use these tests to supplement the
standard suite derived from the functional requirements and use cases.
The second approach is to ensure that the
people performing the final checks on the product can accurately and reasonably
act as an advocate for the end user. In many organizations, the product champion
is leveraged initially to gather the voice of the customer in the analysis
phase, but should also be used at the end of the day to ensure the user’s needs
are met. I think a big part of what makes the titles from Electronic Arts
successful is the fact that everyone in their testing teams, indeed most people
in their development teams as well, are avid gamers themselves. They epitomize
the best in end-user advocacy - they know what will work well in the market
because they are actually part of the market themselves.
Do everything in your power to ensure that you
know you have addressed the end user’s needs before the product goes out the
door. - JB [top]
When putting together a practical collection of
measures to track your project, product or process, it is important to recognize
that you need a balance of short-term tactical measures as well as long-term
strategic measures to gain a complete picture. While it is valuable to know
whether you are going to make this week’s deliveries as promised, it is equally
important to be sure the project is not headed for the proverbial cliff as well.
Start with some short-term measures first –
they will generally be more localized, easier to measure, and provide the quick
feedback that will make it easier to start and sustain a measurement program.
You might find value in knowing the likelihood of completing your currently
assigned tasks on time (or by how much you expect to blow out your initial
estimates), or how the collection of these tasks roll up to determine whether
the project will be completed on time.
Strategically, the change in tactical measures
over time will reveal trends that can provide a different level of insight. Are
we improving in our ability to estimate? Is the number of open defects
diminishing as we approach our proposed delivery date? Do we see the definition
of scope stabilizing over the life of the project?
Many strategic measures are derived from the
change in tactical measures over time, implying the need to carry these measures
forward in some sort of repository. Often this infrastructure is built into
requirements management or issue tracking tools, but spreadsheets with pivot
tables or simple databases will do in a pinch for tracking trends in measures
such as estimates versus actuals. Remember to avoid going overboard with the
tool support, focus on getting value out of the numbers themselves.
Spanning multiple projects, we can gather
information about the effectiveness of the business as a whole. How much
variability do we have in our project success? Can we correlate this variability
with specific causes, such as new vs. maintenance projects, degree of technology
innovation or – yipes - differences in who is running the project (which is more
often a concern that the PM’s are missing adequate leadership, rather than some
PM’s being worse than others)?
For any metrics program, it is important to
take a disciplined approach to identifying what to measure, rather than simply
measuring what is readily available or searching for numbers that justify your
cause. In any case, no single measure is sufficient for a complete understanding
of where you stand with your current approach – be sure that you know enough
about the tactical and strategic issues to be able to make informed decisions. - JB
[top]
Whether you are battling for a horizontal
market with a dozen others or have captured a 100% of a vertical market, there
is always room for improving your development team’s effectiveness. In fact, for
some small organizations with a strong market position, it is quite possible to
have an inefficient development organization and still maintain your revenue
streams. How is this so? The quick answer is that there is no substitute for
being the only product that solves a customer need. Still, whether it is known
or not, this inefficiency manifests itself in reduced productivity.
For those unconsciously-incompetent
organizations that are oblivious to their inefficiencies, their only hope is
that competition will force them to violently extract their heads from the sand
and examine the world around them. In the absence of this, they will continue
dysfunctionally, their lack of pain keeping them oblivious to their
opportunities.
To use the metaphor of fitness, these companies
are unhealthy, while they could be working towards being healthy or fit. In
cases like those above, they aren’t even aware that they are unhealthy or, more
worrisome, sick. Healthy software teams are characterized by the existence of at
least 10 key practices. These practices contain the appropriate amount of
discipline in the following areas:
- Issue/bug/requirements change management,
- Source code and document control,
- Requirements specification,
- Pragmatic estimation
- Appropriate life cycle and project planning,
- Repeatable and frequent builds,
- Peer reviews and open sharing of work
artifacts,
- Explicit allocating of dedicated testing
resources,
- Existence of test plans and cases, and
- Project retrospectives.
Fit organizations also get excited about
measurement, causal analysis, closed-loop improvements, requirements
traceability, data collection and more.
Prior to investing, venture capitalists look
for the integration of these known good practices into the everyday development
project life cycle to significantly reduce corporate risk. Successful software
development leaders educate teams on these key healthy practices and implement
strategies for optimal adoption. Building this critical mass of knowledge will
ease the burden of implementing change in established teams. You want to avoid,
as insightful author Gerald Weinberg calls it, the 'Pickle Principle' where
"cucumbers get more pickled than the brine gets cucumber-ed!"
How do you beat the "if it ain’t broke - don’t
fix it" syndrome when you don’t know the definition of 'broke'? The quick answer
is education - its pursuit and fostering. You also may want to consider getting
a health check-up from the equivalent of your general practitioner, someone who
will give you an objective assessment of where you stand or, in the case of
many, where you painlessly lay. - GF [top]
Quite often, as we decide it is time to get our
developmental ducks in a row, we find a need to coordinate a collection of
material that will form the basis of documentation – both for our declared
process, and for the products that this process is intended to produce. A quick
search will generate a huge number of candidate packages to use as a basis:
standards-based packages from industry associations such as the IEEE, loose
smatterings of random offerings provided from community-based websites,
individual elements from locations hither and yon throughout the internet, and
comprehensive packages from many vendors.
There are pros and cons with each of these
approaches to building a quality library, here are some of the questions that
should be swirling around in your head as you imagine what the fine print should
look like for any of these approaches.
Who’s behind this stuff? While some of the
brightest minds in the field are contributing to the knowledge base overall,
there is no minimum standard for self-promotion of templates. Individual
templates or checklists may have some unique insights, but take nothing as
guaranteed and use good judgment as you apply any information you find. Just
because it comes from the internet, even from a well revered website, that is no
guarantee it is appropriate information for your needs.
Will this fit our culture? Just as with any
tool such as a bug-tracking system or project management software, packaged
methodologies come as part (or all) of an assumed process, which may be agile
and efficient or large and cumbersome. It should be relatively close to what you
are doing now and for the most part support your current good practices (yes,
every organization I’ve seen has at least some good practices that are worth
focusing on and sustaining). Most established organizations don’t take kindly to
major changes, and most new groups will likely have plenty of opinions about
what the right approach should be. An external solution can serve to objectively
mediate these different opinions, but in most cultures there will still be
challenges to overcome.
What’s the real motive? Is the source of this
packaged methodology really trying to improve your effectiveness while
collecting a reasonable remuneration, or are they trying to lock you into their
approach, their tools, their consulting. Is the methodology technology-centric
(whether focused on a particular tool suite or not), quality-centric (focused on
the definition and production of a well understood product), or team-centric
(focused on maximizing the collaborative effectiveness of the group)? Do these
motives align with yours?
How do the pieces fit together? In many
approaches such as Extreme Programming, the overall methodology has been defined
and evolved over time to work well as a complete system, where the pieces
complement each other for reinforcement. Constant refactoring without a
test-first approach, team ownership and coding standards is a recipe for
disaster – and XP is one of the more concise ones around. Most comprehensive
packages will eventually be tuned to fit together as a system, though there may
be gaps and overlaps in version 1.0. If you mix and match, this should be one of
your greatest concerns.
How easy is the fit? The broad, all
encompassing methodologies usually started from what worked on a large project,
then grew over time to be more generally applicable across the industry, to a
point where they cover all the bases but need to be dramatically tailored down
to be reasonably useful for even large projects. Is there any guidance on how to
make it practical for your needs, and how much will that guidance cost? Remember
that for the best fit, the methodology needs to be tailored down for the
organization, then tuned specifically for each project’s needs. The more
comprehensive the starting point, the more tailoring required.
What are the lifecycle costs? If you are buying
a product, how are the licenses structured, are there maintenance fees (which
would appear rather strange as there shouldn’t be a great deal of bugs or
feature churn in a defined methodology – for the most part, the wheel has
already been invented), and what will it cost to have someone come in and
explain or help tailor this beast? On the other end of the spectrum, will you
even be able to find the source of information for clarification if necessary?
Can we do it ourselves? There are plenty of
reasons for tackling the challenges of creating a defined methodology yourself,
with only light reliance on a packaged methodology:
- First and foremost, a
methodology defined as a team for the needs of the team will be embraced by
the team. Participation breeds ownership and acceptance, and you can’t buy
that in a box anywhere.
- It is best to start small.
Any wholesale change in approach will cause far greater culture shock than
benefit for the group. The combined learning curves of many individual
practices that comprise an overall methodology will be a major setback, one
that some companies that I have worked with never did manage to recover from.
Evolution as a gradual process has shown to work over millions of years.
- Grow organically.
Methodology components such as coding or design standards, or review
checklists are best grown based on the internal findings of the group. Find a
problem once, fix it. Find it twice, identify how it should be remedied in a
standard fashion and broadcast the news in a standard or checklist. They will
become personal expressions of your best practices, rather than a generic set
that will rarely apply to your situation.
- Play the field. Rather
than locking into one source, learn from all that are available. Nobody has
cornered the market on appropriate approaches for all software projects, and
no one ever will. Take what works from wherever you can, and don’t be afraid
to mix and match if you have considered the ramifications (remember the notion
of a cohesive system above). Remember the bottom line is improved
predictability and effectiveness for your projects, not adherence to someone
else’s assumed approach. Best-practices are only situationally applicable.
For all of the reasons above, my leaning would
be to take an internal approach to building up a defined methodology, at most
using a broader overall methodology as a basis of defining the direction you are
taking. Don’t take the sales pitch at face value, as with anything you need to
understand what you are getting yourself into. Consider what the fine print
would look like if it was available. - JB [top]
The movie “Touching the Void” tells of two British alpine
climbers Simon Yates and Joe Simpson who deal miraculously with a seemingly
impossible set of life-threatening challenges while climbing and descending the
Peruvian Andes mountain
of Siula Grande. Without giving away too much of the plot, one of the climbers
shatters his leg while descending at the 20,000 foot level and falls hundreds of
feet into a crevice. The story chronicles the amazing journey of Joe Simpson as
he deals with overwhelming adversity and finds a way to get home amidst
devastating obstacles.
There is a key moment in the movie when Simpson accepts that
the big picture is just too much to digest and that dwelling on the immensity of
it all is not a productive exercise. Progress for Simpson is picking a location
50 feet away and setting a goal to reach that goal in 20 minutes. As
insignificant this may seem, remember Simpson is doing this on one-leg, without
food and water, -40 temperatures, and navigating glaciered ice and rocks. Step
by step and stumble by painful stumble, progress is made towards his impossible
goal.
Developing software and, in particular, improving and
changing the way teams develop software has a hint of this kind of challenge
inherent in it. The exception is that, unlike Joe Simpson, teams tend to focus
on the formidable view rather than on the 20 minute view. Huddling in fetal
position in the crevice and freezing to death appears to be the chosen approach
for many. We hear recurring mantras such as "we’ll never ship software with no
known defects." or "we’ll never get enough testing resources" or "this
organization will never change". For the many wishing to make improvements but
feel overwhelmed, take some tiny steps – take one step or one stumble – but do
move forward and leave the moaning masses.
Here are some things you can do:
- Bring awareness through
measuring 2 or 3 aspects of development. Sometimes it just takes a comment
like "gee, I never looked at it that way – thanks." to get change happening. A
couple of measures we see on a regular basis are the Weekly Rates of Incoming
Defects and Repair Rates of Defects. Another measure is the Percent of Total
Test Cases executed, or Percent of Project Effort Allocated to Testing.
- Post the measures where
people can view, debate, and generate ideas for potential solutions.
- Collect numbers on errors
found during requirements, design, code or test review.
- Start sending emails
recommending books, magazines, websites, articles – any insights and ideas
from others.
- Start a Lunch-and-Learn session
on a weekly basis and get developers to share favourite code snippets,
personal tools, books read, or videos. Anything that gets the team sharing
together will bring benefit to the project. And finally,
- Pass on the URL to the
Clarrus Compendia – it’s a goldmine of challenging topics for your
Lunch-and-Learns. There are so many, many more steps that can be taken with a
minimal amount of effort. It is also irrational to believe that there is no
wasted time in your development process and that improvement is not possible.
In the midst of crushing schedule pressures, massive
disillusionment from poor management decisions, insufficient resources and
challenging customers, you must find a way to make progress towards your goals.
Whether you’re eating an elephant one bite at a time, descending from Siula
Grande on one leg, or trying to reduce the number of delivered product defects,
there is something small you can do – now! - GF [top]
Have you ever run into the situation where, 6
months or a year after you’ve made a decision, you find yourself back in a
similar situation, or even worse, in a real pickle because of the decision you
had made? For the life of you it is impossible to remember what you were
thinking in the first place. Been there, done that - if only I knew then what I
know now. Hmmm…what did I know then, anyways? It seems like a lifetime
ago...
Configuration management principles help the
project out in many ways. Most of us recognize CM as a tool that helps us
recover that file that mysteriously went missing, or back out of an
implementation path that is even uglier than the one we hoped to fix. Living in
the here and now, capturing and maintaining our information under CM gives us
the confidence to move forward, knowing we have the safety net if we take a
wrong step. It helps coordinate the team, and if used well, helps avoid the
deadly integration stages that you may never dig yourself out of.
We have also come to depend on CM to give us
assurance that we can pull together precisely what is needed to build the system
– all the stuff we need, and nothing extra. Done right, we know precisely which
versions of each file holds together to form a cohesive set. We can reproduce
any set of information we have released without having to maintain a plethora of
different versions. In some shops, CM has become a crutch that has allowed us to
be very sloppy with our releases (…what’s one more branch?...), but that’s
fodder for another article.
In many companies I have worked with, there is
one capability in CM systems that is rarely used well – the capability of
capturing the rationale behind any changes that are made to the system. Any CM
tool worth its salt will allow you identify the reason for change – indeed, I
don’t know of any commercial tools that don’t support this. Whether it is
freeform text or a reference to a change request number, this audit trail is
critical for the strategic evolution of the system. At any point in time, you
should be able to go back to any change that has taken place and understand who
made the change, why the change was made, and how it was made.
If you find that as you check in files you just
click past that troublesome dialog box that pops up asking for a comment, you
are performing a severe disservice to yourself and to the project. There are
very few of us that can recall our rationale for all our actions even a week
after the fact, let alone 6 months or more, and it is impossible for others to
decipher the rationale from empty comment fields. Without the knowledge of why
changes were made, you are left at best to relearn the rationale, or at worst to
misinterpret the rationale and inject more problems into the system.
Once you have your project baselined, you have
set up a commitment and expectations with all the stakeholders. Capture this
baseline under a solid configuration, and manage change appropriately from that
point on and your commitment will be preserved. Use your CM system to preserve
the changes and the rationale behind those changes, and you have a built-in
long-term memory for the myriad decisions that are made on any project. It is
far easier to retrace your steps with a solid audit trail than to use forensics
to try to reconstruct it after the fact. - JB [top]
Software development groups often have a very
twisted perspective of what quality means. There will be a QA group that beats
up on the product after it has been thrown over the wall from the development
team. These testers will poke at it from all sides and pass back their issues,
whereupon the developers will argue from the position of "well, we wrote the
stuff, so we certainly should know how it is supposed to work!" This internal
bickering continues until:
- The project times out and
the product is shipped anyways, or
- The QA group stops looking
for bugs, so with ‘no new bugs’, the product can be shipped, or
- Someone in senior
management repeatedly diverts the efforts to another direction, and few
products ever get shipped.
I’ve seen all of these in action in the real
world - usually it is not a pretty sight.
Generally in software, there is the notion that
“quality is what other people are responsible for” on a project. We will put new
hires into the QA/Test group so that they can familiarize themselves with the
product in a place where they can’t do much harm (or much help, for that
matter). The prima-donnas get the cushy design and architecting gigs (and all
too often the relaxed standards of practice as well), those that don’t quite cut
it end up elsewhere. We will appoint a Quality Director that sits with the
management team only if we have to when quality standards are forced upon us
because we want to sell to Europe, or work in Defense, or build Medical Devices.
Then we’ll do our best to work around these pesky people that are trying to stop
us from shipping our product anyways. Our goal is to get the job done, right?
I don’t think so. The goal should be to get the
job right, because just ‘getting it done’ usually means you’ll be back at the
same task later when someone else finds that it doesn’t really work. If you are
lucky, it’s those newbie internal testers saving your bacon - the ones you have
put there so they ‘can’t do much harm’. If you’re not so lucky, it’s a
disgruntled customer – and don’t you dare try to lay the blame on the test team!
The process of developing a product, software
or otherwise, involves a chain of people each doing their part to contribute to
the whole, and the notion of quality should be on every person’s mind throughout
that chain. As humans we all make mistakes, but it is unfair, inefficient and
very risky to expect that the last person in the chain is responsible for all
the mistakes injected throughout the process. Incorrectly naming these victims
of our deeds the Quality Assurance group simply perpetuates the notion that it’s
their job to clean up the mess while you move on to other things (and hope they
don’t interrupt you with their trivial concerns).
Quality needs to be on everyone’s mind, at all
times – it’s something that should be bottled and pumped through software
development ventilation systems. We are all responsible for the quality of the
components we contribute to the overall product, and we should be explicitly
aware of what quality really means for our contribution. Quality Assurance isn’t
the people at the tail end that has little time to find these nasty problems – a
Quality Assurance team is best thought of as part facilitator, part mentor, part
support team, part objective auditor. Someone that is really doing Quality
Assurance is working to ensure that everyone else has the skills, knowledge and
resources to do a quality job.
No matter where you are in your company’s food
chain, if you think that quality is simply someone else’s responsibility, you
are totally missing the point. It is your job, wherever your role, to ensure
that your contribution does not degrade the overall system. Quality is your
responsibility. - JB [top]
Look at any car’s dashboard today, and you will
find the same set of core indicators. The primary element is always a
speedometer, followed by a less prominent fuel gauge and odometer, after which
the information tapers off quickly. There may be a temperature gauge or just a
couple of 'idiot lights', there might be a tachometer, there may be tire
pressure indicators, possibly a few others. While there is a trend these days to
increase the information available to the driver (not unlike the trend of adding
features to already bloated desktop applications), the important elements of a
dashboard really haven’t changed for years.
This consistency over time is, literally, no
accident. The driver’s primary goal behind the wheel is to safely navigate from
Point A to Point B, and aside from the feedback provided by the windows and
mirrors, the dashboard provides the information that allows the driver to reach
that destination. Am I moving at a reasonable speed, do I have enough fuel, is
the engine working within acceptable operating parameters? The rest is
secondary.
What’s meaningful to measure in a car is all a
matter of perspective. Take that same car to the mechanic for a tune-up, and he
will only glance at the odometer to see whether it’s close to the time for a new
timing belt or other scheduled maintenance. The key indicators for the mechanic
today come from the on-board computer that provides detailed information about
the engine’s timing, fuel mixture, and a host of other measures that don’t even
make sense to most drivers.
What’s meaningful to measure in software
development is also a matter of perspective. As with a car, there are literally
thousands of things that could be measured on a software project, and it is
important to avoid the temptation to measure for the wrong reasons:
- We want to avoid simply
looking at the measures that are at our fingertips and easy to gather in order
to distill useful information ("our timesheets are telling us that we’re all
working 40 hour weeks…"),
- Avoid manipulating
information to tell us what we want to hear ("since we have stopped looking
for defects, our defect count has gone way down...").
Dashboards for software projects, both
commercial and home-grown applications, have been all the rage for the past few
years - with all manner of information displayed. Rather than providing the
useful information to appropriately drive the project, they often end up more
like those activity centers that we place in our children’s playpens – they can
serve to pacify senior management with all the charts and dials, but don’t do
much else. Selecting appropriate measures is not that straightforward.
One person’s meaningful measures can be useless
for someone else. A high Cyclomatic Complexity can raise alarms for an astute
developer, while a low Schedule Performance Index might do the same for a
project manager. Your perspective, consisting of the environment and culture you
are working in, your role in the project, and whether you are focused on
strategic or tactical issues will determine the goals you set. These in turn
will help you ask the questions of the project to identify whether or not you
are achieving these goals, and the questions will determine which are the most
meaningful measures to take.
The GQM (Goals/Questions/Metrics) approach for
building a metrics program, coined by Vic Basili, describes a disciplined
approach to identifying measures that will be meaningful for your context. Done
correctly, you will have a small handful of measures that make sense for you,
and help you make the right decisions on your project. You will have the right
dashboard to help you get to your destination with no accidents. - JB
[top]
Some of us live to work, others work to live.
Unfortunately, there are too many stuck in the former category that would prefer
to be in the latter. There is always pressure to find those nasty bugs that we
just can’t seem to put enough band-aids on, or to meet that looming deadline. Or
as Douglas Adams said, "I love deadlines. I love the whooshing sound they
make as they fly by."
There are individuals (and indeed entire
sectors) that relish the thought of putting in the long hours to get a seemingly
impossible project out the door on time. It can become a badge of honour, a
cultural norm that makes those that are interested in a different balance in
life to appear as misfits. From what I have seen and experienced, though, this
is not a sustainable approach. Individuals will eventually tire of the pace, and
organizations will face ongoing turnover challenges. Brute force doesn’t appear
to be the long-term answer to the quality question.
It is interesting to consider today, as the
Cassini spacecraft settles in between the rings of Saturn, how quality applied
appropriately in software development can make a significant difference.
Way back in the 6th issue of Fast Company,
there was an
article about the gang at t |