Raising the Water Level
Join the DZone community and get the full member experience.
Join For FreeThis is a wonderfully evocative metaphor, since practically everyone has seen a stream or river with water flowing around rocks and they can visualize the effects those rock have. However, long before I ever heard of any of this Lean or Agile 'stuff', I read a story about how raising the water level was the more appropriate way of dealing with those rocks.
A Little History Lesson
I live in Ottawa, Ontario
which is the capital of Canada. It wasn't always the capital, in fact
originally it was a rough & tumble lumber town along the Ottawa
river which acted as a highway for transporting logs from many
kilometres upstream. Ottawa is also where the Rideau River flows from
the south into the Ottawa river, and is the general route for the Rideau Canal that connects Ottawa with the St. Lawrence River and Lake Ontario at Kingston.
The Rideau Canal owes its existence to those pesky Americans who live to
the south. In the 21st century, Canada and the U.S. are close friends,
allies and trading partners, but it hasn't always been this way.
During the War of 1812,
the threat of invasion from the south or at least a blockade of the St.
Lawrence River forced the British to consider an alternative route from
Montréal to their naval base at Kingston. A canal from Ottawa to
Kingston along the Rideau and Cataraqui Rivers was approved and
construction began in 1826, led by Colonel John By.
Today, a large portion of the land in which Col. By had to work is open
farmland but that wasn't the case in the late 1820's. Work on the canal
was at best a very tough grind made worse by malaria-carrying
mosquitoes that infected the workers by the thousands. Another aspect
of the local geography that presented challenges to Col. By was the
tough granite of the Canadian Shield. This required blasting in many
areas which, since this was decades before the invention of TNT, meant
the use of black powder.
When
you consider the conditions and the era in which this took place,
construction flew along at a quite vigorous pace until 1829 when
construction had reached Rideau Lake. This was a key area since Rideau
Lake was the source for the Rideau River that flowed north to Ottawa,
and nearby Mud Lake (now Newboro Lake) was the source for the Cataraqui
River that flowed south to Kingston. The original plan was to dig a
1,500 metre (4800 foot) channel between Mud and Rideau Lakes, but the
construction workers discovered that they weren't dealing with the mud
& gravel they expected but rather with the hard granite bedrock of
the Shield. Costs began to spiral out of control, and the local
contractors even quit the project. Col. By had a problem and needed a
solution quickly.
He examined the area's geography more closely and came up with a novel
plan. Rideau Lake had a narrow section, and By decided to build an
extra, unplanned dam there as well as a lock station. This split Rideau
Lake into Upper Rideau and Big Rideau Lakes and raised the water level
in Mud Lake by 1.5 metres (almost 5 feet).
Doing so dramatically reduced the amount of excavation required to
connect the two watersheds and construction of the remainder of the
canal continued it's brisk pace until completion in 1832.
Raising the Water Level with Your Team
We talk quite a bit about Agile being the "art of the possible". If
your team is one of the early adopters of Agile in a company it's quite
likely that "possible" in your context may not be what you read in Agile
literature or are taught in courses. I'm a firm believer in lowering
the water level to expose the rocks but I also know that in some cases,
like Col. By, raising the water level may be the best way to proceed for
the time being.
For example, coming from the XP world I advocate for very short
iterations, ideally 1-2 weeks. When you're dealing with just software, I
have yet to encounter a situation where a team couldn't produce work
with meaningful business value in that time frame. Indeed, those very
short iterations will expose many rocks that can and should be dealt
with immediately.
When you start working with physical hardware, though, it simply may not
be possible to complete a piece of work into a short iteration. In
fact, it may be quite inefficient to force fit some physical board or
card design work into a fixed length iteration, or to deliver it
incrementally - if a card requires 5 heat sinks, what value does
delivering the design of the first 3 provide?
In that case, a longer iteration length or a process such as Kanban where cadence is decoupled from the size of the work items is likely more appropriate.
Another example of raising the water level to deal with the reality of
the situation is with a team's Definition of Done. New teams have a
tendency to put a lot more steps or items in their DoD than they
actually can complete in an iteration. This isn't a big problem, and
actually is a very good exercise at showing all the work required to
deliver something. After the end of the first iteration, though, many
teams realize that their initial DoD was too ambitious and they may need
to pare it back somewhat in order to deliver work. That isn't to say
that they don't report and deal with the impediments that prevented them
from achieving their DoD, but it may mean raising the water level
temporarily until the team or their organization is capable of meeting
the more expansive version.
A third example is when a team is dealing with a large legacy code base
(to which you respond, "Who isn't?!"). It may be very, very difficult
to create microtests and use Test-Driven Development at a low level from
the start (although there are plenty of resources available to help
team eventually do that). In that case, you may choose to raise the
water level initially and start doing Acceptance Test-Driven Development
instead. This would provide automated test coverage at a higher level
where it may be much easier to create the tests, and thus provide more
overall value than spending the time doing the remedial work to clean up
the code to make it more amenable to TDD at the microtest level.
Again, though, books such as Working Effectively with Legacy Code
will help you to deal with that Big Ball of Mud and introduce low-level
TDD which will improve the overall quality of the system.
So, you may need to apply some outside-the-box thinking like that of
Col. By in order to deal with the rocks that you encounter in a team's
transition to Agile. As a coach, I constantly advocate for teams to
push their limits of "possible" in order to gain improvements in how
they work and in the quality of the work they produce. However,
sometimes raising the water level may be an appropriate way to achieve
the art of the possible.
Published at DZone with permission of Dave Rooney, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending
-
Step Into Serverless Computing
-
Performance Comparison — Thread Pool vs. Virtual Threads (Project Loom) In Spring Boot Applications
-
Writing a Vector Database in a Week in Rust
-
How To Approach Java, Databases, and SQL [Video]
Comments