Is there is a potential crisis in the teaching of computer programming in many universities?.

The government target for 50 per cent of all 17 - 30 year olds to be participating in higher education by 2010 has led to an increase in the number of applicants applying to study computing in universities over the past 10 years. Consequently, the range of ability and previous subject knowledge of applicants has widened considerably during this period.

Higher education is now an extremely competitive market, and to compete effectively many university computing departments now offer a broad range of diverse computing pathways with introductory courses that require little or no previous specific subject study or knowledge.

Computer programming is an essential core theme in most computing courses and as a result many computing departments have had to reflect upon what is now appropriate subject content for introductory programming modules. Additionally, how programming modules are delivered and assessed are having to be re-evaluated.

Historically, research suggests that students have always found computer programming difficult; the abstract nature of programming involving problem solving and logical thinking requires a certain aptitude, and the necessary skills and disciplines are not always easy to learn and execute.

Even students who are bright and successful in other areas of study often struggle to grasp the basics of programming, and this has traditionally led to higher than average failure and drop-out rates. Many students end up disillusioned and look for ways to avoid the subject later in the programme.

Modern programming paradigms, based upon the object-oriented programming (OOP) paradigm, and introduced in recent years, have additional complex concepts and constraints associated with them.

OOP languages such as Java and VB.NET are now widely used for teaching introductory programming modules in many universities. These place an additional cognitive burden on students over and above the already difficult programming principles associated with all programming languages.

Many students complain that they find it difficult to understand some of the complexities associated with object orientation. Trying to deal with these concepts at an early stage leads to having less time to focus on more fundamental principles and often results in students having a poorer understanding of the basics.

Add to this the need to include modern windows programming environments with graphics controls and event handling, and it all becomes too much for many students to handle; they simply cannot see the wood for the trees. 

If the principles of OOP are introduced too early it may lead to cognitive overload for some students resulting in confusion and disillusionment with the subject.

This additional complexity makes the problem of teaching contemporary programming at an introductory level even more acute and if not addressed is  likely to lead to even higher failure and drop-out rates in the early phases of computing programmes, with more students trying to avoid programming at all costs. 

Why is it that students find programming courses more difficult than they did in the past?

One reason is that the range of abilities of student cohorts has undoubtedly widened in recent years. Another is simply that OOP programming is more complex and difficult to understand. It has often been suggested that the difficulty in the teaching and understanding of a programming language can be seen by examining the complexity of the ubiquitous 'Hello World' program.

The 'Hello World' program illustrates the simplest form of human-computer interaction (HCI); it sends a text message from a computer program to the user, displayed on the screen. 'Hello World' will be familiar to many computer lecturers and students as it is considered to be the most basic of programs, and is normally used as the first program example in many undergraduate programming text books and introductory programming modules.

To illustrate the additional complexity of OOP consider as a simple metric the comparison of the program code for 'Hello World' written in Pascal, a language used in many universities to teach introductory programming in the past, and Java a contemporary OOP language widely used commercially and in universities today to teach programming.

PASCAL:
program HelloWorld
begin
   write ('Hello World')
end.

JAVA:
class Message
{
   public static void main (String args[ ])
   {
      Message helloWorld = new Message ( );
      helloWorld.printMessage ( );
   }
   void printMessage ( )
   {
      System.out.print ("Hello World");
   }
}

These two programs perform exactly the same function. It is not difficult to see that the early generation Pascal program is very simple and easy to understand, most students and even most ordinary adults would have no problem understanding what is going on.

The Java program on the other hand is much longer, uses a range of complex programming words, many of which have difficult concepts associated with their use, and is much more difficult to understand. Faced with this as their first exposure to the simplest of introductory programs it is not surprising that many students are overwhelmed and confused.

As an academic who has been involved in teaching programming in a new university for many years I have seen this problem steadily growing worse. If not addressed, the additional cognitive load associated with object orientation, and the wider and more varied backgrounds of contemporary student cohorts, may well lead to a potential crisis in the teaching of introductory programming modules. To avoid this potential crisis computing departments must re-evaluate the structure of programming courses and reflect upon the content of introductory modules.

In the computing department at Christ Church University we have adopted an 'objects later' approach to the teaching of programming. Introductory programming modules in the first year of the undergraduate B.Sc. in Computing are taught using VB.NET a modern windows-based OOP environment.

However the object orientation side of the programming language is de-emphasised and largely avoided leaving the students to concentrate upon the more important basic programming principles that are needed at this level. This allows students to rapidly develop impressive looking windows programs that utilise and illustrate these fundamental principles and which reinforces their understanding and stimulates their interest in the subject.

This is not to suggest that the important concepts associated with the OOP paradigm are to be avoided or ignored just because they are difficult. It is essential that universities teach using OOP languages as prospective employers expect computing students to have an understanding of them. It is suggested that the object orientation should be introduced and explained later in the programme when students have an understanding of the basics and are better equipped to deal with more complex programming concepts.

This approach has been tried now for a number of years and has been widely welcomed by staff and students and has resulted in improvements in attrition rates, with more students choosing programming options later in the programme. This approach may not be suitable for all computing programmes or universities to adopt, but it has certainly led to a more coherent and balanced programme for our students.

It is perhaps ironic that modern OOP paradigms, introduced in part as a solution to the original software crisis, may be the cause of a new software crisis in the teaching and understanding of programming in many universities.