October 2007 -- needs more about AgentSheet, Alice, Ruby, and Scratch
My ten year old daughter asked me to help her learn to program. It's not that she's interested in computer science, it's that she knows that programming is required to create games and other things that she has imagined. I investigated a multitude of languages / environments. The following is what I decided would be the best languages for instructing kids:
I decided that Squeak was best option for my daughter, especially using the ReadyPC environment from Squeak: Learning to Program with Robots and that it had an Alice like Wonderland environment. After we started, it has become clear that Alice is a better choice because she is more interested in storytelling than creating artifacts. There are also a number of other other noteworthy languages that I considered, but I rejected them for various reasons after a brief investigation. Others might find these languages useful for their needs.
Years ago I was inspired by the book Mindstorms which made the case to use computers as a tool for students to explore and learn rather than merely an automated tool for rout memorization or for teaching computer science. In the early 1990s I helped run some classes in Scheme and Logo that focused on discovery and creativity. I figured there had been a lot of advances in the last ten years. So I started by looking for projects which were not just teaching kids to program, but were using computers and programming to help kids explore the world around them. I guess I wasn't looking in the right places, because I had trouble findinga lot of people doing interesting things. I have recorded what I discovered in the additional information end the end of this document.
I spend some time trying to find what languages / environments and curriculum were being successfully used with kids. The rest of the document details what I found. For each language I have recorded my biased assessment of it's pedagogical value, small bit about the history of the language, educational material / practices I could find, a summary of possible implementations to use, and a list of additional resources. I believe the best environment would provide minimally:
Logo was designed from the ground up for use as a pedagogical tool and is very easy to learn. Most logo implementations provide a very friendly IDE. On the down side, there are no industrial strength logo implementations for large scale projects and the programming model is fairly simple. I would recommend logo for a very basic introduction to programming or for exploring mathematical principles, especially geometry. While more advanced computer science could be taught in logo, I would recommend using one of the other languages.
Logo originally designed at MIT in the early 1970s as a educational tool for children. Logo itself is a functional language which is normally implemented as an interpreter within an interactive environment. All logo implementations to my knowledge provide a read, interpreter, execute loop which allows the direct entry of expressions as well as the creation of functions and provide turtle graphics makes it extremely easy for kids to immediately gain visual feedback for the programs they create. Logo hasn't changed significantly over the years though a number of logo implementations have taken the 2d graphics "world" of turtle graphics to much richer "worlds" which support 3d graphics, animation, and/or music.
Through the 1980s logo was the premier language and environment for thoughtful education. There is a reasonable body of research, curriculum, and tools for someone wanting to use logo for instruction and exploration. There were a number of MIT-AI memos about logo. The Logo Foundation continued to generate educational resources as well as often workshops to help teachers better use logo in educational settings. Today, Logo is typically used as a tool to explore topics such as geometry rather than a way to teach "programming".
All of the web sites listed in the implementation section have links to resources for their specific implementation. At some point I might update this section with implementation neutral resources.
Squeak provides an extremely rich development environment. The down side of squeak is that the complex environment is fairly different from everything else. The Smalltalk language also uses a moderately complex syntax which is quite different from most other languages. So the learning curve is more than say scheme, and the learning invested into learning Smalltalk is unlikely to transfer to other languages. Even with the extra complexity I would recommend using Squeak to explore general topics, building multi-media projects, or creating simulations because the environments richness offsets it's idiosyncrasies. I would recommend using some other language if you want to focus primarily of computer science.
The Smalltalk family of languages that was developed at Xerox PARC. The original versions of Smalltalk was designed to teach younger children. Over time Smalltalk evolved into an extremely rich programming language and environment designed for professional programmers. Smalltalk is a purely object oriented language and the environment is also written in Smalltalk. The syntax is quite different from every popular language currently in use. Squeak is a version of Smalltalk which was developed to be a freely available multi-media environment. It's extremely powerful, complex, with a GUI interface which doesn't follow the native windowing system user interface guidelines. It is easy to change and evolve Smalltalk, yet little has been changed since 1980. Hopefully more people will start to work on Squeak and take it to the next level.
Squeak and tools built on top of squeak seems to have taken up the "premier educational tool" mantle from logo in the educational research community. There was a nice article/interview about squeak published in technos. Best best place to find information about using squeak for education will be found at Squeakland. If you click on "download" you will find a repackaged Squeak designed to make it easier for kids to get a good start by hide some of the environment's complexity.
Scheme is well suited for classic computer science education. The scheme language is clean and simple. I would recommend considering scheme for teaching computer science material because the student can focus on the core concepts they need to understand without spending a lot of time thinking about the language they are working in. Scheme can be used to explore more general topics, though logo or Squeak might be better choices for this sort of use.
Scheme is a language rooted in the Lisp community which was originally designed to explore Carl Hewitt's theory of actors as a computing model. [See Evolution of Lisp, see page 17-20 for a brief explanations of scheme's history]. Scheme has exceptionally clear and simple syntax and semantics making the language very quick to learn. You will find that the full description of scheme is very concise and extremely readable. Yet, scheme supports a wide variety of programming paradigms, including imperative, functional, and message passing styles. With additional libraries it is possible to explore object oriented, meta-object, and aspect orient approaches.
In the early 1980s scheme started to displace Pascal as the the language of choice for computer science education in progressive schools. For a short time I had hopes that Scheme might become the dominate instructional language, but that didn't happen. There are still numerous high schools and colleges that use scheme for instruction. There are several reasons why scheme is ideal for teaching introduction to computer science materials. There are several excellent college level textbooks for teaching computer science in scheme as well as a number trade texts. The two most popular texts these days seem to be:
Python is a clean language which are easy to learn. Python is popular in the real world for developing web oriented applications. Given many kids' desire to create cool web pages, there is a nature drive which can be harnessed for educational purposes in python. The downside of python is that there isn't a really great, kid friendly, IDE.
Python is a dynamic language designed for the creation of scripting and applications in a variety of domains. Python was built for working programmer, but due to the clean design, are well suited for educational uses. Python has a rich library and an extremely active community.
I don't know of any good instructional material designed to use python as a vehicle to explore the world or teach programming.
As far as I can tell, Java is the most language of choice for CS1 & CS2 in college and college prep curriculum. On the plus side, java has become a popular vocational language and has a rich and growing set of libraries. The downside is that there is a large learning curve, students typically end up focusing a large amount of time on learning the libraries rather than focused on creating unique / new code, and the develop/test/evaluate cycle is slow compared to the environments provides by most of the other languages in this list.
Java was original developed to be a working language industrial strength applications and operating systems incorporating features found in a number of languages and making up for some deficiencies found in C++. Java is the first language to win a large popular following which has a garbage collector, modules, a decent type system, exception handling, and a clean object system. Java is community used in industry for the creation of business applications. Java is often used for web based applications which require complex user interaction.
There are a wide variety of text books and curriculum for classic computer science education in Java, especially at the college level. Sometimes Karel the Robot or Alice are used at the beginning of a course to provide an easier framework for programming. Once the core concepts related to computing are understood, the students switch to using Java. I would strongly recommend starting students out with Karel or Alice if students have no past programming experience.
For a discussion about educational programming languages check out Don's Box discussion on teaching younger kids to program and lambda's follow-up. Some other idea can be found in kidsdomain list of programming languages and the Educational programming languages article on wikipedia. Microsoft has a "kid's oriented" coding4fun section of MSDN.
Schools with Interesting Looking Programs
Active Research Programs