Enhet 2 / 12

Skript och AutoComplete

Vinster:

  • Möjlighet att mappa chattläge till rätt uppgiftstyp med inline-slutförande
  • Förmåga att skriva kraftfulla produktionsuppmaningar som inkluderar input/output-kontrakt, kantfall och stilbegränsningar
  • Möjlighet att validera genererad kod och eventuella nya föreslagna beroenden innan sammanslagning

En utvecklares första kontaktpunkt med AI är ofta autokomplettering - en funktion som föreslår nästa rad när du skriver - eller att säga "skriv in den funktionen" i ett chattfönster. De använder båda samma motor men kräver olika discipliner. I den här enheten omvandlar vi kodgenerering från en slumpmässig "skriv ner den" till ett ingenjörssteg vars utdata är förutsägbar och verifierbar.

Målet är att förvandla AI från ett verktyg som snabbar upp din skrivmaskin till en lärling som arbetar inom de begränsningar du ställer in. En välledd lärling sparar tid; En oledd lärling skapar en röra som du måste städa upp senare.

Två användningslägen: Inline Completion och Chat

Inline-komplettering kommer in när du skriver i din editor; Du skriver en funktionssignatur eller en kommentarsrad och den föreslår resten. Det är bra för hastighet, men det har ett snävt sammanhang: det ser bara kod i närområdet. Därför fungerar det bäst när du skriver din avsikt tydligt i en kommentar. Till exempel, //validate user email, throw ValidationError if invalid comment förbättrar förslaget nedan avsevärt.

Chattläget är för större och strukturerade uppgifter: "Lägg till paginering i den här klassen", "Extrahera ett gränssnitt för den tjänsten". Här har du lyxen att ge roll, sammanhang och format. Den allmänna regeln är: slutförande för små och flytande uppgifter, samtal för uppgifter som kräver tänkande och struktur.

Tips: Acceptera inte blint kompletteringsförslaget med "Tab". Läs den föreslagna raden en sekund; Ett felaktigt variabelnamn eller ett inverterat tillstånd läcker oftast härifrån.

Steg för att översätta avsikt till kod

  1. Definiera kontrakt. Vad är funktionens in-, ut- och felbeteende? Som "Hämta e-post, normalisera om det är giltigt, kasta fel om det är ogiltigt".
  2. Ange begränsningarna. Använder du inte externt beroende? En specifik stilguide? Finns det en prestationsgräns?
  3. Ge ett exempel. Ett input-out-par ("ali@x.com → valid, ali@ → error") flyttar modellens förståelse av avsikt från förutsägelse till precision.
  4. Be om små bitar. En funktion, ett ansvar. Gå sedan vidare till nästa.
  5. Läs och kör den genererade koden. Att sammanställa + ett snabbt manuellt försök är det billigaste garantisteget.

Tre minifodral

Fall 1 — Kommentarsdriven produktion ökar noggrannheten. En utvecklare begärde först en datumanalysfunktion med en tom kropp och fick rätt resultat i 3 omgångar. I det andra försöket, när jag definierade funktionen med en 4-rads kommentar (accepterade format, tidszonsregel, feltillstånd) och begärde den, kom koden som fungerade i första omgången. Samma modell, samma dag; skillnaden var bara tydligheten i avsikten.

Fall 2 — Att inte specificera en version är dyrt. Ett team kämpade med det äldre callback-baserade API:et som ersatte fs.promises i kod producerad för Node.js. När raden "Use Node 20, ESM, async/await" lades till i prompten, följde produktionen projektet första gången; Genomsnittet av 12 minuter som spenderades på korrigering nollställdes.

Fall 3 — Verklig vinst i boilerplate-kod. En mikrotjänst krävde 6 nya DTO (Data Transfer Object — en enkel dataklass som bär data mellan lager) och deras valideringsregler. Det som brukade vara ungefär 90 minuters manuellt arbete reducerades till 35 minuter när det producerades och granskades av AI; Eftersom kodupprepningen är hög och mönstret är tydligt, fungerade AI inom sitt mest effektiva område här.

Fyra kopieringsbara mallar

Kontraktsbaserad funktionsgenerering:

Roll: Du är en flitig {{språk}}-utvecklare. Funktionskontrakt:- Namn: {{namn}}- Indata: {{typer och deras betydelse}}- Utdata: {{typ och betydelse}}- Felstatus: {{vad som kastas/retureras när}}Begränsningar: {{inga externa beroenden/stil/prestanda: {{input_1:1}}}{>exempel {{output_1}}- {{entry_2}} -> {{error_2}}Ge först signatur + kort plan, sedan kod. Skriver prov, bara funktion.

För att matcha befintlig stil (anpassa till kodbas):

Nedan är en exempelfunktion från vårt projekt; Lär dig namngivning, felhantering och kommentarsstil här. Skriv en funktion för {{new_task}} med SAMMA stil. Exempel: {{current_code}}

Från skelett till fyllning (stub → implementering):

Fyll i funktionsskelettet nedan enligt TODOs i kommentarerna. ÄNDRA signatur och returtyp. Gör inte en hjälpfunktion som inte finns; om det behövs, låt mig veta "denna hjälpare behövs". {{skelet_kod}}

Alternativ appjämförelse:

Ge 2 olika implementeringar för {{task}}: (a) prioritera läsbarhet, (b) prioritera prestanda. Skriv ner 1 mening "när är att föredra" under varje mening.

Svag prompt / Stark prompt

Svag: "Skriv en e-postverifieringsfunktion till mig."
Strong: "TypeScript 5, endast standardbibliotek. Skriv isValidEmail(indata: sträng): boolean. Trimma mellanslag, gör det skiftlägesokänsligt, a@b.co är giltigt, a@, @b.co, tom sträng är ogiltig. Om du ska använda regex, var inte alltför komplex; lägg till 2 rader med kommentarer."

Kraftfull version; Returnerar språk, version, signatur, kantfall och en stilbegränsning. Den genererade koden både fungerar och passar in i ditt projekt.

Tillvägagångssätt

När ska användas

Uppmärksamhet

Inline komplettering

Små skär i flöde

Acceptera inte förslaget utan att ha läst det

Kontraktsbaserad produktion i chatt

Ny funktion/klass

Ge exempel och kantfodral

Tillverkning efter stilprov

Lägger till i befintlig kod

Välj aktuell exempelkod

skelettstoppning

Signatur fast, kropp blank

Ändra signaturen

Kodduplicering och beroendefällan

AI rekommenderar ofta ett nytt bibliotek för att göra jobbet enklare. Ibland är detta korrekt, ibland lägger det till ett onödigt beroende till ditt projekt eller föreslår ett paket som inte existerar (en hallucination). Regel: du bekräftar varje nytt beroende. Lägg inte till det i projektet utan att verifiera att paketet faktiskt existerar, underhålls och har rätt licens. Oftast är en hjälpare som redan är i projektet bättre än ett nytt paket.

Varning: Granska importraderna som föreslagits av AI. Ett icke-existerande paketnamn (som också kan likna falska paket som kallas "typo-squatting") både bryter kompileringen och utgör en säkerhetsrisk.

Vanliga misstag

  • Att ha signaturen som bestäms av modellen. Om du inte fixar input/output-typerna kommer en annan signatur med varje produktion och integrationen blir svår.
  • För att inte tala om kantfall. Tom inmatning, null, negativt tal, mycket stort värde — om du inte anger dessa, skriver modellen den "lyckliga vägen" och hoppar över kanter.
  • Kombinera förslaget utan att testa det. Kod som verkar fungera betyder inte att den fungerar.
  • Accepterar onödigt beroende. Att lägga till ett helt bibliotek för en one-liner skapar tekniska skulder.
  • Stilinkonsekvens. Olika namn och felhantering från resten av projektet gör kodbasen ojämn.

Sammanfattningsvis

Kodgenerering är kraftfullt när du översätter avsikt till ett tydligt kontrakt. Använd inline-komplettering för små, in-stream-uppgifter och för uppgifter som skapar struktur i konversationen. Du anger input/output-typer, kantfall, version och stil; Ge ett exempel på modellen; verifiera varje nytt beroende; och springa och läsa varje producerat stycke. AI lönar sig bäst i formelrik, repetitiv kod – kör den där, inom de gränser du anger.

Applikationsuppgift

Välj en verklig liten funktion från ditt projekt som du behöver skriva. Skriv först ut den till AI med mallen "kontraktsbaserad funktionsgenerering", som ger in-/utdatatyper, två kantfall och en stilbegränsning. Kompilera den genererade koden och prova den med två olika ingångar. Fråga sedan samma funktion igen, den här gången "skriv det här till mig" utan något sammanhang, och jämför de två utgångarna rad för rad: vilka kantfall missades, hur många korrigeringar krävdes?

checklista

  • [ ] Jag vet var jag ska använda chattläge med inline-komplettering.
  • [ ] Jag bestämmer input/output-kontraktet och kantfallen i funktionsgenerering.
  • [ ] Jag har gjort det till en vana att lägga till språk- och versionsinformation i prompten.
  • [ ] Jag kompilerar och testar varje producerad del innan jag sätter ihop den.
  • [ ] Jag bekräftar varje nytt beroende som AI föreslår genom att verifiera dess existens och nödvändighet.
  • [ ] Jag kontrollerar att den genererade koden matchar projektets stil.