I discovered this idea late.

In chasing an ideal world, goals of a programming system should be:

  • to support and encourage powerful ways of thinking
  • to enable programmers to see and understand the execution of their programs

Programmers must be able to read the vocabulary, follow the flow, and see the state. Programmers have to create by reacting and create by abstracting. Assume that these are requirements. Given these requirements, how do we redesign programming?

Rather than acting cool according to what’s fashionable to program with now, the author presented some concrete criteria on what makes a good programming tool.

Does the environment allow the learner to…

  • read the vocabulary? — Is meaning transparent? Is meaning explained in context, by showing and telling?
  • follow the flow? — Is time visible and tangible? At all meaningful granularities?
  • see the state? — Does the environment show the data? Show comparisons? Is hidden state eliminated?
  • create by reacting? — Is something on screen as soon as possible? Is the parts bucket on the floor?
  • create by abstracting? — Can the programmer start concrete, then generalize?

Does the language provide…

  • identity and metaphor? — Is the computer’s world connected to the programmer’s world?
  • decomposition? — Can the programmer break down her thoughts into mind-sized pieces?
  • recomposition? — Can the programmer put diverse pieces together?
  • readability? — Is meaning transparent?