Uforanderlig data v2 -DOMen fra helvede

photo 2Som opvarming til GOTO skrev jeg et indlæg om immutability, hvor jeg MEGET kort forklare hvad det er og hvorfor jeg klart skulle se David Nolens indlæg om netop det her på GOTO. Så hermed opfølgeren.

Fordraget startede med et hurtigt historisk view, hvor han nævnte at nogle af ideerne bag immutability i virkeligheden har mange år på bagen, men at det først er for nyligt at det faktisk er udmundet i konkrete implementationer. Derefter gik han et skridt dybere og gav en kort forklaring af hvordan en immutable datastruktur kan implementeres på en effektiv måde, med brug af et koncept kaldet Tries (som er en speciel type søgetræer), og hvordan man med strukturel deling kan gøre det rimeligt effektivt at konstruere en ny “kopi” af datastrukturen, hvor den primære del (som så ikke er ændret) kan være delt. Som han nævnte, er det nemmere at forstå, hvorfor de er værd at bruge, når man kender principperne bag og har en basal forståelse af hvordan det virker, hvilket hans gennemgang meget klart gav.

Efterfølgende viste han at det i den naive tilgang kostede ca. en faktor to at bruge immutable arrays frem for klassiske JavaScript-arrays, samt at der i Clojurescript, som er en dialekt af Clojure der oversættes til JavaScript, faktisk findes simple tricks der gør at “opdateringer” af en immutable array var hurtigst.

Ind på scenen fra venstre kommer React, som er et facebook-bibliotek til at lave brugerflader i JavaScript. Måden det virker på er, at det har den aktuelle tilstand af din DOM. Du fortæller den hvordan du ønsker DOMen skal se ud, og den beregner en diff som den så på snedig vis kan bruge til effektivt opdatere din DOM og din webside.

Den ide som Nolen fik, var at koble Reacts og Clojurescripts fikse ide med immutable datastrukturer til et bibliotek kaldet OM, som pudsigt nok faktisk var hurtigere end standard brug af React. Derefter opdagede han at når man nemt kan beregne forskellen mellem A og B for at komme til tilstand B, kan man også vende det om og trivielt gå baglæns, hvilket gør “undo” trivielt.

Vi kan vel alle blive enige om at det der internet ikke forsvinder sådan lige med det samme, og React er opstået fordi Facebook, ønsker at udvikle hurtigere og bedre web applikationer, og formodentligt også med brug af bedre abstraktioner. Derfor er det særdeles interessant at det kan gøres både simple og mere effektivt med brugen af immutable datastrukturer, hvilket må siges at være en rigtig god grund til at tage konceptet alvorligt og undersøge om det også i andre sammenhænge er en bedre og mere effektiv abstraktion.

Nolen er en god og passioneret taler og jeg synes han kom udover rampen og fik tilhørene interesseret i, hvad han havde at sige. Ville dog ønske at han havde diskuteret flere af de interessante egenskaber ved disse datastrukturer. Det er til dels forståeligt at han valgte at fokusere, men omvendt er det jo den overordnet ide med immutable datastrukturer som er værd at fremhæve og diskutere. De spørgsmål der kom fra salen gav dog mulighed for at fremhæve nogle af disse, fx at de er “lock fri” og derfor er geniale i en multi-trådet verden.

Der er meget der tyder på, at det er noget man kommer til at se mere til f.eks. har Facebook lavet en håndfuld immutable datastrukurer i JavaScript, som folk så bl.a. kan bruge sammen med React, og der skal ikke meget fantasi til at gætte hvor de har den ide fra.

Desuden dukkede immutable også op i et oplæg om SWIFT som jeg så tidligere på dagen. Hvor langt Apple og SWIFT folkene er gået med immutability ved jeg ikke, men med udbredelsen af iPhones og React mm. er der noget der tyder på at funktionel programmering og ideerne derfra, er ved at blive mere og mere udbredt i takt med at flere og flere mærker bagsiden og ulemperne ved at vi i nogle år troede at svaret på alt universet og alting var OO. Det er det efter min mening ikke nødvendigvis. Så lad os forsætte søgen efter bedre måder at lave software på …“we are not there yet”.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *