Teaching Coding to Absolute Beginners
With every learning you do, there is additional learning that happens on how to learn and teach things. When you watch a course from a great teacher or listen to a talk by an exceptional speaker, you don't only receive what is being delivered. You inadvertently absorb how it is delivered as well. Learning coding by myself was an excellent education in how coding should be taught to absolute beginners. Self-teaching anything is an unintentional education in teaching, which is great because I have always wanted to become a teacher.
Luckily, my wish to become a teacher was granted when the college I went to in Canada asked me to become one of their part-time "professors." Colleges in Canada are similar to trade schools in some other countries. A lot of the teachers in these colleges are working professionals in their respective fields. Being a "professor" at a Canadian college doesn't require a pedagogical degree. Essentially, I was invited there to teach coding while learning how to teach coding myself.
I have spent five years teaching coding to absolute beginners in the Visual Effects (VFX) department. I have had a tough audience. They weren't there to learn to code as it didn't directly relate to the field they were studying for. Most of them were coming from an art background, so coding had bad connotations in their mind. I had some disadvantages as well. At one point, I changed careers to become a full-time programmer. I wasn't a VFX guy anymore. In fact, I didn't even care that much about VFX. But I was in love with coding. So I tried my best to get them to like it as well.
My learning journey and my experiences in teaching coding to absolute beginners made me incredibly opinionated in how it should be taught to beginners. Here are some of the principles that I abide by when I teach coding.
Not everything about a subject would be immediately relevant to you. In fact, you can go very far without knowing certain elementary things in a domain. For example, you could successfully drive a car for a long time without having any knowledge about how the engine works. It is not that the engine is irrelevant. It is just not immediately relevant. You can learn about it later.
Progressive Disclosure is an interaction design pattern where you gradually reveal an application's complexity. You might have also witnessed it in video games, where a tutorial will first try to get you comfortable with basic moves and gradually introduce more complex concepts. I deploy this in my teaching and always start with comprehensible, manageable, and applicable information at the level that the students are at.
There can be things about any domain that you don't even have to learn at all. There is a chemistry to how molecules interact with each other when you are cooking, but you can be an excellent chef without knowing anything about it. I am a programmer, but I don't know some of the most basic things about how a computer works. And sincerely, I am not interested in it either. I would hide a lot of complexity that doesn't have an immediate application when I teach to a beginner. Any student with an inclination can explore the intricacies of a given domain on their own once they establish the basics in it.
Coding is an intellectual endeavor, and there are things about it that are absorbing and interesting. I believe in hiding complexity, but I can't entirely agree with oversimplifying things. Imagine learning a new language and not being taught a single line of poetry or an expression. Where is the excitement in that? When I was learning to code, I would dwell in forums like Hacker News to see how programmers or technologists would communicate. Not everything they said made sense to me, but I was fascinated by the richness of the domain that would surface in their conversations. I think there is a certain beauty in details, and it should not be completely hidden.
Keep it Relevant and Inclusive
When I teach, I try to have applicable examples that are relevant to my target audience. I personally find it painful when I come across a coding exercise that is not applicable or so niche that I can't even bother to think about what is being discussed. Using Star Wars characters when teaching might be fun if your audience is into that universe but can be a barrier when they haven't seen the movies. It can be hard to find something that is going to speak to everyone, though. Having a lot of different types of examples can be helpful to have good coverage. You are risking alienating your audience when you base your examples and explanation on one kind of thing.
One thing at a time
If I am learning statistics and being taught about it over an example of baseball, that means there are now two new things for me to worry about. There are much simpler examples to draw from and keep it to teaching one complex thing at a time.
Make it Actionable
It would be tough to learn how to play poker by just reading about it. At some point, you need to practice your learnings to get better at it. Coding is like that too. You can read all about it but what you learn needs to be enforced by exercises and examples. It is tough to ensure that you learned anything until you put it into practice. It is funny how your illusion of comprehension can get shattered so quickly when faced with reality. That is a good thing, though. When learning something new, you would want to identify the gaps in your knowledge as fast as possible so you can fill them quickly.
Don't make any assumptions
I don't particularly like making any assumptions about what the students might already know. As someone new to coding, they might not know what a code editor, terminal, or programming library is. I try to be mindful of this and remember to include short explanations whenever that is relevant.
I am a self-taught programmer, so I get learning how to code can be so challenging. It has been a while since my complete beginner days, but I still remember the frustration I would feel when I came across a resource that didn't respect some of these principles. I made sure to write Awesome Coding, my book that teaches coding from scratch, with these ideas in mind.
I derived these principles from my experiences, so I would love to hear if they overlap with the formal pedagogical methods out there. Feel free to let me know at firstname.lastname@example.org!