At present, there is a general consensus on the nature of learning programming, but there are different opinions on what forms an effective environment for it. It is generally recognized that the development of a mental model is a formidable task for the student and that learning programming is a complex activity that depends heavily on metacognitive skills. This book, based on a NATO workshop, presents both pure cognitive models and experimental learning environments, and discusses what characteristics can make a learning model effective, especially in relation to the learning environment (natural or computerized). The papers cover cognitive models related to different aspects of programming, classes of learners, and types of environment, and are organized in three groups: theoretical and empirical studies on understanding programming, environments for learning programming, and learning programming in school environments. Comprehension, design, construction, testing, debugging, and verification are recognized as interdependent skills, which require complicated analysis and may develop independently, and in different orders, in novices. This book shows that there is unlikely to be a single path from novice to expert and that the structure of the final product (the program) may not constrain the process by which it comes into being as much as some would advocate.