Ansichten eines Informatikers

Robustes Programmieren ist aus der Mode gekommen

Hadmut
8.8.2009 22:07

war mal eine Unix-Tugend, aber inzwischen bewegt es sich massiv in Richtung Verschlechterung.

Ich hatte mich ziemlich über den dämlichen Network Manager unter Ubuntu geärgert und auf der zugehörigen Mailingliste etwas herumdiskutiert. Früher war Unix mal das Sinnbild für gut kombinierbare und verständliche Programme, die auf einen einzelnen Zweck optimiert waren, unabhängig, extrem robust. Klare Funktion, klare Interfaces.

Unter Linux wird das inzwischen ziemlich vermurkst. Ich hatte über die steigende Komplexität der Desktops schon geschrieben. Immer mehr Programme und Funktionen hängen von undurchsichtigen Desktop-Funktionen ab, die meist auch noch schlecht bis lausig dokumentiert sind und sich ständig ändern. Dazu kommt, daß es im OpenSource-Bereich immer öfter dazu kommt, daß irgendwelche Spinner aus Weltsicht, Ideologie oder Inkompetenz sich irgendwelche Standpunkte nehmen und meinen, sie müßten die Welt verbessern oder auf ihren Pfad bringen und dann überhaupt nicht mehr mit sich reden oder sich überzeugen lassen.

Der Network Manager ist ein Paradebeispiel dafür.

Das ganze Ding ist ein Fehlkonzept. Geschrieben wie eines dieser Gnome- oder KDE-Gadgets, extrem verwoben in den Desktop und dessen Funktionen, aber völlig undurchsichtig. Nicht einmal die Developer auf der Mailingliste könnten bei Fehlfunktionen sagen, wie sich das Programm eigentlich richtig verhalten soll oder wo man mit der Suche zum Debugging beginnen könnte. Der Programmierstiel ist grausam, wenngleich auch in vielen typisch amerikanisch. Eine strikt (und maschinell) durchgeprügelte Formatierung, dazu ein C-typischer Wust aus kaum verständlichen Funktionsaufrufen. Viele Funktionen mit fast gleichen oder ähnlichen Namen ohne daß die Aufgaben und Unterschiede erkennbar wären. Praktisch keine Kommentare, kein Debuggin-Code, keine Fehlerausgabe, keine Erläuterungen. Man steht davor wie der Ochs vorm Berg.

Debian und Ubuntu unterstützen bei der Netzwerk-Konfiguration eigentlich vier Phasen: pre-up, post-up, pre-down, post-down. Hat sich bewährt, ist Standard für die Packages. Der Autor von Network Manager sieht das nicht ein. Er ist der Meinung, post-up und post-down müssen reichen, weil jedes Programm damit klarkommen müßte daß das Netzwerk ausfällt. Also gibt es nicht. Da ja auch nichts in Stein gemeißelt wäre, mögen sich die gesamten Debian- und Ubuntu-Distributionen doch bitteschön nach ihm richten und nicht er sich an die Standards halten.

Parameter-Übergabe an die aufgerufenen Skripte für post-up und post-down gibt’s auch nicht. Network Manager speichert seine Netzwerkkonfiguration nicht selbst, sondern auf ziemlich abstruse Weise und einige Dämonen über den dbus entweder unter /etc oder irgendwo in der Konfiguration des KDE oder Gnome Desktop. Wechselt man zwischen Gnome und KDE, sind alle Netzwerkeinstellungen weg, und auf der Kommandozeile geht gleich gar nichts.

Weil aber die Daten alle aus dem DBUS gepopelt werden müssen, erwartet der Autor, daß es den aufgerufenen Programmen reicht, wenn man ihnen die UUID der Netzwerkkonfiguration schickt. (Völlig bescheuert, aber da wollte mal einer quer duch alle neumodischen Konzepte turnen ungeachtet der Frage, ob das hier sinnvoll ist.) Und dann sollen sich etwa Shell-Skripte irgendwie den ganzen Kram über den DBUS zusammensuchen. Ein völlig vergurktes Konzept.

Selbst die Konfigurationen, die nicht irgendwo in den Tiefen der Gnome- oder KDE-Konfigurationsbäume versteckt sind, sondern allgemein lesbar unter /etc/NetworkManager/system-connections liegen, laufen problemlos. Für jede Konfiguration gibt es eine Datei. Jetzt wäre es aber nicht so, daß der Network Manager die beim Programmstart einfach so einließt. Der NM erwartet, daß von inotify erzählt bekommt, welche Dateien alle daliegen. So wie früher einfach mal ein Directory aufmachen und die Dateien lesen wäre zu einfach.

Das Dumme daran ist, daß das alles sehr komplexe, schlecht dokumentierte und ständigen Änderungen unterliegende Dienste sind, die für so etwas eigentlich auch nicht entworfen wurden. Und die Programmiertechnik der Autoren ist die, die ich immer als die Konjunktiv-Technik beschreibe: Ja, wir verstehen’s auch nicht, eigentlich müßte der Network Manager die Dateien finden und lesen. Warum er es nicht tut? Schicksal. Kann man nicht klären.

Da wird gerade auf den Desktops ein Mist zusammenprogrammiert, der nicht mehr auszuhalten ist. Und die Leute sind dann in ihrer Inkompetenz stur und unbelehrbar.

Allerdings habe ich auch den Eindruck, daß das daher kommt, daß die Leute heute nicht mehr ordentlich zu programmieren lernen. Kommt in der Informatik-Ausbildung nicht vor. Da wird irgendwelcher theoretischer Kram gelehrt. Und viele Unis fahren auf das funktionale Programmieren ab, weil es so schöne theoretische Sichtweisen erlaubt und man so schön Programme hinschreiben kann ohne zu verstehen, was da eigentlich vor sich geht. Wobei die Leute überhaupt keine Sachkunde und kein Gefühl mehr dafür entwickelt, was da eigentlich vor sich geht. Der Compiler oder die Laufzeitumgebung werden es schon richten. Und es hat außerdem den schönen – und an den Universitäten besonders hoch geschätzten – Vorteil, daß mit solchen rein theoretisch orientierten Sichtweisen, funktionalem Programmieren usw. Leute in einem Hörsaal Programmieren lehren können, obwohl sie selbst keine Ahnung vom Programmieren haben. Und solche Meister-Informatiker kommen dann dabei heraus. Akonadi ist ja auch so ein grausiger undurchsichtiger Ressourcenfresser.

Allerdings gibt es da noch ein ganz anderes fragwürdiges Detail: Der Autor ist bei Red Hat. Zwar sagt er, daß es sich gerade nicht um ein Red Hat Tool handelt, sondern für alle Distributionen gedacht ist. Er sagt aber auch, daß Red Hat ihn dafür bezahlt, daß er sich ausschließlich um das Ding kümmert, und daß deshalb natürlich am Ende die Anforderungen von Red Hat erste Priorität genießen. Ein Schelm, wer sich was böses dabei denkt.

16 Kommentare (RSS-Feed)

enno
8.8.2009 23:50
Kommentarlink

Da fällt mir doch gleich mein “Bug der Woche” ein. Lohnt sich durchaus die ganze Story zu lesen.

https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/371291


Camie
9.8.2009 11:59
Kommentarlink

Wie wäre es mit wicd unter Ubuntu? Macht zumindest bei uns einfach was es soll, keine ominösen Verbindungsprobleme mehr. Seit Jaunty ist es in Universe und problemlos installierbar.


Hadmut
9.8.2009 12:04
Kommentarlink

Hey, danke für den Hinweis, den kannte ich noch gar nicht. Muß ich mir unbedingt mal anschauen.


Kompottkin
9.8.2009 12:39
Kommentarlink

Was die Universitäten angeht: Um Theorie geht es in einem Universitätsstudium doch gerade, welches ja eine wissenschaftliche (!) Ausbildung darstellt. Informatik ist eben nicht Programmierung. Vielmehr ist die Programmierung eine bestimmte Anwendung der Informatik. In einem wissenschaftlichen Studium sollte sie eigentlich mehr oder weniger nur der Anschauung dienen.

Als Ausbildungsberufe gibt es unter anderem den mathematisch-technischen Softwareentwickler sowie den Fachinformatiker. Außerdem findet sich auch ein anwendungsorientierteres Studium als an der Uni, nämlich an der FH. Mit diesem Angebot ist doch fast jedem gedient, oder läßt es noch etwas Wesentliches missen?

Sicherlich, die zunehmende Entwissenschaftlichung des Universitätsstudiums und seine Wandlung hin zu einer reinen Berufsausbildung, die durch den Bolognaprozeß einen weiteren kräftigen Schub bekommen hat, hilft nicht gerade, die Forschungsorientierung eines Universitätsstudiums zu unterstreichen.


Hadmut
9.8.2009 13:10
Kommentarlink

@Kompottkin: Nein!

Die Universitäten haben – bis zum Diplom oder äquivalent – zunächst einmal die Aufgabe, eine Berufsausbildung herzustellen. z. B. § 29 Abs. 1 LHG BW: “Lehre und Studium sollen Studierende .. auf eine berufliche Tätigkeit vorbereiten…”.

Außerdem kann ich dieses Geschwätz darum, daß Informatik nicht Programmieren sei und man das an den FHs lernen könne, nicht mehr hören. Letztlich ist das nämlich keine fachliche Aussage, sondern wieder mal eine der vielen, vielen dummen Ausreden dafür, daß Universitätsprofessoren – folgt man ihrem Standpunkt – eigentlich gar nichts können müssen. Was immer man von ihnen erwartet, sie sagen, Wissenschaft sei etwas anderes und das dürfe man von ihnen nicht erwarten.

Über 10 Jahre lang habe ich von der Uni in meinem Promotionsstreit immer nur gehört, was sie alles nicht können, was man von ihnen nicht erwarten darf, wofür sie keinen Fachmann haben, was alles nicht geht. In 10 Jahren konnten sie mit keinem Wort erklären, was für wissenschaftliches Arbeiten eigentlich gefordert wird. Manchmal habe ich den Eindruck, “Wissenschaftler” sind hauptberufliche Gar-nichts-Könner, die ihren Standpunkt so gut vertreten, daß sie dafür auf Lebenszeit bezahlt werden. Erschreckend etwa, daß man für ein Jura-Studium nebenher noch in externe Repetitorien gehen muß um das zu lernen, was man für den Beruf braucht. Und nicht wesentlich anders ist es in der Informatik.

Mag sein, daß Programmieren nur zu einem Teil der Informatik gehört. Es gibt aber Lehrstühle für Softwaretechik. Und Vorlesungen über Softwaretechnik. Und nicht mal die können das. Wenn man schon den abstrusen Standpunkt einnimmt, daß man nur Theorie für wissenschaftlich hält und ordentliches Programmieren für unter seiner Würde hält, dann soll man wenigstens nicht noch so tun, als könnte man Softwaretechnik.


TEN
9.8.2009 13:00
Kommentarlink

“[…] viele Unis fahren auf das funktionale Programmieren ab, weil es so schöne theoretische Sichtweisen erlaubt und man so schön Programme hinschreiben kann ohne zu verstehen, was da eigentlich vor sich geht. Wobei die Leute überhaupt keine Sachkunde und kein Gefühl mehr dafür entwickelt, was da eigentlich vor sich geht. Der Compiler oder die Laufzeitumgebung werden es schon richten.”

Wobei dieser Vorwurf z.T. eher an manche Java-Kurse gerichtet werden könnte, in denen ein “Engineering” nur noch Meilen entfernt vom Maschinenraum gelehrt werden soll – im “worst case” mit dem Ergebnis: “Unformatiker”, die im OOP-Wald stehend vor Bäumen mit keinem Bit mehr per Du sind. 😉

Für FP wurde von Neil McAllister in Fatal Exception (“What’s the best first language for a programmer?” 2009-07-24 http://www.infoworld.com/d/developer-world/whats-best-first-language-programmer-413) unlängst genau die gegenteilige Auffassung propagiert:

“In fact, I’d venture that if you learned nothing but C++ or Java in your college coursework, you probably went to a bad school; if you learned Scheme, chances are you went to a good one.”

Klar würde auch dieser Ansatz ohne Nachdenken mit vielen unnötigen Rekursionen den Hardwareumsatz ankurbeln…

Aber schlechten und anfälligen Code kann man wahrscheinlich in jeder Sprache schreiben (auch wenn einige das bedeutend besser als andere unterstützen ;-)).

Worauf es in (“seiner”) “Computer Science” wirklich ankommt, hat Alan J. Perlis ja mal schön zusammengefasst:
“Don’t feel as if you’re Bible salesmen. The world has too many of those already. What you know about computing other people will learn. Don’t feel as if the key to successful computing is only in your hands. What’s in your hands, I think and hope, is intelligence: the ability to see the machine as more than when you were first led up to it, that you can make it more.”


Hadmut
9.8.2009 13:16
Kommentarlink

@TEN: Nein!

Objektorientiertes Programmieren heißt ja “nur”, daß man seinen Programmcode sauber aufräumt und strukturiert, und daß man die einzelnen Bestandteile des Programms mittels sauberer Schnittstellen und Zugriffsstrukturen voneinander trennt. Es heißt ja nicht, daß man nicht selbst programmiert.

Funktionales Programmieren hingegen heißt (jedenfalls so, wie es an manchen Unis gelehrt wird), daß man irgendwelche theoretischen Formeln quasi 1:1 in Programmcode übersetzen kann und den Rest der Laufzeitumgebung überläßt, ohne sich da irgendwie Gedanken darum zu machen, was da eigentlich passiert und wie der Interpreter das Problem letztlich auflöst. Die eigentliche Lösung des Problems überläßt man einem okkulten Laufzeitsystem. Und hält das auch noch für elegant und fördernswert.

Viele der Dozenten, die funktionales Programmieren lehren, demonstrieren eigentlich nur vor versammeltem Publikum, daß sie zu faul (oder zu doof) sind, selbst richtig programmieren zu lernen und – Wissenschaft macht’s möglich – ihre Inkompetenz zur Tugend erklären und auch noch abprüfen. Dann sollten Sie sich lieber ehrlich hinstellen und sagen, daß sie leider nicht programmieren können und es deshalb leider auch nicht lehren können, und man dafür doch bitte eine Vorlesung an der FH besuchen möge. Das aber erlaubt die Arroganz der Universitäten wieder nicht.


yasar
9.8.2009 13:14
Kommentarlink

Zum Thema Network Manager:

Ist der größte Mist, den es gibt. Ist für den 08/15-user vielleicht eine (kleine) Hilfe in seinem Homenetzwerk, wo alles weitgehend einfach strukturiert ist, aber wen ich damit in dutzenden Kudnennetzen unterwegs bin und teilweise meine (Kunden-)VPNs (openVPN, IPSEC, etc) kotaktieren will, spuckt mir das Teil öfter in die Suppe. Daher bin ich wieder dazu übergegangen, die herkömmliche Methode mit Dateien unter /etc/network u.a. und passenden Skripten für die Arbeitsumgebung zu behelfen.

Den Tipp mit Wicd werde ich mir mal anschauen.

Zum Thema Informatikerausbildung:

Natürlich ist es so, daß die an der Uni ausgebildtenen Informatiker vorwiegend das wissenschaftliche und theoretische Wissen vermittelt bekommt (oder bekommen sollte). Allerdings gehört IMHO zu einer guten theoretischen Ausbildung dazu, daß zumindest ein Einblick in die Praxis gehört. Nicht umsonst schreiben die Bauingenieure Prxissemester auf dem Bau vor,damit die Bauigel erleben, wie auf dem Bau gepfuscht wird. Ob die Architekten diese Auflagen auch haben weiß ich nicht.

Von daher wäre es in der Informatik nicht abwegig ein oder zwei Praxissemester vorzschreiben, in denen Programmieren u.a. praktische Tätigkeiten gelehrt werden.

Wobei ich aber betonen möchte, ein Informatiker kein Programmierknecht werden sollte, auch wenn viele das miteinander asoziieren.


Peter
9.8.2009 13:32
Kommentarlink

@Hadmut:

also zu meiner Zeit (so 1998 rum) fielen in der Informatik I Vorlesung Sätze wie:

“Es kann nicht sein, daß wir hier Informatiker ausbilden, die keine Programmiersprache beherrschen.”

“Sie sollten am Ende Ihres Studiums in der Lage sein, sich eine beliebige Programmiersprache innerhalb einer Woche anzueignen.”

Das Ergebnis war dann relativ praxisnah sowohl in Vorlesung als auch in Übung mit Java.

Für mich mit C++-Background zwar mehr ein Grund mich mit meinen Tutoren über die (damaligen) Schwächen der Sprache zu streiten. (Zu starker Hang für Downcasts ist ja bis heute noch ein Thema…)

Der Grundansatz war aber völlig richtig.

Es wird Dich, nebenbei bemerkt, vermutlich erstaunen, daß einem Lieblingsfeind von Dir (Prof. Tichy) eben diese Sätze über die Lippen kamen 🙂


TEN
9.8.2009 13:41
Kommentarlink

Ich schrieb natürlich bewusst einschränkende “z.T.” und “manche”: Gar kein Zweifel, dass OOP wichtig ist und auch sehr nutzbringend und sinnvoll gelehrt werden kann und sollte!
Problematisch finde ich nur das (hoffentlich seltene) Extrem, in dem Semester damit vergehen, unter dem Titel “Programmierung” fast nur die Objekte und Methoden fremder APIs aufzufinden und als nicht weiter zu hinterfragende “black boxes” baukastenmäßig zusammenzuklicken (und dabei entsprechend wenig über Strukturen und Effizienz lernen zu können).


Hadmut
9.8.2009 14:34
Kommentarlink

@TEN: Genau das, nämlich nur das Nutzen fremder APIs ist ja genau der Murks, der zu solchen Geschwüren wie dem Network Manager führt.

Die haben auch alle möglichen API, IPC, weiß der Kuckuck was zusammengerührt, DBus, inotify, Speicherung von Daten in der Desktop Konfiguration und ohne Nachzudenken, was sie da tun, eine übles und kaum zu kontrollierendes Konglomerat zusammengebaut.


Camie
9.8.2009 15:31
Kommentarlink

Zum Informatikstudium:
Ich habe Biochemie studiert.

Ein Lieblingssatz eines Profs (und Praktikumsleiters) der allgemeinen Chemie war: “Die Chemie ist ein intellektuelles Handwerk”. Und genau so war das Studium auch aufgebaut, wir hatten wirklich viele Praktika. Obwohl ich nur einen Bruchteil der erlernten Techniken überhaupt noch benutze, weil auch viele rein chemische Praktika dabei waren, merke ich immer wieder dass es sinnvoll war weil ich die Hintergründe und Abläufe verstehe, wenn ich ein neues Experiment plane. Selbst die Funktionsweise eines Geräts wie z.B. Spektrometer, an denen man nicht viel einstellen brauch, habe ich immer besser verstanden nachdem ich es einmal im Praktikum selbst gesehen habe.

Ich kann mir gut vorstellen, dass es mit dem Informatikstudium und dem Programmieren ähnlich aussieht.


hardy.falk
9.8.2009 15:41
Kommentarlink

Na ja, ein Beispiel für funktionale Programmierung in der Sprache Mercury
ist der Pdf – Generator Prince. Er rendert HTML mit CSS2 in Pdf-Dokumente.
Paginierung, Kopf-und Fußzeilen, SVG und anderes. Komplexe Reports, mit eingebetteten Kurvendarstellungen werden in ein,zwei Sekunden erzeugt.
Als mein Arbeitgeber die PDF-Ausgabe für die Reporterstellung benötigte, hatte ich damals (2006) etwas recherchiert und auch das unsägliche Apache-FOP ausprobiert. Kein Vergleich.
Der CSS- beinahe-Erfinder Håkon Wium Lie hatte damals argumentiert, dass XSL-FO ein Irrweg sei und die Verwendung von CSS empfohlen. Er ist, so weit ich weiß, an der Firma auch beteiligt.

-> Wikipedia:
Mercury is a functional logic programming language geared towards real-world applications.It is developed at the University Of Melbourne Computer Science department.

Mercury is a purely declarative logic language based on Prolog[1].
It features a strong, static, polymorphic type system, as well as a strong mode and determinism system.

Mit diesem Hinweis möchte ich die funktionalen Sprachen vor ihren deutschen Hohepriestern verteidigen. Der Prince-Formatierer war jedenfalls eine Erlösung. Kleine Software vom Feinsten.


Jens
27.8.2009 18:47
Kommentarlink

Gerade wieder viel Spaß mit dem NetworkManager gehabt … Mußte für ein Interface manuell eine IP einstellen – am Anfang hat er als Präfix immer 1 genommen statt 24 (eingestellt in einem extrem grottigen kconfig-Modul). Und jetzt funktioniert es plötzlich …


yasar
28.8.2009 14:03
Kommentarlink

Apropos wicd:

Ist bei mir wieder rausgepflogen. Ich habe einigen Interfaces per /etc/network/interfaces ihre Konfiguration zugeteilt, aber wicd scherte sich nicht drum und war der Meinung diese Interfaces sich krallen zu müssen, was natürlich schiefging.


[…] vielleicht-irgendwann-Diplominformatiker mir von einem Fachinformatiker sagen lassen muss, dass das was ich lerne nicht sinnvoll ist, und dass es Unternehmen gibt, die lieber Fliesenleger anstellen und ihnen C++ beibringen, als […]