There is an interesting paradox in teaching: the better you know a subject, the harder it is to talk to beginners. Experience means you have forgotten what tripped you up when you were a beginner.
Consider typing. Or division. Or even reading this sentence. Easy now, right? Looking back, it's hard to remember why they were hard. Looking back, the stumbling blocks are invisible.
Let's consider a sophisticated concept you know and love: variables.
Variables are so fundamental that it is impossible to write useful code without them. I bet you think about them about as much as you think about breathing. But they weren't always that easy. Consider the following code:
>>> myValue = 5
>>> myValue + 3
What will this third command print? The answer is 5, but many beginners will say "8."
Why? Most misconceptions are the brain enthusiastically applying previous knowledge to new situations. If you can figure out what rules and knowledge your students are bringing to the table, you can start to anticipate their misconceptions and design lessons and error messages accordingly.
For example, in basic arithmetic, adding two numbers yields a third number. It is not at all obvious to students that addition does not come bundled with assignment. And from your perspective this is an invisible stumbling block, because this is knowledge you know so well you didn't even remember it was there to be learned.
Before we go on, take a moment to write down everything you know about variables, or know how to do with variables. Try to state the "obvious."
Nice! Now check your list against this one and see if there are any invisible stumbling blocks missing from your list. (The specific bullet points will, of course, depend on the programming language you have in mind, but the purpose of this list is to help you spot invisible concepts.)
- why they are so hugely important for writing software
- how to change the value of a variable
- how to perform operations on a variable without changing its value
- how to check the value of a variable, both on the interpreter and in a script (crucial for debugging)
- variables can store any data type, including strings, objects, and in some languages, functions
- variables can refer to other variables
- multiple variables can point to the same thing
- variables can have no value, or an undefined value, and this is different from a value of '0' or ""
- changing the name, and even capitalization, means a totally different variable to the interpreter.
Want more practice? Try unpacking some other "obvious" concepts, like printing (with a printer, right?), strings (let's make a sweater), and functions (this is a hard one—make sure to practice on a real human).
Crucially important note: this does not mean that you should try to explain all of these things to a beginner, but it is very important to remember that they exist so you don't blithely run your students over rough terrain.
So how can you help students around these stumbling blocks?
1) State the "obvious." It's only obvious once you already know it.
2) Plan to spend 2x-4x more time on the basics than you think students will need. Regardless of the elegance of the explanation, students need time to wrap their heads around new concepts.
3) Iterate on feedback. Put your lesson in front of students and ask them to think out loud as they take it. Asking probing questions will help you uncover their misconceptions, but don't jump in with explanations. Tweak your lessons, then rinse and repeat.
Share your thoughts and collaborate with other teachers and course creators in our course creator forum.
Thanks to E.O. Stinson and Kyle Conroy for their insightful draft feedback.