Yesterday evening, me and two other friends arranged a highly spontaneus and inofficial code kata, at my friend’s apartment. The task was to develop a Monopoly game, using TDD. It was sort of an experiment as well, we wanted to see how TDD could help us discovering design, rather than inventing it.
We started by talking about the domain, listing some words that we thought were important to the game. Then we made a small domain model diagram, just with boxes and lines (the relations had no directions or multiplicities). This was fun! It felt like we were back in school again.. 🙂
After that, we started to make some user stories, each on a small piece of paper. Here are the stories we came up with (in prioritized order):
- A player walks the number of steps the dices show.
- In the beginning of the game, the ordering of player moves is determined.
- Players act in the predetermined order (was later removed, redundant with previous).
- A player hits or passes “Go” and earn 4000.
- A player buys the street he/she is on.
Now, we could start to implement the game! 🙂 But, as we realized, the first story was very hard, since we had no code to start with. Actually, starting to write the first test was probably the hardest. I think we made the conclusion that the first test we tried to write was to big, so we divided the test into smaller parts, and BOOM, it went much more smoother. Also, we tried to follow YAGNI, as much as possible.
An interesting detail is that we kind of get stuck on the “the dices show” part of the first story. It’s obviously something that has to do with random number(s), but how should we test that? I.e., we thought that only players would need dices, but if a player use the Random() system method, then we must capture it in a public state in order to know if the player actually walked the number of steps that the dices show. Not nice! We felt the urge to really talk about this, to see if logical arguments could lead us into a good, and hopefully pragmatic, solution to this problem. We ended up with dependency injecting an “IDice” – something that could give us a random number between two and twelwe, and mocking the IDice in the test. Nice! Now we could manipulate the player through fake dices, without having code smells all over the place!
Though, in retrospective, it would have been nice with an expert on TDD in the room. In the end, you would like yourself (or the group) to ask good questions and answer them logically, but without experience, asking the right questions in the right time is hard. A teacher behind the back, mentoring and supporting would be nice to have. Reminds me a little about Polya, “How to Solve It“. Though, doing the excercise without a “master” was probably a good idea, in some way: it made us (more) convinced about what we were doing, and if we weren’t convinced, we had to talk about it.
We did the excercise for about six hours, but we had dinner and wine during that time as well, and perhaps we weren’t that effective all the time 🙂 Anyway, we implemented all the stories, except the last one (a half-baked story).
Thank you for a very nice evening!