LÄSA KOD

MANUAL DEL 5 // FÖRSTÅ VAD AI SKRIVER ÅT DIG

VARFÖR DET HÄR STEGET

Du behöver inte skriva kod — men du bör kunna läsa den

Just nu är du troligen i det här läget: AI skriver kod, du klistrar in den, du testar, det fungerar eller inte. Du vet vad koden gör — men inte hur.

Det fungerar länge. Men det har ett pris: du kan inte bedöma om koden är bra eller dålig. Du kan inte hitta felet själv när något går fel. Du vet inte om AI löste problemet rätt eller bara på ett sätt som ser ut att fungera just nu.

Att läsa kod är lättare än att skriva den — ungefär som att läsa ett recept är lättare än att laga mat utan recept. Du behöver inte memorera syntax. Du behöver känna igen mönstren.

Den här guiden tar verklig kod — kod som AI producerar — och lär dig läsa den meningsfullt. En bit i taget.

MÅL: SE KOD OCH FÖRSTÅ VAD DEN GÖR
INTE MÅL: SKRIVA KOD FRÅN MINNET

METOD

Hur du läser kod du inte förstår

Det vanligaste misstaget är att försöka förstå varje rad direkt. Det är som att försöka förstå varje ord i en mening på ett okänt språk — du fastnar på detaljerna och missar helheten.

Läs istället i tre pass:

  1. Strukturen. Scrolla igenom koden utan att läsa. Hur lång är den? Finns det tydliga block — sektioner separerade med tomma rader, kommentarer eller indentering? Vad finns i toppen, mitten, botten?
  2. Namnen. Läs bara variabelnamn och funktionsnamn. Vad heter saker? saveNote, userInput, renderList — namnen berättar nästan alltid vad koden gör, utan att du behöver förstå hur.
  3. Flödet. Hitta startpunkten — var börjar det hända? Ofta en händelse som ett knapptryck. Följ sedan vad som händer steg för steg därifrån.

PASS 1: STRUKTUR — HUR SER DET UT?
PASS 2: NAMN — VAD HETER SAKER?
PASS 3: FLÖDE — VAD HÄNDER I VILKEN ORDNING?

METOD

HTML I PRAKTIKEN

Läsa HTML — hitta trädet

HTML är det lättaste att läsa. Titta på det här blocket:

<div class="card">
  <h2>Mina anteckningar</h2>
  <ul id="note-list"></ul>
  <input id="note-input" placeholder="Ny anteckning" />
  <button onclick="saveNote()">Spara</button>
</div>

Du kan läsa det här utan att kunna HTML. Det finns en box (div) med klassen "card". Inuti: en rubrik, en tom lista med id "note-list", ett textfält med id "note-input", och en knapp. Knappen anropar en funktion som heter saveNote när man klickar.

Tre saker att leta efter i HTML:

  • id — ett unikt namn för ett element. id="note-list" betyder att JavaScript kan hitta just det elementet med det namnet.
  • class — en CSS-koppling. class="card" betyder att CSS-regler för "card" gäller det här elementet.
  • onclick / onsubmit — en händelse kopplad direkt till ett element. Klick på det här → kör den här funktionen.

id → JAVASCRIPT HITTAR DET
class → CSS STILAR DET
onclick → JAVASCRIPT REAGERAR PÅ DET

CSS I PRAKTIKEN

Läsa CSS — regler och vad de gäller

CSS är uppbyggt av block. Varje block har en selektor — vad regeln gäller — och egenskaper — vad som gäller.

.card {
  background: #1a191b;
  padding: 2rem;
  border-left: 4px solid #ff00c8;
}

Läs det så här: allt med klassen "card" ska ha en mörk bakgrund, luft runt innehållet (padding), och en rosa linje till vänster.

Selektorn berättar vad regeln gäller:

  • .card — alla element med klassen "card"
  • #note-list — elementet med id "note-list"
  • button — alla knappar
  • button:hover — alla knappar när musen är över dem

När en stil inte slår igenom som du förväntar dig — leta efter en annan regel med samma eller mer specifik selektor. Den vinner.

.card → ALLA MED KLASSEN CARD
#note-list → BARA DET MED DET ID:T
#note-list är mer specifik än .card → DEN VINNER

JAVASCRIPT I PRAKTIKEN — DEL 1

Variabler och vad de håller

JavaScript börjar ofta med att hämta element från HTML och lagra dem i variabler. Det ser ut så här:

const noteInput = document.getElementById('note-input');
const noteList = document.getElementById('note-list');
const saveButton = document.getElementById('save-btn');

Läs det som: "Hitta elementet med id 'note-input' i HTML-dokumentet och kalla det noteInput härifrån."

Nu kan JavaScript använda noteInput istället för att leta upp elementet varje gång. Det är hela poängen med variabler — ett kort namn för något som annars skulle behöva upprepas.

Tre nyckelord du ser för att skapa variabler:

  • const — värdet ändras aldrig. Sätts en gång, används som det är.
  • let — värdet kan ändras. Används för saker som uppdateras.
  • var — äldre variant. Fungerar men AI bör undvika det — be om const och let istället.

const → ÄNDRAS INTE
let   → KAN ÄNDRAS
var   → GAMMALT, UNDVIK

JAVASCRIPT I PRAKTIKEN — DEL 2

Funktioner — hitta dem och förstå dem

En funktion i JavaScript ser ut så här:

function saveNote() {
  const text = noteInput.value;
  if (text === '') return;
  const item = document.createElement('li');
  item.textContent = text;
  noteList.appendChild(item);
  noteInput.value = '';
}

Läs den rad för rad med metodiken från tidigare:

  1. const text = noteInput.value — läs vad som står i textfältet och kalla det text.
  2. if (text === '') return — om texten är tom, avbryt. Gör ingenting.
  3. document.createElement('li') — skapa ett nytt listelement.
  4. item.textContent = text — sätt listelelmentets text till det användaren skrivit.
  5. noteList.appendChild(item) — lägg till det nya elementet i listan.
  6. noteInput.value = '' — töm textfältet.

Sex rader. Sex steg. En funktion. Du behöver inte veta hur du hade skrivit det — du behöver veta att du kan läsa det och förstå det.

FUNKTIONER

JAVASCRIPT I PRAKTIKEN — DEL 3

Villkor — koden som bestämmer

Villkor är det du ser mest i kod som hanterar användarinput. Grundformen:

if (villkor) {
  // gör det här om villkoret är sant
} else {
  // gör det här annars
}

I praktiken, för ett formulär med validering:

if (emailInput.value === '') {
  errorMessage.textContent = 'E-post krävs';
  errorMessage.style.display = 'block';
} else if (!emailInput.value.includes('@')) {
  errorMessage.textContent = 'Ogiltig e-post';
  errorMessage.style.display = 'block';
} else {
  submitForm();
}

Läs det som en beslutskedja: om fältet är tomt — visa felmeddelande. Annars om det saknar @-tecken — visa annat felmeddelande. Annars — skicka formuläret.

Jämförelseoperatorerna du ser:

  • === — är exakt lika med
  • !== — är inte lika med
  • > och < — större/mindre än
  • ! framför något — motsatsen (inte sant)

if (x === y) → OM X ÄR LIKA MED Y
if (!isValid) → OM DET INTE ÄR GILTIGT
if (count > 0) → OM RÄKNAREN ÄR ÖVER NOLL

JAVASCRIPT I PRAKTIKEN — DEL 4

Loopar — samma sak för varje sak i en lista

När AI genererar kod som visar en lista med poster ser du nästan alltid en loop. Den vanligaste i modern kod:

notes.forEach(function(note) {
  const item = document.createElement('li');
  item.textContent = note.text;
  noteList.appendChild(item);
});

Läs det som: "för varje anteckning i listan notes, skapa ett listelement, sätt dess text, lägg till det i listan."

note är ett tillfälligt namn för varje enskild anteckning — det byter värde för varje varv. Första varvet är det den första anteckningen. Andra varvet den andra. Och så vidare.

Du ser också den äldre formen:

for (let i = 0; i < notes.length; i++) {
  // gör något med notes[i]
}

Samma sak, mer ordrik. i är en räknare som börjar på 0 och ökar med 1 för varje varv tills den nått listans längd. notes[i] betyder "anteckningen på plats i i listan".

forEach → FÖR VARJE SAK I LISTAN, GÖR DET HÄR
for-loop → RÄKNA UPPÅT OCH GÖR DET HÄR VARJE STEG

JAVASCRIPT I PRAKTIKEN — DEL 5

Asynkron kod — känna igen mönstret

Det här är mönstret du ser i all kod som pratar med ett API:

async function fetchData() {
  try {
    const response = await fetch(apiUrl);
    const data = await response.json();
    renderResults(data);
  } catch (error) {
    showError('Något gick fel');
  }
}

Läs det här i delar:

  • async function — den här funktionen innehåller saker som tar tid. Webbläsaren vet att den ska vänta.
  • await fetch(apiUrl) — skicka en förfrågan till den URL:en och vänta på svaret innan du går vidare.
  • await response.json() — konvertera svaret till JavaScript-data och vänta tills det är klart.
  • try / catch — försök göra det här. Om något går fel, fånga felet och gör det där istället. Det är felhantering — utan det kraschar hela funktionen tyst om något misslyckas.

Ser du asynkron kod utan try/catch är det ett varningstecken — be AI lägga till felhantering. Utan det vet du aldrig varför ett API-anrop misslyckades.

async/await → VÄNTA PÅ SVAR
try/catch → HANTERA FEL ISTÄLLET FÖR ATT KRASCHA

ASYNKRONT

JAVASCRIPT I PRAKTIKEN — DEL 6

Objekt och listor — hur data ser ut

Data i JavaScript har två grundformer du ser hela tiden.

En lista (array) — en samling värden i ordning:

const notes = ['Handla mjölk', 'Ring mamma', 'Fixa deploy'];

Ett objekt — en samling namngivna värden:

const note = {
  text: 'Handla mjölk',
  createdAt: '2025-04-01',
  done: false
};

Du når ett värde i ett objekt med punkt: note.text ger dig texten, note.done ger dig sant/falskt.

I verkligheten är det nästan alltid en lista av objekt — varje anteckning är ett objekt, alla anteckningar är i en lista:

const notes = [
  { text: 'Handla mjölk', done: false },
  { text: 'Ring mamma', done: true }
];

Det är exakt formatet du får tillbaka från en databas eller ett API. Förstår du det här mönstret förstår du hur data flödar genom nästan alla system du bygger.

[ ] → LISTA
{ } → OBJEKT
[ { }, { } ] → LISTA AV OBJEKT → DATABASENS FORMAT

NAVIGERA KOD

Kommentarer — kartan i koden

En kommentar är text i koden som inte körs — den är bara till för att läsaren ska förstå. I JavaScript börjar den med //:

// Hämta sparade anteckningar från localStorage
const saved = localStorage.getItem('notes');
const notes = saved ? JSON.parse(saved) : [];

// Rendera listan på sidan
renderNoteList(notes);

Kommentarer är din bästa vän när du läser okänd kod. Be alltid AI kommentera koden den skriver:

"Lägg till en kommentar på svenska ovanför varje
funktion som förklarar vad den gör och varför."

Kod utan kommentarer är svår att läsa. Kod med bra kommentarer läser sig nästan som prosa. Det är en enkel instruktion som gör allt framtida arbete enklare.

LÄSBARHET

ÖVNING

Läs det här blocket — vad gör det?

Använd metodiken: struktur, namn, flöde. Försök förstå vad det här gör innan du läser förklaringen under.

function deleteNote(id) {
  notes = notes.filter(function(note) {
    return note.id !== id;
  });
  saveToStorage();
  renderNoteList();
}

Vad gör det?

Funktionen heter deleteNote och tar emot ett id. Den filtrerar listan notes — behåller bara de anteckningar vars id inte matchar det angivna id:t. Sparar sedan den uppdaterade listan, och ritar om listan på sidan.

filter är en listoperation som skapar en ny lista med bara de element som uppfyller ett villkor. Villkoret här: "id:t ska inte vara det vi vill ta bort." Allt annat bevaras.

filter → BEHÅLL BARA DET SOM UPPFYLLER VILLKORET
!== → INTE LIKA MED
RESULTAT: NY LISTA UTAN DET BORTTAGNA OBJEKTET

TILLÄMPA DET HÄR

Fyra saker du nu kan göra som du inte kunde förut

1. Hitta felet utan AI. När något inte fungerar kan du nu titta på koden och följa flödet. "Knappen anropar saveNote(). Den läser noteInput.value. Men variabeln noteInput är aldrig definierad i den här filen." Det är felet. Du hittade det utan att fråga Claude.

2. Bedöma AI:s svar. Claude ger dig ibland två alternativa lösningar. Nu kan du läsa dem och se: den ena har try/catch, den andra inte. Den ena kommenterar sin kod, den andra inte. Du kan välja den bättre lösningen med förståelse, inte tur.

3. Göra små ändringar själv. En text i en kommentar, ett färgvärde i CSS, ett felmeddelande i JavaScript — saker som är triviala att ändra direkt istället för att fråga AI om varje liten sak.

4. Ställa exaktare frågor. Istället för "det funkar inte" kan du nu säga: "Funktionen renderNoteList körs innan notes har hämtats från localStorage. Hur fixar jag ordningen?" Det är en fråga Claude kan svara direkt och exakt på.

LÄSA KOD = BÄTTRE FELSÖKNING
LÄSA KOD = BÄTTRE BEDÖMNING
LÄSA KOD = SNABBARE ÄNDRINGAR
LÄSA KOD = EXAKTARE FRÅGOR

TILLÄMPNING

BYGGA VANAN

Hur du tränar det här utan att det känns som träning

Du behöver inte avsätta tid för att "läsa kod". Du tränar det varje gång du vibe-codar — om du lägger till ett steg.

Nästa gång Claude ger dig kod: innan du klistrar in den, läs igenom den en gång med metodiken. Struktur, namn, flöde. Tar en minut. Ställ sedan en fråga om det du inte förstår:

"Förklara vad den här funktionen gör rad för rad"
"Varför används async/await här?"
"Vad händer om API-anropet misslyckas?"
"Vad gör filter() i det här sammanhanget?"

Varje förklaring lär dig ett mönster. Mönstren ackumuleras. Efter ett par veckor märker du att kod som såg obegriplig ut börjar läsas nästan av sig självt.

Det är inte att lära sig programmera. Det är att skaffa sig tillräcklig läsförmåga för att äga det du bygger.

VARJE SESSION: LÄS KODEN INNAN DU KLISTRAR IN
VARJE FUNKTION DU INTE FÖRSTÅR: FRÅGA CLAUDE
EFTER TVÅ VECKOR: DU LÄSER KOD

RUTIN

SAMMANFATTNING

Vad du kan läsa nu

HTML: TRÄD, ID, CLASS, ONCLICK
CSS: SELEKTOR + EGENSKAPER, SPECIFICITET
JS: const/let, FUNKTIONER, VILLKOR, LOOPAR
JS: async/await, try/catch, OBJEKT, LISTOR
METOD: STRUKTUR → NAMN → FLÖDE
VANA: LÄS KODEN INNAN DU KLISTRAR IN DEN

Nästa steg är att börja skriva enkel kod själv — inte för att ersätta AI, utan för att ha kontroll över de enklaste delarna av det du bygger.

DU LÄSER KOD NU

GÅ TILLBAKA OCH LÄS DET AI SKRIVIT ÅT DIG