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
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.
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.
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.
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?
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; |
Möglichkeit 1:(set! a (+ 2 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=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.
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.).
„Objektorientierung mit Oberon-2 in der Ingenieur-Grundausbildung“, Informatik-Spektrum 20: 350-356 (1997), Springer Verlag 1997
„Perspektiven für's Informatikstudium“, 12/14/01, Computer Technik (ct), Heise Verlag
„Wege zum Erfolg“, 12/16/00, Computer Technik (ct), Heise Verlag
„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
„Berufsbild Informatik – Allgemeine Ausbildungsvoraussetzungen“, Universität Koblenz/Landau, http://www.uni-koblenz.de/fb4/berufsbild/kapitel2/kap212.html
„Umfrage unter
allen Studierenden der TU Berlin 3.12.1998“, TU Berlin,
http://www.tu-berlin.de/presse/umfrage/fb13_www.htm
Vorlesung Informatik I, Prof. Klaeren, Universität Tübingen, WS 1999/2000
„The Scheme Advantage“, http://www.schemers.com/schmrs2.html
„On Understanding Types, Data Abstraction and Polymorphism“, Computing Surveys, Vol. 17 n. 4 pp 471-552, Dezember 1985
„Polymorphe Typsysteme“, Markus Stengel, Proseminars-Arbeit, SS 2001, Universität Tübingen
Präzedenregeln in C++, http://www.mathematik.uni-marburg.de/~cpp/anhang/praezedenzen.html
Erwartungen an den
Informatiker,
http://www.uni-koblenz.de/fb4/berufsbild/kapitel4/einstieg.html
Einkommen Informatiker, http://www.uni-koblenz.de/fb4/berufsbild/kapitel4/einkommen.html
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
vii Sprachen, bei denen man nur einen Teil des Wortschatzes verwendet bzw. verwenden darf
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)
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“
xxi Programme, die es dem Computer bzw. dessen Betriebssystem ermöglichen, Geräte wie Grafikkarten, Computermonitore, Tastaturen usw. zu verwenden
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