The modern world has become increasingly computerized. Microprocessor computers emerged in the ’60s and ’70s, moving gradually from universities into workplaces, then more rapidly into schools, into homes, and eventually into consumers’ pockets. Mirroring the emergence of computers has been the increasing need to program these devices. However, computer programming is widely considered a hard skill to learn (Mendelsohn, Green, & Brna, 1990; Guzdial, 2002; Kelleher & Pausch, 2005). To overcome this difficulty—both perceptual and technical—researchers and educators developed new educational programming languages to introduce computer code to people of all ages (Mendelsohn et al., 1990). The history of programming education is a narrative of answering two central questions: “Why learn to program?” and “how to learn to program?” Over the past six decades, many solutions have been created to answer the latter question of how to help novices learn programming concepts (Brusilovsky, Calabrese, Hvorecky, Kouchnirenko, & Miller, 1997; Kelleher & Pausch, 2005; Bau, Gray, Kelleher, Sheldon, & Turbak, 2017). However, the question of “why learn to program,” which was central to early research in programming education (Mendelsohn et al., 1990), has shifted in prominence over time. In our increasingly digital world, there has been “a global push to broaden participation in computer science” (Bau et al., 2017, p. 72). Yet, before focusing on how to make programming accessible to everyone, “one of the first questions that must be answered is why novices need to program” (Kelleher & Pausch, 2005, p. 84). The evolving relationship between these two questions, “why learn to program” and “how to learn to program,” has impacted the development of programming education over the past six decades.
The earliest educational programming languages of the ’60s and ’70s sought to introduce learners to the cognitively rewarding world of logic and problem-solving. Seymour Papert, an educator and computer scientist at the Massachusetts Institute of Technology (MIT), believed that learning to program was a way for students to express themselves and “[debug] their own thinking” (Guzdial, 2002, p. 3). The idea that “a programming language is … a medium that creates new ways of dealing with existing knowledge” was shared by several researchers at the time (Mendelsohn et al., 1990, p. 179). By focusing on the cognitive benefits of programming, the mechanics of how to program were secondary to the reason for learning to program. Mendelsohn et al., in researching the early uses of educational programming languages, frame the question of “why learn to program?” as a contrast between the goals of “programming to learn, or learning to program” (p. 179). Logo, the first educational programming language developed by Papert, Feuzeig, and Solomon, was an example of programming to learn: it helped children make cognitive connections between computer code and problem-solving situations, and could be used to “explore a wide variety of topics from mathematics and science to language and music” (Kelleher & Pausch, 2005, p. 113). Through this perspective, the question of “why learn to program?” was a driving force for early educational programming languages, superseding the question of “how to learn to program.” In the following decades, as computers became more central to our lives and our society, their increasing economic importance shifted the emphasis placed on these two questions.
In the ’80s and ’90s, the narrative for learning to program changed from a cognitive experience to an economic imperative, and approaches to programming education became more visual and more varied. Programming was no longer “an activity practiced only by the few who had access to the still-rare machines” (Guzdial, 2002, p. 2). With computers now in homes, schools, and workplaces, there was a new interest in “making programming accessible to a larger number of people” (Kelleher & Pausch, 2005, p. 83). New careers in technology and software development placed increased importance on the tools available to teach programming concepts. New techniques, such as mini-languages, created a simplified syntax for the express purpose of introducing novices to programming (Brusilovsky et al., 1997). The question of “why learn to program?” was still present, but a more prominent focus was placed on not only “how to learn to program,” but how these learning-languages transferred to the general-purpose languages of the computer industry (Mendelsohn et al., 1990; Brusilovsky et al., 1997; Guizdal, 2002). Through a systematic study of over fifty programming languages for novices, Kelleher and Pausch (2005) identified two primary objectives: those that “teach programming for its own sake” (p. 84), and those that “empower their users to create interesting programs” (p. 112). With programming becoming economically important for new careers and new avenues of research, the initial idea of programming as a “mental gymnasium” (Mendelsohn et al., 1990, p. 175) fell out of favour, replaced with the increasing need to learn programming for the sake of programming. With the proliferation of the Internet over the next two decades, the focus on how to program became even more prevalent.
The worldwide explosion of the Internet since the ’90s has increased interest in making programming accessible to everyone, and the question of “how to learn to program” has taken centre stage. Endeavours such as Code.org’s Hour of Code have created hundreds of apps and activities to introduce programming concepts to students around the world (Bau et al., 2017). Scratch, developed by the MIT Media Lab, and a spiritual successor to Logo, represents a block-based language; the latest evolution of how to learn to program. Block-based languages aim to lower the barriers to programming by offering a graphical syntax—reducing the need to memorize programming functions—as well as by offering the ability to experiment with code and remix it on-screen (Kelleher & Pausch, 2005; Bau et al., 2017). Research shows that these block-based languages do make programming easier to learn (Bau et al., 2017). However, the answer to the original question, “why learn to program,” has now become: because computers are everywhere. There is a global push to teach computer science concepts in schools, and some researchers suggest that “programming is still not nearly as widely learned as it should be” (Bau et al., 2017, p. 78). Nevertheless, as educational apps proliferate in classrooms around the world, it is essential to look back on the history of programming education and consider the purpose of these apps. Are schools teaching programming to offer cognitively rewarding activities to expand their students’ understanding of the world, or are they teaching programming intending to produce future programmers?
The history of programming education since the ’60s has demonstrated incredible ingenuity in answering the question of “how to learn to program.” Yet, throughout these evolving tools and techniques, continuing to ask the question of “why learn to program?” is equally imperative. This question, which motivated the creation of the first educational programming languages, seeks to understand the cognitive benefits of learning about logic and computational thinking. Several researchers and educators who have studied educational programming languages agree that the purpose for learning to program is an area that requires additional research (Mendelsohn et al., 1990; Guzdial, 2002; Bau et al., 2017). In the future narrative of programming education, the questions of “why learn to program?” and “how to learn to program?” must go hand-in-hand. We would be doing a grave disservice to future learners by asking one question without the other.
Bau, D., Gray, J., Kelleher, C., Sheldon, J., & Turbak, F. (2017). Learnable programming: Blocks and beyond. Communications of the ACM, 60(6), 72–80. https://doi.org/10.1145/3015455
Brusilovsky, P., Calabrese, E., Hvorecky, J., Kouchnirenko, A., & Miller, P. (1997). Mini-languages: a way to learn programming principles. Education and Information Technologies, 2(1), 65–83. https://doi.org/10.1023/A:1018636507883
Guzdial, M. (2004). Programming environments for novices. Computer Science Education Research, 127–154.
History of computing. (n.d.). In Wikipedia. Retrieved October 9, 2019, from https://en.wikipedia.org/wiki/History_of_computing
Kelleher, C., & Pausch, R. (2005). Lowering the barriers to programming: A taxonomy of programming environments and languages for novice programmers. ACM Computing Surveys, 37(2), 83–137. https://doi.org/10.1145/1089733.1089734
Mendelsohn, P., Green, T. R. G., & Brna, P. (1990). Programming languages in education: The search for an easy start. Psychology of Programming, pp. 175–200. https://doi.org/10.1016/b978-0-12-350772-3.50016-1