Merk
Listen under er veiledende og gir eksempler på hva de ulike kompetansemålene i faget Utvikling omfatter. Den dekker ikke alt som kan inngå i kompetansemålene.
Det er viktig for deg som elev å kunne knytte kompetansemålene til eget arbeid, spesielt med tanke på eksamensforberedelser.
Gjennomgang av kompetansemålene
Kompetansemålene kommer fra Udir.
Vurdere fordeler og ulemper ved ulike programmeringsspråk og velge og anvende relevante programmeringsspråk og algoritmer i eget arbeid
Denne kompetansen handler om å forstå at ulike språk har ulike styrker, og å kunne begrunne valgene man tar i egne prosjekter.
Sammenligning av programmeringsspråk
| Språk | Styrker | Svakheter | Typisk bruksområde |
|---|---|---|---|
| Python | Enkel syntaks, mange biblioteker | Dynamisk typing kan skjule feil, GIL begrenser ekte parallellitet | Web, automatisering, data, AI |
| JavaScript | Kjører i nettleseren, stort økosystem | Svakt typet, kan gi uforutsigbare feil | Frontend, backend (Node.js) |
| C# | Sterkt typet, god IDE-støtte | Mer komplekst enn Python | Spill (Unity), desktop-applikasjoner |
| Java | Plattformuavhengig (JVM), robust | Mye boilerplate-kode | Store systemer, Android |
| C++ | Svært raskt, full kontroll over ressurser | Komplekst, manuell minnehåndtering | Spillmotorer, systemprogramvare |
Algoritmer
| Begrep | Forklaring | Eksempel |
|---|---|---|
| Algoritme | En steg-for-steg oppskrift for å løse et problem | Sortering av en liste, søk i data |
| Tidskompleksitet | Hvor lang tid en algoritme bruker i forhold til inputen | O(n), O(n²), O(log n) |
| Iterativ utvikling | Bygge og forbedre løsningen gradvis | Lag en enkel versjon først, forbedre den |
Utforskingsområder
- Sammenlign Python og et annet språk (f.eks. C# eller Java) - lag det samme programmet i begge
- Lag en sorteringsalgoritme i Python uten å bruke innebygde funksjoner
- Utforsk et nytt programmeringsspråk og skriv en kort rapport om fordeler og ulemper
Lage og begrunne funksjonelle krav til en IT-løsning basert på behovskartlegging
Kompetansen handler om å finne ut hva brukerne trenger og formulere dette som konkrete krav til løsningen.
| Begrep | Forklaring | Eksempel |
|---|---|---|
| Behovskartlegging | Systematisk undersøke hva brukerne trenger | Intervju, spørreundersøkelse, observasjon |
| Funksjonelle krav | Konkret beskrivelse av hva systemet skal gjøre | «Brukeren skal kunne registrere seg med e-post» |
| Ikke-funksjonelle krav | Krav til ytelse, sikkerhet, brukervennlighet | «Siden skal laste på under 2 sekunder» |
| Feature requests | Konkrete ønsker om ny funksjonalitet, formulert fra brukerens behov | «Jeg vil kunne filtrere produkter etter kategori» |
Utforskingsområder
- Lag en behovskartlegging for en fiktiv nettbutikk eller skole-app
- Skriv 5-10 funksjonelle krav basert på kartleggingen
- Formuler feature requests for en Python Flask-applikasjon basert på tilbakemeldinger fra brukere
Vurdere brukergrensesnitt til IT-tjenester og designe tjenester som er tilpasset brukernes behov
Fokus er på å lage løsninger som er intuitive og brukervennlige, med utgangspunkt i brukerens perspektiv.
| Begrep | Forklaring | Eksempel |
|---|---|---|
| UI (User Interface) | Det visuelle designet brukeren ser og interagerer med | Knapper, menyer, farger, layout |
| UX (User Experience) | Helhetsopplevelsen brukeren har med løsningen | Er det lett å finne frem? Fungerer flyten? |
| Universell utforming | Design som inkluderer alle brukere, også med nedsatt funksjonsevne | Kontraster, skjermleser-støtte, tastaturnavigasjon |
| Prototyping | Lage skisser eller wireframes før man koder | Figma, Penn og papir |
Utforskingsområder
- Evaluer brukergrensesnittet til en eksisterende nettside - hva fungerer bra og dårlig?
- Lag en wireframe/prototype for en Flask-applikasjon med pen og papir eller Figma
- Design en enkel nettside med HTML/CSS som følger prinsipper for universell utforming
Gjøre rede for hensikten med teknisk dokumentasjon og utarbeide teknisk dokumentasjon for IT-løsninger
Kompetansen handler om å kunne skrive dokumentasjon som gjør at andre (og fremtidig deg) kan forstå, vedlikeholde og videreutvikle en løsning.
| Type dokumentasjon | Forklaring | Eksempel |
|---|---|---|
| README | Overordnet beskrivelse av prosjektet | Hva gjør prosjektet, hvordan installere |
| API-dokumentasjon | Beskrivelse av endepunkter og dataformater | Flask-ruter, request/response |
| Kodekommentarer | Forklaringer i selve koden | Docstrings, inline-kommentarer |
| Brukerveiledning | Hvordan brukeren skal bruke løsningen | Steg-for-steg-guide med skjermbilder |
| Systemdokumentasjon | Arkitektur, avhengigheter, oppsett | Nettverkskart, requirements.txt |
Utforskingsområder
- Skriv en god README.md for et av dine Python-prosjekter på GitHub
- Dokumenter API-endepunktene i en Flask- eller FastAPI-applikasjon
- Bruk docstrings i Python-funksjonene dine
- Lag en enkel brukerveiledning for en applikasjon du har laget, med skjermbilder og instruksjoner
Beskrive og anvende relevante versjonskontrollsystemer i utviklingsprosjekter
Versjonskontroll er essensielt for å spore endringer, samarbeide og sikre arbeidet sitt.
| Begrep | Forklaring | Eksempel |
|---|---|---|
| Git | Distribuert versjonskontrollsystem | git init, git commit, git push |
| GitHub | Skybasert plattform for Git-repositories | Lagre prosjekter, samarbeide |
| Branch | En parallell versjon av koden for utvikling | feature/login, bugfix/header |
| Merge | Slå sammen endringer fra en branch til en annen | Pull request på GitHub |
| Commit | Et «lagringspunkt» med beskrivelse av endringer | git commit -m "Lagt til innlogging" |
| .gitignore | Fil som sier hvilke filer Git skal ignorere | __pycache__/, .env, venv/ |
Utforskingsområder
- Bruk Git og GitHub aktivt i alle prosjektene dine
- Øv på branching og merging - lag en branch for en ny funksjon, commit endringene, og opprett en Pull Request tilbake til
main - Skriv gode commit-meldinger som beskriver hva som ble endret
- Utforsk CI/CD med GitHub Actions - f.eks. automatisk deploy til GitHub Pages eller en Docker-container
Designe og implementere IT-tjenester med innebygget personvern
Fokus er å tenke personvern allerede fra designfasen, ikke som en ettertanke.
| Prinsipp | Forklaring | Eksempel |
|---|---|---|
| Privacy by Design | Personvern bygges inn fra start | Minimere datainnsamling, kryptere passord |
| Dataminimering | Samle kun de data som er nødvendige | Ikke lagre fødselsdato hvis det ikke trengs |
| Kryptering | Beskytte data slik at uvedkommende ikke kan lese det | Hashing av passord med SHA-512, kryptering med RSA |
| Samtykke | Brukeren må godkjenne innsamling av persondata | Informert samtykke ved registrering |
| GDPR | EUs personvernforordning som gjelder i Norge | Rett til innsyn, sletting, dataportabilitet |
Utforskingsområder
- Lag en Flask-applikasjon med innlogging der passord hashes (f.eks. med
hashlibog SHA-512) - Implementer et samtykkeskjema i en nettside
- Diskuter hvilke data en skole-app faktisk trenger å lagre
Analysere digitale trusler, verdier og sårbarheter og utvikle applikasjoner med innebygget sikkerhet
Kompetansen handler om å kjenne til vanlige trusler og bygge sikkerhet inn i koden fra starten.
Vanlige trusler og sårbarheter
| Trussel/Sårbarhet | Forklaring | Tiltak |
|---|---|---|
| SQL Injection | Ondsinnet SQL-kode sendes via brukerinput | Parameteriserte spørringer, ORM |
| XSS (Cross-Site Script) | Ondsinnet JavaScript injiseres i en nettside | Escape brukerinput, Content Security Policy |
| Brute Force | Gjentatte forsøk på å gjette passord | Rate limiting, sterke passordkrav, MFA |
| Utdaterte avhengigheter | Kjente sårbarheter i gamle biblioteker | Dependabot, regelmessig oppdatering |
| Hardkodede hemmeligheter | Passord/API-nøkler direkte i kildekoden | Miljøvariabler (.env), secrets management |
Verdivurdering
| Verdi | Eksempel |
|---|---|
| Brukerdata | Navn, e-post, passord |
| Forretningslogikk | Algoritmer, prisberegninger |
| Tilgjengelighet | At tjenesten er oppe og fungerer |
Utforskingsområder
- Lag en Flask-applikasjon og test den mot vanlige sårbarheter (f.eks. SQL injection)
- Bruk miljøvariabler (.env) for å lagre API-nøkler og hemmeligheter
- Implementer inputvalidering i et Python-prosjekt (se Datavalidering-modulen)
- Sett opp Dependabot på et GitHub-repository
Anvende relevant testmiljø og utføre testing tilpasset IT-løsningen som utvikles
Kompetansen handler om å sikre kvaliteten på kode gjennom systematisk testing.
| Type testing | Forklaring | Eksempel / Verktøy |
|---|---|---|
| Enhetstesting | Teste individuelle funksjoner isolert | pytest, unittest |
| Integrasjonstesting | Teste at flere deler fungerer sammen | Sjekke at en Flask-rute henter riktig data fra databasen |
| Automatisert testing | Bruke verktøy som simulerer en bruker i nettleseren | Selenium, Playwright |
| Manuell testing | Teste manuelt ved å bruke applikasjonen | Klikke gjennom en nettside |
| Testdrevet utvikling | Skrive tester før koden (TDD) | Skriv test → Se at den feiler → Lag kode |
| Testmiljø | Eget miljø for testing som ikke påvirker produksjon | Virtuell maskin, Docker-container |
Utforskingsområder
- Skriv enhetstester med
pytestfor et Python-prosjekt - Prøv automatisert nettlesertesting med Selenium - test at en nettside oppfører seg riktig
- Sett opp et testmiljø med Docker eller en virtuell maskin i Proxmox
- Utforsk GitHub Actions for automatisk testing ved push
Modellere og opprette databaser for informasjonsflyt i systemer
Fokus er å forstå hvordan data struktureres, lagres og flyter gjennom et system. En database er i bunn og grunn en samling av tabeller som henger sammen - litt som et regneark, men med regler for hvordan tabellene relaterer til hverandre.
| Begrep | Forklaring | Eksempel |
|---|---|---|
| Relasjonsdatabase | Data lagret i tabeller med rader (oppføringer) og kolonner (felter), der tabellene kan kobles sammen | SQLite, PostgreSQL, MySQL |
| ER-diagram | En tegning som viser tabellene i databasen, hvilke felter de har, og hvordan de henger sammen (entity-relationship) | En elever-tabell koblet til en klasser-tabell via klasse_id |
| Normalisering | Organisere tabellene slik at data ikke lagres flere steder (unngå duplisering). Deles inn i normalformer (1NF, 2NF, 3NF) | I stedet for å skrive klassenavnet i hver elevrad, lager man en egen klasser-tabell og refererer til den |
| Primærnøkkel | En kolonne (eller kombinasjon) som unikt identifiserer hver rad i en tabell | id-kolonnen - ingen to rader har samme id |
| Fremmednøkkel | En kolonne som peker til primærnøkkelen i en annen tabell, og dermed kobler tabellene sammen | klasse_id i elever-tabellen peker til id i klasser-tabellen |
Utforskingsområder
- Lag et ER-diagram for en enkel applikasjon (f.eks. en blogg med brukere, innlegg og kommentarer)
- Opprett en SQLite-database i Python med
sqlite3-modulen - Bruk en ORM som SQLAlchemy sammen med Flask
Beskrive ulike datalagringsmodeller og metoder for å hente ut og sette inn bestemte data fra databaser som brukes av andre systemer
Kompetansen handler om å forstå ulike måter å lagre data på og hvordan systemer utveksler data via spørringer og APIer.
Datalagringsmodeller
| Modell | Forklaring | Eksempel |
|---|---|---|
| Relasjonell (SQL) | Data i tabeller med rader og kolonner, relasjoner via nøkler | SQLite, PostgreSQL |
| Dokumentbasert | Data lagret som dokumenter (ofte JSON) | MongoDB, Firebase |
| Nøkkel-verdi | Enkel lagring med nøkkel og tilhørende verdi | ValKey, Redis |
| Filbasert | Data lagret i filer (CSV, JSON, XML) | Konfigurasjonsfiler, eksportdata |
Hente ut og sette inn data
| Metode | Forklaring | Eksempel |
|---|---|---|
| SQL-spørringer | Strukturerte spørringer mot relasjonsdatabaser | SELECT * FROM elever WHERE klasse = 'VG2' |
| CRUD | Create, Read, Update, Delete - de fire grunnoperasjonene | Flask API med POST, GET, PUT, DELETE |
| API (REST) | Hente/sende data fra/til andre systemer via HTTP | requests.get("https://api.example.com/data") |
| ORM | Objekt-relasjonell mapping - bruke Python-objekter i stedet for rå SQL | SQLAlchemy |
Utforskingsområder
- Lag et Flask REST API som utfører CRUD-operasjoner mot en SQLite-database
- Hent data fra et offentlig API med Python
requests-biblioteket (se Flask 2 - API-modulen) - Sammenlign SQL-database med JSON-fillagring i et lite prosjekt
- Utforsk SQL-spørringer: SELECT, INSERT, UPDATE, DELETE, JOIN
Tverrfaglige temaer
Fagene Utvikling, Brukerstøtte og Driftstøtte overlapper på flere områder. Her ser du hvordan fagene henger sammen, og hvorfor det er nyttig å forstå helheten.
📄 Dokumentasjon (Utvikling + Brukerstøtte + Driftstøtte)
Alle tre fagene handler om å skrive god dokumentasjon, bare med ulikt fokus:
- I Utvikling skriver du README-filer og API-dokumentasjon. I Brukerstøtte blir den samme informasjonen til en brukerveiledning. I Driftstøtte brukes den til å sette opp appen på en server.
- En README som beskriver miljøvariabler og
requirements.txter teknisk dokumentasjon, men også driftsdokumentasjon. - Docstrings i Python-koden din er nyttig for deg selv, men også for den som skal feilsøke eller videreutvikle prosjektet.
🔐 Sikkerhet og personvern (Utvikling + Brukerstøtte + Driftstøtte)
Sikkerhet dukker opp i alle tre fagene, men på forskjellige nivåer:
- I Utvikling hasher du passord og validerer input. I Brukerstøtte veileder man brukere i sterke passord og MFA. I Driftstøtte konfigureres brannmur og HTTPS på serveren.
- Privacy by Design betyr at du bygger samtykke og dataminimering inn i koden. Brukerstøtte forklarer brukerne hva som lagres. Driftstøtte sørger for at dataene lagres og slettes riktig.
- Alle tre fagene jobber med GDPR, men fra hver sin vinkel: kode, kommunikasjon og infrastruktur.
🧪 Feilsøking (Utvikling + Brukerstøtte + Driftstøtte)
Feilsøking er sentralt i alle tre fagene. Metodene er forskjellige, men utfyller hverandre:
- I Utvikling skriver du tester med pytest og leser applikasjonslogger. I Brukerstøtte brukes halvdelingsmetoden for å finne ut hva som feiler. I Driftstøtte overvåkes servere med verktøy som Grafana.
- Samme feil kan se forskjellig ut fra hvert perspektiv: brukeren ser en feilmelding, utvikleren ser en stack trace, og driftstøtte ser høy CPU-bruk.
- God logging i koden gjør feilsøking enklere for alle. Et tidspunkt og en feilmelding fra brukerstøtte er mye mer nyttig når applikasjonen logger detaljert.
👥 Brukerforståelse og krav (Utvikling + Brukerstøtte)
Begge fagene handler om å forstå brukerne, men på ulike måter:
- I Utvikling gjør du behovskartlegging og skriver funksjonelle krav. I Brukerstøtte samler man tilbakemeldinger og ser mønstre i hva brukerne sliter med.
- Et brukergrensesnitt som er vanskelig å forstå fører til flere henvendelser til brukerstøtte. God UX-design i Utvikling reduserer behovet for veiledning.
- Feature requests fra brukerstøtte er i praksis behovskartlegging. Begge fagene jobber med det samme problemet fra hver sin side.
⚖️ Lovverk og personvern (Utvikling + Driftstøtte)
GDPR og personopplysningsloven påvirker både koden og infrastrukturen:
- I Utvikling bygger du inn sletting av brukerdata. I Driftstøtte sørger man for at dataene faktisk forsvinner fra backup og logger også.
- Dataminimering er et prinsipp i Utvikling (samle kun nødvendige data). I Driftstøtte handler det om at databaser og logger ikke lagrer mer enn nødvendig.
- Begge fagene må dokumentere hvilke persondata som behandles, men i Utvikling handler det om koden, og i Driftstøtte om infrastrukturen.
🔄 Versjonskontroll og utrulling (Utvikling + Driftstøtte)
Git brukes i begge fagene, men til forskjellige formål:
- I Utvikling bruker du Git for branching, pull requests og samarbeid om kode. I Driftstøtte versjonskontrolleres server-konfigurasjon og scripts.
- CI/CD knytter fagene sammen: utvikleren merger kode, GitHub Actions kjører tester, og en pipeline ruller ut den nye versjonen på serveren.
- Begge fagene bruker commit-meldinger og endringslogger for å spore hva som er endret og hvorfor.
Overordnede temaer
I læreplanen (LK20) er det tre overordnede temaer som skal prege opplæringen på tvers av fag. Her er eksempler på hvordan de er relevante i Utvikling.
🏥 Folkehelse og livsmestring
Teknologi påvirker hverdagen til folk. Som utvikler har du direkte innflytelse på brukeropplevelsen.
- Universell utforming (WCAG) sørger for at applikasjoner fungerer for alle, inkludert brukere med nedsatt syn eller motorikk
- Dark patterns er designvalg som lurer brukere til å gjøre ting de ikke ønsker (f.eks. skjulte abonnementer). God UX-design unngår dette.
- Personvern i kode handler om å beskytte brukernes digitale identitet, f.eks. hashing av passord og dataminimering
🏛️ Demokrati og medborgerskap
Programvare kan gjøre informasjon og tjenester tilgjengelige for alle, eller stenge folk ute. Valgene du tar som utvikler har betydning.
- Åpen kildekode gjør programvare tilgjengelig for alle og fremmer kunnskapsdeling, f.eks. ved å publisere prosjekter på GitHub med en åpen lisens
- Opphavsrett og lisenser (MIT, GPL, Apache) handler om å respektere andres arbeid og forstå hva du har lov til å bruke i egne prosjekter
- Universell utforming sikrer at digitale tjenester er tilgjengelige for alle borgere, uavhengig av funksjonsevne
🌱 Bærekraftig utvikling
Koden du skriver kjører på servere som bruker strøm. Teknologivalg påvirker ressursbruk.
- Effektive algoritmer bruker mindre prosessorkraft og energi. Forskjellen mellom O(n) og O(n²) kan utgjøre mye i stor skala.
- Vedlikeholdbar kode med god dokumentasjon og modulær struktur kan gjenbrukes og videreutvikles i stedet for å skrives på nytt
- Valg av teknologi påvirker ressursbruk: en statisk nettside bruker langt mindre serverkapasitet enn en tung applikasjon