Gabi und Sascha
Tags - Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Wir verwenden in der Softwareentwicklung bei unserem Arbeitgeber viel freie Software. Selbstverständlich geben wir auch Software zurück. Allerdings fällt auf, dass wir kaum Software aus dem universitären Umfeld verwenden. In der Produktion jGABL 2 - auch weil der Entwickler bei uns arbeitet und das Produkt aktiv pflegt; zu Forschungszwecken den sogenannten Stanford Parser. Und zu mehr als Forschung ist der Parser auch nicht zu gebrauchen. Nicht wegen der Qualität seiner Resultate. Der Grund ist die Qualität der Implementierung. Diese ist aus professioneller Sicht mangelhaft.

Der Mangel in der Qualität der Implementierungen fällt bei vielen Softwarepacketen aus dem universitären Umfeld auf. Diese mangelhafte Qualität ist in meinen Augen allerdings auch kein Problem, sondern durch das Prinzip bedingt. An Universtitäten werden die Softwareentwickler der Zukunft ausgebildet. Menschen die in der Ausbildung sind können noch nicht die Qualität bringen, die erfahrene Softwareentwickler abliefern können.

Ein Bekannter klagte mir sein Leid. Er arbeitet für ein Büro, welches Software aus Forschungsprojekten an Universitäten in der Industrie vermarktet. Speziell im Bereich der Windenergie. «Die haben klasse Ideen. Genau die Problemstellung gelöst. Aber das war es dann auch. Haskel kennt doch kaum jemand. Das bauen die Hersteller doch nicht ein. Das müssen die komplett neu machen.»

Das Problem: es gibt kaum Entwickler, die eine Haskel-Programm warten können. Gerade bei Produkten, die eine so lange Lebensdauer wie Windkraft-Anlagen haben, sind esoterische Lösungen ein Killer.

Ein weiteres Problem ist die Robustheit solcher Entwicklungen. Sie gehen von einer perfekten Umgebung aus. Fehler sind nicht so schlimm, dann wird das Programm halt noch einmal gestartet. In Windenergie-Anlagen ein Nogo - solche Programme sind die typischen 80% Lösungen. Bei Java Programmen immer wieder der Klassiker: System.exit(int) in einem catch-Block. Normaler Anfängerfehler. Kann passieren. Es bedeutet aber auch, dass sie Software nicht so einfach in einer Container-Ungebung verwendet werden kann. Zwar kann der Aufruf verboten werden, dann allerdings fangen die Probleme erst richtig an. Denn wer schon nicht an solche Probleme denkt, der denkt auch nicht an komplexe Sicherheitsprogrammierung. Was im übrigen die wenigsten Entwickler machen.

Ein weiteres Problem universitärer Software ist die Lebensdauer. Mir ist leider schon zweimal passiert, dass ein Produkt eingesetzt wurde (nicht im meinem jetzigen Arbeitgeber :-)), welches ambitioniert begonnen wurde und dann im digitalen Nirvana verschwand.

Es mag Beispiele geben, bei denen es anders gelaufen ist. Aber die von mir erlebten Beispiele schrecken ab. Schade eigentlich. Eine Lösung für die Misere habe ich auch nicht.


Als jemand dem versucht wird an der Hochschule sowas wie Informatik beizubringen, fühle ich mich genötig, hier auch mal meinen Senf zu abzugeben.

Wie läuft das denn in der Uni ab?

Im Grundstudium, wo dem Namen nach die Grundlagen für die weitere Entwicklung gelegt werden sollten, geschieht dieses eben leider viel zu selten.

Was ist mir im Grundstudium so an Sprachen/konzepten begegnet?

Als Vertreter der Funktionalen Programmierung die an der Uni selbst entwickelte Sprache Opal. Warum man hier unbedingt eine Eigenentwicklung pushen will, die meiner Meinung nach nicht praxistauglich ist, bleibt schleierhaft. Muss was politisches sein, davon hab ich keine Ahnung.

Dann immerhin in einer(!) Hausaufgabe mal Assembler. Dabei bestand die Aufgabe aber lediglich darin, ein einem vorgegebenen C-Rumpf eine Assembler-Routine einzubinden, die zwei Siebensegmentanzeigen 'lustig blinken' lässt. Also eine Freiformaufgabe nach dem Motto macht was ihr wollt. Ja, (Motorola-)Assembler wurde in der Vorlesung besprochen, aber ich glaube nicht das irgendwer davon was mitgenommen hat.

Dann habe ich tatsächlich C programmiert, okay, fast Assembler ;) - das war aber in einem Praktikum, und C war bereits voraussetzung dafür - habe mir das also in den ersten 2 Wochen selber beigebracht. [Wo soll da Qualität entstehen?] Code Review durch den Veranstalter? Fehlanzeige, keine Zeit.

Dann das Java-Drama!
Man könnte ja annehmen, man würde sowas wie Objektorientierung bei einer Sprache einsetzen, die das kann. Hmmm. Nope, wir benutzen Java erstmal imperativ. Und das bleibt auch lange so, wer OO will muss sich das schon selber beibringen - oder von einer Studierendeninitiative beibringen lassen, die auch einen Javakurs anbietet, weil Java als Sprache nicht unterrichtet werden kann (Zeitmangel eben, 'Algorithmen und Datenstrukturen' sind halt Thema - und beim Bachelor wurde noch mehr gekürzt) - aber Grundlage für die Hausaufgaben ist es dennoch.

In der Vorlesung muss der Code auf das wesentliche runtergekürzt werden, man sieht maximal ein Fragment. Wenn in der Vorlesung tatsächlich mal eine Fehler'behandlung' gemacht wird, gibt es im Wesentlichen zwei Varianten:

class VarianteA{

public static void main (String[] args) throws Exception{
 ...
}

}
oder:
class VarianteB{

public void machwas (String foo) {
   try{
       ...
   } catch (Exception e){
      e.printStacktrace();
      return;
   }
}

}

Wenn man tatsächlich mal eine Programmieraufgabe abzugeben hat, was in der Regel alle zwei Wochen zu geschehen hat, reicht es im Normalfall, wenn auf dem Monitor was ausgegeben wird, dass der Lösung nahekommt.

Wenn man eine class-Datei ausgeführt hätte, die nur per System.out die Ausgabe simuliert und dann irgendeinen (fehlerhaften) Code gezeigt hätte wäre das mit Sicherheit nicht aufgefallen. Auf Fehler habe meistens ich den Tutor hingewiesen, indem ich meinte, hier, schaumal, das geht nicht - weisst Du warum?.

Eine wunderbare Anedote, welche diese Misere zeigt sei hier noch kurz skizziert.
Es sollte RMI gelehrt werden. Kurz vorher wurde das Konzept

'Thread'
behandelt. Also man überschreibe die
run()
Methode und ruft dann die start-Methode auf.

Unsere Aufgabe war die Implementierung eines Spiel-Clients, der vom Server einen Spielpartner zugewiesen bekommt, so dass diese dann miteinander in Kontakt treten können und gegeneinander spielen.

Der RMI-Server des Lehrveranstalters war so dermassen buggy, dass ich ihn schliesslich decompilert habe, eine neue Version gebaut habe und den Originalserver duch meinen ersetzt habe, damit die Mitstudenten überhaupt ihre Hausaufgabe lösen konnten.

Abgesehen davon, dass das Problem auftrat, dass die Clients stets versucht haben, die private IP des Spielpartners zu erreichen, weil der hinter einer Firewall bei einem Studenten daheim gestartet worden war [konzeptionelles Problem] blokierte der Server des Lehrveranstalters ununterbrochen.

Nach dem decompilieren wusste ich auch warum. Sie haben die run-Methode überschrieben und auf dem Tread dann eben diese aufgerufen - statt der start-Methode. Man fragt sich dann schon, wieviel diejenigen, welche hier Aufgaben erstellen, vom Stoff selbst noch im Kopf haben...

Um das rabenschwarze Bild ein wenig aufzubessern sei ausdrücklich darauf hizuweisen, dass diese Erfahrungen auch immer persönliche Einschätzungen enthalten und ich andererseits sehen, dass sehr viele Leute an der Uni sich extrem engagieren und versuchen das beste aus der Situation zu machen und trotz aller Widrigkeiten den Anspruch qualitativ guter Lehre an sich stellen. Dies gilt sowohl für die meisten Profs als auch WMs und Tutoren.

Leider werden jedoch die Mittel immer weiter gekürzt - auch die Einführung des Bachelors wird nicht dazu beitragen, dass der emittierte Code an Qualität zunimmt, im Gegenteil. Die Programmierpraktika sind fast komplett gestrichen, die Studenten müssen sich alles selbst beibringen.

Und schlussendlich müssen die Profs sehen, dass sie genügend Drittmittel einfahren um den Betrieb eingermassen am Laufen zu halten.

Ich habe in meinem Grundstudium ein einziges mal einen Tutor erlebt, der sich stundenlang Zeit genommen hat und bei jeder Abgabe einen Codereview der Hausaufgaben gemacht hat - leider ein Einzelfall (danke Martin!).

Ergo:
Der Student selbst hat dafür zu sorgen, dass er Leute findet, die ihm 'Coden' beibringen und er hat sich sehr intensiv selbst zu bilden. Dabei darf er nicht auf Unterstützung durch die Uni hoffen - er kann nur versuchen eine Gruppe gleichgesinnter zu finden und die Zeit 'opfern' .

Was fehlt sind Praxis und Übung sowie die Erkenntnis, dass es eben nicht reicht mal eben was hinzurotzen, was geradeso die Abgabe überlebt und einen Schein bringt.

Auch immer wieder sehr beliebt bei Thread die run()-Methode zu überschreiben. Das ist meiner Meinung nach nicht der richtige Ansatz. Vererbung ist in OO-Programmierung ein nettes Feature, allerdings überbewertet. Viel besser ist es das Konzept der Delegation zu verwenden.

Was ist den ein Spiele-Server? Ein Spiele-Server ist kein Thread. Er verwendet Threads um mehrere Anfragen «gleichzeitig» abarbeiten zu können. Gelöst werden können solche Probleme: Ist Konzept A ein Oberkonzept von B? In diesem konkreten Fall also: Ist ein Thread ein Spieleserver? Die Antwort ist ein klares nein; eine Nebenläufigkeit ist kein Spieleserver.

In dem beschriebenen Fall wird also eine Klasse SpielServer angelegt. Dann wird eine Implementierung von Runnable geschrieben, der ich ein SpielServer-Exemplar übergeben kann. Mit der Runnable-Implementierung wiederum erzeuge ich einen Thread (am besten immer mit einem konkreten Namen) und starte dann den Thread.

Ein anderes Vorgehen fällt früher oder später auf die Füsse.