Hvordan lage et rettferdig vinlotteri?

Slik brukte vi det beste vi har av teknologi til å gjøre det ukentlige vinlotteriet for gode timeførere mer rettferdig.

Marius Slette Johansen
Bransjebloggen 3min

--

I et ukentlig lapper-i-hatten-lotteri vil noen ha flaks og andre uflaks over tid. Med fullstendig overkill av teknologi og en gjeng utviklere, gjorde vi vinlotteriet mer rettferdig. Kanskje det kan brukes til noe mer?

Rettferdig eller ikke? Hvorfor er det noen som alltid vinner og noen som aldri vinner? Vinlotteri-systemet skal heretter utligne for flaks.

I Making Waves avdeling for Platforms & Services har vi lotteri hver fredag. Kriteriet er at man skal ha ført 37,5 timer eller mer, og målet er å skape litt entusiasme rundt timeføring. Som et konsulentselskap vet vi at presisjon i timeføringen er viktig.

Vi har tidligere brukt en løsning for å gjøre deltagerlisten tilfeldig (www.random.org/lists) og NamePickerNinja.com for å gjøre selve trekningen. I utgangspunktet skulle dette gi oss tilfeldige vinnere, men noen har påpekt (klaget) over at enkelte personer har vunnet flere ganger enn andre, og noen har ikke vunnet i det hele tatt (klagerne).

Lag noe bedre!

Så, i tråd med vår filosofi som selskap, så sendte jeg utfordringen tilbake til avdelingen: Lag noe bedre! Så da gjorde vi det, etter først å ha opprettet slack-kanalen pilsogprogrammering.

Forslagene til hvordan vi kunne gjøre det, hvilke teknologier og algoritmer vi skulle bruke, og hva som er viktig og “nice-to-have”, ble fort mange. Her er det prioriterte.

Prioritet 1 var “Pils/Div” (les: mat og snacks). Utviklere er bestemte folk. Deretter fulgte repo for kildekontroll, et sted å sitte, og data fra et API, og oppgavestyring ble prioritert.

På ønskelisten står Blockchain for å spore trekninger, og Elasticsearch for å hente ut statistikk. Helt klar overkill, men det er jo moro.

IoT-verden kan også bringes inn - en fysisk knapp for trekning og kanskje et lysbrett eller 3D-printede byster av de ansatte som lyser opp under trekningen. Og en webhook til Slack, selvsagt, som poster vinneren.

Ledet av Petter Bronsta dykket vi ned i detaljene - hvilke komponenter vi skulle utvikle og inndeling i Team.

Klassikere som kildekontroll, bygg og deploy ble bestemt at skulle være VSTS (få hadde erfaring med dette, så det var et fint område for læring). Vi måtte ha en webapp for å vise trekningen, en algoritme for selve trekningen og noe administrasjonslogikk for deltagere. Relativt enkelt, ikke sant?

Teamene:

  • 1: DrawMachine Service (Trekningsalgoritme)
  • 2: Webapp
  • 3: Slack integrasjon
  • 4: GUI
  • 5: API mot timeregistreringssystemet

Trekningsalgoritme

I et lotteri trenger man lodd. Løsningen ble slik:

  • Alle ansatte starter med 100 lodd
  • Vinneren av en trekning mister 80 % av sine lodd, som fordeles jevnt på de andre deltagerne
  • Fordelingen av lodd, i motsetning til å bare tildele flere lodd til “taperne” sikrer loddendes verdi over tid.
  • Ansatte som ikke deltar i en trekning forblir upåvirket av trekning, og beholder sine lodd fra forrige trekning.

Tanken bak algoritmen er at man skal unngå at en person vinner flere ganger på rad, samtidig som man fortsatt har en teoretisk sjanse for å vinne, selv med få lodd. Og dersom man ikke vinner, akkumulerer man lodd og øker neste sjanse.

Algoritmen legger til alle deltagere * lodd (1 deltager med 126 lodd blir lagt til listen 126 ganger), listen blir kjørt gjennom Rand() funksjonen og reversert før første element i listen trekkes ut som vinner.

Resultat

Det eneste vi klarte å få helt ferdig første kveld var trekningsalgoritmen. Web- teamet som skulle lage sidene for trekninger og administrasjon brukte mye tid på Entity Framework for .NET Core for å lage en database code-first, GUI-teamet hadde ingen kontroll på, og Slack-integrasjonen fungerte i en testkanal. API-koblingen mot timeføringssystemet var ikke påbegynt, men ble ferdig på et par timer noen dager etter.

Populær løsning

Vi har fått prøvd nye teknologier og løsninger som vi ikke ofte får benyttet i prosjekt, og testet ut måter å kode på som vil være nyttig i fremtiden. Det er morsomt å lære gjennom testing, feiling, utprøving og gode diskusjoner (og en god dose humor).

Videre har vi jobbet med en webside som fungerer som den skal, og neste steg er å gi trekningen en visuell overhaling med farger og javascript for å skape en følelse av “trekning”.

Erfaringene våre om prosjektledelse, og at design kanskje bør gjøres av designere, er en god påminnelse — og vi ble minnet om hvor gøy det er å drikke øl og programmere (på kveldstid).

Stemningen er nå på topp når vi skal trekke ukens vinner, løsningen fungerer som den skal, og andre avdelinger ønsker å bruke løsningen til egne trekninger. Vi jobber nå hardt med å utarbeide en lisensiering for dette.

--

--