For ikke lenge siden falt et spennende brev ned i e-postboksen til kode24, fra NAV:
"Vi har gravd frem kildekoden til et av de eldste datasystemene til NAV. Det er på ca. 291.000 linjer og er skrevet i språket PL/I, tanken er å open-source, slik at folk kan få et innblikk i norsk IT-historie. Er dere interessert?", lød e-posten fra NAV-utvikler Eirik Sletteberg.
Det er klart vi var interessert.
Få minutter etter satt vi med kildekoden til Det Sentrale Folketrygdsystemet i Github-en vår, og en haug med spørsmål.
Kunne fort gått tapt
Det Sentrale Folketrygdsystemet, eller DSF som NAV-ansatte kaller det, er ikke akkurat en lettvekter kodemessig.
Systemet består av over 291.000 linjer med kode, skrevet i det nå obskure språket PL/I, fra IBM. Startskuddet gikk helt tilbake i 1967, og den første dokumenterte kodeendringer som fortsatt befinner seg i systemet er fra 1981.
- Systemet kjørte i produksjon i NAV frem til januar 2018, da ble det erstattet med nye systemer, forteller 31-år gamle Eirik Sletteberg, som til vanlig jobber som fullstack-utvikler, blant annet på NAV-sin Kubernetes-plattform nais.
«PL/I-kode er sjelden vare.»
Sletteberg forteller at de har en del legacy-kode i NAV. Systemer som sakte men sikkert blir oppdatert gjennom generasjoner.
- DSF var blant de eldste applikasjonene vi hadde. I tillegg har vi også stormaskin-applikasjonen Infotrygd. Den er skrevet i COBOL, og blir videreutviklet og kjører i produksjon den dag i dag, sier Sletteberg til kode24.
- Dette er kildekode som fort kunne gått tapt, som oftest ønsker man jo å bli kvitt gammel legacy-kode.
- PL/I-kode er sjelden vare, og mye av det som finnes er nok proprietær kode, som enten råtner på en gammel backup-harddisk, eller som er borte for alltid. Ingen tenker over at dette er noe som kan være interessant å ta vare på for ettertiden, messer han.
Nå eller aldri
- Vi gravde frem koden fordi vi skjønte at det er nå eller aldri. Det er veldig få personer igjen i NAV som har noen form for kjennskap til DSF; jeg har selv aldri jobbet med det.
Sletteberg forteller at de satt i gang å saumfare koden, på jakt etter noen som visste mer om systemet.
Prosessen bak en ny NAV-applikasjon
Og etter mye frem og tilbake, kom Sletteberg i kontakt med 42 år gamle Magnus Lie som jobber som teamleder på NAV sitt Datavarehus, men som faktisk hadde hovedansvar for drifting av DSF den siste perioden det var aktivt.
Lie forteller at han har jobbet i Rikstrygdeverket og NAV siden 1998, blant annet med applikasjonsdrift, schedulering, testing og automatisering i Rikstrygdeverket og NAV sine kjernesystemer.
- I begynnelsen var det primært applikasjoner på IBM-stormaskin, hvor DSF var et av disse systemene. Noen av de andre systemene var kjerneregisterne til NAV som Arbeidsgiver og Arbeidstagerregisteret (AAreg), Tjenestebasert Persondata System (TPS), Tjenestebasert Samhandlingssystem (TSS) og NAV sitt Folkeregister (FR), forklarer Lie.
Unge utviklere på 60-tallet
Lie forteller at DSF var den eldste applikasjonen de hadde i drift, da han jobbet med den. Den ble laget for å oppfylle kravene fra Lov om Folketrygd, som skulle gjelde fra 1. januar 1967.
«Inntil Rikstrygdeverket hadde sin egen maskin måtte kode sendes til IBM for å bli kjørt og testet.»
- Utviklingen av DSF startet før Rikstrygdeverket fikk sin første IBM System/360 mainframe i desember 1966, av en gruppe på rundt 30 unge utviklere i begynnelsen av 20-årene. De aller fleste var ansatte i Rikstrygdeverket, men med noen få konsulenter fra IBM, forklarer Lie.
- Inntil Rikstrygdeverket hadde sin egen maskin måtte kode sendes til IBM for å bli kjørt og testet. Maskinen hadde 64KB RAM, og noen av de største programmene var for store, slik at man måtte lese inn én tredjedel av programmet om gangen. Dette gav utfordringer i forhold til debugging da det ikke alltid var åpenbart i hvilken tredjedel av programmet feilen lå i.
Til tross for utfordringene gikk DSF i produksjon allerede i mai 1966. 20-åringene klarte det!
Hver måned etter, i over 50 år, kjørte DSF flittig batch-jobber som beregnet og betalte ut pensjon til alle pensjonister i Norge, og leste ajourføringer fra saksbehandler, som jobbet mot DSF via et terminal-basert GUI.
Klare for år 2000
Den er et merkelig skue, kildekoden til DSF.
Koden består av en haug med filer, 719 for å være nøyaktig. Alle er kryptisk nummerert i rekkefølge, R0011101 og så videre. Og alle slutter med .pli, navnet på programmeringsspråket som blir brukt.
Slik koda Per-Arne (70) på 70-tallet
De rare filnavnene forklarer utvikler Sletteberg er et valg de tok da de trakk ut filene fra de gamle versjonskontroll-systemene.
- På den tiden var jo ikke Git oppfunnet , så versjonskontrollsystemet de brukte var LCM (Life Cycle Manager) fra Allen Systems. Dette bruker de forøvrig fortsatt i dag, utviklerne som jobber på Infotrygd, forklarer Sletteberg.
- Filsystemet på IBM Mainframe har kun støtte for åtte karakterers filnavn. IBM Mainframe bruker EBCDIC som tegnsett. Da jeg hentet ut filene, konverterte jeg dem fra EBCDIC til ISO8859-1, forklarer Lie.
Inne i selve filene er ting mer gjenkjennelig. Det er funksjoner, løkker, variabler og kommentarer, gjerne i en salig blanding av norsk og engelsk. Koden er virkelig en skattekiste av programmeringshistorikk, hvis man tar seg tid til å se seg om.
/* ***************************************************************** */
/*IDENTIFIKASJON: */
/* R001N522 - PROSEDYRE I PLI KOPI AV R0010522 */
/* PROGRAMMERER: GEIR, OKTOBER 1981 */
/*HENSIKT: */
/* PROSEDYREN AJOURFØRER SØKERS PENSJONSSTATUS MED INFO FRA TRANS */
/* ALDERSBLANKETTEN. */
/* ***************************************************************** */
/* ***************************************************************** */
/* YTELSE_SEGMENTET */
/* ***************************************************************** */
%SKIP;
IF B02.BEREGN_FOLKETRYGD(SØKER_IND) = 'N' THEN
B02.BEREGN_FOLKETRYGD(SØKER_IND) = 'J'; /*9907*/
IF HJ_VIRK_DATO_ÅMD < 19980200 THEN
B02.PENSJON_FØR_9802(SØKER_IND) = 'J';
ELSE
IF B01.PENSJONSTYPE2(SØKER_IND) = 'N' THEN /*9802 HL */
B02.PENSJON_FØR_9802(SØKER_IND) = ' ';
B02.GP_REDUKSJON_KODE(SØKER_IND) = ' ';
W_VIRK_DATO_ÅMD = HJ_VIRK_DATO_ÅMD ;
B02.NAVN(SØKER_IND) = A1S.NAVN;
B02.TKNR(SØKER_IND) = A1S.TKNR;
B02.SPRÅK(SØKER_IND) = A1S.SPRÅK;
B02.PENSJONSTYPE1(SØKER_IND) = 'A';
B02.FØRSTE_GANG_REG(SØKER_IND) = 'N';
B02.P67_KODE (SØKER_IND) = ' '; /*HL*/
Slik som kommentaren i utdraget over, som forteller at Geir har skrevet koden, i 1981.
Sletteberg forteller at det mest spennende de har funnet i koden foreløpig er hvordan DSF skulle håndtere år 2000-problematikken.
- NAV var blant organisasjonene som sikkert hadde høy puls nyttårsaften i 1999. Det ble gjort en del patching i DSF for å støtte dette, og visstnok så skapte ikke overgangen noen store problemer, humrer han.
/* DETTE VAR GLEMT : */
IF W_FNR_EK13_ÅR > 1924 & /*Y2K-K*/
((B02.KONV_P_KODE(BER_EK_IND) = 'K' &
B02.UTTAKSDATO_ÅMD(BER_EK_IND) < 19920000) ! /*Y2K-K*/
((B02.KONV_P_KODE(BER_EK_IND) = 'U' !
B02.KONV_P_KODE(BER_EK_IND) = 'Y' ) &
B02.UFØRHIST.UFT_ÅMD(BER_EK_IND,SISTE_UFØRHIST_EK)
<19920000 ) ! /*Y2K-K*/
- Rikstrygdeverket var veldig tungt inne i Y2K problematikken. Det ble gjort mye endringer for å sørge for at alle datofelter på 2 byte ble utvidet til 4 byte, forklarer Lie.
- Høsten 1999 ble det plassert ut en stor container med dieselaggregat på utsiden av bygget der vi hadde datahall i Amtmann Meinichsgate 15 på Sandaker. Det var for å sørge for at det skulle være nok strøm tilgjengelig til datahallen og kontorlokalene i bygget, dersom strømmen skulle forsvinne fra 1. januar 2000.
Livet som norsk COBOL-utvikler på 80- og 90-tallet
Dyr regning satt strek
DSF klarte seg altså greit gjennom Y2K. Faktisk holdt det koken i nesten 20 år til.
I september 2008 tok riktig nok et annet system over driften, men DSF ble holdt i gang på grunn av historisk data. Det var ikke før i 2018 at DSF ble lagt helt ned.
Sletteberg forteller at NAV tradisjonelt ikke har hatt mye fokus på å skru av gamle systemer. Derfor er det ikke så rart at systemet fikk kjøre så lenge som det gjorde.
- Man lar det bare snurre og gå. De siste årene har det blitt mer bevissthet rundt det, men gamle systemer forsvinner jo ikke av seg selv. Man må gjøre en aktiv innsats for å migrere seg bort fra dem, forklarer Sletteberg.
Driftsjef Lie utdyper hva som faktisk førte til at DSF måtte legges ned:
Det kom en regning fra IBM - lisenskostnad for å få lov til å kjøre PL/I-koden. Det var nok spikeren i kista for DSF. Da var det billigere for NAV å lage systemet Presys, som er en Java-omskrivning av de få delene av DSF som fortsatt var i bruk.
- Det var ingen utviklere med kjennskap til DSF igjen i NAV. Så de måtte hente tilbake en av dem, Trude Sponberg, slik at hun kunne hjelpe til med omskrivingen, forklarer han.
«Norge har kanskje ikke sendt romfarere til månen, men vi har vært blant verdens beste velferdsstater, og det er koden i DSF og Infotrygd som har holdt hjulene i gang!»
Åpen for alle
Og om du klør etter å ta en titt for deg selv, har du flaks. NAV har bestemt seg for å gjøre koden åpen, fra kode24s artikkel blir publisert i dag.
Dermed kan du bade i over 700 filer med norsk kodehistorie på https://github.com/navikt/DSF/.
- Det tok minst en uke å få kjørt gjennom et program
- Koden har nok først og fremst historisk interesse. Det er jo spennende å se hvordan man gjorde ting før! Mange griner fort på nesa av å se gammel kode, men det her har jo kjørt i produksjon i mange år, og gjort en solid, viktig jobb, forteller Sletteberg.
Han mener vi bør ha litt respekt for disse gamle systemene.
- Kanskje det finnes noen nerder der ute som henter frem en PL/I-kompilator og prøver å kjøre koden?, spekulerer han.
- Programvare er en essensiell del av moderne historie. Norge har kanskje ikke sendt romfarere til månen, men vi har vært blant verdens beste velferdsstater, og det er koden i DSF og Infotrygd som har holdt hjulene i gang!
Slik koda NAV ny dagpenge-løsning på tre dager
- Vi er dødsslitne, men stolte, forteller NAV-utviklerne som løste krisa med React, Kotlin og PostgreSQL.