Über Softwarekomplexität

Dienstag, 25 April 2017 10:44 by Christoph

Ich mag Komplexität nicht. Die kann man nicht dauerhaft beherrschen. Kontrollverlust.

Das ist mir beim Aktualisieren der Blogsoftware wieder ganz enorm aufgefallen. Ich hoste ja ungewöhnlicherweise auf einem Windows-Server und bevorzuge serverseitig ASP.NET. Für das Devlog habe ich auf den Platzhirschen zurückgegriffen, die Blogengine.NET. Die war mal schlank, übersichtlich und recht wartbar. Aber die Security. Darf man auf Updates verzichten? Eher nicht. So habe ich in Abständen die Updates mitgemacht und war immer mehr ernüchtert. Was vorher schlank, übersichtlich und recht wartbar war, wurde nun zu Angular, Bootstrap und Webgrease. Leute, mal echt: muss das sein? Ich war ganz nah dran, das alles wegzuschmeißen und einen statischen Seitengenerator zu verwenden. Oder mir selber einen zu schreiben. Dieses Jahr dann jedoch die erfreuliche Nachricht. Das Pendel schwingt wieder zurück. Man rückt ab vom Bloat.

Ich habe das durch meine recht eigentümliche Updatestrategie bemerken dürfen. Die offizielle Anleitung besagt, die neuen Dateien einfach in die alte Installation integrieren. Nein! Dann bleibt doch nicht mehr verwendeter Code rumliegen, stellt schlimmstenfalls Sicherheitsrisiken dar. Ich mache das anders: Neue Installation anlegen und Dateien aus der alten, von denen ich weiß, dass sie gebraucht werden, dort integrieren (Konfigurationen, Themes, Blog-Beiträge). Dann mit Git vergleichen: 1000 Änderungen, davon jedoch 500 echtes Löschen - also nicht jQuery 2.1 entfernen und jQuery 2.4 hinzufügen, sondern wirklich weg! Das ist gut. Es zeigt, dass die Autoren erkannt haben, wie sie übertrieben. Die Abhängigkeitsübertreibung war nicht gut, der Erkenntnisgewinn schon.

Die meisten Entwickler schaffen nur Schritt 1. Die Javascript- und Ruby-on-Rails-Leute sind so ein Beispiel. Es gibt da auch Gute, aber es gibt insgesamt einfach sehr viele, so dass die Schlechten absolut auch mehr sind. Die haben ein Problem und schauen nach einem Gem/ Node-Package. Wiederverwendung ist ja an sich nichts Schlechtes, es ist ein Mittel gegen Komplexität. Aber was die da gemacht haben, entbehrt wirklich allem was gut und rein ist. Ich habe das mal gesehen. Problem war: wir brauchen einen Datensatz aus der Datenbank via Web-API als JSON. Lösung: irgendein Rails-Exporter Gem ergoogelt. Das brauchte aber auch Authentifizierung (abhängiges Gem). Das wiederum sollte auch nebenläufig gehen (abhängiges Gem). Das wiederum musste synchroniert werden (abhängiges Gem). Die Synchronisation musste regelmäßig auf Konsistenz geprüft werden (abhängiges Gem). Bumm! Um einen Datensatz als banales JSON auszugeben wurden 10 MByte an Abhängigkeiten (geschätzte 30 Gems) installiert. Naja, immerhin hatte das System dadurch am Ende auch eine Schnittstelle für Cron-Steuerung.

Kurz: Schaut doch mal genau was ihr braucht. Fast nie benötigt man ein Framework. Beobachtet, welche Abhängigkeiten ihr euch einfangt. Oft findet man sehr spezifische und schlanke Lösungen. Wenn nicht, dann baut man sich eben eine. Software-Engineering ist eine kreative Tätigkeit und Verstehen ist der Schlüssel. Wenn man empfohlene Frameworks einfach von Stackoverflow kopiert, dann ist etwas extrem faul.