AI-verktøy for koding som Cursor, Cline, Copilot og Windsurf har allerede endret måten programvare bygges på. De tar hånd om mye av det rutinemessige arbeidet og boilerplate-koden – omtrent 70% av det som er nødvendig for å utvikle funksjoner. Men hvordan håndterer vi det siste "30%"? Dette er de vanskelige delene: å forstå komplekse krav, designe vedlikeholdbare systemer, håndtere spesialtilfeller og sikre kodekvalitet. Selv om AI kan generere kode, har den ofte vanskeligheter med å håndtere det ingeniørmessige aspektet.
AI verktøyene har gjort det mulig å automatisere mye av den grunnleggende utviklingen, men de siste 30% representerer kjerneområdene som skiller en fungerende prototype fra et produksjonsklart system. Disse områdene krever menneskelig innsikt og erfaring, der ferdigheter innen systemdesign, feilsøking og arkitektur er helt avgjørende.
Tim O’Reilly reflekterer over at hvert skritt i automatiseringen har forandret måten vi programmerer på, men ikke hvorfor vi trenger dyktige programmerere. Vi står ikke foran slutten på programmering som vi kjenner det i dag, men snarere slutten på programmering som vi kjente den tidligere. Dette innebærer at utvikleres roller er i ferd med å utvikle seg, ikke forsvinne.
Derfor er utfordringen for dagens ingeniører å omfavne AI for det den gjør best (de første 70%), samtidig som de fortsetter å bygge de nødvendige ferdighetene for å mestre de siste 30%. For å maksimere verdien av de uerstattelige menneskelige ferdighetene som gjenstår, er det viktig å forstå hvordan seniorutviklere, mellomnivå utviklere og juniorutviklere kan jobbe effektivt med AI på forskjellige måter.
Seniorutvikleres Rolle med AI: Bygg, Rediger, og Mentorer
For seniorutviklere er det å bruke AI som et forsterkende verktøy en mulighet til å utvide innflytelsen sin. Seniorutviklere har typisk dyp domeneekspertise, intuisjon for hva som kan gå galt, og evnen til å ta strategiske tekniske beslutninger. Disse styrkene er en del av de siste 30%, som AI ikke kan håndtere alene.
Som seniorutvikler er din rolle i stor grad å være både arkitekt og redaktør. La AI håndtere førsteutkastet av koden, mens du fokuserer på å designe løsningen og raffinere AIens output. Denne tilnærmingen, hvor du fungerer som en slags "pair programmer" med AI, gir deg muligheten til å jobbe raskere, samtidig som du beholder kontrollen over kvalitet og design. Du oversetter komplekse krav til effektive prompts eller spesifikasjoner for AI-en, og bruker ditt kritiske blikk for å verifisere at alt er i tråd med organisasjonens standarder for kvalitet, sikkerhet og ytelse.
AI fungerer ikke bare som en hjelpegenerator, men også som et verktøy for å drive større initiativer fremover. For seniorutviklere som leder store prosjekter eller takler krevende refaktorering, kan AI virkelig akselerere prosessen ved å håndtere mekaniske endringer og utforske alternative løsninger. Dette kan tillate utviklere å være mer ambisiøse med prosjektene de tar på seg.
En annen viktig rolle for seniorutviklere er mentoring. Ved å lære opp juniorutviklere i hvordan de effektivt kan bruke AI, samtidig som de opprettholder tidløse beste praksiser for programvareutvikling, kan de sikre at AI bidrar på en effektiv og sikker måte. Det er viktig å etablere normer for at AI-generert kode ikke kan tas for gitt, men må verifiseres grundig av utvikleren før det tas i bruk.
Mellomnivå og Juniorutvikleres Utfordringer
For mellomnivå og juniorutviklere er utfordringen en annen. Selv om AI kan produsere kode raskt, er det avgjørende at de forstår hva som skjer bak kulissene. AI kan generere funksjoner, men det kan ikke forutsi hvordan disse funksjonene fungerer i et større system, og kan lett overse kanttilfeller eller kompleks logikk. Juniorutviklere bør derfor investere i å forstå de grunnleggende prinsippene for systemdesign og kodekvalitet.
For juniorer er det viktig å forstå at AI verktøy ikke bør sees på som en erstatning for ferdigheter, men som et hjelpemiddel. Det er fortsatt behov for en solid forståelse av programmeringens grunnleggende prinsipper. Den beste tilnærmingen for en juniorutvikler er å bruke AI som en assistent som hjelper med rutinemessige oppgaver, mens de utvikler de ferdighetene som trengs for å løse de mer komplekse delene av utviklingsprosessen.
En Samlet Tilnærming
Team bør etablere standarder for hvordan AI brukes i utviklingsprosessen. Å ha et felles repository med velprøvde prompts kan gjøre fremtidige interaksjoner mer effektive og konsistente. I tillegg er det viktig å kontinuerlig dele erfaringer om suksesser og fallgruver for å unngå vanlige feller og maksimere AI-verktøyets potensial.
Som AI-agenter blir mer autonome, vil menneskelige utvikleres rolle gradvis bevege seg mot arkitektonisk tilsyn og strategiske beslutninger, snarere enn å være direkte ansvarlig for kodegenereringen. Det er viktig å erkjenne at selv om AI kan automatisere mye, vil menneskelig erfaring og innsikt alltid være nødvendig for å gjøre det som AI ikke kan: designe robuste og skalerbare systemer som møter både nåværende og fremtidige behov.
Hvordan prototyping kan akselereres med AI-assistanse uten å falle i feller
Prototyping er en av de mest effektive metodene for å utforske og validere ideer raskt. Når den benyttes på en gjennomtenkt måte, resulterer det i en robust prototype utviklet på rekordtid, klar til enten å bli transformert til et sluttprodukt eller lagt til side etter å ha gitt verdifulle lærdommer.
AI-drevet vibe coding har revolusjonert denne prosessen, ved at det hjelper utviklere å bygge funksjonelle modeller fra idé til virkelighet raskere enn noensinne. Med hjelp av AI kan programmerere fokusere på høyere nivåer av konseptualisering, mens maskinen håndterer det repetitive og teknisk krevende arbeidet. Dette har ført til en dramatisk økning i produktivitet, der prototyper kan bygges på timer i stedet for uker, og dermed gir raskere tilbakemeldinger fra brukere og raskere forretningsbeslutninger.
Et av de mest interessante aspektene ved denne metoden er hvordan AI ikke bare automatiserer koding, men gjør prototyping til en kreativ og iterativ prosess. Ved å bruke naturlige språkprompter, kan utviklere generere, teste og forbedre prototyper på en kontinuerlig måte. Dette betyr at den tidlige prototypen kan endres raskt for å tilpasse seg endrede krav, uten å bruke verdifull tid på å håndtere den tekniske implementeringen av hvert enkelt aspekt.
Til tross for de enorme fordelene som kommer med AI-assistert prototyping, er det viktig å merke seg at en prototype ikke er et endelig produkt. Det er et førsteutkast som trenger videre forbedring. Når prototypen er laget, er det utviklerens ansvar å "refaktorisere" og styrke koden. Selv om AI kan foreslå forbedringer og generere tester, er det menneskelige utviklere som må sikre at koden er solid og klar for produksjon.
Noen viktige verktøy som spiller en sentral rolle i denne prosessen inkluderer plattformer som Vercel v0, som hjelper med UI-generering, Lovable, som støtter full stack-prototyper, og AI-forsterkede IDE-er som Cursor og Windsurf, som gir et arbeidsmiljø der utviklere kan jobbe mer effektivt og intuitivt. Disse verktøyene kan være med på å akselerere arbeidsflyten betydelig, men det er fortsatt viktig å forstå at AI ikke er en erstatning for menneskelig kompetanse i utviklingsprosessen, men en kraftig assistent.
Samtidig som AI kan hjelpe med å produsere en demo raskt, er det fortsatt nødvendig å gjennomføre en grundig testing og kvalitetssikring før prototypen kan gå videre til et fullt utviklingsstadium. Denne overgangen fra prototype til produksjon innebærer en systematisk tilnærming til arkitektur, implementering og distribusjon. Utvikling av fullverdige webapplikasjoner krever en annen tilnærming enn rask prototyping. Det er ikke lenger bare om å teste ut ideer, men om å bygge et stabilt, skalerbart system.
Det er viktig å merke seg at mens AI kan gjøre prototyping raskere og mer tilgjengelig, krever videreutviklingen av applikasjoner grundigere planlegging. For eksempel må arkitekturvalg som valg av rammeverk, database og API-struktur gjøres før AI kan hjelpe med den tekniske implementeringen. Dette er områder der menneskelige utviklere har en uvurderlig rolle i å sette rammene for hva som skal bygges og hvordan det skal fungere i det lange løp.
Som vi har sett, gjør vibe coding prototyping mer som en kreativ samtale med en assistent enn en ensformig oppgave. Denne "samtalen" mellom utvikleren og AI-en er raskere, mer fleksibel og mer intuitiv enn tradisjonelle metoder, men krever fortsatt menneskelig innblanding for å sikre at den tekniske kvaliteten blir opprettholdt. AI kan hjelpe med å sette opp skjelettet for en full stack webapplikasjon, generere frontend-komponenter ut fra beskrivelser, og skrive backend-logikk på en måte som gjør at utviklere kan fokusere på funksjonalitet fremfor detaljer.
Imidlertid er det viktig å ikke bare stole blindt på AI for å løse alle utviklingsproblemer. Selv om AI kan gjøre mye av det tekniske arbeidet raskt, er det viktig å ha en klar plan for prosjektets arkitektur og de valg som skal tas. Det er derfor nødvendig å forstå at AI er et verktøy som hjelper med å akselerere arbeidsflyten, men den kreative og strukturelle beslutningstakingen ligger fortsatt hos utvikleren. Uten en god forståelse av hvordan systemet bør bygges, vil AI være begrenset i sin evne til å produsere funksjonelle og skalerbare løsninger.
I neste kapittel vil vi dykke dypere inn i hvordan AI kan assistere i full webutvikling. Her handler det ikke bare om å lage prototyper, men om å utvikle hele applikasjoner fra bunnen av, med AI som en pålitelig partner i både frontend og backend-utvikling. Fra å sette opp prosjektstrukturen til å implementere backend-logikk og integrere databaser – alt kan gjøres med AI-assistanse for å optimalisere og fremskynde utviklingsprosessen.
Hvordan sikre nøyaktighet og integrasjon mellom frontend og backend ved bruk av AI
Databaseoperasjoner krever grundig verifisering for å sikre at den AI-genererte koden stemmer overens med ditt faktiske skjema og opprettholder dataintegriteten. AI-en kan ikke automatisk kjenne til spesifikke tabellnavn, feltbehov eller relasjoner med mindre du eksplisitt gir denne informasjonen i prompten din. Selv når modeller har samtaleminner, bør skjema-detaljer inkluderes i hver kompleks database-relatert prompt for å sikre nøyaktighet. Denne eksplisitte tilnærmingen forhindrer vanlige problemer, som når AI-genererte spørringer refererer til generiske feltnavn som user_id, mens ditt skjema faktisk bruker userId eller customer_ref.
Ytelsesvurderinger krever ofte menneskelig tilsyn. Selv om AI-modeller forstår grunnleggende database-konsepter som primærnøkler og sammenføyninger, vil de kanskje ikke automatisk foreslå ytelsesoptimaliseringer, som å legge til indekser på ofte forespurte felt eller vurdere spørringskjøreplaner. Det er viktig å gjennomgå genererte spørringer for effektivitet, spesielt for operasjoner som skal kjøres ofte eller mot store datasett.
Datakonsistensregler representerer et annet kritisk område som krever eksplisitt spesifikasjon. Når man implementerer slettingsoperasjoner, må man tydelig definere den kaskadende atferden som forventes. For eksempel, når du sletter en prosjektpost, må du bestemme om databasen automatisk skal slette tilknyttede oppgaveposter gjennom kaskader eller om applikasjonslogikken skal håndtere denne oppryddingen. Klart å kommunisere disse forretningsreglene til AI: Når et prosjekt slettes, konfigurer databasen til å kaskadeslette alle relaterte oppgaver. Eller alternativt: Når du sletter et prosjekt, skal du først sjekke om det finnes oppgaver og forhindre sletting hvis noen eksisterer. AI-en kan implementere begge tilnærmingene effektivt når den får klare instruksjoner. For kaskadesletting kan den generere fremmednøkkelbegrensninger med ON DELETE CASCADE. For håndtering på applikasjonsnivå kan den produsere kode som spør etter relaterte poster før sletting tillates.
Når du har bygget både frontend og backend med hjelp fra AI, er neste utfordring å integrere dem til en sømløs webapplikasjon. Dette innebærer å sørge for at API-endepunktene kalles korrekt fra frontend, at dataene flyter riktig og at systemet er sammenhengende. Det er avgjørende at det frontend forventer å motta data i en bestemt form, så det backend sender bør matche denne forventningen. Hvis du lar AI jobbe på hvert endepunkt isolert, kan små feil oppstå. Eksempelvis kan backend returnere { success: true, data: [...] }, mens frontend kanskje forventer å motta arrayet direkte. For å unngå dette, kan du eksplisitt instruere AI om responsformatet som skal brukes når du koder begge sider. Alternativt, når begge er ferdige, kan du teste et fullstendig kall: for eksempel åpne webapplikasjonen og se om listen lastes. Hvis ikke, kan du sjekke konsollen i nettleseren mot serverloggene.
Under integrasjonen kan AI brukes til å justere den ene siden for å matche den andre: Hvis backend returnerer litt forskjellige JSON-nøkkelnavn enn det frontend forventer og du oppdager en feil, kan du instruere AI til å endre koden. Hvis frontend sender formdata som formkodet, men backend forventer JSON, kan du be AI om å konvertere det, kanskje ved å bruke JSON.stringify på frontend eller legge til body-parser på backend.
Real-time samarbeidet mellom AI og utviklingsverktøy som IDE-er (for eksempel Cline eller Cursor) er svært nyttig under denne integrasjonsfasen. Du kan åpne frontend- og backend-filene side ved side i verktøyet ditt og instruere AI om å sørge for at frontend henter fra /api/to-dos og at dette samsvarer med Express-rutens forventede forespørsel/response. Eventuelle avvik kan justeres automatisk.
I en fullstack-applikasjon bør du vurdere å implementere ting som lastestatus og feilhåndtering på frontend for mislykkede API-kall. Dette gir et mer profesjonelt resultat. Eksempler på kommandoer som kan brukes er: "Legg til lastestatus: når React-komponenten henter oppgaver, vis en tekst ‘Laster...’ til dataene er lastet", eller "Håndter feil: hvis API-kallet mislykkes (non-200 respons), vis en feilmelding på brukergrensesnittet." Dette vil legge til isLoading-status og betinget gjengivelse, eller implementere en try/catch rundt fetch for å fange opp feil og vise en melding. Denne typen finpussing gjør at applikasjonen din virker mer robust.
Hvis appen krever sanntidsoppdateringer (for eksempel ved bruk av WebSockets eller SSE), kan du be AI om å sette opp en WebSocket med Socket.io. Når en ny oppgave opprettes på serveren, send en melding til alle tilkoblede klienter. Endre frontend for å lytte etter nye oppgaver og legge dem til listen i sanntid. Dette kan være komplekst, men AI-en kan generere både server-side Socket.io-oppsettet og klient-side koden for å koble til og lytte etter eventet.
Et eksempel på en full stack flyt: La oss si at du bygger en enkel kontakt-manager webapplikasjon: Du starter med å bygge frontend med React og backend med Node/Express. Først ber du AI om å lage en ContactList og en ContactForm-komponent for frontend. Deretter ber du AI om å legge til API-kall: I ContactList, hent kontakter fra /api/contacts ved mount. I ContactForm, på submit, send en POST til /api/contacts med formulardataene, og oppdater listen over kontakter ved suksess.
Når du prøver å legge til en kontakt via brukergrensesnittet, kan det hende at den ikke vises i listen. Dette kan skyldes at POST-ruten ikke returnerte den nye kontakten på riktig måte eller at formkoden ikke oppdaterte listen. Her kan AI hjelpe til med å identifisere gapet og rette opp i det, for eksempel ved å justere backend-responsen og frontend-state-logikken for å oppdatere listen uten at en fullstendig oppdatering er nødvendig.
I full stack-utvikling er det nyttig å etablere et produktivt samarbeid med AI. AI kan brukes til å generere standard CRUD API-er eller komponenter, mens du kan håndtere spesifikke og vanskelige deler av logikken selv. For eksempel, hvis du har en proprietær algoritme eller forretningslogikk som er enklere å implementere direkte, kan du gjøre det manuelt, og deretter be AI om å teste eller gjennomgå løsningen. AI-en kan dermed håndtere rutinearbeidet mens du fokuserer på de spesifikke utfordringene som krever din ekspertise.
Hva er rettighetene dine når AI-generert kode kan være et brudd på opphavsrett?
Det finnes en betydelig usikkerhet rundt hvordan opphavsrett og lisensvilkår påvirker kode generert av kunstig intelligens (AI). Enkle retningslinjer finnes ikke, og et forsiktig perspektiv er ofte det beste valget for å unngå problemer med opphavsrett. Selv om det er fristende å tro at AI kan gi deg en "gratis" løsning på kodeproblemer, er det viktig å forstå at AI verktøy kan bruke store mengder opplæringsdata, inkludert kode som kan være beskyttet av opphavsrett. Hvordan man forholder seg til slike situasjoner krever en mer nyansert tilnærming.
I USA, for eksempel, har den høyeste domstolen behandlet spørsmål om "fair use" i saken Google LLC v. Oracle America, Inc., som omhandlet reimplementeringen av Java API-er. Domstolen fant at Googles reimplementering av Java API-deklarasjoner var rettferdig bruk, men dette gjaldt en spesifikk og kompleks sak som omhandlet API-er, ikke all kode. Dette understreker viktigheten av å forstå at opphavsrett ikke beskytter idéene, prosedyrene eller metodene for drift, men selve uttrykket av ideene – altså, den spesifikke koden. I mange tilfeller vil utvikleren som bruker AI betraktes som "forfatter", ettersom AI bare er et verktøy, på linje med en kompilator eller et tekstbehandlingsprogram.
En annen viktig del er vilkårene for bruk av AI-verktøy. De fleste slike vilkår gir brukeren rett til å bruke det som produseres, inkludert kode. Eksempelet med OpenAIs vilkår, som gir brukeren eierskap til utdataene generert med GPT-4, illustrerer at du som bruker vanligvis ikke risikerer at AI-leverandøren hevder eierskap til det du skaper med deres verktøy. Likevel er dette "eierskapet" ofte begrenset til det spesifikke verktøyet, og det innebærer ikke nødvendigvis at det produserte innholdet automatisk er beskyttet av opphavsrett. Den som bruker verktøyet, kan risikere at AI genererer kode som er nært knyttet til treningsdataene, eller som bygger videre på beskyttet innhold. Derfor kan det som på overflaten virker som et originalt resultat, vise seg å være et derivat av en tredjeparts kode.
AI-verktøy kan være en kilde til usikkerhet når det gjelder opphavsrett. Hvis du gir et AI-verktøy tilgang til kode som er beskyttet av opphavsrett, er det en risiko for at verktøyet genererer utdata som kan anses som et derivatverk av den opprinnelige koden. Dette er et tema under debatt i mange rettssystemer, og det er ikke alltid klart hvordan AI-generert kode skal klassifiseres i forhold til eksisterende opphavsrett.
I praksis er det best å anta at AI-genererte koder kan være under et tvilsomt lisensregime. Hvis du er usikker på om koden kan være et brudd på opphavsrett eller ikke, bør du enten unngå å bruke den eller sørge for at bruken er i samsvar med eventuelle lisenser som kan gjelde. I tillegg kan det være fornuftig å gjennomgå og teste koden grundig før du bruker den, for å sikre at du ikke overskrider noen lisensbetingelser eller opphavsrettslover. Husk at det ikke er nok å stole på at AI-verktøyet selv unngår opphavsrettsproblemer, det er brukeren som er ansvarlig for resultatene.
En annen viktig bekymring er etiske hensyn. Når AI gir utdata som kan være svært like eksisterende kode, for eksempel kjente algoritmer eller kodeutsnitt som du gjenkjenner fra åpne kilder som Stack Overflow, er det viktig å håndtere slike utdata med forsiktighet. Hvis du velger å bruke disse, bør du gi korrekt attribusjon til den opprinnelige kilden. Det er uetisk å bruke AI for å unngå kreditering av kilder, da dette kan underminere åpenhet og tillit i utviklerfellesskapet.
I noen tilfeller kan det være at AI-verktøyet genererer kode som er direkte knyttet til en kjent åpen kildekode-lisens som MIT, GPL eller AGPL. For de som jobber med lukket kildekode, kan lisenskravene fra slike kilder være problematiske, da de kan kreve at hele prosjektet ditt blir utgitt under samme lisens. Hvis du er usikker på lisenskravene knyttet til kode generert av AI, er det en god idé å enten omarbeide koden tilstrekkelig eller søke etter alternative løsninger som er kompatible med prosjektet ditt.
Når du vurderer AI-generert kode, er det også viktig å bruke plagieringsdeteksjonsverktøy for å vurdere om den genererte koden er svært lik eksisterende kode. Dette er spesielt viktig hvis du gjenkjenner spesifikke kommentarer, forfatternavn eller unike kodestykkene. Hvis du mistenker at koden kan være et direkte avtrykk fra en kilde du ikke har rettigheter til, bør du vurdere å ikke bruke den eller gjøre betydelige endringer for å sikre at du ikke bryter opphavsretten.
Samtidig er det viktig å være åpen om bruken av AI. Selv om AI-verktøy ikke har rettigheter til det de genererer, kan det være lurt å gi anerkjennelse til verktøyet eller den originale kilden der det er nødvendig, spesielt når det gjelder kreative bidrag som kanskje ikke er åpenbare ved første øyekast.
Hvordan bygge robuste og pålitelige infrastrukturer for skytjenester og agent-systemer
Hvordan overvåkes og håndteres intern korrosjon i olje- og gassindustrien?
Hvordan håndtere etterforskning i saker med stor kompleksitet og politisk følsomhet?
Hvordan beregne gassmolekylers hastigheter og forstå de statistiske egenskapene til luft?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский