A Dojo (道場 dōjō) is a Japanese term which literally means "place of the way"; it refers to a training place for students of Japanese martial arts, where they gather to conduct training, examinations and other related encounters.
By extension, a Coding Dojo is a meeting where a bunch of coders get together to work on a programming challenge. They are there to have fun and to engage in Deliberate Practice in order to improve their skills.
There is no unique way to organize a Dojo. Every group or community is unique in its own way, and adapting the format is perfectly fine!
Make sure that attendees bring a laptop and are ready to code before the event starts. The best resource on setting up F# for various environments is the F# Software Foundation, where you can find instructions for Mac, Linux and Windows.
Here is a rough outline of how a Dojo of about 1.5 hours could look like. Depending on the nature of the challenge, the level or size of the group, or whatever else, this should be adjusted - the goal is for people to learn and have fun!
- 10 mins: Explain the Dojo format, introduction the Challenge
- 5 mins: Break people into teams
- 1 hour: Code in teams [Check midway through how things are going]
- 15 mins before end: Ask teams to prepare to share their experience
- 15 mins: Each team shares their experience with the group
Tips and Tricks
There is no One True Way to organize a Dojo, but here are a few tips that can help make it even more successful!
- A Dojo is NOT a competition; it is a place to learn by coding together. As an organizer or a participant, it is your responsibility to make sure that the atmosphere remains non-competitive, collaborative, and fun. People should feel comfortable regardless of their skill level, and feel safe to try out new ideas.
- The "ideal" size for a Dojo is probably around 20 people; large enough to have different teams, with possibly different approaches to discuss - and small enough that teams can share and discuss their experience at the end of the Dojo. Smaller groups are perfectly fine; larger groups probably require adjustments, because logistics become time consuming. Specifically, in that case it may work better to let teams self-organize more, and sharing the team experience at the end should probably be more of a group discussion, rather than code show-and-tell for instance.
- Breaking people up in random teams is strongly recommended. It makes it easier for people to mix and get to know each other, usually creates teams with better skill distribution - and it is fun :) One simple way to do this is to count how many teams of 4 can be formed, and ask the whole group to count up. For instance, with a group of 12, people would count up 1, 2, 3, 1, 2, 3 etc... Once everyone has said a number, people with the same number form a team.
- Forming teams are better, but it's fine if people just want to work on their own! Encourage people to work in teams and get to know their team-mates, but let people know that if they are not comfortable with that, it's cool, too.
- Take the time to discuss at the end! It is a great way to learn from the other groups, and reflect on what went well or didn't go that great... Depending on the size of the group, it can go from simply asking each group to talk a bit about what they did and learnt, to short demos where each teams shows their code.
- Encourage people to work together, and to organize themselves accordingly: pair program on laptops, rearrange the furniture, anything that makes teams work better together is fair game!
- Digits Recognizer: build from scratch a machine learning engine that recognizes handwritten digits! This dojo is on the longer side (ideally 2+ hours), but is a great introduction to F#, with lots of guidance on syntax.
- Fractal Forest: a simple and fun Dojo - create beautiful fractal trees, and learn some recursion along the way. Good both for beginners and advanced F#ers!
- Canopy & 2048: learn how to use the F# web UI testing library Canopy, by building a bot that automatically plays the game. Good both for beginners and advanced F#ers!
- Markov Bot: build a small program to automatically generate human-looking text. Good both for beginners and advanced F#ers!
- Type Provider Treasure Hunt: use the awesomeness of F# Type Providers to access data from 7 different sources, and unlock a mystery!
- Classics mash-up: Picasquez vs. Velasso! Manipulate images and remix classic paintings - good for beginners and advanced F#ers.
- Ham or Spam: recognize which of the (real) text messages are Spam!
Here are a couple of classic resources to sharpen your F# skills. If you know of other ones we have missed, please ping us on Twitter, or send a pull request!
- F# Koans: learn F#, by fixing tests.
- Project Rosalind: learn about bioinformatics, with small programming problems.
- Project Euler: a series of challenging mathematical/computer programming problems.
- Nifty Assignments: great assignment ideas from the Nifty Assignments session at the annual SIGCSE meeting.
- 99 Problems in OCaml.
- @PragDave's Code Katas.
- Exercism, with some F# specific problems.