Teaching computer science: a Neumont philosophy
Although there may be many areas where educators differ, most educators agree that when teaching Computer Science all things can and will change. Languages change, paradigms change, tools change, applications change -even students change. But more importantly, our knowledge of how to teach these topics will change as we try new teaching techniques and observe the results. In the past, introductory programming courses at Neumont University were taught with an approach that resembled the pedagogical approach we tool to teaching our advanced projects courses. The structure of the class included time to instruct students on new topics followed by a longer period of intense hands-on programming. Although this is an outstanding way to teach advanced programming classes, the time spent programming was a bit extreme for novices. During their first quarter at Neumont, students took Object Oriented Programming (OOP) for four hours each day. In that class, they were put through a rigorous pace, learning in ten weeks what would typically be covered in two or three semesters at a traditional university. This technique worked for students who came to Neumont with a strong background in programming, or for those with a natural aptitude, but it was not suitable for many of our less experienced students. In the fall of 2008, Neumont decided to modify our pedagogical approach to better serve a larger portion of our student body. This meant dividing an intense OOP curriculum into two more manageable courses. Neumont students now take Introduction to Computer Science (ICS) the first quarter and OOP the second quarter. Each class is two hours per day provides students the same amount of instruction time; but the material is now less compressed. This allows our students to work through difficult concepts in a less stressful environment; and gives more time outside of class to practice the concepts covered. Another change Neumont implemented is the language used. In the past, C# was taught in the OOP course at Neumont. The goal of the introductory programming classes at Neumont is to provide students with an understanding of an object-oriented (OO) approach. As a result, it is imperative that the material be taught in such a way as to enhance OO understanding. Now, students at Neumont will continue to learn multiple languages; but begin with Java rather than C#. Java is thought to be a more appropriate language for introductory programming courses for many reasons including its true object orientation, garbage collection, built-in documentation, single inheritance, and the list goes on. C# is another language that meets many of these requirements but is: “...more complex than Java and there is always a price for complexity. Every extra keyword, construct and control structure makes the language more difficult for a novice. One can teach a subset, but students are often dissatisfied with this approach.”[1] Java is also the required language at many traditional universities and at the high school level. Today’s Advanced Placement Program (AP) courses and tests currently require Java. As a result, most pedagogy and available teaching tools and text books written for introductory programming classes are written based on Java. [2]. Another consideration when planning a curriculum for introductory programming classes is pedagogy or the order in which materials is covered. In the Computer Science Course Description prepared by the College Board for the AP course and test, it is stated, “At most institutions, the current introductory programming course takes an object-oriented approach to programming that is based on encapsulating procedures and data and creating programs with interacting objects.”[3] Many programming classes begin by teaching students to write the “Hello World” program. This is a simple program that puts the words “Hello world” onto a screen. This is fine for a class that stresses a procedural approach. It adequately covers how to edit, compile, and run a program in the language being taught. However, if an OO approach is the goal, there are many reasons that this is not the best program to teach first. These problems include the fact that no objects are created, no methods are invoked, and the only class that is written has no reason to exist other than to hold the main method. A course taught using an OO approach should start with students writing a program that instantiates objects and then uses those objects to send messages back and forth with each object performing its own required actions. The problem is that, in order to start that way, students must first learn the following topics: • What is a class and how is it written? • What are instance variables and what does it mean to be public, private, etc.? • What are types and how are they used to declare variables? • How is a method written? How is a method called? • What is an object and how is it instantiated? • Possibly, how are parameters passed to and returned from method calls? • How to use built-in Input/output (IO) classes • What is the main method and what do the words public, static, void, String and [ ] mean? • How to edit, compile and run a program. This is a lot of material to cover before the first program is even written. So how would you start teaching a programming class? One thought is that the introductory class should begin by using simple tools specifically written for novice programmers. Selecting the Java language is a start, but there is more. Another ACM SIGSOFT Software Engineering Notes Page 1 November 2010 Volume 35 Number 1