Unitate 3 / 12

Codarea și programarea perechilor cu AI

Câștiguri:

  • Abilitatea de a scrie funcții, clase și module în AI cu definiții clare de intrare-ieșire și constrângeri
  • Abilitatea de a utiliza AI ca partener de programare pereche și de a progresa pas cu pas, în bucăți mici, verificabile
  • Abilitatea de a surprinde erorile de logică și majuscule limită prin compilarea codului generat de AI și rularea acestuia cu exemple mici

Programarea în pereche este atunci când doi dezvoltatori lucrează la aceeași problemă, unul scriind și celălalt revizuind. Codarea cu AI este versiunea digitală a acestei relații: stabilești direcția, constrângerile și criteriile de acceptare; AI produce o schiță rapidă; Verificați fiecare pas prin compilarea și testarea acestuia. Cea mai mare capcană aici este să îi spui AI „scrie-mi această aplicație de la început până la sfârșit” și să accept orbește un bloc de 200 de linii. Programarea bună a perechilor se desfășoară în pași mici: fiecare pas trebuie să fie ușor de înțeles, testabil și reversibil.

În această unitate veți învăța cum să imprimați funcții, clase și module cu un contract clar de intrare-ieșire; Cum să ghidezi AI pas cu pas; și vom vedea cum să surprindem erorile logice și majuscule marginale rulând codul pe care îl produce cu exemple mici. Scopul nu este viteza, ci viteza verificată.

Concepte: Contract de intrare-ieșire: O definiție clară a ce input ia o funcție și ce ieșire și comportamentul de eroare promite. Cazul marginii: Intrare care nu este obișnuită, dar poate apărea de fapt (gol, zero, negativ, foarte mare, nul). Dezvoltare incrementală: se procedează cu piese mici, de lucru și se validează fiecare pas.

Imprimare cod cu contract net

Baza codului de calitate este să definești exact „ce vrei” înainte de a începe lucrul. Când scrieți o funcție în AI, dați-i cinci lucruri: limbă și versiune, tipuri și semnificații de intrare, ieșire, condiții de eroare și constrângeri (performanță, interdicție de bibliotecă externă, stil). Acest lucru împiedică AI să ghicească.

  1. Scrieți contractul. Intrare, ieșire, eroare, constrângere.
  2. Cereți o unitate mică. O funcție cu o singură responsabilitate; Nu este un modul uriaș.
  3. Solicitați un bloc de testare. Adăugați câteva probe/testări lângă cod.
  4. Compilați și rulați. Încercați-l cu carcase marginale, verificați rezultatul cu ochii.
  5. Treceți la pasul următor. Odată ce o piesă este confirmată, construiți pe ea.

Prompt pentru funcția contractată: „Scrieți o funcție pentru TypeScript 5. Scop: calculați cantitatea totală de articole dintr-un coș de cumpărături. Intrare: { preț: număr, cantitate: număr }[] matrice. Ieșire: număr (total). Reguli: aruncați Eroare dacă cantitatea sau prețul este negativ; returnați 0 pentru o matrice goală; rotunjiți suma la 2 zecimale pentru cazurile zecimale de mai jos. cantitate, preț zecimal, articol unic).”

Ghidarea AI ca o pereche

Un progres bun în programarea perechilor este mai degrabă un dialog decât o cerere mare. Mai întâi, solicitați scheletul și rulați-l; apoi adăugați o stare de margine; apoi remediați o eroare. Această abordare menține codul de înțeles și vă pune în control la fiecare pas.

Prompt de progres incremental: „Vom scrie un cititor care citește un fișier CSV și convertește liniile într-un obiect. Să mergem PAS CU PAS, trecând la pasul următor fără ca eu să confirm fiecare pas. Pasul 1: doar scrieți scheletul care împarte fișierul în linii și separă linia antetului. Nu adăugați conversia tipului sau gestionarea erorilor încă. Păstrați-o pe scurt, explicați încă."

Explicați și justificați promptul de cod: „Explicați funcția pe care tocmai ați scris-o, nu rând cu rând, ci decizie după decizie: ce decizie de proiectare ați luat și de ce, ce caz marginal ați tratat și cum, ce cazuri le-ați exclus în mod deliberat? Enumerați 3 ipoteze din cod pe care nu ar trebui să le ratez."

Sfat: nu accepta codul generat de AI fără a-l înțelege. „Explică-mi asta, ce presupuneri ai făcut?” Întrebarea dezvăluie atât erori ascunse, cât și îți permite să aperi acel cod, deoarece codul rămâne responsabilitatea ta. Introducerea unui cod pe care nu îl înțelegeți în producție este ca și cum ați trimite un contract fără a-l semna.

Solicitare slabă / Solicitare puternică

WEAK:"Scrieți o funcție de sortare."(Rezultat: ce limbă, ce se sortează, este stabil, care este constrângerea de performanță, cod care este vag și probabil nu se potrivește cu cerințele.)STRONG:"Pentru Java 17, scrieți o metodă care sortează un obiect List<Angajat> mai întâi după departament (alfabetic), apoi după salariu (nu returnează lista originală, NU ÎNLOCUITĂ departamentul original. Ultimul, explicați complexitatea metodei în linia de comentarii.

prompt puternic; Include criteriul de sortare (pe două niveluri), regula efectelor secundare (înlocuirea originalului), comportamentul nul și așteptarea testului. Fără aceste detalii, AI produce o soluție plauzibilă, dar incorectă; de exemplu, poate deteriora lista originală și acest lucru va duce la o eroare silențioasă în altă parte.

Validare cu cazuri Edge și mostre mici

Codul care funcționează în scenariul fericit nu este codul corect. Forțați în mod conștient fiecare funcție produsă:

Tip de carcasă margine

intrare de probă

comportamentul așteptat

intrare goală

Matrice/șir gol

Nu este o eroare, rezultat logic gol

Zero/negativ

0, -1

Comportament definit și corect

mare valoare

Milioane de înregistrări

Controlul depășirii/performanței

nul/nedefinit

lipsește spațiu

Eroare controlată sau implicită

Duplicat/neobișnuit

repetitiv, în ordine inversă

rezultat corect

Mini Carcase

Cazul 1 — Eroare de rotunjire silențioasă. AI scrie o funcție care colectează bani cu tipuri zecimale (float); 0,1 + 0,2 dă 0,30000000000000004. Eroarea este rezolvată atunci când inginerul adaugă regula „Rotunjiți la 2 cifre și folosiți bănuți întregi”. O regulă de 3 linii previne mii de bănuți de variație în reconcilierea lunară.

Cazul 2 — Capcană cu efecte secundare. AI scrie o metodă care „sortează” o listă, dar modifică lista originală. Un comportament neașteptat apare deoarece un alt modul folosește aceeași listă. Dacă constrângerea „modificare originală” a fost în prompt, eroarea nu ar apărea niciodată; este prins în revizuirea codului și previne 2 ore de depanare.

Cazul 3 — Câștigurile pas cu pas. Un dezvoltator imprimă simultan un modul de import de 150 de linii; Când găsește o greșeală, nu găsește de unde a venit. Un alt dezvoltator împarte aceeași lucrare în 5 pași mici, testează fiecare pas în 2 minute și prinde eroarea imediat în pasul 3.

Greșeli comune

  • Imprimarea blocurilor mari într-o singură cerere. Se naște un cod riscant, greu de înțeles și de depanat.
  • Cererea unui cod fără a da un contract. Dacă eroarea de intrare-ieșire este ambiguă, AI va ghici și va greși.
  • Testează doar scenariul fericit. Dacă nu se încearcă intrarea goală, nulă, negativă și mare, eroarea este lăsată la producție.
  • Acceptând fără înțelegere. Codul pe care nu îl dezvălui este o datorie pe care nu o poți apăra.
  • Ignorarea tipurilor sensibile precum efectele secundare și banii/data. Flotați bani cu o istorie atemporală este o sursă clasică de eroare.

Pe scurt

Scrierea codului cu AI este o programare disciplinată în perechi: contract clar, pași mici, construiți și testați la fiecare pas. Oferirea de la început a cvartetului intrare-ieșire-eroare-constrângere determină calitatea codului. Explicarea codului pe care îl produce și forțarea acestuia cu carcase marginale scoate la suprafață erorile ascunse sub scenariul fericit. Sursa vitezei nu este acceptarea oarbă; este schiță rapidă plus verificare rapidă.

Sarcina de aplicare

Alegeți o funcție mică, dar reală (de exemplu, totalul coșului, diferența de dată, analizarea textului). Imprimați utilizând promptul funcției contractate; Adăugați cel puțin 5 scenarii de testare alături. Rulați codul și încercați 5 cazuri marginale în mod conștient, folosind tabelul ca ghid. Găsiți o eroare în cel puțin un caz marginal (dacă nu, proiectați o nouă intrare pentru a forța funcția), remediați-o cu AI și verificați prin retestarea că remedierea a funcționat.

lista de verificare

  • [ ] Am scris un contract care include input, output, erori și constrângeri.
  • [ ] Am generat codul în pași mici în loc de un bloc mare.
  • [ ] Am adăugat un bloc de testare/eșantion de rulare lângă cod.
  • [ ] Am testat în mod conștient cel puțin 5 carcase marginale.
  • [ ] Am explicat codul AI și i-am revizuit ipotezele.
  • [ ] Am corectat eroarea găsită și am confirmat remedierea prin retestare.