- Backend-utviklere i Norge tvinges til Java og C#

Ukas Koder Alexander Samsig i EVRY håper vi snart går over til funksjonell programmering.

Alexander Samsig i EVRY har to lidenskaper; funksjonell programmering og reising. 📸: Privat
Alexander Samsig i EVRY har to lidenskaper; funksjonell programmering og reising. 📸: PrivatVis mer

Hvordan begynte du med koding? 👶

Vi har alltid hatt PC hjemme, siden min far var programmerer, og jeg fikk min helt egen datamaskin da jeg var ganske ung. Mye av tiden gikk med å spille dataspill sammen med min storebror, og det er også her at introduksjonen til koding kom fra.

Min bror hadde alltid vært kreativ, så da Warcraft 3 kom ut med en fullspekket map editor, så var han solgt. Jeg observerte en del, og prøvde også selv å gjøre noen små ting i JASS (Just Another Scripting Syntax), men jeg var aldri så kreativ, og ville heller spille enn å skape noe selv.

Senere ble jeg introdusert til webutvikling, gjennom Webbyen.dk, som var et gratis webhotel den gang. Det første jeg lagde på var en wiki-side sammen med noen kompiser, hvor vi skulle ha dansk informasjon om Diablo 2. Det ble ikke til så mye, men jeg lærte meg å sette opp sider i HTML med statisk innhold. Det neste ble selvfølgelig å lage en hjemmeside for min DotA-klan. Vi spilte i en league og turneringer og hadde store drømmer, dessverre så var vi ikke særlig gode, faktisk kom vi helt sist, men hjemmeside ble det!

Nå som jeg hadde funnet meg en superkraft, så måtte jeg lage hjemmesider hvor enn jeg dro. Også i prosjekter på skolen ble det hjemmesider, men egentlig var det bare innholdssider, så ikke noe særlig.

«Nå som jeg hadde funnet meg en superkraft, så måtte jeg lage hjemmesider hvor enn jeg dro.»

Senere ble jeg introduserte til Lua via addons til World of Warcraft. Her fikset jeg mest opp i eksisterende addons, som ikke virket etter mine behov, eller som rett og slett sluttet å virke etter en patch. Dette var ekstra kult, da det faktisk ga meg direkte verdi i mitt spill.

På videregående hadde jeg endelig formelt programmering som fag. Her brukte vi C++ til å løse matematiske problemer hovedsakelig, primært fordi underviseren var også var vår mattelærer. Så for at vi skulle få mer tid til programmering, slo han de to fagene sammen, slik at vi fikk rikelig med muligheter for å lære.

Artig nok, var det ikke før jeg formelt begynte å lære programmering at jeg faktisk snakket med min far om programmering. Han var et slags orakel, så når jeg ikke skjønte hva en Delegate var i C#, kunne han forklare det.

Pulten til Alexander Samsig i EVRY. 📸: Privat
Pulten til Alexander Samsig i EVRY. 📸: Privat Vis mer

Hva jobber du med akkurat nå? 🛠️

Jeg jobber på flere prosjekter samtidig, men alt sammen er Java og Spring.

Jeg jobber blant annet med en aggregator for PSD2-API-er. Målet med prosjektet er å levere et felles API for våre klienter (app, nettbank), slik at de kan vise kontoer, saldo og så videre fra andre banker.

Her benytter vi faktisk Spring Webflux, som er Springs nye svar på et Reactive web-rammeverk, hvor alt skal være asynchronous/non-blocking. Her veier min erfaring med Scala inn, hvor det nettopp er hverdagskost med Reactive-tankegangen.

Et av de andre prosjektene er å implementere Digital Samhandling Offentlig og Privat Kontrollinformasjon for våre bankkunder. Her skal vi gjøre data fra banker tilgjengelige for de offentlige etater.

Her har Bits laget en OpenAPI-spec, som vi må implementere, og utover det har de benyttet seg av Consumer-Driven Contracts via Pact, for å ha unit tests via en kontrakt. Dette er altså mange av de nyeste snacks innenfor API-er, og det er kjempekult at det blir tatt bruk i bankverdenen!

Lokalene rundt Alexander Samsig i EVRY. 📸: Privat
Lokalene rundt Alexander Samsig i EVRY. 📸: Privat Vis mer

Hvordan ser en typisk arbeidsdag ut for deg? ☕

Jeg sitter på EVRYs kontor på Sluppen i Trondheim.

Her møter jeg gjerne mellom klokken 7 og 8, helst så tett på 7 som mulig, men det svinger i perioder om jeg kan komme meg opp. Vanligvis venter der et stand-up klokken 9, hvor man gir en kjapp oppdatering på hva som er gjort og om man har noen hindringer.

Men ellers så blir det mye koding, godkjenne litt pull requests, litt prosjekt møter og så videre.

Hva synes du er de mest spennende språkene, rammeverkene eller teknologiene akkurat nå? ✨

Jeg er veldig glad for dette spørsmålet, fordi alle som har møtt meg vet at jeg kommer til at nevne Scala, det er bare et spørsmål om tid.

Jeg er dypt opptatt av Scala, og mange av de kule teknologiene deromkring. I det siste har jeg lekt mye med Scala.js hjemme, sammen med React og Firebase. Her har jeg altså skrevet min frontend i Scala og kompilert det til JavaScript. Fordelen med det er primært type-systemet, samt at Scala undeniably er et langt bedre språk enn JavaScript. For at få typesterk tilgang til JavaScript-biblioteker, må man selvfølgelig skrive sine egne fasader, så da mister man mye av verdien med Scala.js. Men heldigvis finnes det et prosjekt som heter ScalablyTyped, som leser alle TypeScript typedefinisjoner og lager Scala.js-fasader ut av dem. Dette er kjempekult, og gjør det mulig å benytte JavaScript-biblioteker som Firebase SDK-en smertefritt, og med den type sterke sikkerhet man er vant med fra Scala.

«Alle som har møtt meg vet at jeg kommer til at nevne Scala, det er bare et spørsmål om tid.»

Interessen for Reactive gror, og her er Playframework som et fullt Reactive web-rammeverk veldig bra, og det har både Java og Scala API-er. Det er et veldig modent rammeverk, så hvis man tenker på å prøve ut Reactive, så ville jeg helt klart anbefale Playframework over Spring Webflux. Hvis man er mer opptatt av mikroservices så kan man også bruke Playframework der, men ellers så finnes Lagom som er bygd for mikroservices, så her får du kjempebra støtte for for eksempel Event Sourcing og CQRS rett ut av boksen. Igjen har Lagom også både Java og Scala API-er.

Hvis man fortsatt sitter fast med vanlig Java, og ikke er begynt å se på andre JVM-språk, så vil jeg sterkt anbefale VAVR, som tidligere het Javaslang. VAVR tilbyr et helt nytt immutable Collections-API, som er basert på Scala sitt API, her behøver man altså ikke lenger å kalle stream og collect, siden det tilsvarende til Stream-API-et finnes tilgjengelig direkte i VAVR-collections. Du får også en del funksjonelle kontrollstrukturer som Option, Try og Either, dette gjør det mulig å håndtere feil på en funksjonell måte. VAVR gir Java mye av de kreftene som Java ellers mangler for å kunne hamle opp med Scala og Kotlin.

Hvis man ikke har fått med seg Lombok ennå, så bør man absolutt også sjekke det ut. Dette får dine POJOs ned til overskuelig kode, og gjør endringer i dem enklere, siden du slipper å regenerer setters / getters / constructors / equals / hashcode. Jeg anbefaler å bruke Value-annotationen som lager immutable strukturer, men man blir nødt til å bruke Data-annotationen en gang i mellom på grunn av Spring eller andre rammeverker. Ved hjelp av RequiredArgsConstructor-annotationen og en av Component-annotationerne fra Spring, får du klasser som injecter alle “private final” avhengigheter i klassen, dette er en super kombinasjon, og gjør det enda enklere å endre avhengigheter i farten. Annotasjonene som man bør bruke mest er RequiredArgsConstructor for klasser med avhengigheter, og Value/Data for POJOs.

Alt i alt; sjekk ut alt innen funksjonell programmering - det er fremtiden!

Hva er du mest stolt av å ha laget? 🏆

Jeg føler generelt mest stolthet når jeg løser vanskelige problemer, gjerne ved å utvikle biblioteker, eller ved å bidra til Open Source.

På en tidligere jobb brukte vi RabbitMQ, og det ble nødvendig å gjøre Remote procedure calls (RPC). Dette er egentlig veldig mot messaging-tankegangen, og hva man vanligvis bruker RabbitMQ til, men her var det altså behov for det uansett. Vi jobbet i Scala og Reactive, dette gjorde at det var spesielt viktig at disse RPC-kallene var asynchronous/non-blocking. Java-SDK-en for RabbitMQ har en RPC-implementasjon, men den er synchronous og blocking - den var altså ikke noe særlig for oss.

Derfor laget jeg vårt eget lille bibliotek for å gjøre RPC, som var asynchronous og non-blocking. Det var ikke helt enkelt, og krevde at jeg tilegnet meg ganske mye ny kunnskap for å forstå hva som må til for å være asynchronous og non-blocking.

En annen løsning jeg jobbet med internt var å lage en ActiveDirectory integrasjon i det rammeverket vi brukte. Her hjalp jeg til med noen små features, men alt i alt fikk vi laget et bibliotek som var kjempeenkelt å plug-and-play inn i nye prosjekter. Her erstattet vi BasicAuth-innlogging i interne prosjekter med brukerinnlogging via ActiveDirectory, som var en stor forbedring, og gjorde også at alle i firmaet automatisk fikk tilgang uten mer jobbing.

Hva er det vanskeligste ved å være utvikler? 🤷

Det er vanskeligst som utvikler er å bli betalt for å gjøre ting på en måte som man ikke selv føler er best.

Typisk vil man som backend-utvikler i Norge være tvunget til å programmere i Java eller i C#, da dette er de to mest brukte backend-programmeringsspråkene. Her blir det altså objektorientert utvikling for alle pengene. Begge språkene har såvidt begynt å bringe inn funksjonelle prinsipper, men det er fortatt en lang vei igjen om man vil programmere funksjonelt.

«...det er fortatt en lang vei igjen om man vil programmere funksjonelt.»

Hvis vi tar utgangspunkt i Java, da det er her jeg har best kjennskap til økosystemet, så blir du møtt av rammeverk og biblioteker som bruker Annotations. Først tenker man kanskje at det er enkelt, fordi man får til å løse sine problemer med å bare sette en Annotation, men sannheten er at du oftest får så mye magi med i pakken at du ikke helt har fått satt deg inn i hva som skjer. Og til slutt sitter du igjen med rare feil når du kjører applikasjonen.

Den triste sannhet er at Annotations var en løsning som ble tatt i bruk fordi det var den korteste/enkleste måten å få gjort ting i Java på. Her er vi altså ikke langt fra XML-konfigurasjonshelvete, som vi så vidt akkurat er begynt å komme oss ordentlig vekk fra.

Hva synes du norske utviklere bør bli flinkere på? 🙋

Jeg synes at norske utviklere bør begynne å virkelig sette seg inn i Funksjonell programmering.

Man kan ta det trinnvis, så man kan for eksempel begynne med å bare forstå konseptene immutable data, lambdas, referential transparency og higher-order functions. Polen har tatt helt av på funksjonell programmering, og skriver mange bloggposter og gjør mye Open Source - det er ikke noe vi ser så mye av i Norge. Vi har bra kompetanse i Norge, vi er bare ikke like gode til å dele den. Jeg skulle ønske at flere selskaper satset på Open Source, foredrag, og bloggposter som alle kan få glede av, i stedet for å holde det in-house.

Som skandinaver er vi også gode til å la ting være som de der, vi skal jo helst ikke fornærme, men jeg synes vi skal være mer kritiske, spesielt når det kommer til kode og prosesser.

Det er ganske trist når man møter en kodebase, som fortatt gjør ting som de ble gjort for seks år siden, fordi det er ikke noen som har tenkt på å sjekke om det fortsatt er den anbefalte måten å gjøre det på. Hvis man ikke gjør en kodebase inkrementelt bedre når man jobber med den, så vil den bare stagnere, og til slutt stå overfor for så store problemer at eneste utvei føles som en komplett rewrite.

Her er det selvfølgelig helt essensielt at man har automatisert tester, det er den eneste måte å refaktorere kode på med høy sikkerhet. En liten hemmelighet her, er at funksjonell programmering bygger på prinsipper som gjør det ekstremt enkelt å teste.

Hva liker du å gjøre når du ikke jobber? 🕹️

For tiden blir det altfor mye gaming. Jeg har dessverre begynt på World Of Warcraft igjen (hjelp meg), så da går mye av fritiden med på å holde mine karakterer up-to-date.

Utover min gaming-addiction så ser jeg mange TV-serier og leser mye om politikk og teknologi. Når jeg ikke er opptatt med gaming, driver jeg også gjerne med Open Source-koding. Det er artig når man får litt eierskap til de teknologiene man jobber med i hverdagen, og det er vanligvis ikke så vanskelig å hjelpe til som man først tror.

Jeg har også nylig tatt på meg rollen som styremedlem i JavaBin, den norske brukerforening for Java, og utover dette så er jeg også medarrangør i JavaBin Trondheim, hvor vi avholder meetups om alt innen Java og litt utenom.

Jeg også medlem av programkommiteen for Trondheim Developer Conference, hvor jeg gjør min del for å få funksjonell programmering på dagsorden.

De siste par årene har det også blitt mye reising, ingen flyskam her, så det har blitt omkring tre ganger rundt jorden ifølge SAS-appen min. Jeg har vært flere turer i Asia, og jeg må si at Japan er simpelthen et must visit for alle som interesserer seg for kulturen.