IP

I believe that IP should be not just multi-language but multi-paradigm. The justifications for this primarily follow from Godel's theorem.

We computer scientists are so fascinated with Turing's completeness that we forget Godel's incompleteness which is the original and deeper result. I'll leave the details to (1) but here let me just summarise as follows: Turing says that all programming languages are the same, Godel says that they are different. Since Godel is so much closer to the programmer's experience we should stay with that rather than going for grand unifications All is One that are wildly out of sync with experience.

Programming pedagogy can be classified -- somewhat simplistically -- into two extreme positions: (a) Teaching programming means teaching the syntax of a programming language (b) Teaching prpgramming means teaching problem-solving/ algorithm-development. (a) is classically called bottom-up, (b) is called top-down.

Most programmers would accept that (a) is unacceptable. But (b) is equally unacceptable only more subtly so. To see that let us just see how a typical programmer spends his time. Yes he may start off by designing a solution to a problem but after that he will be keying-in, debugging, reorganizing, documenting, walking-through etc. etc. In effect the programming language (and more generally system) gives him a world in which he lives and breathes very much like a fish in water. And the problem-solving time is the small fraction of time he is out of the water. Sorry! Just as bottom-up syntax of a programming language does not constitute programming, neither does top-down problem-solving. What does?

A programming language is a formal system. If anything, these systems are only more formal and enormously bigger than the systems mathematicians deal with, nevertheless, they are formal systems.

Here we come to the nub of the matter. A C programmer may write syntactically correct C but what does he cogitate with?
Integers and their arithmetic -- fine (assuming he went to school),
Variables and assignment -- not so fine: what kind of beastie is x = x + 1?
Arrays -- Ok -- and Memory -- Hmmm...
Pointers -- Oh-Oh -- and memory faults -- Oh-f_ _ _!

A fun world to live in when one is an adult but boring and frightening for a kid.

And all the above is only about the language. When it comes to the system, again there are similar questions. A C programmer must think of .c and .h files, preprocessing, compiling and linking, main and make etc. whereas in an interpreted/scripting language, one can literally start programming before one writes programs (scripts).

In short, the choice of suitable of programming language is as critical to the future of a computer scientist as nutritious food is to the growth of a child. `Look', I will be told, `You are mixing up paradigm -- which is important -- with language -- which is only syntax.' : the classic folly of the top-downer.

This brings me to one of my deep concerns about curriculum design. We people, when framing curricula, arrogate to ourselves the role of philosophers. Is it not our duty to explicate and pass on at least some of this philosophy to students? If we dont will be producing programmers or programmed automata? This is not an idle rhetorical question. If we dont give philosophical understanding, we produce technicians, if we do we produce philosophers. How do we produce young men and women having a real capability to do as well as a capacity for reflection?

A related question is: Given a class of students in which a few seek genuine understanding and the majority seek only certificates/jobs, how do we ensure the justice of giving everyone what he asks for and not forcing wisdom down the throats of the unwilling?

The one-word answer is paradigm. The non-seeker will only see different programming languages. The seeker will see the languages as embodiments of different philosophies. The difficulty of course is for the teacher to dance so delicately that each one gets his own deserts without realising it.

I would suggest that in curriculum design, whether at the level of an individual course, a program like MSc or the dept as a whole, we should try to visualise the content at three levels: technology, science and philosophy.