Enhet 2 / 12

Skripting og autofullfør

Gevinster:

  • Evne til å kartlegge chat-modus til riktig oppgavetype med inline fullføring
  • Evne til å skrive kraftige produksjonsmeldinger som inkluderer input/output-kontrakter, kantsaker og stilbegrensninger
  • Evne til å validere generert kode og eventuelle nye foreslåtte avhengigheter før sammenslåing

En utvikleres første kontaktpunkt med AI er ofte autofullføring – en funksjon som foreslår neste linje mens du skriver – eller si «skriv inn den funksjonen» i et chattevindu. De bruker begge samme motor, men krever forskjellige disipliner. I denne enheten transformerer vi kodegenerering fra en tilfeldig "skriv den ned" til et ingeniørtrinn hvis utgang er forutsigbar og verifiserbar.

Målet er å gjøre AI fra et verktøy som setter fart på skrivemaskinen din til en lærling som jobber innenfor begrensningene du setter. En godt veiledet lærling sparer tid; En uveiledet lærling produserer et rot som du må rydde opp i senere.

To bruksmodi: Inline fullføring og chat

Inline fullføring kommer inn i bildet når du skriver i redigeringsprogrammet; Du skriver inn en funksjonssignatur eller en kommentarlinje og den foreslår resten. Den er flott for fart, men den har en smal kontekst: den ser bare kode i umiddelbar nærhet. Derfor fungerer det best når du skriver intensjonen tydelig i en kommentar. For eksempel, //validate user email, throw ValidationError if ugyldig kommentar forbedrer forslaget nedenfor betydelig.

Chat-modus er for større og strukturerte oppgaver: "Legg til paginering i denne klassen", "Pak ut et grensesnitt for den tjenesten". Her har du luksusen av å gi rolle, kontekst og format. Hovedregelen er: gjennomføring for små og flytende oppgaver, samtale for oppgaver som krever tenkning og struktur.

Tips: Ikke aksepter blindt fullføringsforslaget med «Tab». Les den foreslåtte linjen et sekund; Et feil variabelnavn eller en invertert tilstand lekker oftest herfra.

Trinn for å oversette intensjon til kode

  1. Definer kontrakt. Hva er funksjonens input, output og feilatferd? Som "Få e-post, normaliser hvis gyldig, kast feil hvis ugyldig".
  2. Angi begrensningene. Bruker du ikke ekstern avhengighet? En spesifikk stilguide? Er det en ytelsesgrense?
  3. Gi et eksempel. Et input-out-par ("ali@x.com → valid, ali@ → error") flytter modellens forståelse av intensjoner fra prediksjon til presisjon.
  4. Be om små biter. Én funksjon, ett ansvar. Gå deretter videre til neste.
  5. Les og kjør den genererte koden. Kompilering + et raskt manuelt forsøk er det billigste forsikringstrinnet.

Tre minivesker

Tilfelle 1 — Kommentardrevet produksjon øker nøyaktigheten. En utvikler ba først om en datoparsing-funksjon med en tom kropp og fikk riktig resultat i 3 runder. I det andre forsøket, da jeg definerte funksjonen med en 4-linjers kommentar (aksepterte formater, tidssoneregel, feiltilstand) og ba om den, kom koden som fungerte i første runde. Samme modell, samme dag; forskjellen var bare klarheten i hensikten.

Tilfelle 2 - Det er dyrt å ikke spesifisere en versjon. Ett team slet med den eldre tilbakeringingsbaserte API-en som erstattet fs.promises i kode produsert for Node.js. Da linjen "Bruk Node 20, ESM, async/await" ble lagt til ledeteksten, fulgte produksjonen prosjektet første gang; Gjennomsnittet på 12 minutter brukt på korrigering ble tilbakestilt.

Tilfelle 3 — Virkelig gevinst i boilerplate-kode. En mikrotjeneste krevde 6 nye DTO (Data Transfer Object — en enkel dataklasse som bærer data mellom lag) og deres valideringsregler. Det som pleide å være omtrent 90 minutter manuelt arbeid ble redusert til 35 minutter når det ble produsert og gjennomgått av AI; Siden kodegjentakelsen er høy og mønsteret er tydelig, fungerte AI på sitt mest effektive område her.

Fire kopierbare maler

Kontraktbasert funksjonsgenerering:

Rolle: Du er en flittig {{language}}-utvikler. Funksjonskontrakt:- Navn: {{navn}}- Inndata: {{typer og deres betydning}}- Utdata: {{type og mening}}- Feilstatus: {{hva som kastes/returneres når}}Begrensninger: {{ingen eksterne avhengigheter / stil/ytelse:{}}{>eksempel: {{output_1}}- {{entry_2}} -> {{error_2}}Gi først signatur + kort plan, så kode. Skrive tester, bare funksjon.

For å matche eksisterende stil (tilpasse kodebase):

Nedenfor er en eksempelfunksjon fra vårt prosjekt; Lær navngivning, feilhåndtering og kommentarstil her. Skriv en funksjon for {{new_task}} med SAMME stil. Eksempel: {{current_code}}

Fra skjelett til fylling (stubb → implementering):

Fyll inn funksjonsskjelettet nedenfor i henhold til TODO-ene i kommentarfeltet. ENDRE signatur og returtype. Ikke lag en hjelpefunksjon som ikke eksisterer; om nødvendig, gi meg beskjed "denne hjelperen trengs". {{skelet_kod}}

Alternativ appsammenligning:

Gi 2 forskjellige implementeringer for {{oppgave}}: (a) prioritering av lesbarhet, (b) prioritering av ytelse. Skriv ned 1 setning "når er å foretrekke" under hver.

Svak forespørsel / Sterk forespørsel

Svak: "Skriv meg en e-postbekreftelsesfunksjon."
Strong: "TypeScript 5, bare standardbibliotek. Skriv isValidEmail(input: string): boolean. Trim mellomrom, gjør det ufølsomt for store og små bokstaver, a@b.co er gyldig, a@, @b.co, tom streng er ugyldig. Hvis du skal bruke regulært uttrykk, ikke vær for kompleks; legg til 2 linjer med kommentarer."

Kraftig versjon; Returnerer språket, versjonen, signaturen, kanter og en stilbegrensning. Dermed fungerer den genererte koden både og passer inn i prosjektet ditt.

Tilnærming

Når du skal bruke

Oppmerksomhet

Inline fullføring

Små innsatser i flyt

Ikke godta forslaget uten å lese det

Kontraktsbasert produksjon i chat

Ny funksjon/klasse

Gi eksempel og kantkasse

Produksjon etter stilprøve

Legger til eksisterende kode

Velg gjeldende eksempelkode

skjelettfylling

Signatur fast, kroppen blank

Endre signatur

Kodeduplisering og avhengighetsfellen

AI anbefaler ofte et nytt bibliotek for å gjøre jobben enklere. Noen ganger er dette nøyaktig, noen ganger legger det til en unødvendig avhengighet til prosjektet ditt eller foreslår en pakke som ikke eksisterer (en hallusinasjon). Regel: du bekrefter hver ny avhengighet. Ikke legg den til i prosjektet uten å bekrefte at pakken faktisk eksisterer, vedlikeholdes og har riktig lisens. Som oftest er en hjelper som allerede er i prosjektet bedre enn en ny pakke.

Forsiktig: Se gjennom importlinjene foreslått av AI. Et ikke-eksisterende pakkenavn (som også kan ligne falske pakker kalt "skrive-huk") både bryter kompileringen og utgjør en sikkerhetsrisiko.

Vanlige feil

  • Å ha signaturen bestemt av modellen. Hvis du ikke fikser input/output-typene, kommer en annen signatur med hver produksjon og integrasjon blir vanskelig.
  • For ikke å snakke om kantsaker. Tom input, null, negativt tall, veldig stor verdi — hvis du ikke spesifiserer disse, skriver modellen "happy path", og hopper over kanter.
  • Kombinere forslaget uten å teste det. Kode som ser ut til å fungere betyr ikke at den fungerer.
  • Aksepterer unødvendig avhengighet. Å legge til et helt bibliotek for en one-liner skaper teknisk gjeld.
  • Stilinkonsekvens. Ulik navngivning og feilhåndtering fra resten av prosjektet gjør kodebasen ujevn.

Oppsummert

Kodegenerering er kraftig når du oversetter intensjoner til en klar kontrakt. Bruk inline fullføring for små, in-stream-oppgaver, og for oppgaver som etablerer struktur i samtalen. Du spesifiserer input/output-typer, kanttilfeller, versjon og stil; Gi et eksempel på modellen; verifiser hver ny avhengighet; og løp og les hvert stykke som er produsert. AI lønner seg best i formel, repeterende kode – kjør den akkurat der, innenfor grensene du setter.

Søknadsoppgave

Velg en faktisk liten funksjon fra prosjektet ditt som du trenger å skrive. Skriv den først ut til AI-en med malen "kontraktbasert funksjonsgenerering", som gir input/output-typer, to kantsaker og en stilbegrensning. Kompiler den genererte koden og prøv den med to forskjellige innganger. Spør deretter den samme funksjonen igjen, denne gangen "skriv meg dette" uten noen kontekst, og sammenlign de to utgangene linje for linje: hvilke kantsaker ble savnet, hvor mange korrigeringer var nødvendig?

sjekkliste

  • [ ] Jeg vet hvor jeg skal bruke chat-modus med inline fullføring.
  • [ ] Jeg bestemmer input/output kontrakt og kanttilfeller i funksjonsgenerering.
  • [ ] Jeg har gjort det til en vane å legge til språk- og versjonsinformasjon i ledeteksten.
  • [ ] Jeg kompilerer og tester hvert produserte stykke før jeg monterer det.
  • [ ] Jeg bekrefter hver ny avhengighet AI foreslår ved å verifisere dens eksistens og nødvendighet.
  • [ ] Jeg sjekker at den genererte koden samsvarer med stilen til prosjektet.