Dig deep into the history of any great programmer, and you'll probably find a game. From Mark Zuckerberg to Bill Gates, the pattern repeats itself: A programmer learns to make something fun, and he or she starts down a long path toward expertise.
It's easy to forget the importance of play in learning, partially because the code that expert programmers write is often so serious. But many great programmers continue to take a playful approach to their projects. Linus Torvalds started Linux as "just a hobby," for instance. Failing to maintain a playful attitude might even inhibit professional growth.
Let's move on to look at how play can help you to learn technical skills more quickly, more deeply, and more enjoyably!
The simplest way to get the benefits of play in learning is to play coding-centered games. The popular Koans series are incomplete statements in various languages that users complete or fix to learn basic concepts in the language. Ruby Koans were the first, but many languages have Koans projects now.
For those who prefer less solitary practice, CodeFights pairs programmers and has them race to finish programming challenges against each other. Along the way, students earn points and badges and get paired with ever more skilled competitors.
Finally, CodingBat is an online coding resource that uses familiar test-driven development to teach programming. Covering Python and Java, the CodingBat exercises require the user to complete a function definition that is then run through a series of tests. Initially, the tests fail, showing a red box. But as the student solves more parts of the problem, more of the boxes turn green. This process provides a great preview of an effective real development technique: Start your project by writing tests and then make your code pass those tests, one by one.
Although coding games can be excellent practice, deeper benefits come with choosing and completing a project in your chosen language or framework.
Project-Based Learning: Play by Another Name
The form of play that most developers are good at and familiar with is the learning project: an initial project such as a web app that allows them to learn or advance their skills in a new technology.
Simple project types that are available in multiple languages can form a kind of Rosetta Stone, helping developers familiar with one language use that knowledge to learn another. TodoMVC, for instance, helps you select a Model View Controller framework by maintaining versions of a simple Todo application implemented in a multitude of languages.
The most successful web frameworks have easy-to-follow tutorials that help new developers to get up and running in as little time as possible. By building minimal web apps, these tutorials get developers to the point where they're able to play—to try things out—as soon as possible. Some of my favorites include Meteor's tutorial, the Rails Guides, and the Flask tutorial. Each tutorial does a great job of walking new developers through the process of building a basic project, illustrating the neat things that the framework can do, and encouraging the developer to imagine.
You can treat these projects like playing in several ways, as you build to learn frameworks.
Making Projects More Playful
Many developers instinctively begin with a test project to learn new technologies. Whether you do this or not, approaching a learning project playfully can supercharge its benefits for you.
Think of how children play together: The rules are loosely defined and sometimes made up as the game goes along. Everyone has a general sense of what "doing better" or "winning" means within the game, so the play has direction. When play is open-ended and fun enough, it can essentially continue indefinitely.
You might already see how these elements fit into a successful learning project, especially if you've previously had fun with such a project. I suggest incorporating these elements of play:
- Keeping score—better/worse or winning/losing
One additional aspect to consider is that many games naturally have an audience, and you should bring other people into your learning projects as best you can. When learning, it's sometimes uncomfortable to think of other people using your fledgling creation. But all great software is developed with a user clearly in mind. Think about your product's users as you develop the technology, and treat each project as a "game" that users can play.
Plenty of example projects are available, from blog posts to videos to programming cookbooks. How should you choose?
The Ultimate in Playful Learning: Building Games
Approached playfully, any project can be fun, but building an actual game can sometimes be the best way to get the benefits of playful learning.
It's easy to be playful with a game—they're supposed to be fun! While you're thinking about the user experience of the game, it's easy to connect the new skills and concepts you're learning to something that genuinely interests you. This is exactly the mechanism of play in learning: providing an authentic motivation for learning (and remembering) how the pieces "stick together."
This technique is also incredibly versatile. In addition to learning a new language or framework, you can use what you're learning to explore a new paradigm, such as functional or object-oriented programming within a language you already know. Or you could structure your games project to revolve around a new technology you're interested in using, such as WebGL. For example, developer Minh Tran wrote Jinteki.net, a clone of the card game Netrunner, in ClojureScript, in part to get a deeper familiarity with the language.
Experts in coding education have taken note. Online coding school Bloc.io, for instance, uses its online Ruby Warrior game to engage potential students. CodeCombat has gone even further, using gaming as a product that teaches students the basics of programming. CodeCombat has "gamified" the process, but part of the work students do is help to build the game around themselves.
Tips for Building Games
If you've tried the projects and gamification suggestions I've mentioned and now you want to take the next step, building your own game, begin by finding a game framework such as Pygame, which supports the common user-interface themes you'll need in your game. The online textbook Invent with Python is another excellent place to start.
Once you've chosen a framework, here are my top three tips:
- Start small and build up. When you're just starting, think of your code like game sketches—quick ideas-in-code that help you to evaluate key aspects of your game. After you make several such sketches, you'll be able to identify the most engaging elements of what you've built, and then you can build on those for your full game. Thinking of code blocks as rough sketches also can help with writer's block.
- Identify a core mechanic that's fun. Is your core mechanic collecting resources or points? Avoiding bad guys? Solving a puzzle? This simple mechanic should be at least mildly interesting without the whiz-bang of graphics or a full interface. Once you've identified this core mechanic of fun and interest, accentuate it and build your game around it.
- Break the mechanic. This is the hidden reason we love games: We get to break the rules. Power-ups, level-ups, and special characters all let us bend or break the rules of the game. Think of the Star in Super Mario brothers. Suddenly, Mario is not only invincible; he wants to run into monsters instead of avoiding them. How can your game allow the user to bend the rules?
Speaking of breaking or bending the rules, make sure you do a little of that while you're learning! Fun and genuine excitement are fuel that the brain uses to learn new things. The more you're able to incorporate fun and excitement into your technical training, the more effective that training will be, and the more you'll enjoy the process!