Last week I took course on Agile design by J.B. Rainsberger in Reggio Emilia, organized by Avanscoperta. Here's a review of the course and some interesting points that I have learned; however, they may be different from what you would have picked up since your personal background is different from mine.
There are no grand rules when it comes to design software, an activity where choosing alternatives is highly contextual and driven by the scenarios you need to implement. The theoretical topics touched by J.B. included:
- two development techniques, one that temporarily makes you write tests in an end-to-end manner and one called Presenter-first which is a particular instance of the outside-in approach described in GOOS.
- The 4 (actually 2) rules of simple design.
- The mechanical and intuitive point of views, as described in his article on the subject.
Mechanical rules target duplication and good names, while intuitive design goes one step further and consider the meaning of code instead of its appearance.
J.B. made us exercise in pairs for 20' timeboxes to get the feel of a problem, then tackle the same problem starting from scratch, in multiple languages.
There are so many user stories to choose from that you would never get to the end of the list - and this is not the point as the focus is on deliberate practice. One of the constraints set by J.B. was to commit at every green bar - which I liked very much as it forces us to focus on a single, small task at a time (similarly to Arialdo Martini's commit-message-first strategy).
Examples were very focused, since practising without aim is not that useful when you have a teacher instead of being alone practicing. In one instance, J.B. told us the test list to complete and a particular order for it to be implemented, as the goal was discipline in incremental development and commit strategies.
After finishing the topics for the course, on the last day we brought up some code of ours for J.B. to review and discuss.
Some examples were announced as legacy code, to trigger a discussion on what to fix first and some high-level strategy such as logging differences in execution and business impact in a legacy and modern version of the same code (the new code for the commission fees would make us more money? Try it in production alongside the old one and see.)
Other examples focused instead of refinement, such as my Roman numerals kata and a bowling kata based on the State pattern by Matteo. It's nice how you consider code finished while J.B. can make you recognize some duplication and give you some new road to travel or to break up objects in more composable pieces.
Alongside getting feedback on our design and code, it was instructive to look at demos where J.B. live coded the same examples, taking refactoring to new levels. The maniacal attention to everything he typed stuck with me: the incremental search for good names, the discipline in committing and deciding messages, and the pattern used to do so (such as the "as long as" suffix for commits partially implementing a feature with just a small green scenario).
The other aspect of demos was the capability to listen to the tests to detect coupling, and to steer the design towards unit tests with respect to integrated ones. Accidental duplication of details in test such as repeating strings in expectations from different tests is a new smell for me.
I am glad of having been sent to attend J.B.'s training by Onebip as it was a rare occasion in Italy. The organization by Avanscoperta was very efficient and it placed us alongside a soft skills course by Pierluigi Pugliese, causing contamination between technical- and people-oriented professionals during the evenings. The timing was also good as the courses took place just before the Italian Agile Days 2013, one of the biggest conferences in Italy dedicated to the movement.
I think the formula of the course is also powerful: a 3-day full immersion outside of work, in a different city and with fellow programmers interested in the same topics. Coursera is nice, but it's much easier to obtain the deep focus necessary to improve within this setting.