The day has come, and so did the 8am when we started setting up the scene at MyCorporation co-working space. I secretly planned on starting at 9, and it seemed to be a good idea. At 8:30, there were only 4 of people present. At 9:00am, we started the day with 4 pairs watching Corey and his greeting. After a short explanation of the day and the problem we're going to work on, session 1 started. Most of the attendees were familiar with pair programming, TDD and clean code, but never had the chance to try them "in production". The pairs were formed by people knowing each other, this gave them something to hang on to while facing new challenges. The first session was aimed to show the way pair-programming is done in practice, so I issued a role change every 15 minutes. The 45 minutes passed in a blink of an eye. Deleting code at the end caused some muttering, but we were counting on that. It seemed that the in-session role changing slowed the pairs down, so we voted to stop that for the next rounds. Two more people joined us during the first retrospective, and we maintained this number of 5 pairs until the very end of the day.
Session 2 started with the same pairs, as they now got to know the problem domain, and learned a lot from the previous session. Some didn't really stick to TDD at first, but in the second run, they tried. As I was walking around in the room, I could feel the innovation coming from those awesome minds trying to solve the Game of Life and the communication barriers. It was very interesting to hear that even co-workers who have been working together for years now, have never known each other as well as they did after 2 sessions of pair-programming. The participants were mainly from the world of PHP and Java, but thanks to some brave guys, we even had Scala, C# and Ruby popping up. The third session begun with new pairs. People paired up according to what they've heard from each other in the previous retrospectives. Some wanted to try out new languages that the other half knew, some wanted to try working with someone else. We introduced TDD ping-pong. I'm not sure if the language learning goal was a good choice, because we ended up with some pairs where only one participant knew the given syntax. Nevertheless, the problem was solved by the one not knowing the language told the other what he'd want to write. During the coding session, we've joined a global Google hangout, where fellow coderetreaters from Germany, Sweden and Belgium were doing their thing. Right after our third session, we saw that the guys from Ghent are standing in front of the camera and waiting for someone to talk to them. So we did, and had a great time talking to J. B. Rainsberger.
Our catering for the day was sponsored by Mimox, and they did invest in some really tasty food. MyCorporation organized it to be at the restaurant next door.
For the fourth session, we introduced the primitive obsession constraint. I made a mistake in facilitating and did not discover in time that a pair got sucked into an unnecessary generalization problem which held them back from achieving the primary goal. Lesson learned; as a facilitator you need to see their code, not just look at it. Another thing I've learned is that introducing these constraints without the participants understanding why they are good at all, isn't really a viable practice. I will create slides for each for the next time and speak about them a bit prior the first session.
For the final 2 sessions I suggested that everyone should return to their primary language. What they didn't know is that I had an evil plan prepared. (Thanks Jim for the idea).
We voted for the 3 lined methods constraint, and started coding. I encouraged the pairs to commit themselves to any other constraint too if they like, and most of them happily took the challenge. By the end of the 45 minutes, we had one team which completed the task. The evil plan was to ask them not to delete their code, but for the next session swap their product with another pair and they'll be working on the inherited code in the final session. Shame and laughter filled the air all at once, but they did it anyway. I hope that the message was clear that you should always leave code the way that you can even project it on the wall. A very appropriate global constraint was voted for this session: no swearing! The pair which inherited the already finished code received some guidelines from the original creators and started working on making the tests more readable, while the others tried to continue and complete each-others work.
Due to the delayed start, we had to leave the venue as soon as we finished session #6, so the final retrospective and the closing circle was held in a restaurant nearby. I was really happy that everyone stayed up until the end, and everyone wanted to have more coderetreats. Most people said that they will try this exercise at work, and they never thought pair programming was such fun and productive. My remark was that I really enjoyed facilitating, but I'd love to code too. For my greatest surprise, there were several volunteers for the role. We agreed upon rotating the role amongst these individuals, which is - I think - a great contribution to the coderetreat community.What I learned from the day?
- There's hope for a change of culture
- There are craftsmen in our city
- People need to experience agile development in practice to understand its values
- Hands-on TDD and pair programming trainings should be present in our professional community
- Organizing is fun and I still love it
What will happen?
- We created a Facebook page for the newly forming community
- We will conduct a coderetreat once a month
- We will share knowledge between the participants
- We will try and "infect" others with this experience
- We will do this for fun and knowledge
Thank you all who had made this global day possible! Thank you all who got up early on Saturday and coded all day long. You have proven yourselves dedicated to your profession, there's no other way to put it! :)