Leseempfehlung: ‚Die Hyperion-Gesänge‘ von Dan Simmons

Urlaubszeit ist Lesezeit bei mir, wann hat man sonst Zeit dafür? Dieses Mal kam der Tipp dazu aus dem Security Now Podcast, den ich hier sonst eher wegen seines eigentlichen Themas ‚IT Sicherheit‘ erwähne, der aber immer mal wieder eine gute Quelle für Science Fiction Literatur ist.

Bei dieser Empfehlung merkt man das Alter der beiden Hosts, denn der erste der beiden Romane, um die er hier geht, wurde im Jahr 1989 veröffentlicht: Hyperion von Dan Simmons. Der folgende Roman, der die Handlung abschließt, ist Der Sturz von Hyperion und erschien ein Jahr darauf. Wer meiner Empfehlung folgt, sollte gleich zu Die Hyperion-Gesänge greifen, ein 2002 erschienener Sammelband mit beiden Teilen.

Gut gealtert

Bei Science Fiction ist es so eine Sache mit dem Altern…manche Romane lesen sich Jahrzehnte nach dem Erscheinen eher albern oder gar peinlich, weil die Autor*innen sich die Zukunft in Details ausgemalt haben, die von der Realität überholt oder aus heutiger Sicht einfach kurzsichtig erscheinen.

Aber Dan Simmons hat es geschafft eine Zukunftsvision zu beschreiben, die sehr ferne Elemente enthält, wie eine verzögerungslose Reisemöglichkeit zwischen den Sternen. Aber auch aus heutiger Sicht bereits (fast) gegenwärtige Elemente, wie ein allgegenwärtiges Datennetz, in dem sich alle Menschen nahezu permanent aufhalten, und dessen Abwesenheit zu Entzugserscheinung und Hilflosigkeit führt. Als er das geschrieben hat gab es das Internet zwar schon in technischer Hinsicht, aber es war nur wenigen Menschen bekannt und die Aussicht, jeder Mensch könnte ein Gerät bei sich führen, welches jederzeit Zugriff auf diese Sphäre ermöglichen, eine Vision, die vielen vermutlich ferner schien als die fliegenden Autos, die wir eigentlich alle schon haben sollten.

Aber auch hier ist die Vision so geschrieben, dass man sich nicht daran stört, wenn von Komlogs (im Original comlogs) die Rede ist und nicht von iPhones, und es betont nur, welche menschlichen Eigenschaften über die Zeit hinweg vielleicht unverändert bleiben werden.

Bestimmte Begriffe wie SimStim oder das schwarze Eis, welches zur Charakterisierung der Datenwelt verwendet wird, deuten auf das Entstehen in den 80ern hin, zumindest kenne ich sie aus den Neuromancer-Romanen, die ein paar Jahres zuvor erschienen und danach sind sie mir nicht mehr begegnet. Aber das wirkt nicht antiquiert, es sind einfach nur Begriffe unter vielen anderen spannenden Wortschöpfungen.

Krieg, Religion, Gier und Altruismus

Die Geschichte hat einige der ‚üblichen‘ Zutaten einer Space Opera: Es gibt Raumschlachten, viele verschiedene Welten, an der Zeit wird herumgespielt, die Menschheit breitet sich kolonisierend über das All aus und benimmt sich dabei nicht besser als die europäischen Eroberer, die weite Teile der Erde unterworfen und ausgebeutet haben, die Sinnfrage ist immer noch nicht abschließend beantwortet.

Allerdings ist dies nur der Hintergrund, vor dem sich die verschiedenen Handlungsstränge entfalten und die ungefähr 10 Individuen bewegen, denen die Geschichte folgt. Und deren individuelle Motivationen anders sind und denen man, auch wenn sie nicht durchweg Sympathieträger sind, durch die mehr als 1.000 Seiten gerne folgt.

Und für mich war am Ende beeindruckend und schön, wie die ganzen Fäden und absurden Einfälle – ich nenne hier nur die merkwürdigen Parasiten – zusammengeführt werden und ein homogenes Gebilde ergeben.

Aktuell: Die Entwicklung der KI

Ein wesentlicher Aspekt der Romane ist aber auch das Entstehen von KIs und deren irgendwann zur Menschheit konkurrierende Entwicklung. Das hier gezeichnete Bild ist grob genug, um heute nicht lächerlich zu wirken, aber die Ideen für so eine Entwicklung lassen sich auch in den durch das Erscheinen von ChatGPT befeuerten Diskussionen wiederfinden und wirken daher weiterhin aktuell.

Und auch das, was ich als eine Kernfrage der Romane sehen würde: Inwieweit sollte man Produkten und ‚Geschenken‘ von KI Systemen vertrauen, die man nicht mehr versteht und deren Motivation damit ebenso wenig?

Bilder aus der KI

Die drei hier enthaltenen Bilder sind dabei auch aus einer KI gekommen. Mit Hilfe von Midjourney habe ich versucht eine Impression zu erstellen, welche bei Leser*innen der Romane hoffentlich schnell eine Assoziation auslösen wird.

Jetbrains AI Assistent – kurz ausprobiert

Wir setzen in der Programmierung der BIS Anwendungen seit einiger Zeit auf Intellij, die Java IDE von Jetbrains, und zwar in der Ultimate Edition. Der Schritt weg von Eclipse – damals schon mit der Spring Tool Suite – war zunächst nicht ganz leicht, aber im Endeffekt sind die Hilfsfunktionen dieses Produkts so leistungsfähig, dass sich der Umstieg gelohnt und die Kosten in Form von besserer Produktqualität und Entwicklungsgeschwindigkeit aus meiner Erfahrung voll zu rechtfertigen sind. Auch die Tatsache, dass Android Studio, welches wir für unsere App verwenden, auf Intellij basiert und somit der Wechsel zwischen den IDEs leichter fällt, ist hier ein Argument.

Was ist der AI Assistent

Seit ein paar Wochen vermarktet Jetbrains nun seinen auf OpenAI Technologien basierenden AI Assistenten und verspricht hier durch die direkte Integration in die IDE – und deren schon vorher vorhandenes, tiefes Verständnis des Programmcodes – eine bessere Leistung und nahtlosere Integration, als sie mit anderen vergleichbaren Tools zu erreichen sei.

Hier ein paar Erfahrungen dazu, wie sich das Tool in einem komplett neu gegründeten Java 22 Projekt anfühlt. Da das hier beschriebene Verhalten vermutlich schon wieder veraltet ist kann man das aber nur als eine momentane Bestandsaufnahme sehen:

Automatische Codevorschläge nur aus der Methodensignatur

Ein erster Effekt ist dieser: Es reicht aus – jedenfalls oft – eine Methodensignatur zu schreiben und der Assistent macht einen Vorschlag. Zum Beispiel sorgt die Signatur

public Set<Fachabschluss> fachAbschluesse()

für diesen völlig korrekten Codevorschlag:

Aufforderung zur Methodenimplementierung per Prompt

Nicht immer klappt es mit dem Automatismus, warum ist mir nicht klar geworden. Aber in so einem Fall kann man per Prompt zur Implementierung auffordern:

Allerdings zeigt sich hier die Unberechenbarkeit der heutigen KI Lösungen: Im ersten Anlauf wurde direkt der passende Code erzeugt. Als ich das Ganze noch einmal für die Screenshots gemacht habe aber nicht und erst ein erneutes Prompt brachte das gewünschte Ergebnis:

Hier wurde also zuerst eine sinnfreie Implementierung vorgeschlagen, die einfach nur null liefert. Es kann natürlich sein, dass der Assistent hier gemerkt hat, dass ich den vorherigen Vorschlag verworfen hatte und daher so ‚reagiert‘. Trotzdem wirkt es etwas skurril und unberechenbar, aber durchaus im Einklang mit den Erfahrungen vom ChatGPT oder Google Bard (inzwischen abgelöst durch Gemini), die fehlerhafte Ergebnisse liefern und dann auf Hinweis auf die Fehler etwas besseres nachliefern.

Überhaupt das Thema Fehler:

Verwendung von nicht existierenden Methoden

Eine Sache, die scheinbar regelmäßig vorkommt, ist die Verwendung von nicht existierenden Codebestandteilen im Vorschlag:

Die richtige Lösung wäre es hier gewesen noch eine Ebene tiefer zu gehen und aus den Modulabschluss-Objekten die enthaltenen Fachabschluss-Objekte zu holen. Und nicht über eine nicht vorhandene Methode eine Filterung durchzuführen.

Konsistenz: Unterschiedliche Lösungen für gleiche Aufgaben

Auch wenn es nicht falsch ist gibt es ein Verhalten, welche mein Stilempfinden stört: Der Assistent erzeugt für gleiche Aufgaben unterschiedlichen Code. Das sind teilweise nur Nuancen, aber sie machen den Code inhomogen und damit schwerer verständlich.

Code Variante 1

    public Set<Fachabschluss> fachAbschluesse() {
        return module.stream()
                .flatMap(mip -> mip.fachAbschluesse().stream())
                .collect(Collectors.toSet());
    }

Code Variante 2

    public Set<Fachabschluss> fachAbschluesse() {
        return profile.stream()
                .map(Profil::fachAbschluesse)
                .flatMap(Set::stream)
                .collect(Collectors.toSet());
    }

Beide Varianten führen zum gleichen Ergebnis, aber es zeigt die Zufälligkeit der von der KI generierten Codes.

Nicht ganz up to date

Das generelle Problem der heutigen LLMs, die prinzipbedingt nicht tagesaktuell sein können, zeigt sich auch hier an manchen Stellen, etwa beim Versuch die Java Version in der pom.xml des maven-Projekts über den Assistenten auf Java 22 zu erhöhen:

Das Java 22 JDK wurde ca. 10 Tage vor dem Schreiben dieses Posts veröffentlicht. Allerdings scheint das ‚Wissen‘ des Assistenten noch deutlich älter zu sein, was man aus der Behauptung schließen kann, die letzte stabile Java Version sei 17. Selbst wenn ’stabile Version‘ die LTS Releases meint, so wäre das Java 21 und das kam am 19. September 2023 raus.

Grundsätzlich führt einen der Assistent hier aber auf die richtige Spur und sagt, was man machen muss. Und das ohne die IDE verlassen zu müssen. In vielen Anwendungsfällen dürfte es nicht stören, wenn der Assistent nicht die allerletzten Sprachversionen kennt. Allerdings hatte ich bei anderen Assistenten auch schon Probleme damit, dass Versionen von Open Source Projekten eingebunden wurden, die entweder schon nicht mehr existierten, oder die wegen lange bekannter Sicherheitsprobleme bereits nicht mehr zur Nutzung empfohlen wurden.

Fazit

Durch das Entstehen von KI Werkzeugen, die Programmcodes in hoher Qualität erstellen können, wird auch das Berufsbild der Softwareentwickler*innen schon jetzt sehr in Frage gestellt. Und was ein Tool wie der Jetbrains Assistent zeigt: Für bestimmte Routinen muss man nicht mehr selbst programmieren können. Oder nur noch in Teilen.

Allerdings ist mein Einsatz des Werkzeugs vermutlich noch zu sehr vom Denken als klassischer Softwareentwickler geprägt, der es gewohnt ist die Struktur seiner Software vorzugeben. Daher habe ich der KI nur etwas Zuarbeit überlassen. Das eigentliche Versprechen ist es aber, dass man eigentlich gar nicht mehr direkt Software entwickeln können muss, sondern ’nur‘ seine Anforderungen und Ziele definiert und der Rest kommt automatisch. Vielleicht noch mit etwas ‚low code‘.

Also so, wie ich beim Generieren von Fotos per Midjourney – siehe das Bild der Roboterhände am Anfang – vorgehe, ohne irgendeine besondere Kenntnis von Malerei oder Graphikdesign zu haben. Aber um so an die Softwareentwicklung herangehen zu können müsste ich erst einmal viel entlernen, was ich mir in Jahrzehnten erarbeitet habe. Mal sehen, ob mir das beim nächsten Versuch gelingt.