Notional machines
what does it mean to learn a programming language and runtime environment?
One workable answer is to learn a "notional machine".
Just a fancy way of saying that you are comfortable using words and diagrams to explain what is happening inside of the computer at any point in your program's execution. A series of
  • visualizations
  • diagrams
  • refactoring techniques
  • vocabulary
That are accurate but manageable; correct enough that you can use them to predict program state, debug your projects, and accurately translate between diagrams & code. But not so precise that you get lost in low-level implementation. An important feature of a notional machine is that they are not built on overly-familiar analogies. It should build new intuitions based on how teh programming language actually work, instead of building on old intuitions from elsewhere in life that sort-of work like the programming language.
An easy danger when teaching programming is relying too heavily on approachable analogies that are not quite correct. This is especially dangerous because programming languages & computers are not like other things students have learned before. An intuitions built off of previous experience can be misleading and can lead to un-learning later on.
Using a common set of visualization tools, and correct vocabulary from day 1 is super important. Building up a shared and correct understanding is only realistic when you, your peers and your coaches all discuss the same visuals with the same vocabulary.

Topic Applied

A tricky part of teaching with notional machines is related to rule #6 from​
  1. 1.
    Never hesitate to sacrifice truth for clarity.
This is a fine line to walk. On one hand an approachable analogy is the definition of sacrificing truth for clarity. On the other hand, a misleading analogy will lead to less clarity in the future when a student learns something about their language that does not fit with the analogy they learned before.

Topic Applied to JavaScript

Fortunately JavaScript has a couple tools that help you to teach a JS notional machine, and more importantly allow students to continue developing theirs while not in class:
  • ​JS Tutor (everything synchronous and on the callstack)
  • ​Loupe (the event loop)
  • ​Promisees (promises)
Copy link
On this page
Topic Applied
Topic Applied to JavaScript