20 Jahre Java

Keine Zeit? Hier die Kurzversion in 30 Sekunden.
- Am 23. Mai 1995 wurde Java öffentlich vorgestellt, jetzt sind es 20 Jahre.
- Was bleibt: die JVM, eine fast sture Abwärtskompatibilität und ein riesiges Ökosystem samt Maven Central.
- Tiefpunkte: Applets, das Plug-in mit seinen Sicherheitslücken, Unsicherheit nach der Oracle-Übernahme, die lange Pause zwischen Java 6 und 7.
- Lichtblicke: Java 8, OpenJDK, Spring Boot. Java 9 mit Jigsaw ist für 2016 angekündigt.
Gestern war der Jahrestag: Am 23. Mai 1995 wurde Java öffentlich vorgestellt. Zwanzig Jahre sind in unserer Branche eine Ewigkeit, und es ist selten, dass eine Sprache samt Plattform so lange nicht nur überlebt, sondern ziemlich mittendrin steckt. Ich arbeite mit Java neben C#, PHP und C++, und der Vergleich mit den anderen hat mein Bild von Java im Lauf der Zeit eher geschärft als verändert. Ein paar Gedanken zum Geburtstag, ohne Anspruch auf Vollständigkeit.
Was Java ausmacht
Wenn ich sagen müsste, was an Java das Eigentliche ist, wäre es für mich nicht die Sprache. Die Sprache ist solide, lange Zeit eher bieder, und viele Dinge, die in anderen Sprachen elegant gehen, waren hier umständlich. Das Eigentliche ist die virtuelle Maschine. Die JVM hat die Idee „einmal schreiben, überall laufen“ nicht ganz so eingelöst, wie der Slogan es versprach (wer je eine Oberfläche auf drei Systemen testen musste, weiß das), aber für Serveranwendungen hat sie ein Versprechen gehalten, das mindestens genauso wertvoll ist: Der Code läuft dort, wo man ihn hinstellt, und verhält sich ziemlich gleich.
Dazu kommt eine Eigenschaft, die man leicht unterschätzt, nämlich die Abwärtskompatibilität. Code, der vor vielen Jahren kompiliert wurde, läuft meist auch heute noch. Das hat einen Preis: Manche Entscheidungen der Anfangszeit, etwa die Art, wie Generics umgesetzt wurden, kann man nicht mehr zurücknehmen. Aber wer andere Plattformen kennt, auf denen jede zweite Version etwas Altes bricht, lernt diese Verlässlichkeit zu schätzen. Für alle, die Software über ein Jahrzehnt betreiben müssen, ist das kein Detail, sondern das halbe Argument.
Und dann das Ökosystem. Es gibt kaum ein Problem, für das es keine Bibliothek gibt, oft sogar mehrere. Maven Central hat daran großen Anteil: Dass man eine Abhängigkeit mit ein paar Zeilen in einer Konfigurationsdatei einbindet und das Werkzeug den Rest samt transitiver Abhängigkeiten holt, ist heute so selbstverständlich, dass man vergisst, wie mühsam es früher war, Jar-Dateien von Hand zusammenzusuchen. Auch Open-Source-Projekte wie Apache oder Eclipse haben die Plattform geprägt, vielleicht mehr als jede Spezifikation.
Die Tiefpunkte
Es gab auch Zeiten, in denen ich Java mit gemischten Gefühlen betrachtet habe. Applets zum Beispiel. Die Idee, kleine Programme im Browser laufen zu lassen, war reizvoll, aber das Ergebnis waren träge Startzeiten, graue Kästen und Dialoge, die man wegklicken musste. Als sich andere Techniken im Browser durchsetzten, verlor das Applet seinen Sinn, und die Browser-Hersteller räumen die alte Plug-in-Schnittstelle inzwischen auf. Ein Plug-in, das kaum noch jemand braucht, aber auf Millionen Rechnern installiert ist, wird zum bequemen Einfallstor. Die Sicherheitslücken im Java-Plug-in der letzten Jahre haben dem Ruf der Plattform mehr geschadet, als es der Technik gerecht wird, denn mit Java auf dem Server hat das wenig zu tun. Der Schaden blieb trotzdem hängen.
Der zweite Tiefpunkt war eher ein Zustand der Ungewissheit. Als Oracle Sun übernahm, war nicht klar, was aus der Sprache wird: Würde Oracle sie weiterentwickeln, bremsen oder vor allem juristisch verwalten? Es folgte die lange Pause zwischen Java 6 und Java 7, in der wenig Sichtbares passierte, während andere Sprachen auf der JVM und daneben spürbar vorankamen. Man hatte zeitweise das Gefühl, dass Java auf der Stelle tritt und die Dynamik bei Scala, Groovy und anderen liegt. Ich will der Zeit nicht unrecht tun, hinter den Kulissen wurde sicher viel gearbeitet. Von außen sah es aber nach Stillstand aus, und das hat Vertrauen gekostet.
Die Lichtblicke
Dafür war Java 8 vor gut einem Jahr eine echte Erleichterung. Lambda-Ausdrücke und die Stream-API ändern, wie man Code schreibt, und zwar nicht kosmetisch. Sammlungen zu verarbeiten ist plötzlich lesbar, und viel Zeremonie fällt weg. Dass eine so alte Sprache sich so deutlich bewegen kann und dabei kompatibel bleibt, hätte ich nach den mageren Jahren nicht erwartet. Es zeigt, dass Abwärtskompatibilität keine Ausrede für Stillstand sein muss.
Ebenfalls wichtig finde ich OpenJDK. Dass die Referenzimplementierung offen liegt und Hersteller und Community daran mitarbeiten, nimmt der Frage nach der Zukunft einen Teil ihrer Schärfe. Selbst wenn ein einzelner Eigentümer das Interesse verlöre, bliebe der Code da. Das ist eine Art Versicherung, die man hoffentlich nie braucht.
Und dann Spring Boot. Nicht, weil ich glaube, dass es alles löst, sondern weil es eine Schwäche angeht, die Java lange anhing: den Aufwand, bis eine Anwendung läuft. Ein ausführbares Jar mit eingebettetem Server, vernünftige Voreinstellungen, wenig Konfiguration. Wer sich an meterlange XML-Dateien erinnert, spürt den Unterschied sofort. Dass die Plattform sich auf der Ebene der Werkzeuge und Frameworks so erneuert, gefällt mir fast besser als manche Spracherweiterung.
Java neben den anderen
Im Vergleich mit C#, PHP und C++ zeigt sich, wofür Java steht. C# ist in vielem schneller vorangegangen, bei Sprachfeatures war es Java lange voraus. PHP ist unschlagbar, wenn es schnell gehen soll, verlangt aber mehr Disziplin, damit ein Projekt wartbar bleibt. C++ gibt mir Kontrolle, die ich in Java nicht habe, und ich bezahle sie mit Aufwand. Java liegt dazwischen: nicht die schnellste Wahl und nicht die eleganteste, aber eine, bei der ich wenig Überraschungen erwarte. Für größere Anwendungen, die lange leben sollen, ist das häufig genau das Richtige.
Ein Blick nach vorn
Für Java 9 ist ein Modulsystem unter dem Projektnamen Jigsaw angekündigt, ursprünglich schon für eine frühere Version geplant und jetzt für 2016 vorgesehen. Ich bin gespannt, ob es hält, was man sich davon verspricht. Die Idee ist, die Plattform selbst in Module zu zerlegen und Abhängigkeiten zwischen Teilen eines Programms sauberer zu fassen als mit dem Klassenpfad, der immer schon eine Quelle von Rätseln war. Die Schwierigkeit liegt darin, dass dabei Millionen Zeilen bestehenden Codes weiter laufen sollen. Ich erwarte keine Revolution, eher eine längere Eingewöhnungszeit, in der man Fehler an unerwarteten Stellen findet. Aber der Schritt ist überfällig.
Was ich aus zwanzig Jahren mitnehme: Plattformen überleben nicht durch Eleganz, sondern durch Verlässlichkeit und durch eine Gemeinschaft, die sie weiterträgt. Java war oft nicht die schönste Wahl, aber selten eine, die man bereuen musste. Das ist, bei Lichte betrachtet, ein ziemlich gutes Zeugnis.
Beitragsbild: eigene Collage mit Logos von Wikimedia Commons (Duke (Java-Maskottchen): sbmehta nach Vorlage von Sun Microsystems, BSD-Lizenz); die Marken gehören ihren Inhabern.
Christian Ackermann
Softwareentwickler (C++, C, Java, C#) aus der Oberpfalz, bloggt seit 2001 über Linux, Technik und Kochen.