Note: This is an essay I wrote for a class. It’s on a topic that I feel at least some passion for, and I hope you enjoy it. As for the citations, just look for the author’s names down at the bottom in the Works Cited section. I’m changing this from a Word document to a blog post, so there might be some hiccups along the way.
Abstract
Although personal computers have become everyday items in children’s lives very few children have learned anything about programming. And while programming has been reserved for the most technically-minded engineers in the past, its core concepts have the potential for helping students learn concepts in math, science, and other areas requiring analytical thinking. Recently, programming environments and languages have been developed with the goal of having a “low floor,” a “high ceiling,” and “wide-walls.” Two projects that have had considerable success in their endeavors are Scratch and Processing. While they are targeted at different audiences – Scratch for elementary school students and Processing for high school students and older – both have successfully introduced people to programming who otherwise couldn’t have overcome the barriers to programming.
Software Literacy
“The ability to ‘read’ a medium means you can access the materials and tools created by others. The ability to ‘write’ in a medium means you can generate materials and tools for others. You must have both to be literate.” (Kay)
It has been quite a few years since personal computers were introduced into the marketplace, and since the late 1970s, they have become a commonplace item across the country. While this generation of children and students have come to be known as “digital natives,” very few know much, if anything, about programming and the critical thinking concepts that make it up (Resnick, Maloney and Monroy-Hernandez).
Being able to quickly learn software and the ideas of how to write code have tremendous potential for helping students learn concepts in math, science, and other analytical thinking fields. But what characteristics must the tools we use to teach software literacy have in order to be most affective? It has been argued for years that programming languages should have a “low floor,” a “high ceiling,” and “wide-walls.” This triplet of characteristics means that the language should have a shallow learning curve, create increasingly complex projects, and accommodate a user’s various interests (Papert).
Meeting these three requirements has not been an easy task for tool and language developers. But two projects from MIT exemplify success in these three areas best: Scratch and Processing. Scratch teaches children age 8 – 16 programming concepts through a building block metaphor. Processing brings together a programming language, development environment, and teaching methodology to appeal to the visual design and electronic arts communities. Each of the tools has its strengths and weaknesses, but both appropriately serve their intended audiences.
A History of Computer Programmers
It’s not difficult to find a highly detailed timeline of the invention of programming languages, but what is to be said for the programmers developing in those languages? Looking at who programmers have been in the past and how they’ve changed over the past fifty years can give us insight into who the programmers of the future might be. The continuing evolution of who computer programmers are and how they are viewed by the public is best explained through the lens of the level of the languages the programmers used.
“Real” Programmers
The earliest programmers, or “real” programmers, are best characterized as the select few people in the 1940’s who understood how to operate the immense computers that filled the space of an entire room. They knew machine language, and poured their blood, sweat, and tears into writing it. Machine language is considered the lowest level language class, and it is the only language that a computer truly understands. These earliest programmers labored hard-wiring the switches and cables inside the machines with only the 0s and 1s that the machines could interpret (Lohr). Luckily, very few computer programmers still write any machine code.
1960’s Hacker Culture
The next phase of programmers moved from the cumbersome machine languages to a slightly higher level set called assembly languages. Assembly languages are one level of abstraction away from machine code and take advantage of human words like ‘add,’ ‘sub,’ and ‘mov.’ This abstraction allowed for many more people to learn how to program and bred a new group of people writing code not as their day job, but as a hobby. Some of these programmers, affectionately called “hackers,” were more enthusiasts than professional software engineers, but the results of their efforts are no less important. The World Wide Web and the Internet are both products of 1960s hacker culture. But while assembly languages were slightly less primitive than machine code, they were by no means simple to learn and understand.
Now and the Future
More recently, languages referred to as high level languages have spread as the most prevalent to code in. High level languages are strongly abstracted from machine code and, like assembly languages, must be translated back into machine code in order to be executed. This strong abstraction has allowed for people to teach themselves how to program. As a result, there are far more programmers today than existed even twenty years ago. And while most professional programmers still have a formal education in software development, the next logical step in the evolution of who programmers takes us to the general public.
Today, the software community is working towards the goal of universal software literacy. The hope is for programming knowledge to be commonplace and for ordinary people to understand how to conceive of a simple solution to a complex problem with the help of computers.
This shift of who a programmer is involves a similar advancement in the languages or software environments that these new programmers will write code in. We need languages further abstracted from machine code and syntax that more closely resembles human language to decrease the learning curve of programming and improve the readability of code. Even though software literacy for the general public seems like a lofty ambition, developments have already been made in this direction.
Scratch – the children’s programming language
Of all the programs that have attempted to introduce programming concepts to beginners, MIT’s Scratch has had the most success. Scratch is an interactive program rather than a syntax-based coding language; it employs building blocks to construct programs rather than relying on potentially confusing grammars. Developed by the Lifelong Kindergarten Group at the MIT Media Laboratory and released in 2007, Scratch was build with its specific core audience of children age 8 to 16 in mind (Maloney, Peppler and Kafai). The creators of Scratch knew that since computers had been introduced in the late 1970s, they had become everyday items in children’s lives, but that very few children have learned how to program. Knowing this, the Scratch team set out to build a program that satisfied the triplet of having low-floor/high-ceiling/wide-walls and appealed to children (Resnick, Maloney and Monroy-Hernandez).
Give It Meaning
Scratch’s users learn important mathematical and computational concepts, as well as how to think creatively, reason systematically, and work collaboratively. But how do they accomplish all of this without losing interest? By making sure that every aspect of the program gives meaning to the user’s work. Scratch does this in two ways: diversity and personalization.
Scratch is unlike many of its competitors because it has wide-walls and supports the creation of a diverse range of project types such as stories, games, and simulations. Scratch allows its users to make different kinds of programs as it is much more meaningful to work on a project that reflects one’s own interests. These programs reflect who each young creator is, as exemplified by Scratch’s built-in personalization features.
Scratch makes it easy for people to customize their programs by incorporating different media and allowing users to do things like import photos and record their own voices. Scratch succeeds in having both a low-floor and high-ceiling because kids can not only “develop abstract programs to do mindless things with a cat or a box, etc… but they could add their own pictures and their own voices to the Scratch environment. (Resnick, Maloney and Monroy-Hernandez)” When Scratchers build programs that are personally meaningful to them, they are more eager to learn mathematical and computational concepts that pertain to their projects (Resnick, Sowing the Seeds for a More Creative Society). How better to introduce the eighth-grade algebra concept of variables than to show a boy that a programming variable will let him keep track of how many points he has scored in the basketball game he programmed?
Make It Social
Once a child creates a Scratch program, she can share it on the Scratch web site in the same way that one would share a video on YouTube. The Scratch programming environment is tightly coupled with this sharing web site, and the 700,000+ projects that have been shared there are a testament to the vibrant community currently developing in Scratch. This website functions both as a location for viewing or collaborating on one another’s work and as a repository of material to learn new techniques and programming concepts from. Once a project has been uploaded to the sharing site, it can be run from in the browser, commented on or voted for, or downloaded for reverse-engineering by another Scratcher. Scratches share the same benefits as an open-source program like Scratch, namely that its users can keep learning from their peer’s discoveries.
The depth offered by Scratch is quite extraordinary considering the fact that it is merely an educational tool for very young children. It teaches concepts like conditional statements (“if” sometime is true, “then” do an action), iteration (going through each element in a list), parallel execution (multiple processes running simultaneously), and user input (keyboards, mice, etc.) in a manner that a 10-year-old can fully comprehend. Its replacement of a syntax and grammar-based language by a graphical user interface is wholly appropriate for the context of its use. But this veil of simplification must eventually be removed to reveal a more advanced, but hopefully not more confusing, development environment.
Processing – the electronic sketchbook
Processing was born from the idea of making a language that both gives visual expression to sophisticated forms of computation and acts as a teaching tool for those unfamiliar with computer programming (Maeda). Under the direction of renowned graphic designer John Maeda, Processing has been developed by MIT graduate students Casey Reas and Ben Fry since 2001. Processing’s syntax is a stripped down version of Java, which allows for a declined learning curve while preserving the power and flexibility of Java. Whereas Scratch is aimed at young children, Processing looks to serve an older, more educated audience of people in high school and older.
The intelligent development environment used by Processing is called the “sketchbook,” and all of the programs a user writes are referred to as “sketches.” While Processing is fully capable of generating full-featured software, its intention is much simpler than that. Reas and Fry want their users to sketch different renditions of what the finished product might be, much in the way that architects work with cardboard before building a skyscraper or musicians sit down with a piano before composing a concerto. Because Processing was created by people with primarily creative backgrounds, it breaks from the cycle of programmers making tools for programmers and “engages people with visual and spatial minds. (Reas and Fry)”
Programmers Teaching Artists Teaching Programmers
The two main audiences that come to Processing are artists and programmers, each with an interest in the other’s field of expertise. For both groups, Processing serves as an excellent jumping-off point from which one can explore other programming languages or creative theory. The variety of classes and workshops being offered at universities such as UCLA, MIT, and Hongik University in Seoul give evidence to Processing’s flexibility, with some classes approaching the language from a programmers point of view and others from an artist’s perspective.
As computers become more pervasive in the creative arts, programming skills increase in demand. One reason why so many people come to Processing and succeed in learning the concepts of programming through the language is because it embraces and is centered around artistic theory. In fact, the equivalent of a “Hello World” program given on the Processing learning web site is one line of code that draws a line. From there it moves on to giving the line a background and color (Fry and Reas).
A one-week workshop at Hongik University in 2003 brought together design and computer science students, and the interaction between the two groups illustrates Processing’s strengths in crossing over the two fields. When students without previous programming experience produced work that was visually complex but technically elementary, the computer science majors helped them understand more advanced programming techniques. And the inverse occurred with the students without any comprehension of basic design principles (Reas and Fry).
Conclusion
The concept of software literacy is not new. Ted Nelson wrote in 1974 that “the more you know about computers… the better your imagination can flow between the technicalities, can slide the parts together, can discern the spaces of what you would have these things do. (Nelson)” This is exactly the idea that Scratch and Processing are striving to further. Pushing programming onto unwilling students is not how software literacy will be accomplished. Rather, tightly coupling people’s interests with the manner in which programming is introduced to them makes them much more receptive to the ideas being presented. Also, we must not forget the reason for teaching programming concepts. The fact that educators are using coding as a gateway to many other critical thinking concepts is important; it betters education and expands how our minds conceive of solving problems.