This research project examines how students learn computer programming, and applies that information to develop a programming language and development tools that are better suited to learning than currently popular languages and tools.
Among the most popular languages used for introductory programming courses are C++, Pascal, Java, and Ada. All four languages have complex syntax rules--rules that take time to learn and understand. An introductory programming class must therefore exchange time spent learning concepts for time spent learning syntax. Introductory programming classes that use languages with simpler syntax--such as Scheme or Smalltalk--are less common.
The first step of my research project is to test the impact of programming language on learning in the introductory programming classroom. For the experiment, I will design a 10-week class that teaches the same material using different languages (suitably adapted for the peculiarities of each language), most likely, C, Java, Scheme, and Smalltalk. (C is on the list because Oregon State University's introductory programming class uses C, and I teach that class. I have the class material for C, and I will adapt the material for the other languages.)
I hope to design the experimental classes so the students will be able to progress to the next class in the introductory programming sequence. Students will be given a choice whether to participate in the experiment or take the traditional, non-experimental introductory class. Students who elect to participate will be divided randomly among the experimental classes. The experimental classes will take place concurrently in each of the three terms in the academic year. About 300 students sign up for the introductory class each term. Assuming about half agree to participate in the experimental program, that puts about 30 to 40 students in each experimental class per term.
At the beginning and end of each term, the students will be given a language-independent test of computer science concepts. The students will also be followed through the remainder of the introductory programming sequence to measure their performance.
From this experiment, I hope to show that language plays an important role in how much a student learns in an introductory class. Through structured interviews, I hope to discover what aspects of those languages were most helpful for students and what hindered learning the most. Based on what I learn, I plan on developing a new programming language that is better suited for learning the basics of computer programming.
An additional aspect of creating a new language is that the new language can avoid pitfalls of older languages that make them difficult for the visually impaired (e.g., using symbols that do not exist in the Braille character set), or languages that are inherently US-centric (e.g., identifiers cannot use accented letters).
Programming languages and tools cannot be separated. The tools greatly affect how students learn the language and concepts. Tools that treat a program as a black box encourage blind experiments. Like a lab rat pressing a lever and hoping for a food pellet, the student tries different symbols and programming constructs without a full understanding of what those symbols do. Sometimes, the program delivers a food pellet, and sometimes it doesn't. Tools that expose the inner workings of the program and let the student manipulate the variables, functions, and other program entities in a concrete manner can help the student experiment constructively.
Given a new programming language, the next step is to develop the programming tools for that language. One of the difficulties of the first part of this project is that the language and tools are inextricably mixed, but that can also be an advantage. The structured interviews can reveal where the tools aid learning.
The emphasis of the programming tool will be visualization of a running program. Beginning students often have difficulty with the abstract nature of programming. The tool will give these students an opportunity to experiment in a concrete fashion with programs and the constituent parts.
Additional experimental courses will compare student learning with the new language and tools, new language with other tools, and traditional languages.
The best language and tools help no one without an effective course and curriculum. Many beginning students work with computer programs at a concrete level (using the terminology of Piaget). To be effective at computer programming, they must progress to formal reasoning. All students progress at their own pace, but the tools and course work can help. Students progress to formal reasoning through self-regulation: running into areas where concrete reasoning fails, examining the situation, and deriving new models to incorporate the new data. Students must be able to explore in a safe, but fairly unrestricted environment to satisfy their curiosity and their need to resolve paradoxes in the old models.
Organized research can identify more areas where students have difficulties, and can identify in greater detail the nature of these difficulties. That information will be important for designing the new language and programming environment. Integral with the effort to develop the language and the programming tool will be a parallel effort to devise lab exercises that use the language and environment effectively. The exercises will be self-directed labs, suitable for use in open labs, delivered over the World Wide Web, or used in self-paced closed labs.
I have not yet explored in depth which aspects of this research project have been covered by others. If someone else has already studied the relationship between programming language and learning, for example, I might be able to capitalize of that prior research. Many people have strongly held opinions in this area, but so far, I have not found any formal studies.
Lots of work on program animation and visualization has taken place. I need to sift through it all to find out about links between visualization and learning.
Lots of research in science education addresses the development of formal reasoning and constructivism. Some of that research applies to computer science education, and some CS education researchers have started applying that research.
Much of what I read about introductory computer programming does not focus on the first programming class, but instead looks at the introductory computer science class (CS1). Students usually have programming experience when they take CS1. My research focuses explicitly on students who have absolutely no prior programming experience. Some people call this class CS0. Some write about CS1 as though students come into the class without programming experience, but looking at the class material reveals an implicit assumption that students already understand the fundamental concepts of variables, functions, statements, and so on.
I am currently an instructor at Oregon State University, teaching introductory computer programming. I plan on enrolling at OSU as a graduate student to pursue the research described above. Clearly, the entire project is too big for one person to tackle in a realistic time frame. I will pick an aspect of this research project that is appropriate for a Ph.D. degree.
Over the past three years, I have been developing course material that encourages individual exploration in an open lab environment. I have started development of a language-independent concept test. I plan to continue this work, but applying it to the new language and tools.