- Alt håp er ute, jeg tar systemet mitt offline

Etter to år med utvikling setter Øystein Amundsen strek for sitt hobbyprosjekt.

Øystein Amundsen jobber til vanlig som utvikler i Bouvet, men har de siste årene lagt sjela i et system, som aldri ble lansert. 📸: Privat
Øystein Amundsen jobber til vanlig som utvikler i Bouvet, men har de siste årene lagt sjela i et system, som aldri ble lansert. 📸: Privat Vis mer

Min datter på 13 er konkurransegymnast. Hennes idrett er troppsgymnastikk, en sport hvor laget er i fokus - ikke individet. Hobbyprosjektet mitt kom til livet i sommeren 2016, da klubben hennes i byen skulle arrangere NM.

Jeg var relativt ny i gamet, min datter hadde ikke holdt på så veldig lenge, og teknisk komité hadde spurt etter frivillige for å hjelpe til. Jeg ble engasjert som «puncher» for resultatservice - det er de folka som tar poengene fra dommerne og sørger for at poengene blir publisert, både online og på storskjerm i salen. Programvaren vi satt med på den tida - et svenskprodusert PHP-basert system - var både kostbart per konkurranse og utrolig dårlig laget! Hvorfor skulle trykking av poeng føles så tungvindt og langtekkelig?

Teknologien som frister

Her kan vi gjøre bedre, tenkte jeg. Angular 2 var akkurat sluppet i beta, og jeg tenkte at dette måtte jo være en perfekt match for et slikt system. Da jeg konfronterte teknisk komité med idéen min, sa de at det var fritt frem for å lage noe, og at alle bidrag ville bli mottatt med takk.

«Så jeg satte i gang. How hard can it be, right?»

Så jeg satte i gang. How hard can it be, right? Jeg jobber i Bouvet og har gjort det siden 2006, da selskapet jeg var ansatt i ble kjøpt opp av dem. Jeg har jobbet med web-basert teknologi siden 2000, og har vært innom PHP, JSP, ASP, Java, C#, Python og JavaScript. Av alle språk jeg har brukt, er JavaScript min favoritt, så jeg hadde lyst til å bruke JavaScript fullstack – noe jeg aldri hadde hatt mulighet til i jobben min før. Perfekt learning opportunity.

Derfor startet jeg jakten på et NodeJS-backend rammeverk. Først fant jeg TypeORM, og database-kommunikasjon var nå dekket. Det var nå klart at jeg ønsket å bruke TypeScript både til frontend og backend. Så jeg kom over routing-controllers. Siden jeg hadde jobbet mye med Java Spring, følte jeg meg relativt på hjemmebane.

Jeg satte i gang og laget et poeng-førings system etter erfaringene jeg dannet under NM, og planen var å følge best-practice all the way – både når det gjaldt UX, web-standarder og tilgjengelighet. Det var også et poeng at systemet skulle ha et homogent miljø uansett hvor det ble satt opp. Docker var the obvious choice her da – enda en learning opportunity for meg.

Poengføringssystemet til Øystein, GymSystems. 📸: Privat
Poengføringssystemet til Øystein, GymSystems. 📸: Privat Vis mer

Katastrofen

Etter over et år med utrolig mye kveldsarbeid, hadde jeg en meget buggy versjon jeg kunne presentere til teknisk komité.

«vi måtte defaulte til å registrere poeng i Excel.»

De var imponerte, men det var fortsatt en del features som manglet før systemet kunne brukes. Etter å ha lagt inn enda flere timer med hastverkarbeid, fikk jeg tillatelse til å teste ut systemet på en juleavslutning for klubben. Det ble en katastrofe.

For det første klarte vi ikke å oppnå kontakt med serveren over lokalets wifi, og måtte benytte mobil-data for å registrere. For det andre bestemte selvfølgelig trenerne seg for at på akkurat denne avslutningen, skulle hvert individ poengføres i stedet for at det ble delt inn i lag. For å kunne registrere alt, måtte jeg dermed lage et lag per utøver. Systemet håndterte ikke denne mengden data spesielt godt, og krasja etter et par innlegg. Dermed måtte vi måtte defaulte til å registrere poeng i Excel.

Jeg besluttet at her måtte det refaktoreres.

Internasjonal oppmerksomhet

I mellomtiden ble jeg oppmerksom på at domenet hadde fått besøkende fra ganske mange plasser rundt i verden. Github repoet mitt hadde også fått en del nye følgere, og jeg fikk plutselig en henvendelse fra en klubb i Brazil som lurte på om de kunne få lov å bruke systemet mitt. Dette ga meg pågangsmot.

Et år senere, hadde jeg produsert en PWA av systemet, med offline egenskaper for å støtte dårlige WiFi-forhold i idrettssaler. Jeg hadde WebSocket-kommunikasjon med serveren for å støtte sanntids-push-oppdatering av klientene når poeng var tilgjengelig. Jeg var veldig fornøyd.

Offisiell test

Vi skulle på nytt teste systemet. Denne gang under en offisiell konkurranse. Jeg var helt overbevist om at systemet kunne takle omtrent hvilke forhold som helst.

Men igjen støtte vi på problemer.

WiFi nektet å godta domenet, og vi måtte kjøre over mobildata. Ikke nok med det, jeg hostet det hele over Azure, som steilet når det kom fler forespørsler enn det lave antall requests per minutt den var vant til. Gjennom jobben får vi 500,- per måned til Azure-resurser, og jeg hadde derfor valgt en av de billigste VM-ene jeg kunne få der. Det holdt helt åpenbart ikke.

At WiFi nektet å godta domenet til Øystein satt en stopper. 📸: Privat
At WiFi nektet å godta domenet til Øystein satt en stopper. 📸: Privat Vis mer

Konkurrenten

Rundt samme tiden fikk jeg nyss om at det var en annen utvikler som også laget et lignende system. En som var i samme situasjon som meg - en engasjert far til en utøver.

Men i motsetningen til meg, hadde denne utvikleren sikret seg en avtale med Norges Gymnastikkforbund om at systemet skulle benyttes i alle offisielle konkurranser.

Jeg tok en kikk på systemet - så langt jeg kunne uten å ha noen innlogging - og tenkte med meg selv at her kunne vi sikkert laget et supert system sammen. Jeg tok kontakt med utvikleren, introduserte meg, gav en link til mitt system og spurte om vi kunne utveksle erfaringer og kanskje slå sammen applikasjonene våre. Men jeg fikk dessverre avslag på dette.

Det andre systemet var nemlig planlagt med en inntektsmodell, noe som ikke hadde falt meg inn å tenke på.

Vel, nå anså jeg slaget som tapt og la det hele på hylla en periode.

Kan ikke gi opp så lett

Litt senere angret jeg, og tenkte: "Jeg kan ikke gi opp så lett". Hvis jeg lager et overlegent system, og de bare får prøve det ut, så kanskje.

Jeg tok kontakt med kommunen, som driver det offentlige WiFi vi benytter i turn lokalene her, og fant ut at de benyttet auto-blacklisting av domener gjennom en crawler-software. Denne programvaren hadde tydeligvis besluttet at mitt domene tjente gambling relatert innhold. Så det var der WiFi-problemene kom fra!

Etter å ha avklart dette, var problemet med WiFi løst. Gjennom leting på internettet etter billigere hosting, bestemte jeg meg for at $5 per måned hos digitalocean.com var greit, for å få dette på lufta. Jeg hadde jobbet for mye med det for at det ikke skulle bli brukt til noe.

Problemet med request-overflow løste seg når jeg gikk bort fra Azure, i tillegg hadde jeg et knippe nye idéer som jeg mente ville gjøre tjenesten enda bedre.

Jeg hadde nettopp lest om GraphQL, og ville teste det ut. Det var en del REST-forespørseler som gikk litt treigt, da API-ene mine var litt for generaliserte, og ofte hentet ut mere data enn de trengte. Jeg kom over NestJS, og ble umiddelbart forelsket - samme filosofi og struktur som Angular og støtte for GraphQL ut av boksen.

Grepet av lærelyst og ønske om å skape noe vakkert, gikk det enda et halvt år med kveldsarbeid på å skrive om hele backend, og få på plass server side rendering med Angular Universal.

Øystein jobbet videre med systemet, tross motgang. Og fikk omsider full score i Lighthouse-testen. 📸: Privat
Øystein jobbet videre med systemet, tross motgang. Og fikk omsider full score i Lighthouse-testen. 📸: Privat Vis mer

Den siste muligheten

Nå var nå systemet helt optimalt. Med over 90% i score på Lighthouse var dette nå en PWA som støttet opp under alle bransjens regler for en optimal app.

Den neste konkurransen hvor vi hadde mulighet til å bruke systemet nærmet seg, og jeg gikk tilbake til teknisk komité med håp om at de kanskje ville prøve systemet på nytt.

«Alt håp er nå ute. Jeg tar systemet offline og gir opp å videreutvikle det.»

Foreningen ønsket at vi benytter «standard»-programvaren, var svaret jeg da fikk.

Alt håp er nå ute. Jeg tar systemet offline og gir opp å videreutvikle det. Som et siste krampetak, og ut av respekt for de som har henvendt seg til meg med forespørsler om å bruke systemet, lette jeg etter en host som var villig til å ha systemet liggende på en server. Det er tross alt en god del timer som har gått i prosjektet, og det er synd hvis det bare skal dø slik. Derfor la jeg ut en post på kode-24 facebook-gruppa. Men det ser ut til at «gratis» kan jeg bare drømme om. Så da må jeg vurdere hvorvidt jeg ønsker å betale penger i tillegg til tiden jeg har dytta i dette. Så, historien jeg har lagt frem her er en trist en. Det er alltid et personlig nederlag når et system en har investert tid i å bygge, enten profesjonelt eller privat, ikke blir brukt.