Tillbaka till grunderna i datavetenskap, trots examen: på spaning efter fyra år som flytt

En bekännelse från en datavetare med examen men utan grunderna

När jag pluggade trodde jag att jag var ganska duktig. Och det trots att jag inte ens förstod hur viktiga grunderna i datavetenskap var, utan bara jagade betyg.

På mitt sätt gick jag mina kurser ganska flitigt, och jag hade till och med vunnit priser i universitetets programmeringstävlingar och i capstone-tävlingar (där studentlag bygger ett avslutande projekt). När mina kurskamrater slet med fel i koden stod jag bredvid och spelade besserwisser och kände mig överlägsen. Men nu måste jag erkänna: det jag byggde på den tiden var rena barnleken.

Att koppla in en riktig databas (DB) var för svårt, så jag sparade data i en textfil från Anteckningar (.txt) med kommatecken (,) som avgränsare. Och i stället för en Raspberry Pi, som kräver styrning på operativsystemnivå, nöjde jag mig med en Arduino som går igång med några få rader kod. Lärarna berömde resultat som bara såg ut att fungera på ytan, och jag inbillade mig att det var min verkliga kompetens.

Intervjuer jag klarade genom att plugga utantill – där började tragedin

Men så fort jag kastades ut på arbetsmarknaden krossades det ogrundade självförtroendet. Jag åkte ut redan i CV-gallringen, gång på gång. Titeln tävlingsvinnare räckte inte för att dölja mina bristfälliga grunder i datavetenskap.

Ju mer oron kröp på, desto mer fixerade jag mig vid att samla på mig ytlig fasadkunskap. Förståelsen kom i andra hand; som en maskin nötte jag in mönstersvar för att klara intervjuerna. Min lärobok var ”100 troliga intervjufrågor” som jag skrapat ihop från teknikbloggar.

När intervjuaren frågade ”Vad är skillnaden mellan TCP och UDP?” svarade jag som en varuautomat: ”TCP är förbindelseorienterat och garanterar tillförlitlighet men är långsamt, medan UDP är förbindelselöst och snabbt men mindre tillförlitligt.”

I själva verket hade jag ingen aning om vad ett paket var eller hur en 3-way handshake faktiskt går till. Men ironiskt nog lyckades jag, tack vare just den mekaniska utantillinlärningen, lura intervjuarna, få riktigt bra omdömen och landa ett jobb. Jag trodde att jag hade haft tur. Jag anade inte att det var början på en tragedi, där fyra års karma skulle drabba mig på en och samma gång.

Passerkortet jag pluggat mig till stod sig slätt mot jätten som heter skarpt läge.

Att överleva som fullstack i ett litet team

Jag hamnade i ett litet team. Där fanns inga bekväma uppdelningar i ”frontend” och ”backend”.

Redan första dagen fick jag stå inför en tsunami av tekniker. Jag trodde att det räckte att vara bra på antingen Java eller JavaScript. Men verkligheten var den svarta skärmen i en SSH-terminal mot Linux, mystiska Docker-containrar, CI/CD-pipelines i GitLab och dessutom Spring Boot, Vue.js och till och med Redis… Tekniker som jag som student hade skjutit upp med ett ”det tar jag sen” eller viftat bort med ett ”det där behöver jag inte kunna” anföll mig från alla håll.

Kunskapen jag hade rabblat upp på intervjuerna var helt oanvändbar i jobbet. Eller rättare sagt: jag visste inte hur jag skulle ”tillämpa” den. För att förstå varför Docker-containern jag startat hela tiden dog (OOM) och varför Redis åt upp minnet behövde jag på riktigt just de grunder i datavetenskap som jag hade pluggat in inför intervjuerna.

Ett slott byggt på sand

Till slut hade jag blivit en ”copy-paste-utvecklare” som kopierade och klistrade in kod (Ctrl+C, V) på måfå. Funktionerna fungerade på något sätt, men jag visste inte varför.

  • CORS Error: varför vägrar min webbläsare ta emot serverns svar? (okunskap om HTTP-headers)
  • OOM (Out Of Memory): varför dör en server som gått fint helt plötsligt? (okunskap om minnesläckor och GC)
  • Connection Refused: det funkar lokalt, så varför slutar det fungera när jag driftsätter? (okunskap om portvidarebefordran och brandväggar)

Eftersom jag inte förstod principerna bakom den bekvämlighet som ramverken erbjöd, kunde jag inte lösa problemen när de uppstod. Jag byggde ett vacklande slott av glänsande ramverk på en mark där grunderna i datavetenskap var bristfälliga.

Teknik som byggs upp utan förståelse för principerna är som ett sandslott som rasar redan av en liten våg.

Re: Booting, tillbaka till startpunkten

Därför bestämde jag mig för att börja om från början. Det kändes mer angeläget att reda ut den grundläggande frågan ”Hur i hela friden förstår och kör datorn egentligen min kod?” än att just nu bygga ännu ett glänsande portfolioprojekt.

Den här bloggen dokumenterar en ihärdig efteranalys, där en utexaminerad datavetare med bara ett examensbevis i handen bygger upp grunderna i datavetenskap från noll igen. Jag tänker inte bara rada upp Linuxkommandon eller installationsguider för Docker. I stället vill jag visa hur jag ställer frågor som de här och letar mig fram till svaren.

  1. Language & OS: vad händer från att Java-koden kompileras tills den når CPU:n?
  2. Network: vilken väg färdas paketen när jag trycker Enter i adressfältet?
  3. Virtualization: vad skiljer min laptop från datorerna i serverhallen, och varför behövs virtualisering?
  4. DevOps: hur driftsätter jag koden jag skriver på ett säkert och automatiserat sätt?

Bortom localhost

Det slutgiltiga målet är att med egna händer bygga upp och styra Linux, Docker, CI/CD och även molnmiljöer. Jag hoppas att du vill följa med när jag lämnar det trygga växthuset localhost och blir en ingenjör som klarar sig även ute i serverlandskapets vildmark.

Till dig som, precis som jag en gång, säger ”Vi läste det på universitetet, men jag minns det inte”: jag hoppas att de här anteckningarna kan bli en liten vägvisare som får dig att slå dig för pannan och utbrista: ”Jaha, det var alltså det läraren menade!”

Lämna en kommentar