Computer science curricula, programming languages, and minds

Posted on January 1st, 2006 by

Joel Spolsky recently posted some interesting musings about computer science education under the heading The Perils of JavaSchools. They make particularly interesting reading given the current configuration of our introductory computer science courses at Gustavus (now about 15 years old) and given that we’re slowly warming up for a discussion of whether we want to make any changes, and if so, in what direction.



  1. Milo Martin says:

    When I saw the Joel “On Software” Spolsky article, I thought of my good old GAC’s introductory computer science curriculum. I fondly recall my days in CSI/II learning Scheme back when they were called MC27/28 and we used the Structure and Interpretation of Computer Programs (SICP) textbook (before the genesis of Concrete Abstractions).

    I’m now a professor at Penn, and we have a two-course Java-based introductory course, but then we cover C in our “introduction to systems course” and use it extensively in our required operating systems course. Students are exposed to functional programming languages in a variety of electives, but they are not part of the core curriculum any longer. (In fact, Joel Spolsky’s article uses Penn’s CSE121 moving away from using a functional language toward Java as an example of this trend toward Java). However, I want to point that Penn is not a Java-only school (as the article implicitly labels it).

    So, what is the right language for teaching introductory courses? When work started on Concrete Abstractions over a decade ago, there were few good options for programming languages for introductory classes. Java did not exist, Python was in its infancy, and Pascal (the CompSci AP language at that time) was clearly heading on the way out. At the time, The choice was C/C++ (practical, but unfriendly and cumbersome) or some sort of functional programming language.

    However, I think things are different now. Java is in widespread use, and it is more friendly that C++. Thankfully, most of the schools that once taught C++ as a first language have migrated to teaching Java. However, Java’s popularity is a mixed blessing. A decade ago, it was expected that every CS
    major would know some C/C++. Today, I think new graduates are expected to know Java and still have some proficiently in C/C++. At Penn, we cover C pretty well (at least enough to give the students some understanding), but C++ isn’t really covered very well.

    Unfortunately, I don’t know of a introductory Java textbooks that are really an introduction to “computer science” rather than just “Java programming”. In my opinion, such a focus on the big-picture ideas of CS has always been the most important advantage of an approach like Concrete Abstractions and similar approaches. No matter what language is taught, teaching CS should be the primary focus (and not the specific language).

    In addition, use of scripting languages like Perl, Python, and PHP is increasingly common. Such languages are no longer glorified shell scrips, but substantial programming languages. In fact, I think that Python would make a great teaching language: it is widely used in the real-world (unlike Scheme or ML), it doesn’t force heavy object-oriented syntax or type system on users (unlike Java), and it inherits some Scheme-like programming styles involving lists, map(), and higher-order functions.

    I think a Python version of Concrete Abstractions would be very compelling. As Python has many similarities to Scheme (dynamic typing, first-order support for lists, arbitrary size integers, higher-order functions, and function generators). However, in contrast to Scheme, Python has regular assignment statements, traditional looping constructs, traditional procedure call syntax, built-in support for associative arrays, and a rich standard library. I know that Max is in the midst of writing and revising an OS textbook, so he probably doesn’t want to tackle another textbook project anytime soon, but “porting” Concrete Abstractions to Python would make for an interesting textbook that uses both a pragmatic language, but also can focus on the core CS concepts emphasized in such an approach…

  2. Antony Sargent says:

    I also fondly remember starting out at Gustavus with Scheme followed by C++ and then Java, and I think that experience left me well prepared both for my CS Master’s coursework and my programming career so far.

    My working experience has been primarily writing code for server based software, with a little windows desktop stuff also, using a mixture of C, C++, Perl, PHP, and Javascipt. It’s typically been consumer focused, performance sensitive, and using lots of open source components. One of the great benefits of running your application on an open source stack is that you can find and fix problems you encounter, or make improvments, in the layers underneath your code. A lot of important infrastructure such as web servers, databases, networking libraries, text indexing engines, and bindings to various system libraries, is still written in C or C++.

    Almost all of the Java desktop and server applications I’ve come into contact with have had serious problems either from a design, UI, or performance standpoint (or some combination of the three). I’m not sure whether the language itself is to blame, I’ve just had bad luck, or I’m biased by my particular work experience and the opinions of my peers who seem to generally dislike Java.

    I think Joel is right that to be a good programmer, it’s really important that you have learn to think at multiple levels of abstraction, and be forced to do hard thinking about tough problems. I don’t know how important the language you initially learn is, as long as you get a solid grounding in computer science concepts and are exposed to a few languages with different features. From there it isn’t too hard to pick up new ones.

    Milo, your comments and other things I’ve been reading lately prompted me to start learning Python, which I’ve enjoyed so far. Perhaps I’ll give Ruby a try as well.

    I’ve also been going back and taking a look at the introductory Scheme material from my Gustavus days. There are some really beautiful and elegant ways of expressing ideas in there, and it’s been a joy to look back upon that material from a new vantage point.

  3. max says:

    Naturally I was not only glad to read Antony’s comments as a whole, but also particularly touched that he enjoyed looking back over the introductory material (using Scheme) that he had first encountered at Gustavus. For anyone else wanting the same experience who hasn’t caught on to this fact yet: our book, Concrete Abstractions, is now available for free on the web.