I should be working on continuing my posts about Lean Startup and the Enterprise, but Winter Storm Nemo has had me pretty close to home for this weekend and given me the opportunity to spend a lot of time in the house with my kids. For those of you who don’t know my children, they love trains. Actually, love probably doesn’t quite convey the level of feeling my almost 4-year-old son has for them, and his little sister is not far behind. As such, one of their favorite activities is to build a train set on the table in their room. This introduces several challenges, including the constraints of the table, demands of two different and very vocal stakeholders, as well as the need to use the track as it is being built. When we play on the set, we can end up with some very sophisticated tracks, like this one below.
After building several such tracks, it occurred to me that we’ve been doing it using many concepts from Agile Software Development including evolutionary design, continuous integration, short iterations, and refactoring to name just a few. For some time, I’ve been meaning to catalog the evolution of one of these tracks, all it took was being snowed in under 3 feet of white powder for me to finally have the opportunity. This blog encompasses the building the track you see above from Friday evening through Sunday morning (February 8th – 10th, 2013).
Sprint 0 – Planning
Preparations for first iteration. (Feb 8th, 6:30 PM)
While little kids frequently are impatient to get going, we still need some preparatory activity. In this case, we clear off the table while having a discussion about what they would like in their track. In general, Trevor – who is two years older than his sister – is the more vocal one. In tonight’s case, he really wanted to have a track that created a “tunnel,” whereby one track would run over a lower one. I told both Trevor and Lexi to pick some of the big pieces that they wanted to use. As Martin Fowler would describe architecture as the stuff that is “hard to change”, I’ve found that space is a major constraint on the table, so getting some of the larger pieces out first maximizes our ability to incorporate them into the track. In this case we see a few tunnels and some of the “double track” selected.
Sprint 1 – First Complete Track
First Complete Track (Feb 8th, 7:05 PM)
The first complete version is built, offering little more than a loop with a few detours and the large constructs selected in sprint 0. I have learned with my children that unfinished work is very hard to put down. Bedtime, meals, and other distractions are much easier to address if the track is always “done” and functioning. Additionally, as you can see at this point, the track is being used all the time; this helps in several ways. First, especially in the case of Lexi, our team’s velocity is much higher if she’s testing (playing) as opposed to trying to build, which is more like demolition.
Continuous play also provides critical feedback about stability and playability. From my point of view, a good train set has two primary goals. The first is the fun and enjoyment of building it while spending time with my kids. The second, however, is the freedom it grants when they are then engrossed in playing, allowing me to do other things. This second goal can be undermined by two major risks: areas that are fragile, causing breaks and calls for “help,” and areas where two trains can enter gridlock, causing a conflict between two strong-willed children. Ongoing use while I build highlights both of these challenges very quickly. As you can see, even in this early iteration, we have two areas where trains can steer off to avoid a collision. With our technical foundation in place, we’ll move on to confronting the primary requirement for this track next, the “big tunnel.”
Sprint 2 – The Big Tunnel
First major usability test (Feb 8th, 7:11 PM)
We had our first usability test with Lexi & Trevor both running trains on the same track. Here we see a nice demonstration of the ability for Trevor’s trains to go past Lexi’s without a major incident. This is a good sign, so I’m feeling good at this point. You can also see the beginning of the big tunnel in the lower left of the picture. My initial thinking is to have an elevated loop that runs over much of the ground-level track, providing the tunnel experience demanded by my users.
Unfortunately time runs short and some disagreements about precise requirements prevent me from implementing this functionality right now. We simplify the upper level and have a single run of elevated train track, which runs over the lower level and then drops down to merge onto the main line.
Completed track after Sprint 2 (Feb 8th, 7:22 PM)
This second picture from the sprint shows where we ended for the night. Indeed, short iterations were critical here: the night was getting late and we had to rush off to the bath. I didn’t even notice this picture was blurry until later, but it properly captures the sense of urgency felt by everyone as we tied off any loose ends. You will notice the draw bridge in the first picture from this sprint has been removed and replaced with a simplified run of elevated train track. We found a usability issue with the descent by the mountain pass, but as the saying goes among many in the field, if you aren’t ashamed of your first release, then you waited too long. This version will have to be good enough. After their bath, I gave the children the choice of one more period of building track or watching one TV episode – Dinosaur Train; naturally – and they choose television. We will kick off our third sprint the next morning.
Sprint 3 – Modifying the Elevated Run
Finished track from Sprint 3 (Feb 9th, 8:57 AM)
Trevor was quick to express his displeasure with the current state of the train track. In fact, by the time I came into the room to help him, he was busy starting to lay out a new elevated loop like we had tried in Sprint 2.
Now you will see the upper loop around the mountain in the top left quadrant of the picture. Implementation was actually pretty fast, as we had started down this path in the prior sprint before abandoning it, so we had a general idea of what we wanted to do.
While working on that, we also added a lateral track running left to right in the middle of the table; this space was looking unused, so we figured we would start to run some lines through it.
Sprint 4 – Continued Evolution of the Design
Widened left/right track in the middle of the table (Feb 9th, 9:07 AM)
Additional junctions added on the ground level track (Feb 9th, 9:12 AM)
As you may recall from Sprint 0, both Trevor and Lexi are big fans of what we call “double track.” The middle line had quite a bit of space around it, so we decided to widen it to run with two lanes. Additional enhancements included another connection in some of the ground-level track in the top right quadrant pictured below.
Sprint 5 – Stubbing While You Go
4-way junction added (Feb 9th, 9:21 AM)
3rd intersection integrated (Feb 9th, 9:27 AM)
Traffic hits a blocked path (Feb 9th, 9:31 AM)
Trevor has been quite fond of one particular “switcher” piece recently, a four-way junction he received form his nana that invariably finds its way onto every track we build. He didn’t select it during Sprint 0, but sure enough, out it came. This piece is particularly hard to fit in as it has an irregular angle and four different connections. Here you can see our initial strategy was to insert it into an established line of the track with the extra two connections simply blocked off. This allowed traffic to flow through, and gave me time to work on a way to integrate the additional intersections.
Initially, Trevor was quite upset with a “stopper” on the track. I explained that it is only a temporary fix to keep the trains safe and from falling off the track. I assured him that we will keep building. He was unsure at first, but grudgingly accepted it and we kept going. However, from this point on, whenever we finished for a snack, break, or to enjoy the snow – yes, we did actually get to explore outside and didn’t spend the entire weekend just building train tracks – he would invariably ask, “and then we’re going to fix the stopper later?”
Sprint 6 – Technical Debt
Trouble of elevated passing (Feb 9th, 9:38 AM)
Refactored passing (Feb 9th, 9:38 AM)
At this point, it became clear some parts of the track were not working very well. The primary ramp going up to the top level of the track had a sharp left turn that was not holding up well. Derailments were frequent resulting in upset users and damage to the track. As you can see in this sprint, the general course of the track remains unchanged, but the specific pieces were modified to fit better and be sturdier.
This was quite a nice demonstration of refactoring and building up quality based on actual experiences. In order to meet on of the primary goals of this track, that it be both engaging and not require parental support on a regular basis, I must balance two competing goals. Added turns and complexity makes the track more interesting and fun, but at the same time that also increases the chance of breaks and the invariable call, “Daddy, I need help!”
As the overall track gets more complex, there are too many turns—and too few of a couple key pieces, like those red towers—to brace every single one. Continuous usage while building has provided valuable feedback to ensure that we build up any fragile areas likely to attract a lot of traffic and don’t waste time and scarce resources on ones that hold up well enough. This design remained as is for the better part of the morning. It was not revisited until after lunch.
Sprint 7 – I Guess We Didn’t Need That
Mountain loop completed and undergoing testing (1:20 PM)
Full view of track at end of Sprint 7 (Feb 9th, 1:39 PM)
This sprint saw the departure of the gate drawbridge, something that had been selected early one when picking out “big pieces” to add to the track. It was cut from Sprint 1 and put back in later when, with the new loop around the mountain tunnel, we were looking for ways to further expand the elevated track. Had I tried to remove it earlier, I would have faced steep resistance, but with a view of what we could do by replacing it, our sponsors quickly agreed that we could remove the drawbridge to accommodate more elevated train track.
Sprint 8 – Close Loose Ends
3-way split added to top-left circle and lower track modified slightly (Feb 9th, 5:38 PM)
The first sprint in the evening was very quick. Trevor has come to accept that at times some tracks will be blocked for construction. In this case, one such block remained at the end of Sprint 7 without a clear path to correct it. After spending the afternoon walking through snow drifts and shoveling, we had an insight and found a three-way split track that added another ramp up to the elevated track. The bottom run was also modified with another switching track and some other slight modifications made by Lexi & Trevor.
Sprint 9 – Changing Requirements
Test driven track development (Feb 9th, 5:43 PM)
Major modifications to intersections in the top-right quadrant (Feb 9th, 6:01 PM)
Finished version after sprint 8 (Feb 9th, 6:18 PM)
Sometimes, a powerful stakeholder demands a change simply because he doesn’t like something. In this case, Trevor had decided that the three-way splitter in the top right corner had to go. I tried to explore his motivation for this demand, but unfortunately there was no discussion. The piece was unacceptable and had to be removed quickly. Being conscious of my behaviors for this blog, I began to really focus on keeping the system working the whole time (don’t break the build). As such, I began developing techniques like the one pictured above to component-test new designs before picking up any track. This actually allowed me to work much faster, as I could clearly see if something would fit or not before removing any of the legacy train track.
I should have asked Trevor to sign a requirements document, as once we began to pull up some of the track, the changes kept coming. The second picture above shows the major reconfigurations requested, including the complete replacement of one three-way intersection and the flipping of another one. You will also see the “track to nowhere,” elevated above in the middle of the table, representing work we needed to complete in a future sprint. I must confess that at this point in the project I was tempted to betray my principles and not keep the track working the whole time. Thankfully, we wer able to quickly complete the broken link and get to dinner.
Sprint 10 – Build up Quality
Trevor blocking off an incomplete track (Feb 9th, 7:24 PM)
Complete track at the end of Sprint 9 (Feb 9th, 7:30 PM)
Sprint 10 was special on several counts. Up until now, every sprint had begun at Trevor or Lexi’s behest. However, after the rushed job to finish sprint 9 in time for dinner, I felt we had taken some unacceptable shortcuts and needed to clean up the track one more time. Sufficiently consumed, I decided we needed to get “just one more sprint” in in order to address a couple key things. Specifically, the emergent pattern we seemed to use was looping track with multiple break-off points along the way. In order to do this, at times we needed to use male-to-female & female-to-male converters. This project has the very real constraint that we don’t have many of those pieces, and we had specifically run out of male-to-female converters. We needed to revisit a few key intersections to see if they could be better patterned in order to use fewer parts, saving precious pieces for sprints in our final day of this project. I won’t detail the changes in this image, but if you look closely you will see some fairly serious changes in the specific pieces in the top-right quadrant, even though the pattern does not change at all. Another major success in this sprint occurred towards the end while breaking a few key intersections. I was searching for a piece in one of the bins, and came back to find that Trevor had added a stopper to one of the incomplete tracks!
Sprint 11 – Final Release
Final train track (Feb 10th, 8:58 AM)
Angle view of completed track (Feb 10th, 8:57 AM)
We resumed work on the track Sunday morning and unfortunately we were beginning to feel our constraints. Space was coming at a premium now, and several specific parts were getting low. We had a meeting and agreed that we were close to done, but wanted to see if we could add more tunnels and train stations. We were able to add a tunnel and a small station on top, which provided a starting point. Interestingly, the final sprint was actually surprisingly calm. Both children were happy with the design and set to playing with it more thoroughly, allowing me to spend more time that morning shoveling out my car for work the next day.
All told, the track features 22 distinct intersections & junctions to prevent train collisions, as well as the ensuing sibling conflict. As of Wednesday night, the track has undergone heavy usage with no changes, thereby meeting my goal of providing an outlet for them to play without needing frequent parental interventions.
Looking back at the experience, it is pretty impressive to see the gradual growth of the track as we successfully iterated on the design. Thinking about the key question of “was there a design,” it seems unfair to say that design didn’t come into it. I used a very specific design, we built a loop, added an upper level, and then proceeded to insert more and more additional paths as possible. The experience, in some ways, feels like it was a little opportunistic, as we reviewed the implemented design at several points in time to find places where there were natural fits. Traffic modeling was also not necessary, as I had immediate feedback from my users when an intersection accidentally became inescapable or we faced other problems with the flow. We used a complexity strategy of establishing heuristics as guiding principles. One of the most famous examples of this model would be the US Marine Corp. When command breaks down, they have three guiding principes: capture the high ground, keep moving, stay in touch. In our case, the guidelines were: keep the track intact, look for opportunities to add new branches, continuously test.