Global Day of Coderetreat 2012
As last year I helped the coderetreat first-time facilitators to jump-in and organize their first coderetreat. I had some training sessions on Google Hangout during which I talked with a lot of passionate professionals from all over the world. Together with me Jim Hurne had done the same effort to spread his knowledge about the way he facilitates a coderetreat.
Jim has done a lot of work for the Global Day, he added the sessions on the coderetreat.org website created, the hangouts for all the registered attendees for each session, and a lot of other very useful things. He was full of energy and I want to thank him for all that effort, I don’t think the Global Day would have been that successful without his sustained effort.
I chose to go to Cluj-Napoca to facilitate the coderetreat on the Global Day. I had talked with the Cloud Troopers company about hosting a community event, and this was the time. They were kind enough to sponsor also the lunch. Out host was Georgiana Gligor, and she was very keen to see what a coderetreat is all about.
We started at around 9:20, and because all the attendees were new to the concept of coderetreat I did a longer intro, of around 30 minutes. I explained what is the purpose of a coderetreat: experimentation, practice, getting out of our comfort zone, writing the best code possible, do not focus on finishing the problem. Some concepts were a bit strange to the audience, but this was really useful for the day.
The first session of the coderetreat was free: just explore the problem. It was a good idea because only a couple of people heard about Conway’s Game of Life. During the retrospective we had just some discussions about the problem, and a couple of starting points for implementing it.
Because I saw some very complicated implementations I chose for the second session the following constraints at choice: no conditionals, no loops, method of 4 lines maximum, only one dot per line. Every pair needed to choose at least one of them, and I asked each pair after five minutes what was their choice. It is very important to ask what was the chosen constraint, because they often forget to choose one and this leads to less practice and more hacking. During the retrospective of this session we talked a lot about how to implement a solution without using conditionals. This discussion proved to be useful for the next sessions.
I did not see a lot of abstractions during the second session so the third session had to be the Single Responsibility Principle: If the method has more than one responsibility add those names in the method name using “and” or “or”, When the method name has “and” or “or” then split the method, No conditionals: ifs, switch, etc, No try/catch, Exactly one assert per test, Test one behaviour per test. During the retrospective of this session it turned out that talking about some solutions of avoiding conditionals during the last retrospective was very useful and it was faster to overcome this issue.
Before the lunch I gave printed Kudo cards, and I invited each pair to write a card to a pair that taught him or her something. I asked them to think about pair-programming as a learning activity, and I am sure they learned a lot by doing this.
The lunch was thought to be, in the spirit of the coderetreat, some high quality food. Georgiana was very funny by extending the “no pizza rule” to “only healthy, balanced diet food”. She did not let almost anyone buy food that was not healty enough. Thanks again Cloud Troopers for sponsoring the lunch.
After the lunch we had to do something more energizing, because it’s hard to fight the strongest force in the universe: digestion (thanks JB for teaching me that). The fourth session was Taking Baby Steps: you need to add a test and write the implementation in a two-minutes timebox. If you cannot do it in two minutes, you use a versioning system to revert to the last commit. When you were able to make the test green in less than two minutes you should refactor. You can take as many 2 minutes timeboxes to refactor, but the condition is that each refactoring should fit in the 2 minutes timebox. This session was really getting everyone out of their comfort zone. During the retrospective it resulted that 2 minutes are not enough for them, and they would use 5-10 minutes timeboxes. Nevertheless the idea seemed interesting for them. I responded that it is a very good technique to let you know what you need to learn. Why can’t you commit in two minutes? What keeps you back? And this could be one list of things you need to practice…
The fifth session was around pair-programming games. Every pair needed to chose to do ping-pong pair programming with either Evil Coding or Mute Pairing. Most of them, except one pair, chose evil coding. It was probably one of the funniest session during the coderetreat. They enjoyed the challenge of writing good tests and bad implementations, but also they learned some features of the language or some strange ways to make a test pass.
The last session was again a kind of a free session, but every pair needed to chose what to practice, either to practice again based on one of the session ideas that we had done, or something completely new . I asked every pair in the first five minutes of the session what they want to practice. I think this is very useful when facilitating because often you forget what you want to do, given that you code with someone you don’t know and everything seems so new.
During the day we had a lot of video calls with people around the world: London,Munster, Belgium, Bucharest, Sheffield, South Africa, Timișoara, Canada. It was a really nice experience for everyone to see that a lot of passionate programmers are doing the same thing in so many cities around the world. I also let the video of the Google Hangout being projected on the wall when not talking with them, and it was really nice connecting the two distant cities in this way.
Before the closing circle I asked everyone to write kudo cards for anyone that taught them something. They had five minutes, and after a couple of minutes I saw the cards being passed in the room, people thanking their pairs and smiling when receiving gratitude. Here are the cards I received
At the end of the coderetreat we had the usual closing circle. Here are my questions together with the answers I received:
1)How did you feel?
- Tired x2
- Out of the comfort zone
- Felt strange
- Needed to think differently
- Like a beginner. I did not program in .Net, felt incompetent, did only languages I did not know
- Under pressure, relaxed, intrigued
- It was interesting
- I saw how others work
- I saw different approaches and ways of working
- Liked the constraints
- Liked the Single Responsibility constraints
- I liked it today, even though having a headache
- Happy + confused
- It’s already 6PM!
- Very intense
- I liked I worked in Java, programming a lot PHP usually
- Liked to interact with everyone here.
- I felt very well after all the beers I drank during the sessions 🙂
- Learned a lot of things.
- Felt very well.
2) What did you learn
- Test methods should have long and explicit names
- You can do things differently
- You don’t need a complex IDE
- Taking Baby Steps
- Experimented on TDD
- How to apply polymorphism, applying Single Responsibility Principle
- Git
- Short methods
- TDD x2
- Evil / Mute programming
- Some methods of working can help you writing better code
- Inheritance, how not to use conditionals
- Pair-programming
- The names are very important
- You should take the time to name things: it help you afterwards
- Smaller methods: we all knew that deep in our hearts
- You can do things differently than the things we are doing usually
- Evil coding was nice
- Mute pairing was interesting
- Write tests => do more
- I would like to attend the next coderetreat
- Abstractise the things more
3) What would you do differently on Monday?
- Run all the test battery before committing
- Shorter methods x 3
- Learn Java
- Make smaller steps
- Use Git better
- TDD
- Pair-programming
- Write more tests x 2
- Better method names with Single Responsibility Principle
- More tests
- Better names
- Create more classes
- Correct my defective TDD style
At the end of the day I forgot to tell everyone to make a group picture, but I did remember later, when only the group that went to beer was in the room. So here we are:
Thank you Georgiana for offering to help the coderetreat in Cluj!
Thank you Cloud Troopers for hosting the coderetreat, and for sponsoring the lunch!
Thanks to all the passionate programmers that attended, I think we had an excellent time together during an exhausting full day of coding!
PS: The slides I used for this coderetreat can be found here. More pictures can be found on the AgileWorks Cluj Meetup group here.
The event was great, and I felt very good exploring the things I normally don’t have / want to have / find time for.
I particularly enjoyed the “taking baby steps” session, which meant that you only got 2 minutes to perform a full cycle: write test, write supporting code to make it pass, commit to git. If the tests were not passing, you’d have to remove all code from those 2 minutes and start over. This draconic set of rules got me pretty quickly into “the zone” and I felt the joy of programming again.
I hope we’ll repeat this experience soon, as I met great developers, and even met a former university colleague after many-many years.