Fire produkter, 68 repositories
To uger inde hos GolfNext. Hvad vi rent faktisk bygger, hvordan tretten års software ser ud under det, de integrationer vi startede i uge to, og et ærligt kig på de mål, jeg satte mig selv, før jeg havde skrevet under på noget.
Jeg startede hos GolfNext mandag den 3. august klokken 8:00. Jeg havde forestillet mig et stille kontor og tyve minutters ventetid. Størstedelen af teamet var der allerede og i godt humør. Jeg havde en cheesecake med, som vi spiste efter frokost, for jeg har været i Danmark længe nok til at vide, at det der med kage ikke rigtig er valgfrit.
Peter, der startede virksomheden i 2012, havde Claude åben, før jeg havde fundet mit skrivebord, og var i gang med de konti og rettigheder, jeg skulle bruge. En lille ting at lægge mærke til på en første morgen. Den fortalte mig mere end et onboarding-deck ville have gjort.
Det første indlæg på denne blog var et brev, jeg skrev til mig selv, før jeg havde skrevet under på noget, fyldt med forudsigelser om en virksomhed, jeg havde besøgt én gang. Her holder jeg det op mod det, der faktisk er her. Det meste af det følgende handler dog ikke om mig. Det er virksomheden, jeg gerne vil beskrive: hvad vi bygger, hvad der ligger under det efter tretten år, og hvad vi har tænkt os at gøre ved det.
Hvad GolfNext bygger
Hvis du aldrig har tænkt over, hvilken software en golfklub kører på, ser det sådan her ud. En klub er en lille virksomhed med flere kasketter på én gang. Der er en proshop, en driving range, medlemskaber, et bookingsystem og i stigende grad en simulator eller to. Bookingsystemet håndterer tee times, altså de starttider, hvor en gruppe er booket til at slå ud på første hul. Hele dagen i en klub er bygget op omkring det gitter.
Historisk kom hver af de kasketter som sin egen kasse, fra sin egen leverandør, med sin egen software vedhæftet. Køb automaten, få automatproducentens system, uanset om det passer til den måde, du driver din klub på.
Vores position er den modsatte. Jeres hardware og infrastruktur forbliver jeres, og I er frie til at vælge den software, der passer. Vi vil være åbne over for enhver integration, så uanset hvilket managementsystem en klub allerede bruger til sine tee times, er målet at spille sammen med det i stedet for at bede dem om at smide det ud. Frihed til at vælge, kraft til at forbinde.
Selvbetjeningskiosker. En digital reception, der kører døgnet rundt. Greenfee, udlejning og køb i proshoppen, uden at nogen skal stå bag en disk. Så vidt vi ved er den den eneste af sin slags i golf. En klub får færre bemandede timer og tjener fortsat penge uden for åbningstiden. En spiller får den samme bekvemmelighed, som vedkommende allerede har alle andre steder i sit liv.
Betaling på driving rangen. Betaling på rangen, der virker med alle mærker af boldautomater. Den kompatibilitet er produktet. Automaten tilhører klubben, eller den der solgte den til dem, og at kunne ligge oven på dem alle sammen er hele pointen. Kort, apps, wallets, pinkoder, med analytics bagved i realtid. Mange steder kører rangen stadig på kontanter, og det er her, efterspørgslen vokser hurtigst lige nu. Mere end 500 millioner bolde om året går igennem det. Det bliver til en hel del slicede slag.
Voucher-håndtering. Udstedelse, distribution og indløsning, alt sammen digitalt, fra en enkelt billet til en hel sponsorpakke.
Simulator-håndtering. Automatiseret adgangskontrol, så en simulator kun kører i en betalt session. Ikke mere tidstyveri, bedre udnyttelse.
Hvad det løber op i i dag: 400+ anlæg, 18 lande, 350.000+ aktive brugere. Grundlagt i Danmark i 2012 og stadig meget dansk, hvilket også er grunden til, at jeg gik hjem fra min første dag fast besluttet på at tage mit danske alvorligt.
Stakken, uden pynt
Otteogtres repositories. JavaFX på desktopsiden, PHP, Vue, React, React Native, Spring, Java, Kotlin. Det hele på AWS.
Skrevet ned på den måde ligner det ubeslutsomhed, og det er det ikke. Tretten år, fire produktlinjer, hardware ude i marken, og i det meste af den historie blev softwaren bygget af eksterne partnere, der var gode til deres arbejde. Hvert projekt valgte det, der gav mening den dag, det startede, og de fleste af de valg var fornuftige. Det, der aldrig skete, er, at nogen gik tilbage bagefter og fik valgene til at stemme overens.
Så, den ærlige tilstand, for jeg skrev i brevet, at jeg ville skrive den slags ned i stedet for at pudse det af.
En pæn del af de otteogtres repositories var ikke blevet rørt i årevis og blev aldrig arkiveret. Forks, spikes, engangsværktøjer, der overlevede deres formål. Jeg begyndte at arkivere i den første uge, langsomt, for de fleste af dem vidste jeg endnu ikke, hvad jeg kiggede på, og ikke at vide er en langt bedre grund til at lade noget være end til at slette det.
I koden kan man læse generationerne. Flere pakkestrukturer inden for det samme sprog, ingen af dem forkerte, alle sammen forskellige. En AGENTS.md skrevet til Codex og en CLAUDE.md skrevet til Claude, der ligger i det samme repository, beskriver det samme projekt og er uenige om det. En README.md, der dokumenterer en version af systemet, som ikke findes længere. En runtime, der gik end of life for et stykke tid siden og stadig kører. Og en release-proces, der er rigtig god for nogle af vores værktøjer og en snowflake for andre, hvor en del af den ligger i en pipeline og en del af den ligger i hovedet på nogen.
Sikkerhed ligger øverst i bunken. Af de niogtyve punkter om engineering practices, jeg har skrevet ned indtil videre, er fem markeret med høj prioritet, og alle fem handler om sikkerhed. Det er ikke en opdagelse om GolfNext specifikt. Det er sådan tretten års levering plejer at se ud alle steder, hvor ingen for nylig er blevet betalt for at gå og kigge efter.
Da jeg lavede en forudsigelse om det hele udefra, skylder jeg dig resultatet. Det ligger nogenlunde, hvor jeg regnede med, og det mener jeg som et fair udfald snarere end en klage. Det her er tretten års kontinuerlig levering fra folk, der sendte funktioner ud, som kunderne rent faktisk havde brug for, på deadlines, med de prioriteter de fik stukket i hånden. Man ville finde nogenlunde det samme billede i de fleste virksomheder på den alder, og jeg vil hellere være den, der rydder op, end den, der sukker over det. Den ene forudsigelse, der ramte præcist, var den kedelige: jeg gættede udefra på, at repoerne ville være underautomatiserede, og det er de. Det er min åbning.
Det, jeg tog fejl af
Jeg havde gjort mig klar til, at produkterne ville være det svage punkt. Virksomheder med en stak som vores har ofte “sendt-alligevel”-software ovenpå, den slags hvor man kan mærke deadlinen i brugerfladen.
Sådan er det ikke her. Produkterne er gode. Der er plads til forbedring i dem alle sammen, selvfølgelig. Men det, jeg bliver ved med at lægge mærke til i møder, er, at alle tænker fra kundens side først, også folk uden nogen teknisk baggrund overhovedet. Hvad oplever spilleren, der står ved kiosken klokken halv seks om morgenen. Hvad skal en klubmanager forklare et medlem, når noget går galt.
Det instinkt er svært at eftermontere i et team. Pakkestrukturer kan refaktoreres og README-filer kan skrives om, og begge dele er bare arbejde. At lære en gruppe mennesker at bekymre sig om personen i den anden ende er et problem af en helt anden slags, og det har vi ikke.
Det vi startede i uge to
To integrationer landede næsten med det samme, og de er det samme væddemål i forskelligt tøj. Platformen er kun åben, hvis den rent faktisk forbinder til de systemer, klubberne allerede kører.
teeControl er et managementsystem, som mange klubber bruger, og vi integrerer det, så det virker gennem vores kiosker. Førstehåndsindtrykket er godt. Førstehåndsindtryk er også billige, og der er et stykke vej herfra. Vi har brug for ordentlige testsystemer. Vi kommer sandsynligvis til at skulle justere nogle af vores egne flows, så de passer til deres. Der er stadig beslutninger, der skal falde på plads i begge ender. Det bliver en proces snarere end en sprint, og det siger jeg hellere nu end at skrive et triumferende indlæg om det i uge to.
Lightspeed er en spillervendt app, som vi gerne vil understøtte som betalingsmulighed. Peter havde allerede bygget en første version, før jeg kom, og at overtage den var min anledning til at få fingrene i rigtig kode her for første gang. Ti tusind linjer, læst fra ende til anden, og derefter kørt og rodet med, indtil jeg forstod, hvad den lavede. Det gav en liste af fejl og en stak opfølgende stories, hvilket er det, der kommer ud af at læse hvad som helst grundigt. Det mere nyttige resultat er, at den nu også ligger i mit hoved og ikke kun i hans.
Og Verifone-terminaler på skrivebordet, som er den jævnlige påmindelse om, at en stor del af vores software ender i en fysisk genstand, som nogen skal røre ved.
Den tilgang, John og jeg landede på, er at springe den store forudgående specifikation over. John er den anden udvikler, selvom det ikke yder ham retfærdighed, for han er lige så meget løsningsarkitekt og projektleder som ingeniør. Få en testinstans, byg op mod den, lad virkeligheden skrive dokumentationen. To uger inde kender jeg ikke systemerne godt nok til at skrive en god specifikation, og at lade som om ville bare producere et dokument, vi stille og roligt ville holde op med at læse i september.
En lille ting, der er værd at give videre til enhver, der overvejer at arbejde et sted som her. Jeg brugte mine første par dage på at være tålmodig omkring adgange, ud fra en antagelse om, at der var en proces, jeg skulle vente på. Så sagde jeg højt, at det her stort set var det, jeg var blevet ansat til, og om jeg måtte få dem nu. En halv time senere havde jeg AWS. Ventetiden var udelukkende min egen opfindelse.
Hvordan vi udruller
Det mest interessante problem i de første to uger lå ikke inde i et repository. Det var at finde ud af, hvordan ændringer kommer ud til kunderne.
Jeg brugte en fredag på ordentligt detektivarbejde. CloudWatch-logs på den ene skærm, et downloadet database-snapshot på den anden, og transaktionstilstande stillet op mod det, koden mener burde være sket. Et sted derinde fandt jeg fyrre commits, der aldrig var blevet pushet nogen steder. Det er den ucharmerende halvdel af at hente viden hjem. Adgange er den nemme del. At genopbygge en forståelse af, hvad systemet rent faktisk gør, tager meget længere tid.
Vi har ikke nogen gradvis udrulning i dag. Det, vi har, er kunder, der er fysiske steder, og en håndfuld af dem ligger en kort køretur fra kontoret. Så den første ring er geografi. Nogle få nærliggende klubber får den nye version først, og hvis det går galt, er redningsplanen tyve minutter i bil med en reserveterminal i bagagerummet. Det tog omkring fem minutters samtale at nå frem til, for når man først lægger mærke til, hvor kunderne er, er det et ret oplagt træk. Det er ikke det, jeg ville tegne på en tavle. Det er tilgængeligt i denne uge, og det køber tillid nok til at blive ved med at levere, mens det ordentlige bliver bygget.
At lære spillet og ordene for det
På dag tre spillede jeg den første golfrunde i mit liv, sammen med kolleger. Syv eller otte slag per hul. Aldrig ti. Vi mistede ikke en eneste bold hele runden, hvilket jeg får at vide er den mere imponerende statistik for en begynder. Ingen skrev en score ned.
Jeg vil anbefale den generelle version af det til enhver, der starter i en virksomhed, hvis domæne de ikke kender. Ikke golf specifikt. At gå ud og gøre det, softwaren handler om.
Ugen efter satte John og jeg os ned til det, der blev de mest nyttige to timer i uge to: at blive enige om, hvad vi kalder tingene, før tre systemer hver opfinder deres eget ord for det samme begreb. Ni huller er en loop. Stroke index rangerer hullerne efter sværhedsgrad. Der er rating category. Intet af det er eksotisk, hvis man spiller golf, og det er alt sammen usynligt for en udvikler, der aldrig har stået på et teested, hvilket for to uger siden var mig.
At få ordforrådet rigtigt tidligt koster næsten ingenting. At få det forkert koster dig tre services, tre navne for én ting og et oversættelseslag, ingen havde tænkt sig at bygge. Jeg kørte ét tjek, som jeg vil anbefale enhver, der gør det her: jeg fik Claude til at verificere “loop” på egen hånd, fordi det lugtede for mig af et ord, udviklere opfinder og derefter overbeviser sig selv om er domænesprog. Det kom tilbage som rigtig golf. At bruge modellen til at tjekke vores eget ordforråd, i stedet for til at skrive kode, er en af de bedre anvendelser, jeg har fundet til den indtil videre.
Niogtyve punkter, og hvor det her er på vej hen
Forbedringslisten ligger i ClickUp nu, mest så jeg kan holde op med at bære rundt på den i hovedet. Niogtyve punkter, alle stadig i backloggen, groft grupperet i repository-standarder og konventioner, sikkerhed og hemmeligheder, CI/CD og test og afhængigheder, infrastruktur og data, arkitekturretning, og AI og agenter.
Det første, vi rent faktisk har rullet ud, er det mindst spændende punkt på hele listen. mise, som fastlåser og installerer de rigtige sprogversioner per projekt, så man kloner et repo, og den korrekte Java dukker op af sig selv. Med så mange teknologier spredt over så mange repositories er den skat, man betaler hele dagen, at skifte mellem dem, og netop den skat kan undgås.
Målet har ikke ændret sig siden brevet. Byg et landskab, hvor kontekst er billig at samle op. Hvis en ny udvikler, eller en frisk AI-session, hurtigt kan forstå en service, kan arbejdet gå i gang med det samme, af hvem der end tager fat. Hvis de ikke kan, starter hver opgave med arkæologi. Alt på den liste med niogtyve punkter ligger nedstrøms af den ene sætning.
Scorekortet
Hvilket bringer mig tilbage til brevet og løftet om at rette mine egne opgaver offentligt.
Bliv ved tasterne. Holdt. To terminalrettelser sendt ud, pull requests reviewet, og jeg har overtaget ejerskabet af en af apps’ene. Jeg bygger stadig, hvilket var den betingelse, jeg satte, før jeg takkede ja til jobbet.
Genopbyg forståelsen, ikke bare adgangen. For det meste. CloudWatch-eftermiddagen, database-snapshottet, Lightspeed-overdragelsen: det er den rigtige form for arbejde. Det, jeg endnu ikke kan påstå, er at kunne frigive hvad som helst i stakken uden at spørge nogen.
Åbenhed i det åbne. Holdt, og lettere end jeg havde regnet med, mest fordi rummet her gør det let.
Nu den anden halvdel.
Mål nummer et skred. “Gør arbejdet synligt” stod øverst på listen, og denne blog var måden. Hvert eneste indlæg før det her blev skrevet, før jeg havde skrevet under på kontrakten, hvilket viser sig at være det nemmeste tidspunkt overhovedet at skrive om en virksomhed. Så startede jeg rent faktisk, og i to uger var der ting foran mig, der betød mere end et blogindlæg. Jeg vil ikke kalde det en krise. Jeg skrev, at hvis der blev stille, skulle jeg tage det som et advarselstegn, så: noteret.
Koldstarten er milevidt fra fem minutter. Jeg satte mig selv fem minutter fra klon til kørende kode og bad fremtidige mig om at tage tid på det. Jeg har ikke taget ordentligt tid på det, hvilket er sin egen lille fiasko. Jeg har klonet nok af de her repositories efterhånden til at give et fair skøn. Et sted mellem to og seks timer afhængigt af hvilket, man vælger, lad os sige fire i gennemsnit. At få iOS-buildet til at køre tog det meste af en dag med Xcode, pods og emulatorer. mise er det første rigtige skridt mod at lukke det hul, og et skridt er ikke et tal.
Det fælles AI-kit er punkt niogtyve ud af niogtyve, og den del er med vilje. I brevet kaldte jeg det den ting, der gør “AI-first” fra et slogan til rigtigt fælles værktøj. To uger inde kan jeg se, hvorfor det ikke kan komme først. Et fælles kit bygget oven på otteogtres inkonsistente repositories ville mest af alt bare indkode inkonsistensen. Fundament først, kit bagefter, og den rækkefølge vil jeg forsvare. Det, jeg ikke vil lade som om, er, at rækkefølgen er gratis. Indtil vi når dertil, får jeg en masse gearing ud af et setup, jeg har brugt et år på at finpudse, og som ingen andre her har endnu.
Og dagene åd pladsen til at tænke. Jeg skrev, at den kreative, legende tid ikke er en belønning, man optjener, når det seriøse arbejde er gjort, at den er det seriøse arbejde. To uger inde er det det første, kalenderen tager. Én ting hjælper her, og den er specifik for den her branche: golf er sæsonbetonet. Klubberne har travlt nu, så vi har travlt nu. Platformen bliver stille hen over vinteren, og det er der, værktøjskassen til 2027-sæsonen bliver bygget. At have en form på sit år er mere nyttigt, end jeg havde regnet med.
Det, jeg tog mest fejl af, er også det, jeg er gladest for. Jeg mødte op forberedt på modstand. Jeg regnede med at skulle gøre mig fortjent til adgange, argumentere for omfang og føre sag for hver eneste ændring. Næsten intet af det var der, og den modstand, jeg mødte i de første fjorten dage, havde jeg selv taget med.
To uger er ikke længe nok til at konkludere ret meget. Spørg mig igen til vinter, når klubberne bliver stille, og vi finder ud af, hvad vi rent faktisk gør med tiden.
