Sind Programmiersprachen, die Studenten im Universitätsstudium lernen, für die Praxis relevant?


Hausarbeit von Markus Stengel
Universität Tübingen, Wintersemester 2001/2002

Anschrift: Markus Stengel
Herrenberger Str. 22, A318,
72070 Tübingen

Einleitung

Bei Klärung der Frage, ob die Programmierspracheni, die Informatikstudentenii während ihres Studiums an der Universität erlernen bzw. erlernen müssen für die Praxis relevant sind, muß zunächst geklärt werden, was relevant überhaupt bedeutet. Notwendig für private Projekte? Sinnvoll im Kontext der gesamten universitären Ausbildung? Voraussetzung für einen Arbeitsplatz? Auf diese Fragestellungen soll im Folgenden eingegangen und Antworten gefunden werden.

Voraussetzungen

Zunächst ist zu klären, welche Voraussetzungen ein Informatikstudent mitbringen muß, da sich nur so untersuchen läßt, ob die in der Lehre verwandte bzw. verwandten Programmiersprachen geeignet oder ungeeignet sind.

Ein angehender Informatikstudent sollte mathematisch5 begabt sein, ein technisch-naturwissenschaftliches Verständnis5 und gute Englischkenntnisse5 besitzen. Insbesondere die mathematische Begabung ist wichtig, da die Softwareentwicklung, die nach wie vor ein zentraler Bestandteil der Informatik ist, „verlangt, die wahre Welt in Formeln und Logik zu fassen“2. Verdeutlich wird dies an folgendem Beispiel2:

„Frage: Ich habe kein Interesse an Mathematik und will Informatik studieren. Wie mache ich das am Besten?“

„Antwort: Gar nicht ...“

Des weiteren werden unter anderem eine überdurchschnittliche Leistungsbereitschaft5, intellektuelle Flexibilität5, selbstständiges Denken und Organisieren der eigenen Arbeit5 erwartet. Besonders hervorzuheben ist noch, daß spezielle Informatik- und Programmierkenntnisse nicht vorausgesetzt werden5.

Ziele der Universitäten

Auf welcher Höhe, also welchem Niveau soll das Studium ansetzen? Die Ansichten darüber gehen weit auseinander. Als gemeinsamer Nenner galt bisher, daß die Erlernung des Gebrauchs von vorhandenen Anwendungeniii nicht Ziel des Informatikstudiums sein kann2. Es sollte jedoch auch keine zu tiefe Ausbildung sein, z.B. sollte niemand seinen PC selbst zusammenschrauben müssen2.

Der ideale Informatiker2 plant und überlegt gründlich, „wendet sein Wissen kreativ an“2, bildet sich selbstständig weiter, ist teamfähig, kann selbst Gruppen leiten, hat umfassendes Kenntnisse von Hardware, Software, Algorithmen und vieles mehr2. Er muß englischsprachige Fachliteratur verstehen, da dies für sein Fach unerläßlich ist. Universitäten legen im Gegensatz zu den Fachhochschulen den Schwerpunkt auf die akademische Ausbildung, insbesondere den Bereich der Forschung. Sie versuchen, die „knappe Ausbildungszeit ... effizient zu nutzen“1, indem sie sich auf die Vermittlung von Konzepten und grundlegenden Modellen wie z.B. Abstraktionstechniken7, Modellierungsmethoden7 und objektorientierte Programmierung7 konzentrieren.

Der Formalismus soll, noch in der Tradition von Dijkstra2, frühzeitig Abstraktion und ein sauberes Arbeiten und eine vorherige gründliche Planung erzwingen. Dafür und für das Beweisen7 von Programmen werden die in den Mathematik-Vorlesungen gelehrten Methoden wie z.B. Induktion herangezogen, weswegen gerade der Mathematik im Grundstudium der Ruf des Fachs, mit dem „gesiebt“6 wird anhängt.

Erwartungen der Arbeitgeber an den Informatiker

Vergleicht man diese Zielsetzung der Universitäten mit den als relevant bezeichneten Erwartungen von Personalchefs, so decken sich diese nur in geringem Umfang12: Allein schon die „betriebswirtschaftlichen Zusatzkenntnisse“12 und „Fremdsprachenkenntnisse“12 können in seltensten Fällen erbracht werden, da sie einen zusätzlichen Aufwand bedeuten. Gerade in Zeiten von Studiengebühren14 stehen die Studenten unter Druck, in möglichst kurzer Zeit ihr Studium abzuschließen, können also nur begrenzt diese relevanten Arbeitsmarktkriterien12 erfüllen.

Anders sieht es aus bei der Praxiserfahrung12. Durch Praxissemester und Praktika könnten Universitäten zumindest diese Forderung erfüllen. Werden solche dennochiv nicht veranstaltet, könnte durch die Lehre von marktgängigen Programmiersprachen wie Cv und Cobolvi bereits „mehr als die Hälfte der Nachfrage“12 gedeckt werden. Häufig werden jedoch vereinfachte Sprachenvii oder Exoten wie z.B. Schemeviii verwendet2. Wieso kommt die Universität nicht in diesem Bereich den Forderungen der Wirtschaft entgegen?

Exotische und nicht-marktgängige Programmiersprachen

Viele Studenten bringen Informatikvorkenntnisse1 mit. Meist erschöpfen1 sich diese jedoch in rudimentärem Wissen über etablierte Betriebssysteme wie Windowsix und DOSx und einigen Grundkenntnissen in einer Programmiersprache wie Pascalxi. Es können also für die oben aufgeführten Anforderungen keine Grundkenntnisse vorausgesetzt werden.

Die Verwendung einer vereinfachten oder exotischen Sprache wie Scheme bietet verschiedene Vorteile gegenüber marktgängigen Sprachen.
So verringert sich der Vorsprung der Studenten mit Programmiervorkenntnissen2 gegenüber ihren unerfahreneren Komilitonen; sie starten – bei der in der Lehre verwendeten Sprache – unter den gleichen Voraussetzung wie die übrigen Studenten. Außerdem kann ihnen gleichzeitig ein „sauberer Programmierstil“2 beigebracht werden. Eine syntaktisch vereinfachte oder begrenzte Sprache bietet i.d.R. weniger Möglichkeiten, einen Algorithmus aufzuschreiben. Auf diese Weise verhindert sie unter anderem, daß die Studenten mit syntaktischen Problemenxii zu kämpfen haben. Stattdessen können sie sich auf das algorithmische Design konzentrieren8, 1. Hierzu sei ein Beispiel in C und in Scheme gegeben:

C

Scheme

Möglichkeit 1:

a = 2 + 3;
a = a * 5;
a = a & 1;
a = a | 3;

Möglichkeit 1:

(set! a (+ 2 3))
(set! a (* a 5))
(set! a (bitwise-and a 1))
(set! a (bitwise-or a 3))

Möglichkeit 2:

a = (2+3) * 5 & 1 | 3;

Möglichkeit 2:

(set! a (bitwise-or (bitwise-and (* (+ 2 3) 5) 1) 3)

Einer Variable a wird zunächst die Summe von 2 und 3 zugewiesen. Anschließend wird das Ergebnis mit 5 multipliziert. Danach folgen zwei Bit-Operationen: Zunächst wird eine UND Operation mit 1 und anschließend eine ODER Operation mit 3 durchgeführt. Das Ergebnis ist dann 3.
Bei der Implementation wie in Möglichkeit 1 läßt sich der Algorithmus klar erkennen, keine der beiden Programmiersprachen lassen irgendeinen Vorteil in Bezug auf Syntax gegenüber der anderen erkennen.
Anders ist es jedoch bei der Möglichkeit 2: Hier werden Unterschiede deutlich. C verwendet Präzedenzregeln11 um die Reihenfolge zu bestimmen, in der der arithmetische Ausdruck abgearbeitet werden muß um das korrekte Ergebnis zu erhalten. Einerseits bietet dies den Vorteil, daß mathematische Rechenvorschriften 1:1 umgesetzt werden können. Andererseits bedarf es jedoch aufgrund der zusätzlichen Operatoren wie Bit-Operatoren eine zusätzlicher Vorschriften, was sich schließlich in der Gesamtzahl von 17 Präzedenzstufen niederschlägt. Dazu kommen die Regeln für die Stelligkeitxiii. Zwar stellt das für den Computer bei der Umsetzung kein Problem dar, doch ist es für einen Menschen äußerst schwierig, sie alle zu kennen. Schnell können sich Leichtsinnsfehler einschleichen oder der Programmcode für jemanden, der ihn nicht selbst geschrieben hat, unlesbar (unverständlich) werden.
Scheme dagegen hat stets die Struktur (Operator Operand_1 ... Operand_n)
. Das ist zunächst eine Einschränkung, jedoch sind Teilausdrücke klar voneinander unterscheidbar und es werden keine Präzedenzregeln benötigt, da jeder Teilausdruck in sich geschlossen ist, der Ausdruck bleibt lesbar.
Natürlich muß nicht so programmiert werden wie in Möglichkeit 2 angegeben, es gibt beliebig viele Stufen zwischen Möglichkeit 1 und 2, doch bei Sprachen wie Scheme sind die Möglichkeiten von vorneherein stärker eingeschränkt, was z.B. einem Korrektor von Übungsblättern deutliche Arbeitserleichterung bringt und damit auch Zeit und Geld spart.
Ein wichtiger Aspekt bei der Beurteilung, ob eine Sprache für die Lehre geeignet ist, ist der Grad der Beweisbarkeit7.
Scheme setzt konsequent das Lambda-Kalkülxiv um und ist deswegen beweisbar, d.h. es kann z.B. mittels Induktion bewiesen werden, daß ein Scheme-Programm7 korrekt arbeitet. Bei C ist dies schon wegen der fehlenden automatischen Speicherverwaltungxv äußerst schwierig. Auch enthalten gängige Sprachen wie C oder Javaxvi häufig Design-Fehler, welche zu teilweise unerklärlichen Fehlernxvii führen.
Lehrsprachen können helfen, wichtige Inhalte der Informatik effektiver zu vermitteln als in der betrieblichen Praxis eingesetzte. Derartige Inhalte wären, zusätzlich zu den oben genannten, objektorientierte Programmierung1 (OOP), modulare Programmierung1, prozedurale Programmierung1, Rekursion8, Korrektheit7, Abstraktion7, Kürze7, Erweiterbarkeit7 und Verständlichkeit7. Auch bieten Lehrsprachen meist einen höheren Grad der Abstraktion von der Hardware des Computers und dem eingesetzten Betriebssystem; es ist also egal, auf was für einer Art von Computer programmiert wird (X86-Architektur, Alpha, Macintosh, Linux Platform, Windows Platform etc.). Der Student kann z.B. Programme in Scheme auf einem Linux-Rechner in der Universität und daheim an seinem Macintosh-Rechner bearbeiten und testen, während das in hardwarenahen Sprachen wie
C nicht ohne zusätzlichen Aufwand funktioniertxviii.
Ein weiteres Beispiel, das zeigt, daß gängige und in der Praxis eingesetzte Sprache sich nicht notwendigerweise für die Lehre eignen, ist die Polymorphie9, 10: Beispielsweise wird inzwischen Java in der betrieblichen Praxis oft eingesetzt, auch viele Universitäten setzten Java als Unterrichtssprache ein. Im Gegensatz zu Scheme beherrscht Java jedoch nicht alle Polymorphiekonzepte, für diesen Bereich ist sie also ungeeignet.
Abschließend könnte man noch von einer gewissen Zwangsmotivierung der Studenten sprechen: Von einem Informatikstudent wird erwartet, daß er sich die notwendigen Kenntnisse in einer Programmiersprache selbst aneignet2. Angenommen der Student hat Scheme gelernt. Erwartet nun ein Arbeitgeber von ihm, daß er Kenntnisse in
C mitbringt, muß er sich in kurzer Zeit in diese Sprache einarbeiten; der Aspekt der selbstständigen Weiterbildung2 als Teil des Informatikstudiums und als Voraussetzung für ein später erfolgreiches Arbeiten in diesem Beruf wird ihm so nocheinmal deutlich vor Augen geführt.

Doch hat der Einsatz von exotischen oder vereinfachten Programmiersprachen nicht nur Vorteile. So hat ein Informatiker mit einer universitären Ausbildung gegenüber einem Fachhochschulinformatiker den Nachteil, daß er oft nicht unmittelbar4 einsetzbar ist, da spezielle praktische Vorkenntnisse in einer in einem Unternehmen verwendeten Sprache (C, Java3) fehlen, die zusätzliche Einarbeitungszeit benötigen. Ferienarbeit oder ein – möglicherweise von der Universität gefordertes – Praktikum wird so deutlich schwieriger.
Lehrsprachen wie Scheme, die von der zugrundeliegenden Hardware und dem Betriebssystem abstrahiert sind, ermöglichen es natürlich nicht, platformspezifische Optimierungstechniken und hardwarenahe Programmierung zu erlernen bzw. zu lehren. Während man die Optimierungstechniken eventuell noch vernachlässigenxix kann, ist die hardwarenahe Programmierung jedoch ein äußerst wichtiges Teilgebiet der Informatik. Nur in Sprachen wie C oder Assemblerxx können Gerätetreiberxxi geschrieben oder – zumindest bisher – Maschinen gesteuert werden. Auch muß sich der Student niemals wirklich mit der Funktionsweise eines Computers auseinandersetzen, wenn er nur eine abstrahierte Lehrsprache lernt, denn es ist ein Unterschied, ob man theoretisch etwas verstanden hat und über die Probleme und die Vor- und Nachteile einer Architektur Bescheid weiß oder sein Wissen praktisch angewandt und so geprüft hat.
Ein weiteres Problem der Lehrsprachen sind gute Entwicklungswerkzeuge. Für gängige Programmiersprachen wie C und Java sind viele gute Programme vorhanden, großteils auch noch kostenlos, die die Programmentwicklung deutlich vereinfachen und beschleunigen. Darüberhinaus unterstützen sie bei der Fehlersuche (Debuggerxxii) und bei der gemeinsamen Arbeit mehrerer Leute an einem Projekt
. Diese Werkzeuge gibt es für exotische Programmiersprachen in nur geringer Anzahl oder sie haben nur einen sehr eingeschränktem Funktionsumfang.
Schließlich hat die Beschränkung des zu verwendenden Wortschatzes einer Programmiersprache auch den Nachteil, daß der Student nicht immer ein Problem auf die eleganteste Art lösen kann, wie folgendes einfaches Beispiel zeigt:
Der Student soll ein Programm schreiben, daß die Bewegung eines Balles berechnet. Für die Berechnung benötigt er den arcus tangensxxiii, um den Winkel alphazum Ball über die Abstände in x- und y- Richtung mittels
alpha = atan (y/x)
zu bestimmen. Dies funktioniert wunderbar, solange nicht x
kleiner oder gleich 0 und y nicht größer als 0 ist, denn dann muß er hinzuzählen bzw. die Division durch x abfangen und das Ergebnis auf 0 setzen. Viel einfacher geht es jedoch mit der Funktion atan2: Sie nimmt x und y als Parameter und berücksichtigt alle Sonderfälle. Zum Vergleich

atan

atan2

if (x == 0)
alpha=0;
else if ((x<0) && (y>0))
alpha=atan(y/x)+pi;
else
alpha=atan(y/x);

alpha=atan2(y,x);

Wie leicht zu erkennen ist ist die Berechnung mittels atan2 deutlich verständlicher, fehlerunanfälliger (weil weniger Befehle) und kürzer als mittels atan. Dabei ist Kürze eine der „Maximen des guten Programmierens“7, doch wird sie – wäre dieser Befehl aus dem erlaubten Wortschatz ausgenommen – explizit verhindert.



Fazit

Das Ziel einer universitären Ausbildung muß es sein, „informatische Grundlagen mit möglichst langer Halbwertszeit“1 zu vermitteln. In Zeiten von Studiengebühren14 ist es für einen Studenten wichtig, möglichst viel Wissen möglichst effizient vermittelt zu bekommen. Wenn dazu eine Lehrsprache, bzw. eine exotische oder eine vereinfachte Programmiersprache, besser dazu geeignet ist als eine gängige, in Firmen eingesetzte Programmiersprache, so gibt es nichts daran zu beanstanden.
Ob eine Sprache für die Praxis relevant ist, lässt sich ohnehin nicht eindeutig klären. Prinzipiell ist jede Sprache relevant, da sie es dem Studenten ermöglicht, Programmiererfahrungxxiv zu sammeln. Die Anforderungen des Arbeitsmarktes ändern sich ohnehin ständig, tatsächlich könnte es sein, daß Leute mit guter Kenntnis von genau der exotischen Sprache, die der Student an der Universität gelernt hat, auf einmal benötigt werden.
Viel besser als eine einseitige Lösung ist allerdings, nicht nur eine Sprache in der Lehre zu verwenden, sondern mehrere. Der Student sollte mit den verschiedenen Ansätze und Prinzipien vertraut gemacht worden sein, so daß er sich bei Bedarf schnell einarbeiten kann. Dazu muß er allerdings auch die Möglichkeit dazu haben, so sollten sich auch zu den Sprachen, die nicht in der Lehre eingesetzt werden, Bücher in der Bibliothek befinden6.
Auch könnte die Universität die Studenten ermutigen, aktiv dazu beizutragen, „ihre“ Sprache aufzuwerten: Die Studenten könnten in Arbeitsgruppen und Projekten versuchen, die Probleme zu lösen, die eine Akzeptanz in der Arbeitswelt verhindern (z.B. neue Prozessorarchitektur (z.B. neue Architekturen entwickelnxxv, bessere Compilerxxvi und Interpreterxxvii, etc.).





Literaturliste und Quellenangaben


  1. „Objektorientierung mit Oberon-2 in der Ingenieur-Grundausbildung“, Informatik-Spektrum 20: 350-356 (1997), Springer Verlag 1997

  2. „Perspektiven für's Informatikstudium“, 12/14/01, Computer Technik (ct), Heise Verlag

  3. „Wege zum Erfolg“, 12/16/00, Computer Technik (ct), Heise Verlag

  4. „Wirtschaftsinformatiker/in – Ein Schnittstellenberuf mit Chancen?“,Podiumsdiskussion vom 25.04.1997, Institut für Informatik der Universität Zürich, http://www.alumni.ch/Archiv/POD_9704.html

  5. „Berufsbild Informatik – Allgemeine Ausbildungsvoraussetzungen“, Universität Koblenz/Landau, http://www.uni-koblenz.de/fb4/berufsbild/kapitel2/kap212.html

  6. „Umfrage unter allen Studierenden der TU Berlin 3.12.1998“, TU Berlin,
    http://www.tu-berlin.de/presse/umfrage/fb13_www.htm

  7. Vorlesung Informatik I, Prof. Klaeren, Universität Tübingen, WS 1999/2000

  8. „The Scheme Advantage“, http://www.schemers.com/schmrs2.html

  9. „On Understanding Types, Data Abstraction and Polymorphism“, Computing Surveys, Vol. 17 n. 4 pp 471-552, Dezember 1985

  10. „Polymorphe Typsysteme“, Markus Stengel, Proseminars-Arbeit, SS 2001, Universität Tübingen

  11. Präzedenregeln in C++, http://www.mathematik.uni-marburg.de/~cpp/anhang/praezedenzen.html

  12. Erwartungen an den Informatiker,
    http://www.uni-koblenz.de/fb4/berufsbild/kapitel4/einstieg.html

  13. Einkommen Informatiker, http://www.uni-koblenz.de/fb4/berufsbild/kapitel4/einkommen.html

  14. HRK zum Thema Studiengebühren,
    http://www.heise.de/newsticker/result.xhtml?url=/newsticker/data/anm-02.11.01-000/default.shtml&words=Studiengeb%FChren





i „Programmiersprachen ähneln einer Fremdsprache; sie bestehen aus Zeichen und Regeln, dienen der Kommunikation mit dem Computer und ermöglichen die Erstellung von Programmen bzw. Software“,
http://www.glossar.de/glossar/1frame.htm?http%3A//www.glossar.de/glossar/z_programmiersprachen.htm

ii obwohl stets der Vereinfachung wegen nur die männliche Form verwendet wird, sind selbstverständlich mit Begriffen wie Studenten sowohl männliche als auch weibliche Personen gemeint

iii Anwendungen sind fertige, meist etablierte Softwareprodukte wie Microsoft Word oder Adobe Photoshop

iv Die Gesellschaft für Informatik (http://www.gi-ev.de/) empfiehlt inzwischen den Universitäten, solche zu veranstalten2

v http://de.dir.yahoo.com/Computer_und_Internet/Programmiersprachen/c_und_c__/

vi http://de.dir.yahoo.com/Computer_und_Internet/Programmiersprachen/Cobol/

vii Sprachen, bei denen man nur einen Teil des Wortschatzes verwendet bzw. verwenden darf

viii http://www.scheme.org

ix http://www.microsoft.com/windows

x http://www.microsoft.com

xi http://www.pascal-central.com/

xii also damit, wie Anweisungen in den Computer einzuspeisen sind, damit er weiß, was von ihm erwartet wird

xiii +, -, *, / benötigten zwei Operanden, haben daher die Stelligkeit 2. Es gibt weitere Operationen, die nur die Stelligkeit 1 haben, wie z.B. ! (NOT)

xiv http://www.qrst.de/html/progsp/lambda.htm

xv http://home.in.tum.de/~kolodizk/Proseminar/Garbage_Collection.html

xvi http://java.sun.com/

xvii http://www-pu.informatik.uni-tuebingen.de/users/sperber/java-sucks/

xviii beispielsweise ist die Art und Weise, wie Zahlen im Rechner abgespeichert werden, je nach Architektur und Betriebssystem verschieden (ob Little Endian oder Big Endian, http://www.webopedia.com/TERM/b/big_endian.html)

xix oft mit der Antwort: „Dafür ist der Compiler zuständig“

xx http://directory.google.com/Top/Computers/Programming/Languages/Assembly/

xxi Programme, die es dem Computer bzw. dessen Betriebssystem ermöglichen, Geräte wie Grafikkarten, Computermonitore, Tastaturen usw. zu verwenden

xxii http://www.glossar.de/glossar/z_programmiersprachen.htm#Debug

xxiii auch als tan-1, bzw. arctan oder atan bezeichnet, der inverse Tangens

xxiv hier: Lernen, ein Problem in kleine Teilaufgaben zu zerlegen und mittels eines Algorithmus zu lösen

xxv Beispielprojekt an der Universität Bielefeld: http://www.techfak.uni-bielefeld.de/ags/ti/lehre/S99.html

xxvi http://www.glossar.de/glossar/z_programmiersprachen.htm#compiler

xxvii http://www.glossar.de/glossar/z_programmiersprachen.htm#interpreter

7/7