Agile bliki
AgileCertification, AgileHandover, AgileImposition, AgileManifestoMeeting, AgileVersusLean, AlphaGeek, AssertionFreeTesting, BigScreen, Buildix, C3, CannotMeasureProductivity, CodeAsDocumentation, CodeOwnership, CustomerAffinity, DatabaseAndBuildTime, EvolutionarySOA, FaultyTechniqueDichotomy, FeatureDevotion, FivePoundBag, FixedPrice, FixedScopeMirage, FunctionalStaffOrganization, HistoryOfIterativeDevelopment, ImprovementRavine, IncrementalMigration, IsAgileForAll, LargeAgileProjects, MeasuringProductivity, MetaphoricQuestioning, ObjectsAndIteration, ObservedRequirement, OnsiteCustomer, OpenSpace, PairProgrammingMisconceptions, PendingHead, PeopleOriented, PleasingTheCustomer, PreferDesignSkills, PreferFunctionalStaffOrganization, PrinciplesOfXP, RigorousAgile, RollerSkateImplementation, SchoolsOfSoftwareDevelopment, ScopeLimbering, ShiftingToCodeOwnership, ShuHaRi, SpecificationByExample, SpreadingIncrementalism, StandardStoryPoints, StickyTimeline, Swebok, TechnicalStaffOrganization, TestingLanguage, ThrownEstimate, VeryLowDefectProject, WhatIsFailure, XpVelocity, YesterdaysWeather
| ObservedRequirement |
agile |
16 September 2008 |
Reactions |
|
Here's one of my favorite software development quotes:
Requirements are the
things that you should discover before starting to build your
product. Discovering the requirements during construction, or worse,
when you client starts using your product, is so expensive and so
inefficient, that we will assume that no right-thinking person would
do it, and will not mention it again.
--Suzanne and James Robertson
It's the opening paragraph of the first edition of their book
"Mastering the Requirements Process". As regular readers might
guess, my liking isn't connected to agreement. I like this quote
because it sums up the waterfall value system to requirements
(indeed the word 'requirement' is inherently waterfallish). Agile methods violate this underlying assumption by intending to
discover the 'requirements' during construction and after
delivery. But even this cavalier disregard of the above sage advice is nothing
compared to what many leading web sites do these days. These sites explore
requirements by observing what the users do on their sites and using
that information to generate ideas for new features along the
following lines: - Look at what
people are trying to do with the site and provide easier ways for
them to do it.
- Look at where people are abandoning doing something, and look for
ways to fix whatever was frustrating them.
- Build a new feature and see if people use it.
- Build an experimental feature and make it available to a subset
of the user base. Not just can you see if they like it, you can also
assess how much load it puts on your servers.
To support this kind of analysis, you need to add user logging
behavior into the application and build some tools to analyze these
logs. Much logging appears for free in web applications, which I
suspect was major impetus for people starting to do this. But the
logging, and analysis, can go further as it's added to the application. I haven't found much advice out there on the web on how to do
this, and I don't hear much discussion about doing this in
practice. Like many things it requires a concentrated effort to
spend the time to build monitoring capability and then to use
it to probe how to improve the software. Furthermore it's a mighty
step away from how the traditional software process, even for
agile projects. But there is a huge potential here. Everyone knows how big the
difference is between what people say they want and what people
actually need and use. By watching what people actually do with your
application, you can find out what actually happens with the
software - which can give you much more direct information than
other sources. As a result I think more teams should consider
adding this approach to their toolkit.
|
| EvolutionarySOA |
agile |
12 September 2008 |
Reactions |
|
Can SOA be done with an agile approach?
I don't delve too much into the cluttered world of SOA
(ServiceOrientedAmbiguity), but I get this question often
enough (in some form or other) to be worth a pontification. When I first came across agile software development (in the form
of Extreme Programming) the most troubling aspect for me was its
approach to software design. Like many I'd become used to the notion
that software should be designed before it was programmed, while XP
seemed to encourage an almost wilful embracing of design
ignorance. In 2000 I was asked to give the closing keynote at the first Agile/XP
conference, and in order to gather my thoughts I ended up writing Is
Design Dead? - an essay that examined the fate of design in an agile
world. I'm still quite proud of that essay and I think it's well
worth reading today - but for this bliki entry I'll summarize. I
talked about two driving approaches to software design: planned and
evolutionary. Planned design works out the design of software in one
phase and builds (programs) it afterwards. In this case changing the
design is hard once you've begun construction. Evolutionary design
assumes regular change of the design even once you've done
significant programming. I concluded that the practices of XP
provided a disciplined approach to evolutionary design, thus making
it much more practical than people had realized. This change did not
remove software design (it is not dead) but did significantly change
how we think about design. The argument for planned design in an SOA context is that we are
building webs of interconnected, loosely coupled systems. In this
situation each system is making its services available as a
PublishedInterface to the whole enterprise. Published
interfaces are hard to change, therefore you need planned design to
get them right so you don't have to change them. Planned design is
also a reaction to the chaotic system interconnections that people
see in most organizations. This chaos is the result of poor design,
so the feeling is that better planned design will prevent this
happening in future. Evolutionary design is an essential aspect of agile methods. One
of the key foundations of agile methods is the
desire to handle, indeed welcome, change. Planned design assumes
change is hard, and thus tries to predict where it occurs. If
changes occur within the predicted boundaries then it's easy, but if
it falls outside those boundaries you're out of luck. Agile thinking
assumes unpredictable change is inevitable and tries to enable it in
a controlled way. So as I look at SOA, or any other design context, the fundamental
question I ask is "is change predictable?" Only if change is
predictable is a planned design approach valid. My sense is that if
predictability is hard within the context of a single application,
it's doubly hard across an enterprise. If we use planned design in a
unpredictable context we find that however good the plans are, they
will be undermined by the unpredictable changes, leading to the same
mess we are currently in. Usually, however, the mess is worse
because a there is significant sunk cost in a planned design, this
can easily reduce the business value that an SOA effort is intended
to produce, particularly if time-to-market is important. As a result I think we have to bite the bullet and figure out how
to do evolutionary design in this loosely connected context. After
all the whole of point of loose coupling is to make change
easier. At the center of this is thinking about contracts in terms
of change, with such ideas as Consumer
Driven Contracts. This direction leads to things like Jim Webber's notion of
Guerilla
SOA. This builds up SOA using small steps directed by producing
business value. Since producing business value is the whole point,
this offers a path to producing a much better return on
investment. It's certainly an approach our clients appreciate. Can evolutionary design scale to SOA sizes? In my view we have an
existence proof at a much larger scale than even a big SOA effort -
the web itself. The web is built on very loose coupling and lots of
unpredictable changes. It is, in many ways, a mess - but it's a mess
that works, delivering real value to lots of people every day.
|
| IncrementalMigration |
agile |
7 July 2008 |
Reactions |
|
Like any profession, software development has it's share of
oft-forgotten activities that are usually ignored but have a habit
of biting back at just the wrong moment. One of these is data migration. Most new software projects involve data that's lived somewhere
else and now needs to be moved into the new system once it's live. A
system replacement might have to move all the old data, new
functionality may lead to data being loaded from some other system. It's common to not take this task very seriously. After all, it's
just reading some data, munging it a bit, and loading into the new
system. Furthermore the code only ever has to be run once, so
there's no point making particularly fast or pretty. Once the
migration is done the code can be safely chucked away. And of course there's no need to worry about it till the end of
the project since you only want to run the migration just before the
new system goes live. I have a high opinion of my readers, if only for their taste in
software writing, so I'm sure I can see the wistful smiles. Data
migration often looks easy from the safety of whiteboard abstractions, but is
usually full of nasty details to trip you up. - You may suspect that
the existing data is somewhat messy, but everyone is usually taken
aback at how dirty the data really is. As a result the whole
exercise is often far more complicated than it ought to be.
- Because it's single use, throw-away code people don't tend to put
much design effort into migration code since they assume it's below
the DesignPayoffLine. That assumption is often
wrong, especially with the previous bullet point.
- Doing an activity that balloons into something harder than you
think is never fun, but when you leave it till close to the ship
date you're offering trouble a big signing bonus.
There's a soundbite I like to use in an agile context: if it
hurts do it more often. Its surface illogicality makes it
memorable, and there's a real truth in there. Many difficult
activities can be made much more straightforward by doing them more
frequently. XPers are particularly well known for applying this
principle to testing, integration, design, and planning - so it
shouldn't surprise anyone to see it applied to data migration. I first saw this done by my colleague Josh Mackenzie on a
moderately sized project (dozen developers for one year) with two
failed attempts in its recent past. He decided he would migrate data with
every two-week iteration. Each iteration the team figured out what
data they needed to add to support the new functionality that was
being built and updated the data migration system to migrate that
extra data from the live system. As is often the case with these things it ended up being much
less impossible than people feared and the resulting reduction of risk
and stress made it a worthwhile choice. They appreciated the obvious
benefits, which boiled down to a distinct lack of hasty panic close to
going live. The most interesting benefit, however, was the one they didn't
expect. Incremental migration made a significant improvement in
communication with the domain experts. Usually when you want to talk
about use cases with domain experts, you make up some pretend
scenario. By using incremental data migration the team got into the
habit of using real examples, which were much easier for the domain
experts to relate to. Furthermore when the development made builds
available for the domain experts to look at, it included a copy of
the live data. As a result the domain experts could investigate how
the new system worked with tricky cases they had run into
recently. Particularly juicy predicaments could easily be copied
over into the test environment. Even without the improved communication it's worth the effort
to do incremental migration. If you do, be prepared to take
advantage of the opportunity to use real data to talk to domain
experts.
|
| AgileVersusLean |
agile |
26 June 2008 |
Reactions |
|
I'm thinking of using agile software development - but
should I use Lean software development instead?
This question is one I've run into a few times recently. It's not
a question I can answer quickly as the question is based on a false
premise about the relationship between lean and agile. So first I
need to go into some history to help explain that relationship. "Lean" fundamentally refers an approach in the manufacturing
world that was originally developed by Toyota in the 1950's. At this
time Japanese industry was recovering from the ravages of the second
world war. This approach, often called the Toyota Production System
is mostly credited to Taiichi Ohno,
although he was influenced by various western thinkers -
particularly Deming. The
Toyota Production System became well known in the rest of the world
in the 1990's when westerners started writing books to explain why
the Japanese were beating the US at so many industries. The western
writers called this approach Lean Manufacturing. Although Japanese
industry in general has run into stickier times since then, Toyota
continues to outperform most western auto companies. Agile software development is an umbrella term for several
software development methods (including Extreme Programming and
Scrum) that were developed in the 1990s. These methods share a
common philosophy which was described as values and principles in
the Manifesto for Agile Software Development. (My essay "The New
Methodology" goes into this in more depth.) There was a connection between lean manufacturing and agile
software from the beginning in that many of the developers of the
various agile methods were influenced by the ideas of lean
manufacturing. This connection was made more explicit by Mary and Tom Poppendieck. Mary had
worked in a manufacturing plant that had adopted lean manufacturing
and her husband Tom is an experienced software developer. They have
written a couple of books on the application of Lean ideas in the
software world. When people talk about Lean Software they are
usually referring to the ideas in these books, although others have
been making similar links. Lean manufacturing and agile software methods have a very similar
philosophy. Both place a lot of stress on adaptive planning and a
people focused approach. As a result lean's ideas fit in very well
with the agile software story. Mary and Tom have both been very
active in the agile community - indeed I'd credit Mary with an
important role in forming the Agile Alliance. (Like me, she was a
founding board member of the Agile Alliance, but she was far more
effective in it than I was.) I've already mentioned that lean manufacturing was an influence
on agilists from the beginning, and in the last few years more ideas
have appeared in the agile world with a clear lean manufacturing
heritage. These range from concrete techniques like Value Stream
Maps, to articulations of existing agile concepts such as the Last
Responsible Moment for making design decisions. The idea of thinking
of analysis and design documentation as inventory came from the
Poppendiecks. Several agilists I know emphasize the importance of
reducing cycle time - another strongly lean-influenced idea. My
colleague Richard Durnall has a nice summary of how lean knowledge
can blend in with agile thinking. A particularly strong appeal to many people about lean ideas is
that they provide a way of explaining agile software development to
people - particularly senior people both within IT and senior
customers. This explanation ranges from a crude appeal to emulate
Toyota to detailed discussions of how lean manufacturing's benefits
translate to the ideas in agile software development. So as you can see, lean and agile are deeply intertwined in the
software world. You can't really talk about them being alternatives,
if you are doing agile you are doing lean and vice-versa. Agile was
always meant as a very broad concept, a core set of values and
principles that was shared by processes that look superficially
different. You don't do agile or lean you do agile and
lean. The only question is how explicitly you use ideas that draw
directly from lean manufacturing. The Poppendiecks didn't introduce lean as a separate idea, nor
did they introduce lean as a published process in the style of Scrum
or XP. Rather they introduced lean as a set of thinking tools that
could easily blend in with any agile approach. I think of lean as a
strand of thinking within the agile community, like a pattern in a
rich carpet. There is a distinct lean software community, as in a mailing list
calling itself lean and people who label themselves as lean
thinkers. But this is no different to the fact that there are also
strong XP, Scrum, and other communities. Most people in these
communities consider themselves part of the broader agile movement
and many people are active in more than one of these agile
communities. The whole point of coining the word 'agile' comes from
a recognition that we share a core set of values and principles and
this common core means what we have in common is greater than our
differences.
|
| SchoolsOfSoftwareDevelopment |
agile |
12 April 2008 |
Reactions |
|
For nth, and I'm sure not last time, I'm sliding into a
conversation about defining practices, labeling some of them as
"best", and probably the C-word (certification). It's a familiar
discussion, and although we've barely started it, I can predict much
of where it will go. It's driven by a perfectly reasonable desire to
identify who are the better software developers, and how existing
developers can improve their abilities. When people get into these conversations, they usually end up in
trouble. Either the group gets into heated discussions and cracks up,
or the group doesn't have heated discussions and produces something
that others deride. The heart of why this happens, and why I don't see
any single, widely-recognized certification program for software
development coming soon is that there is no single, well-agreed way to
develop software effectively. Instead what we see is a situation where there are several schools
of software development, each with its own definitions and statements
of good practice. As a profession we need to recognize that multiple
schools exist, and their approach to software development development
is quite different. Different to the point that what one school
considers to exemplary is considered by other schools to be
incompetent. Furthermore, we don't know which schools are right (in
part because we CannotMeasureProductivity) although each
school thinks of itself as right, with varying degrees of tolerance
for the others. I'm using "school" here in the style of this definition:
4 a: a group of persons who hold a common doctrine or follow the
same teacher (as in philosophy, theology, or medicine) <the
Aristotelian school>; also : the doctrine or practice of such a group
b: a group of artists under a common influence c: a group of persons
of similar opinions or behavior; also : the shared opinions or
behavior of such a group <other schools of thought>
--Merriam-Webster
I came across this notion explicitly from the Context-Driven
School of Software Testing (see James Bach and Brett
Pettichord). I like their way of looking at this because it's a
model that explains why intelligent software developers have such different
approaches. The Context-Driven folks have done some looking at different
schools within the testing world, but I don't know of any good attempt
to classify the schools within the broader world of software
development. I feel a sense of belonging to a school, one that for me
is rooted in the people I met through OOPSLA in the
90's. Object-orientation is a key practice of this school, as is agile
methods. You could reasonably argue that this is the agile school,
except I think that agile methods are a core component of this
school's thinking but not the whole picture. The leaders of this
school include people like Ward Cunningham, Ralph Johnson, Kent Beck,
and Robert Martin. ThoughtWorks is, on the whole, an organization that
follows this school (which is why I'm comfortable here). But despite this sense of a somewhat coherent school, there's still
many open questions. Is it best to think of the agile world as one
school or many (are Scrum and XP different schools or part of the
same)? What are the major schools out there? What exactly defines a
school of thought? I don't have much of an answer to these questions, but the key
point to remember is that there are multiple schools of thought about
how to develop software effectively. We may not think much of the
other schools to our particular one, but we are foolish not to
recognize that other schools exist.
|
| PreferDesignSkills |
agile |
17 January 2008 |
Reactions |
|
Imagine a hiring situation. There's two candidates both with a few
years of experience. In the blue corner we have someone with good
broad design skills in the style of design that you favor (in my case
that would be things like DRY, judicious use of patterns, TDD,
communicative code etc, but the actual list isn't important - just
that it's what you favor). However she knows nothing of the particular
platform technology that you're using. In the red corner we have
someone who has little knowledge (or interest) in those issues, but
knows your platform really well - edge cases in the language, what
libraries are available, fingers move naturally over the
tools. Assume all else about them is equal (which it never is except for
thought experiments like this) and that your team doesn't have any
gaping holes that this candidate might fill. Which one would you
prefer? My answer is simple, I'd take the one in the with broad design
skills. I've always held the view that a good programmer should be
able to pick up a new platform relatively quickly. Learning basic
design aesthetics is both harder and carries over better to new
platforms. Good design practices that matter in Java are equally
valuable in .NET. Not being familiar with the platform does slow you
down (how do I get a literal class name in C# again?), but producing
well designed code is what really makes a difference. Broad design skills aren't completely portable. Java and .NET are
mostly equivalent as languages - moving to Ruby, however, changes
more. Moving to a significantly different beast, like functional
languages, is a bigger shift. In any case, you can't just blindly
replicate all design habits in a new environment. But if you're aware
of the new world, an awful lot does carry over. We've seen this principle prove itself at ThoughtWorks. In our
early days with Java, we found the skills experienced developers had
learned in Forte gave us excellent instincts for working with Java. We
moved away early from the EJB-dominant thinking, and I think it was
experience with other platforms that guided us. We saw it even more
strongly with .NET. Time and again we saw that good developers with a
Java background were rapidly more effective than those with a longer
.NET or Microsoft background who lacked those skills. The difference
was visible in weeks, not months (and sometimes days). At the moment we see this shift most notably in Ruby. We've had
quite the run of Ruby projects this year, and often we turn to people
with long experience in curly-brace languages to fill the need. Again
we've seen the value that broad design skills gives us. It's not always a sure thing. I have seen cases where someone
experienced in another platform just doesn't desire to get in and
learn the new one. Desire to learn is a necessary component here - I'd take
the single platform specialist if he wanted to learn broad design and
the broad designer didn't want to learn the new platform. It's also
essential to have someone on the team who knows the platform well. I'd say most people at ThoughtWorks prefer design skills over
platform knowledge. Many clients don't share that point of view -
which can lead to some difficult pragmatic and ethical choices. What happens if you have someone you want to bring onto the team
with strong design skills and no platform background - yet the client
insists on at least two years experience on the platform. In your
professional judgment, the broad candidate is going to be more
productive than anyone else available. You need to be honest with your
client, but on the other hand he is paying you for your professional
judgment. Does this change if the client has given you responsibility
for delivery of the project? For us these questions are more charged because there is a
financial interest involved. If we add a ThoughtWorker to a team, then
we bill for that person. If a client hires a platform specialist
contractor, we don't get that income. For many people this is a
crucial fact in the situation, yet I expect our project managers are
wise enough to know that the risk of adding the wrong person is much
more important than one billable income. Consider another case where you're open with the client and the
client demands a reduced rate for the broad design person due to her
lack of platform knowledge as she'll be learning on the job. You're
sure that she, despite that lack, will be more productive than the
competing platform expert due to those design skills. Should you
accept a reduced rate? It's the nature of our, and most other, professions that
you learn on the job. A platform specialist also has to learn broad
design skills if he's going to produce maintainable code. Here
it's important to remember that not just is it usually harder to learn
design than platforms, it's also less certain. Given a motivated
broad-designer, I can be pretty sure she'll pick up a platform in
time. But there's no guarantee the other way around. Some people are
good at learning details of a platform, but never figure out how to
write clear code. I've talked here about broad design skills - and I do believe this
makes a difference on the technical axis. But there are other
dimensions of broadness too. Most risk in software projects lies in
the communication between businesspeople and programmers, so a
candidate who can communicate well with users brings a great deal to a
team. A similar issue is knowledge of the problem domain. Often clients
want people who already know their business, yet are surprised when
someone rapidly gains enough understanding to be useful. I've long
held that it's the ability to collaborate with others which is central
here. By collaborating with a domain expert, or a platform expert,
someone with broad skills can be become effective very
quickly. Knowledge of other domains often introduces surprising
insights into a project and similarities often crop up in sup-rising
places. It's remarkable how often things like core accounting patterns
crop up in places that don't look like accounting on the surface. In
the end it's the ability to work with others, coupled with being a
fast learner, that is the critical skill. I'm not dismissing deep platform knowledge here. In an ideal world
every team member would be excellent broad programmers with several
years platform experience, good familiarity with the problem domain,
and written similar systems at least twice before. But we all know how
far our world is from that ideal. You need some platform knowledge on
a team, and if it were a gap I would reach for the platform
specialist to fill it. But that doesn't alter my default position to
prefer broad design skills most of the time.
|
|
|