Ist es sinnvoll alte Programmiersprachen zu lehren?

„Ist es denn sinnvoll, eine alte Programmiersprache in der Lehre zu verwenden?“ fragen immer wieder Mitarbeitern und Studierende.

Bei uns werden Java und SML in der Lehre verwendet. Der Kern von Java entstand von 1991 bis 1992 (unter den Namen Oak für „Objekt Application Kernel“), die Alpha-Version 1995, die Version 1.0 1996. Somit ist Java 17 bis 22 Jahre alt. SML  (oder Standard ML) wurde zwischen 1984 und 1988 entwickelt und 1990 formalisiert. 1997 erhielt SML ihre Bibliothek. Somit ist SML 20 bis 30 Jahre alt. Programmiersprachen, die vor mehr als 15 Jahre entstanden sind, sind sicherlich als alt anzusehen.

Die Frage, meine ich, ist nicht so sehr, ob eine in der Lehre verwendete Programmiersprache alt ist, sondern ob sie für die Lehre geeignet ist. Geeignet für die Lehre ist eine Programmiersprache, die das Lernen von Kernkonzepten der Programmierung erleichtert. Dafür muss die Sprache ausreichend reif sein. Sehr junge Programmiersprachen enthalten sehr interessante neue Konzepte, die allerdings oft nicht ausreichend ausgereift sind: Die Syntax kann schwierig sein, die Konzepte unnötig eingeschränkt. Oft enthalten junge Programmiersprache Konzepte, die sich nicht etablieren, also, die nicht dauerhaft übernommen werden. Solche Sprachen in der Lehre insbesondere in Einführungen in die Programmierung zu verwenden, wäre für die meisten Studierenden eine Herausforderung.

Die Frage stellt sich aber andauernd, ob die bisher zur Einführung in die Programmierung verwendeten Programmiersprachen noch zeitgemäß sind. Einiges spricht den Erhalt von Java und SML, einiges dagegen.

Für die weitere Verwendung von Java spricht … der allgemeiner Brauch an Hochschulen und die breite Verwendung von Java in der beruflichen Praxis. Für die weitere Verwendung von SML spricht, dass die Alternative wohl Haskell wäre. Da aber Haskell verzögert auswertet, halten sie viele für unpassend als erste funktionale Sprache.

Einige Hochschulen verwenden Scala nicht nur, um in die Funktionale Programmierung einzuführen, sondern auch als Einstige in Java. Dieser Ansatz (erst Scala, dann Java) erscheint mir sehr sinnvoll und zeitgemäß. Andere Hochschulen führen schnell in Grundkonzepte ein, dann in die (meist etwas holprige) Umsetzung dieser Grundkonzepte in Programmiersprachen der Praxis wie etwa Python ein. Auch dieser Ansatz erscheint mir shr sinnvoll, wenn auch er erfordert, dass mehr als zwei Programmiersprachen gelehrt – und gelernt! – werden.

FB

13 Responses to “Ist es sinnvoll alte Programmiersprachen zu lehren?”

  1. Marianne sagt:

    Ich bin auch dafür SML durch den funktionalen Teil von Scala zu ersetzen, besonders da es viel bessere und zeitgemäßere Entwicklungsumgebungen für Scala gibt als für SML! Insbesondere gibt es mehr Auswahl.

    Außerdem kann man dann in der objektorientiert-imperativen Vorlesung weiterhin für geeignete Teilaufgaben funktionales Scala verwenden und für andere Teilaufgaben imperative Lösungen. Dann würde man auch nicht gleich alles wieder vergessen (was ich bei SML natürlich niemandem unterstellen möchte, aber ich wage zu bezweifeln, dass auch nur einer der Absolventen aus dem Stand noch ein korrektes SML Programm hinbekommt. Bei vielen dürfte nur noch eine vage Erinnerung übrig sein: „Jaja funktional, keine Variablen und irgendwie viel Rekursion und so..“)

    Überdies spricht nichts dagegen von Scala aus Java Bibliotheken einzubinden.

  2. FB sagt:

    @Marianne: Ich bezweifle, dass Programmierumgebungen nötig sind, wenn man die Grundkonzepte der Programmierung lernt. Um zum Beispiel eine endrekursive Funktion zu verfassen, die die Fibonacci-Zahlen berechnet, benötigt man überhaupt keine Programmierumgebung. Eine Programmierumgebung kann sogar beim Lernen stören, weil sie die Aufmerksamkeit auf Dinge lenkt, die zuerst irrelevant sind.

    Ein Bachelor-Studierender in Informatik muss einfach korrekte funktionale Programme, auch in SML, verfassen können. Sonst kann er jede Hoffnung begraben, als Informatik berufstätig zu sein. Es geht dabei nicht um SML und auch nicht um die funktionale Programmierung, sondern um die Fähigkeit, Abstraktionen der Programmierung zu lernen und umsetzen zu können. Wer das im Studium nicht kann, wird die Programmiersprachen nicht verwenden können, die in zwanzig oder dreizig Jahre verbreitet sein werden. Das muss man verstehen und unter unseren Studierenden propagieren. Tun wir das nicht, so handeln wir verantwortungslos.

  3. Marianne sagt:

    Zwingend nötig sind Entwicklungsumgebungen nie. Aber praktisch! Außerdem lernt man mit ihnen vermutlich insgesamt schneller, da man Fehler schon beim Schreiben von Programmen bemerkt.

    Ich mochte den Ansatz aus der Java Vorlesung, dass man zuerst zwei Wochen lang keine Entwicklungsumgebung benutzen darf, damit man versteht was hinter den Kulissen vor sich geht. Dann darf man einsetzen was man möchte, ein Informatiker sollte sich meiner Meinung früh daran gewöhnen sich in neue Umgebungen einzuarbeiten, zumal es dazu viel Material im Internet gibt, egal ob emacs oder eclipse oder etwas ganz anderes genommen wird.

    Wie oft habe ich SML für eigene Programme eingesetzt? Nicht oft oder sogar nie, ich erinnere mich nicht. Habe SML nichtmal mehr installiert.
    Wie oft verwende ich funktionales Scala? Immer wieder.

    Ich finde wir sollten durchaus auf den Spaßfaktor achten, denn wer Spaß bei etwas hat, der verwendet es freiwillig und lernt dabei viel mehr.

    Das heißt nicht, dass man alle zwei Jahre auf ein neues funktionales Pferd aufspringen sollte, aber ich denke langsam wäre es an der Zeit mal wieder einen Blick auf SML-Alternativen zu werfen. 🙂

  4. Steffen sagt:

    Als Konsequenz der Argumenten des originalen Beitrags sollte man also eine moderne (gepflegte) Implementierung einer alten Sprache wählen. Dem kann ich mich anschliessen.

    Scala ist eine sehr interessante Alternative, doch dann muss man die ProMo vor der EiP lehren – ansonsten würden die meisten Studenten in Scala dann doch nur imperativ programmieren. Sind wir gewillt, eine solche Umstellung durchzuführen?

    Eine moderne ML Implementierung zu wählen ist sicherlich die einfachste Möglichkeit, die Vorlesung zu modernisieren.

    Dem Argument gegen Haskell, die verzögerte Auswertung, kann ich mich nicht anschliessen – das ist nur ein Problem, wenn man zwanghaft imperativ Debuggen will. Für den Stoff der ProMo sollte das unerheblich sein.

    Ein Pluspunkt für Haskell ist dagegen, dass es inzwischen sehr einfache und sichere nebenläufige Programme ermöglicht (z.B. Par). Wenn man glaubt, dass Programme in Zukunft nebenläufig sein sollten, dann ist dass sicherlich ein Argument für Haskell. Auch gibt es für Haskell sehr viel gutes online Material zum Eigenstudium.

  5. FB sagt:

    @Steffen: Ich sehe es auch so. Haskell ist durchaus möglich (wenn auch man aufpassen müsste, dass die verzögerte Auswertung eine Belastung ist). Die Nebenläufigkeit ist sicherlich ein Argument, weil sie im Web-Zeitalter immer wichtiger wird. Scala als erste Sprache wäre sehr gut. Sicherlich besser als Java. Scala nach Java kommt nicht in Frage aus dem Grund, die Sie erwähnen.

  6. lars sagt:

    Wieso wird nicht als erste Programmiersprache C genommen ? Es ist eine einfache Sprache die ein sehr hohes Verständnis der Vorgänge erfordert. (Etwas was zB bei Java kaum der Fall ist, zumindest nicht zu Beginn.)
    Und falls C zu altbacken sein sollte gibt es neuerdings ja Go.

    Wieso wird Skala so gehypt ? Ist diese Sprache nicht mittlerweile viel zu komplex ? Ich habe sie selbst noch nicht benutzt aber es gibt durchaus Kritik an der Sprache. (zu komplex, inkonsistent, unbedeutend im Alltag)
    zB:
    http://www.danisch.de/blog/2011/05/15/kritik-an-der-programmiersprache-scala/

    Aus ähnlichem Grund würde auch niemand auf die Idee kommen C++ als erste Sprache zu wählen – obwohl es den Unterschied gibt dass C++ eine echte Anwendung hat.

    Haskell hätte als funktionale Sprache auch meine Stimme, da es wesentlich motivierender ist, eine moderne Sprache mit echten Anwendungen zu lernen. (Zumindest ist mir seitens SML nichts wichtiges bekannt)

  7. Wie wäre dies? Eine moderne SML-Variante, in einer akademischen Umgebung entstanden, mit vielen Materialien zum Selbststudium, vielen Routinebibliotheken und was sonst noch:

    http://ocaml.org/

    „OCaml is a general purpose industrial-strength programming language with an emphasis on expressiveness and safety. Developed for more than 20 years at Inria it benefits from one of the most advanced type systems and supports functional, imperative and object-oriented styles of programming.“

  8. skom sagt:

    Alte vs neue Sprachen spiegelt nur einen Grund zur Unzufriedenheit der Studenten. Ich kann mich an eine vorgetragene Unzufriedenheit, seit mehr als zwei Jahrzehnte errinern. Ein weiterer hier nicht artikulierter Grund zur Sorge ist die Praxisrelevanz besagter Sprachen. “Ist Haskell in der industiellen Praxis verwertbar? Sollte man nicht besser C++ lernen?” Die Frage als solche ist berechtigt, glaube ich. Die Antwort muss aber mehrere Aspekte abwegen. Z. B. soll die Sprache klein oder gross sein? Ich meine damit

    klein | gross
    ——————————–
    C | C++
    Pascal | Ada
    scheme | Common Lisp

    Sollen Materialien reichlich vorhanden sein oder nicht? Eine exotische neue Sprache wird kaum weiterfuehrende Texte haben. Wie wird man dann weiterfuehrende Vorlesungen halten? Eine kleine Sprache wird wohl eine kleine Community haben und im Web spaehrlich Antworten auf pragmatische Fragen und/oder Fragmente von Hausafgaben. Ist das ein Vorzug ode rein Nachteil? Es ist sicherlich ein Vorteil auf Code Corpora zugreifen zu koennen, um guten Stil zu erlernen aber Hausaufgaben sollten selbstaendig erledigt werden denke ich.
    Und diese Antworten nehmen an, dass man weiss wie alt eine Sprache ist! Was ist ueberhaupt eine Sprache? Fuer natueliche Sprachen hat man schon halb gewitzelt: “Eine Sprache ist ein Dialekt mit einer Armee und einer Marine.” In der heutigen Industrie Landschaft ist das equivalente von Armee und die Marine die juristische Abteilung. Ich mein das ziemlich ernst. Wenn man Java seit Oak Zeiten mit Java 7 identifiziert, dann ist das keine technische sondern eine juristische Aussage. Java v 0.9 waere dann eine kleine Sprache und Java 7 eine grosse. Was ich sagen will ist volgendes: Man kann fruehe Java Versionen relativ einfach erklaeren. Nach der Einfuehrung der Generics ist das nicht mehr so einfach. Sogar das Erklaeren vom Standart API ueber enum ist nicht mehr voellig trivial.

  9. FB sagt:

    @skom: Die Praxisrelevanz des Erlernten – auch der Programmierung – ist wichtig. Allerdings müssen im Studium zuerst und vor allem Konzepte der Programmierung gelernt werden, nicht Programmiersprachen der derzeitigen Berufspraxis. Erstens ändert sich die Berufspraxis schnell. Zweitens ist sie nicht einheitlich. Drittens sind Programmiersprache, die in der Berufspraxis häufig vorkommen, oft sehr schlecht, um Programmierkonzepte zu lernen.

    Der vielzitierter Spruch von Max Weinreich über Sprache hatte den Zweck klarzumachen, dass ein Dialekt genauso wertvoll wie eine Sprache ist. Seine Übertragung auf Programmiersprachen kann, meine ich, nur bedeuten, dass Programmiersprachen, die den Segen der Industriepraxis nicht bekommen haben, genauso wertvoll wie andere sind.

  10. skom sagt:

    @FB
    a) voellige Zustimmung! Besonders hervorheben wuerde ich den 3. Punkt. An der Uni sollte man den Vorgang der konzeptionellen Praegnanz geben. Ein Grund ist dass man sich Versatilität erhoft. Wichtiger noch (glaube ich) an der Uni sollte man wissenschaftliche Qualifikationen erlangen. Fuer pure Berufsausbildung gibt es andere Einrichtungen.

    b) meine Lesart: Der Unterschied kanonische Sprache – Dialekt ist eine politisch erzwungene, administrative Konvention. Insofern existiert keine inhaerente Wertzuweisung durch die Uebernahme in die Industriepraxis. Der wissenschafltichen infragestellung wuerde das nicht standhalten. Ebenso die Frage der Identitaet. Fruehes C# und C# 5.0 identisch waehrend OCaML und F# verschiedene Sprachen sind? Ich glaube dass Weinreichs Ironie darauf hindeutet, dass wissenschafltich keine Unterschied herleitbar ist.

    PS
    Ich mag nicht den besten Geschmack haben, aber in meiner Freizeit (oder waehrend eines Studiums) VB Haskell vorzuziehen wegen angeblicher Industrierelevanz das schaffe auch ich nicht. 🙂

  11. MGM sagt:

    Offensichtlich stellt sich bei Sprachen die sich über 20-30 Jahre etabliert haben, bereits die Frage ob es sinnvoll ist diese Sprachen noch zu lernen. Selbst knapp 20 Jahre alte Sprachen bleiben davon nicht verschont.
    Bei der dabei implizierten Halbwertszeit von Sprachen ergibt sich zusammen mit einer zu erwartenden Lebensarbeitszeit von etwa 40 Jahren, auch im „besten“ Fall für den Lernunwilligen, dass mindestens einmal „bei Null“ angefangen werden muss (every pun intended). Gäbe es „die Sprache“, die man in 35 Jahren können muss, gibt es sie heute noch nicht.

    Ich durfte vor Kurzem lernen wie sehr Programmiersprachen „in der Industrie“ austauschbar sind. Die Geschwindigkeit der Änderungen ist kaum haarsträubender als die Argumentationen die dazu führen. Insbesondere wer sich im Berufsleben in Projektarbeit wiederfindet ist entweder für immer SAP Berater oder beherrscht schnell fünf Programmier- und/oder Skriptsprachen. Weniger werden es im weiteren Verlauf nicht.

    Nach meinen Erfahrungen und Beobachtungen überwiegt auch „in der Industrie“ ganz klar die Fähigkeit sich mit Konzepten und Sprachen vertraut zu machen. Abgesehen davon ist jeglicher Einstieg in eine Sprache, den ein einzelnes Modul vermitteln kann(, muss und sollte), so oberflächlich, dass er zu vernachlässigen ist. Demnach, ist die einzig sinnvolle Diskussion die man bezüglich der Praxisrelevanz von Programmiersprachen in Lehre führen kann: Werde ich $SPRACHE im weiteren Verlauf meines Studiums einsetzen können? Dies gilt noch mindestens für Java.

  12. FB sagt:

    @MGM: Wer mit Scheme oder gar einen alten Lisp-Dialekt gut verstanden hat, was Funktionen höherer Ordnung u.a. map sind, wird gut verstehen können, was MAP-REDUCE und viel mehr ist. Gut ausgewählte alte Sprachen sind im Studium sinnvoller zu lernen als der Umgang mit Java-Programmbibliotheken.

  13. Robert Zydenbos sagt:

    Hier muss ich mit meinen Meinungen aufpassen, weil ich nicht vom Fach, sondern nur ein neugieriger Amateur bin, aber mir fallen folgende Gedanken ein:

    (a) Wer ist ,die Industrie‘? M.E. gibt es viele Industrien, und wie Bekannte mir erzählen, hat man in jeder individuellen Industrie eigene Vorlieben für diese oder jene Programmiersprache. Bekommt man einen Job in einer Firma, wo bisher alles in Modula-2 programmiert wurde, dann wird erwartet, dass der neu Angestellte die alten Programme in derselben Sprache weiterentwickelt (dies ist ein konkretes Beispiel, mir von einem Bekannten aus eigener Erfahrung berichtet). Gerede über ,die Industrie‘, als wäre sie ein monolithisches Block, scheint mir ziemlich sinnlos.

    (b) Eine Programmiersprache heißt nicht umsonst ,Sprache‘: sie hat eine Art von Lexemen / Wörtern (Befehle, Andeutungen von Datenstrukturen: konkrete Elemente) und eine Art von Grammatik (die Systematik, wie diese Elemente korrekt zu sinnvollen Abläufen zusammengefügt werden). Es schiene mir sinnvoll, am Anfang des Studiums die Studenten nicht mit allzu vielen Sprachen zu konfrontieren, sondern am besten nur eine oder zwei Sprachen zu benutzen, durch die die Studenten mit Programmierkonzepten und -modellen (objektorientiert, funktional,…) vertraut werden.

    (c) Während die Studenten studieren, eilen die konkreten Entwicklungen in ,der Industrie‘ weiter. Am Anfang des Studiums weiß man sowieso nicht, was ein paar Jahre später die Wünsche ,der Industrie‘ sein werden. Die Studiumabsolventen werden sowieso beim Eintritt in den Beruf einiges dazulernen müssen (s. auch oben, Punkt ,a‘).

    Deshalb schiene mir eine Sprache wie Ocaml geeignet, weil man objektorientiert oder funktional programmieren kann: in nur einer Sprache, und die Entfernung zu den älteren imperativen Wirth-Sprachen wie Pascal oder Modula-2 ist nicht groß.

Leave a Reply