React: Funktional versus objektorientiert
Entwickler: Hallo Golo! Wir wollen uns ein wenig über den aktuellen Stand bei React unterhalten. Auf den React Days 2018 hältst du dazu auch einen Deep Dive Workshop, bei dem du Konzepte aus der funktionalen Programmierung vorstellst: Immutability, Value Objects, Unidirectional Dataflows, Identität, Gleichheit, Pure Functions, etc. Weshalb kommt die funktionale Programmierung gerade wieder so mächtig zurück, nachdem lange Jahre doch alle Zeichen auf Objektorientierung standen?
Golo Roden: Nimmt man die klassische objektorientierte Programmierung ernst, dienen Objekte dem Abbilden von Fachlichkeit. Sie repräsentieren fachliche Vorgänge. Das bedeutet, dass sie zum einen alle für einen Vorgang relevanten Daten kapseln und zum anderen über die Logik verfügen, um mit diesen Daten zu arbeiten. Nimmt man das objektorientierte Paradigma ernst, bedeutet das, sich primär mit dem Analysieren und Modellieren von Fachlichkeit zu befassen.
In der Realität wird in der Regel jedoch über technische Aspekte diskutiert. Im schlimmsten Fall werden diese Diskussionen von objektorientierten, technischen Eigenheiten der jeweiligen Programmiersprache bestimmt. Dabei ist Entwicklung von Software doch kein Selbstzweck, sondern dient dazu, die fachlichen Probleme der realen Welt zu lösen! Diese Denkweise findet man heutzutage allenfalls im Bereich des Domain-driven Design.
Die Objektorientierung wird also missverstanden und daher in der Regel falsch angewendet. Selbstverständlich kann die objektorientierte Programmierung ihre Versprechen wie Abstraktion und Wiederverwendbarkeit dann nicht mehr erfüllen, was zu Geringschätzung führt. Das ist das eine Problem.
Die Objektorientierung wird missverstanden und daher in der Regel falsch angewendet.
Das andere Problem ist tatsächlich technischer Natur. In den 90er Jahren nahm die Geschwindigkeit von Prozessoren stetig zu. Lief eine Software zu langsam, konnte man im Zweifelsfall einfach auf die nächste Hardwaregeneration warten, die das Problem dann lösen würde. Doch diese Zeiten sind vorbei: Prozessoren werden nicht mehr schneller, stattdessen steigt ihre Anzahl.
Software profitiert von mehr Prozessoren jedoch nicht automatisch. Damit sie die gestiegene Leistung nutzen kann, muss sie Aufgaben parallelisieren können. Während das zeitgleiche Lesen von Daten unproblematisch ist, gilt das für das Schreiben nicht. Es kommt zu Race-Conditions und anderen Timing-Problemen, die nur schwer in den Griff zu bekommen sind.
Nicht umsonst bietet nahezu jede objektorientierte Programmiersprache spezielle Schlüsselwörter, um den zeitgleichen Zugriff auf Daten zu synchronisieren oder zu sperren. Das macht den Entwurf und die Entwicklung von Objekten aufwändig und fehleranfällig.
Das steht im Widerspruch zu dem Wunsch, einfachen und fehlerfreien Code zu erhalten, dessen Auswirkungen sich vorhersagen lassen, ohne vom Zufall oder anderen zeitlichen Effekten zur Laufzeit abzuhängen. Und genau das klappt mit der funktionalen Programmierung viel besser.
Entwickler: Kannst du das vielleicht einmal anhand eines der oben genannten funktionalen Konzepte etwas genauer erläutern?
Golo Roden: Sehr gerne! Ein wunderbares Beispiel ist die Unveränderlichkeit von Objekten, die sogenannte Immutability. Die grundlegende Idee ist, dass ein Objekt nicht verändert werden kann. Stattdessen erzeugt jede Veränderung eine neue Instanz. Damit gibt es per se keine konkurrierenden Schreibzugriffe, also kann es folglich auch keine Probleme wie Data-Races geben. Jede Instanz repräsentiert dann einen einzelnen unveränderlichen Zustand.
Hinzu kommt, dass jede Änderung deutlich wird, da ein Funktionsaufruf eine neue Instanz zurückgibt. Man weiß genau, dass das Objekt nach einem Funktionsaufruf noch den gleichen Zustand besitzt wie zuvor, und dass der neue Zustand im Rückgabewert enthalten ist. Das macht das Nachdenken über den Code und dessen Effekte viel einfacher.
Außerdem wird in der zeitlichen Abfolge ersichtlich, welche Funktionsaufrufe voneinander abhängen und welche nicht. Diese Information kann nicht nur der Mensch, sondern auch der Compiler ermitteln – und entsprechend parallelisierten Code für all jene Funktionsaufrufe erstellen, die unabhängig voneinander sind.
React ist, konzeptionell gesehen, gar nicht so neu, wie viele zunächst glauben.
Ironischerweise ist das alles nichts Neues. Solche Überlegungen gab es schon in den 1950er-Jahren im Rahmen der Programmiersprache Lisp, aus der man übrigens enorm viel lernen kann, gerade in Hinblick auf diese grundlegenden Konzepte von Datenstrukturen und Abläufen.
Vieles davon wird beziehungsweise wurde in React aufgegriffen. React ist also, konzeptionell gesehen, gar nicht so neu, wie viele zunächst glauben. Die große Leistung von React ist aber, die Konzepte und Methoden aus der funktionalen Programmierung leicht verständlich zugänglich zu machen und deren Verbreitung zu fördern. Wer die funktionale Programmierung und ihre Konzepte kennt, wird in React dementsprechend viel Bekanntes wiederfinden.
React & JavaScript – aktuelle Entwicklungen
Entwickler: Woran arbeitet man im React Team gerade – welche neuen Features sind in der Pipeline?
Golo Roden: Eines der ganz großen Themen ist das asynchrone Rendern. Bislang blockiert ein Render-Vorgang die gesamte UI, was man bei komplexen Änderungen zu spüren bekommt, da die UI nur noch träge oder gar nicht mehr reagiert. Das asynchrone Rendern blockiert nicht mehr, weshalb die UI auch dann responsiv bleibt, wenn beispielsweise eine umfangreiche Komponente neu gezeichnet werden muss.
Das Feature ist also insbesondere in Hinblick auf die Performance der UI sehr interessant, erfordert aber teilweise neue APIs und zieht daher einige nicht mehr abwärtskompatible Änderungen nach sich. Beispielsweise entfallen einige Funktionen aus dem Lebenszyklus von Komponenten, da dieser zukünftig anders aufgebaut sein wird.
Beachtlich ist dabei aber, dass die Entwickler von React – wie bei bislang jeder Version – dafür sorgen, dass der Bruch nicht schlagartig von einem auf den anderen Tag erfolgt. Stattdessen werden die nicht mehr länger benötigten Funktionen als veraltet gekennzeichnet, so dass die Entwickler von Anwendungen ausreichend Zeit erhalten, um ihren Code anzupassen.
Das finde ich persönlich ein sehr sympathisches Vorgehen, da man nicht einfach nur vor vollendete Tatsachen gestellt wird, sondern sich nach und nach auf die Änderungen einstellen und sie adaptieren kann.
Entwickler: Die JavaScript-Szene hat den Ruf, besonders schnelllebig und fragmentiert zu sein. Mit TypeScript, Node, Angular, React und Vue.js scheinen sich allerdings in den letzten Monaten doch einige Konstanten herauszukristallisieren. Können wir da so eine Art Konsolidierung der JavaScript-Welt beobachten?
Golo Roden: Die JavaScript-Szene hat nicht nur den Ruf, schnelllebig zu sein, sie ist es! Trotzdem stimmt es aber, dass sich inzwischen einige Konzepte und Technologien etabliert haben, bei denen man davon ausgehen kann, dass sie auch langfristig erhalten bleiben. Auf dem Server ist das zum Beispiel mit dem Framework Express so, das seit einigen Jahren praktisch den Standard zum Definieren von Web-APIs darstellt.
Ähnliches gilt im Frontend, wobei ich es dort weniger an den Technologien, sondern mehr an den Konzepten festmachen würde. Das, was sich beispielsweise mit Angular oder React manifestiert, ist nicht einfach nur eine Technologie, sondern eine hervorragende Umsetzung eines bestimmten Paradigmas. Bei React ist das wie bereits erwähnt der funktionale Ansatz.
Anders gesagt: Wer in der UI funktional programmieren will, wird es schwer haben, eine bessere Lösung als React zu finden, weil React eine hervorragende Umsetzung des funktionalen Paradigmas darstellt. Deshalb haben es andere Bibliotheken und Frameworks auch zunehmend schwer, sich gegen React durchzusetzen: Das zu Grunde liegende Paradigma lässt sich nur schwerlich besser umsetzen.
Das gleiche gilt für Angular, nur dass es dort die objektorientierte statt der funktionalen Programmierung ist, die als grundlegendes Paradigma gilt. Wer in der UI objektorientiert programmieren möchte, wird es schwer haben, ein besseres Framework als Angular zu finden – auch hier wieder deshalb, weil Angular einfach eine hervorragende Umsetzung des zu Grunde liegenden Paradigmas darstellt.
Die Frage nach React oder Angular ist also weniger eine Frage nach der jeweiligen Technologie, sondern letztlich nach den darunter liegenden Konzepten und Überzeugungen: Favorisiert man das funktionale Paradigma oder eher das objektorientierte? Davon hängt stark ab, in welchem Umfeld man sich eher zu Hause und gut aufgehoben fühlt.
Übrigens gilt nochmals das Gleiche auch für TypeScript. Die Sprache setzt das Konzept einer objektorientierten Programmiersprache, die auf einem statischen Typsystem basiert, gut um. Deshalb wird es in so vielen Unternehmen von C#- und Java-Entwicklern genutzt. TypeScript holt die Entwickler dort ab, wo sie sich auskennen und wohlfühlen.
Ganz am Ende steht also die Frage, welches Paradigma man höher wertschätzt. Die Antwort auf diese Frage beeinflusst dann, für welche Technologien man sich entscheidet. Mir persönlich liegt der funktionale Ansatz aus den eingangs genannten Gründen mehr, weshalb ich mich wesentlich stärker mit React und reinem JavaScript verbunden fühle als mit Angular und TypeScript.
Letztlich muss das aber jeder für sich entscheiden und individuell bewerten, wie wichtig zum Beispiel die Parallelisierung und die Nachvollziehbarkeit von Code sind.
Trends in der Webentwicklung
Entwickler: Wenn du dir die aktuelle Szene der Webentwicklung anschaust – welchen Missstand würdest du gerne am schnellsten behoben sehen?
Ich wäre froh, wenn wir den Internet Explorer endlich endgültig als obsolet ansehen könnten.
Golo Roden: Zum einen wäre ich froh, wenn wir den Internet Explorer endlich endgültig als obsolet ansehen könnten. Ich denke, dem wird buchstäblich jeder Entwickler zustimmen. Es ist extrem traurig, wie viel Zeit von kreativen und fähigen Menschen damit verschwendet wird, auf diesen veralteten und unsicheren Browser Rücksicht zu nehmen, weil einige Unternehmen und Konzerne den Aufwand und die Kosten für einen Umstieg scheuen. Im Prinzip hemmen hier einige wenige die Innovationskraft und die Produktivität einer ganzen Branche. Daran muss sich dringend etwas ändern!
Zum anderen hoffe ich, dass der aktuelle Trend, CSS in JavaScript abzubilden, noch mehr Aufschwung erfährt. Auch wenn es beeindruckend ist, was mit modernem CSS inzwischen alles machbar ist, ist es doch unglaublich schwierig, gutes CSS zu schreiben. In praktisch jedem größeren Projekt artet der CSS-Code über kurz oder lang aus und wird äußerst schwierig zu warten. Ansätze wie CSS-Modules greifen hier zu kurz. Schaut man sich die vergangenen 15 Jahre an, hat JavaScript das Web geprägt – und nicht HTML oder CSS. Insofern hege ich hier große Hoffnung, dass CSS in hohem Maße in JavaScript aufgeht.
Entwickler: Und welcher Trend interessiert dich persönlich momentan am meisten?
Golo Roden: In der UI ist das definitiv die gerade angesprochene Möglichkeit, CSS mit JavaScript abzubilden. Generell bin ich davon überzeugt, dass JavaScript noch viel stärker in den Mittelpunkt der Webentwicklung rücken muss, und dass eine viel stärkere Komponentenorientierung à la React gut täte. Wir haben derzeit mit HTML, CSS und JavaScript nicht die so oft beschworene Separation of Concerns, sondern de facto lediglich eine Separation of Languages. Mit React verschwimmt die Grenze von HTML und JavaScript, mit Projekten wie JSS verschwimmt die Grenze zwischen CSS und JavaScript.
JavaScript hat ein ausgereiftes und funktionierendes Modell für Komponenten. Es gibt zahllose Werkzeuge. Es gibt mit npm eine Paketverwaltung mit einer riesigen Community. Wenn es gelingt, HTML, CSS und JavaScript zu einer gemeinsamen Sprache zu vereinen, die es leichter ermöglicht, gut strukturierte und besser wartbare Software zu bauen, dann wäre das ein großer Schritt nach vorne. React trägt dazu einen Teil bei, und auch das ist ein Grund, warum ich React sehr schätze.
Zu guter Letzt glaube ich, dass den ganzen aktuellen Hypes wie Serverless zum Trotz die klassische Methodenkompetenz gerade im Bereich Architektur nach wie vor gefragt ist. Anwendungen zu entwickeln bedeutet mehr, als möglichst viel an andere zu delegieren, und ein wirkliches Verständnis eines Systems braucht man nach wie vor, wenn man es vernünftig entwerfen und gestalten will. Insofern begeistert mich im Grunde genommen alles, was dazu beiträgt, ein tieferes Verständnis von den Themen zu entwickeln, mit denen wir uns tagtäglich beschäftigen.
Entwickler: Vielen Dank für dieses Interview!
Interviewt von: Hartmut Schlosser
Content-Stratege, IT-Redakteur, Storyteller – als Online-Teamlead bei S&S Media ist Hartmut Schlosser immer auf der Suche nach der Geschichte hinter der News. SEO und KPIs isst er zum Frühstück. Satt machen ihn kreative Aktionen, die den Leser bewegen. @hschlosser