As I explored in a previous post, I see learning programming as four layers of skills:
- Syntax skills and programming concepts – how to read and write a programming language and the core concepts behind how the language works.
- Programmatic thinking skills – how to think like a computer and translate a process into a specific set of instructions that a computer can understand.
- Creative skills – how to figure out an answer when it’s not obvious what it should be, how to go from a rough draft to a final draft with all the bumps and detours in between.
- Interdisciplinary skills – understanding and borrowing from other fields to enrich our own programming practice and the things we make.
When learning how to code, the go-to approach for learning resource is the venerable tutorial: a hands-on, step-by-step guided experience intended to introduce and illustrate skills and concepts. The programming tutorial is an essential and effective part of learning how to code. Generations of developers have used them and gained skills and experience along the way.
Tutorials are powerful resources for introducing the first layer of programming skills, syntax skills and programming concepts. They’re especially great for showing how those concepts work together in a complete, well-organized system. They also provide some examples of programmatic thinking in action, which may help students learn those skills.
However, tutorials are not a good resource for learning the third layer, creative skills. The ability to write code from scratch requires a specific skillset, and step-by-step tutorials don’t provide an opportunity to practice that skillset. The majority of tutorials demonstrate pre-written high quality solutions, not the messy, creative, Google-search filled process of writing code to accomplish a specific task when you don’t have a solution provided for you.
Tutorials are also not great at reinforcing skills. They are designed to introduce a new skill or concept and provide an initial practice experience, not to provide opportunities to repeat that skill or concept over and over in different contexts until it sticks, which is an important step in the learning process.
This can create a frustrating experience for new developers. Because tutorials are relied upon heavily, it’s tempting to think that once you’ve completed a tutorial, you should have everything you need to start building things. And for teachers, it can be tempting to think that if you give a student a tutorial, that should be enough for them to have learned what they need to learn. But tutorials don’t necessarily cover the entire range of skills needed to be a developer. Students need resources that can provide practice in all four layers of programming skills. Tutorials are an essential part of that, but the tools we use to teach programming need to expand and deepen to support all skill areas.
A well-balanced learning approach might include experiences categorized as lessons, exercises, and projects:
Lessons are designed to introduce new material for the first time through demonstration or interactive exploration. A tutorial is an example of one type of effective lesson, but lessons can come in a wide range of formats (see Explorable Explanations). Ideally lessons not only introduce new material, but also provide examples of creative problem solving and programmatic thinking in action in the way they are presented.
Exercises are designed to reinforce specific bite-sized skills or concepts in a quick, focused way. Exercises are repeatable, numerous, focused on a specific skill, and often grouped into sets of increasing difficulty or complexity. In a balanced learning plan, once a skill or concept has been introduced through a lesson, it should be reinforced using exercises to build deeper understanding of the skill, concept, and syntax, and also as a way to practice programmatic problem solving and creative skills.
Projects are a student-guided experience that integrate all of the skill layers and are the main driver of motivation and curiosity to learn more. Projects are defined by an idea for a thing you want to make, and a plan for making it. The key is that it’s a thing you’re personally interested in or curious about. There’s a strong argument that the key to learning is just to make a lot of projects, and in many ways that’s true—working on projects you’re personally interested in is a great motivator and guides the learning process (in other words, just build websites!). I think it’s even better when those projects are supported by an infrastructure of thoughtful lessons and exercises.
Projects are where the glue between all of the different skills is added to make them into a cohesive skillset, and where you learn the higher level skills that are hard to identify and practice through lessons and exercises. If you’re learning on your own, one of the best things you can do with a project is look for a mentor to give you feedback on it as you work on it. This is invaluable to improve and integrate all of the skills and get the extra layer of polish that deepens your understanding. If you don’t know anyone who could serve as a mentor, this might be a good time to start getting involved with and online or offline developer community in any way that you feel comfortable. Meetups, Slack groups, and other online communities are most often very welcoming to learners because they’re all learning too!
In this balanced learning plan, tutorials are used as lessons that introduce new material, but they are combined with exercise sets and independent projects to round out and integrate all of the skills. If you’re a student or learning something new, keep these tools in mind and make sure you have a good mix of them. If you’re a teacher, consider how these tools fit into the curriculum to get the best results for students. If you have any thoughts or comments on this, please let me know on Twitter or in my inbox! I’m very interested in your perspective.
Late Night Code Club Newsletter
It’s midnight. You’re huddled in the restricted section of the library, eyes glued to powerful tomes—Creating Killer Websites! Resilient Web Design! The Pragmatic Programmer! You get a missive from your co-conspirators in the Late Night Code Club—another night of adventurous learning is about to begin.
If you enjoyed this post and want to read more like it, I’d like to invite you to join the Late Night Code Club by signing up for the newsletter—it’s a programming education newsletter all about learning and teaching programming. We’re exploring new approaches to learning and teaching, code as a creative practice, and programming as part of an interdisciplinary education. In each newsletter you’ll receive updates about new posts as well as other resources and ideas all about learning programming! It’ll be short, interesting, and encouraging for learners and teachers. See you there!