From Mario Kart to Version Control

The other day someone told the story of a mom and teenage kid on a long car trip. At some point the mom says, “I can’t talk anymore, I have to focus on driving.” The kid was like, “It’s no fair, you get to play the whole time.”

The kid perceived driving as a game, because their experience with driving was within video games. They’ll learn eventually that real driving is not so fun: it goes on and on, and it’s life & death.

What makes driving in video games so much more fun than driving a real car? Part of it is the stakes. What happens if I slam on the brakes and skid into this turn? In a game, worst case, you wreck your digital car and start over again. Perhaps a friendly cloud with a winch hoists you back onto the road. In real life, you and your whole family and another family on the road all die. Or are maimed for life. Those are some consequences.

In the video game, we’re free to experiment, because we can always start over. If you never go off the road as a beginner in Mario Kart, you’re not trying hard enough. In real life, we can’t afford to experiment. There is no undo.

That freedom to experiment makes games more fun. It also makes it possible to learn. Push your limits, find out how fast you can take that turn. If you’ve never failed, then you could do better.

In development, we can give ourselves that freedom. We can make it possible to undo what we tried. Version control can help with this. It gives us savepoints to fall back to. Automated testing helps, so we know we flipped the car immediately, not three laps later.

This last weekend I worked some crazy stunts in git, rewriting project history and patching it together from multiple sources. This was fun, because I knew how to undo my mistakes. It was play, because I had the freedom to fail and learn and try again.

Learn a tool like git well enough, and it becomes the friendly cloud with a winch. Set yourself back on the road whenever you like, and then floor it.