Wer macht es
Sie finden viele interessante Dinge in den React- und ELM-Communities und in den Frontend-Communitys für funktionale Programmierung im Allgemeinen.
Einige neuere Full-Stack-Plattformen, die irgendwie versuchen, eine Entwicklungsumgebung dieser Art bereitzustellen, sind:
Ein 2,3 Millionen finanziertes Startup von Andreessen Horowitz / Y-Combinator von Chris Granger, einem einflussreichen Clojure-Programmierer, der bereits LightTables erstellt hat.
Technologien : Rust (Backend), TypeScript (Frontend) mit einer hausgemachten Implementierung von React-Konzepten (was sie "microReact" nennen)
Noch keine Firma, aber unterstützt von einer Patreon-Kampagne von Paul Chiusano (Autor des berühmten Buches "FP in Scala").
Technologien : Haskell (Backend), ELM (Frontend).
Hinweis : Sie können sehen, dass die Leute hinter diesen Tools erfahrene funktionale Programmierer sind. Überprüfen Sie den Abschnitt "Wie es funktioniert".
Wie es funktioniert -> funktionale Programmierung
Programme haben Status.
Warum konnte Bret Victor dieses Video machen?
Weil:
- In seiner Architektur geht es explizit um Zustandsmutationen
- er verwendet funktionale Reinheit
- Er zeichnet historische Fakten als Status und nicht als aktuellen UI-Status auf
Ein von diesem Vortrag inspiriertes Werkzeug ist die ELM-Sprache.
ELM gibt an, dass :
Die Wurzel des Debuggers ist also das Design von Elm selbst. Wenn Sie auf Sprachebene nicht mit den richtigen Designoptionen beginnen, wird das Erstellen eines zeitreisenden Debuggers schnell äußerst komplex. Selbst Sprachen, die die erforderlichen Designanforderungen teilweise erfüllen, werden ernsthafte Herausforderungen haben.
Was Sie also wirklich verstehen müssen, ist, dass nicht die Technologie interessant ist, sondern die zugrunde liegende Softwarearchitektur . Sobald Sie die Architektur haben, ist es nicht so schwer, solche Debugging-Funktionen hinzuzufügen.
Viele in den ReactJS / Flux-Communities haben gezeigt, dass wir mit dieser Art von Architektur wirklich großartige Dinge erreichen können. David Nolen von Om 's ClojureScript-Hype ist wahrscheinlich der Auslöser, und Dan Abramov hat kürzlich gezeigt, dass wir sehr ähnliche Dinge erreichen können, die mit Bret Victors Debugging vergleichbar sind .
Ich selbst habe mit der Aufzeichnung von Videos von Benutzersitzungen in JSON experimentiert. Dies ist auch eine Funktion, die von dieser Art von Architektur genutzt wird.
Man muss also verstehen, dass das, was er erreicht, nicht durch clevere Code-Tricks oder eine Supersprache erreicht wird, sondern durch wirklich gute Architekturmuster.
Diese Muster sind nicht einmal neu, sie werden von Datenbankerstellern und einigen Backend-Entwicklern sehr lange unter verschiedenen Namen verwendet, einschließlich Befehls- / Ereignisbeschaffung, Journaling ... Wenn Sie eine Einführung wünschen, ist der Confluent.IO-Blog ein sehr guter pädagogische Quelle .
Das Problem besteht nicht einmal darin, Code neu zu laden, sondern darin, was mit dem Status zu tun ist, nachdem der Code neu geladen wurde.
Was Sie wirklich verstehen müssen, ist, dass es keine eindeutige Antwort auf diese Frage gibt: Alles hängt davon ab, was Sie erreichen möchten.
Wenn Sie beispielsweise in Bret Victors Beispiel mit Mario einen Parameter wie die Schwerkraft ändern, können Sie sehen, dass dies sowohl die Vergangenheit (was er aufgezeichnet hat) als auch die Zukunft (die Aktionen, die er nach der Codeänderung ausführen wird) beeinflussen kann. Dies bedeutet, dass die Benutzerabsicht in einem anderen Kontext neu interpretiert wird, wodurch eine neue Historie von Fakten entsteht (häufig als Command-Sourcing bezeichnet).
Während dies für Videospiele, wie er gezeigt hat, wirklich interessant ist, ist dies für viele andere Anwendungen absolut nutzlos. Nehmen wir ein Beispiel für einen Antrag auf Rechenschaftspflicht, bei dem der Steuerprozentsatz jedes Jahr erhöht oder verringert werden kann. Denken Sie wirklich, dass eine Änderung des Steuerprozentsatzes für das laufende Jahr Auswirkungen auf die Bilanz vor 10 Jahren haben sollte? Natürlich nicht, aber es kann immer noch Auswirkungen auf das laufende Jahr haben.
Auch das Mario-Positionsfach beim Anpassen des Sprungparameters kann das Werkzeug nicht selbst wissen, dass es für das Mario-Element angezeigt werden muss. Sie müssen explizit darüber sein, sonst könnte es dasselbe für die Wolken oder die Schildkröte tun. Und ist es sinnvoll, dasselbe für die App zur Rechenschaftspflicht zu tun?
Was ich hier meine ist, dass dies eine coole Demo ist, die gut produziert wurde. Sie können keine ähnliche Entwicklungsumgebung bekommen, die sofort so gut funktioniert. Sie können jedoch die Architekturmuster erlernen, die dies ermöglichen, und Tools wie ELM / Om / Redux / Flux / ReactJS (und einige Haskell / Scala / Erlang können ebenfalls nützlich sein!) Verwenden, die Ihnen bei der Implementierung sehr helfen richtig und bieten Ihnen das Beste, was sie für das Nachladen im laufenden Betrieb können.