This was quite a volatile iteration. Although only 13 of the 21 story points were completed, there was an awful lot accomplished.

Perhaps most significant among the stories was the tracking down of and elimination of The Horrible "SAVE" Bug. This was a bug that snuck in during the early stages of FitNesse as a result of doing just enough to get the tests to pass. In retrospect I clearly should have had a test to catch this bug but it didn't seem necessary at the time.

The loss in velocity for this iteration is mainly a result of the hordes of refactorings we have been making. FitNesse started with a very simple design which was near perfect for the features included. Admittedly there were some areas where we were not quite sure how to proceed. For example, wikiwords posed an architectural problem because among all the html rending involved, wikiwords were the only widgets that required knowledge of the page structure. This is so they may link to the existing page or to a edit form. At the time we struggled to find a comfortable solution and, for lack of a better idea, settled on passing the root page to all the widgets though most never used it. A better solution was around the corner but we couldn?t see it yet.

In this iteration there was one story: Widgetize the classpath elements. The system was previously parsing page content in search of the !path expression along. This was a bit smelly because this code was totally separate from the rest of the wiki parsing code had several aspects of duplication. Little did we know that combining this maverick code with its herd would lead to a chain of refactorings that heal so many sore spots in the code. It was like placing a key piece in the puzzle and watching every other piece just snap into place.

After completing a refactoring the code would talk to us; "Don't pass the root page around.... Put it in the root widget and let the widgets ask for it if they need it." Who am I to disobey the code I write? So we would do what we were told and as a reward we would get a green bar from JUnit, green cells from FitNesse, and a much better design. Then the code would talk again?.

What fun!