TSM - Generare de cod în proiectele mobile

Csaba Fulop - Senior Software Engineer @ Cognizant

Pe măsură ce instrumentele bazate pe inteligență artificială devin tot mai prezente în procesele de dezvoltare software, calitatea codului generat automat devine un subiect esențial. În acest articol explorăm metodele prin care am îmbunătățit acest cod, făcându-l mai robust, mai clar și mai ușor de integrat. Ne vom baza pe experiența practică și vom evidenția punctele forte ale acestor instrumente, limitările lor, dar și strategiile pentru a le reduce efectul asupra codului generat. Vom pune în balanță furnizarea de context în mod exhaustiv cu împărțirea unei probleme în părți mai mici, scoțând în evidență efectul asupra nivelului de încredere al echipei în aceste instrumente.

Context

Experiența noastră cu aceste instrumente a început cu câteva explorări mai timide, ulterior accelerate de către cerințele proiectului de a le folosi într-un mod responsabil și aplicând standardul ISO42K. Bazat pe experiența pe care am dobândit-o, am ajuns să creăm pentru echipele noastre un set de bune practici care pun accent pe valorificarea prompt engineering (ingineria prompturilor) și context engineering (ingineria contextului). Contextul proiectului ne-a oferit oportunitatea de a avea acces la mai multe instrumente de IA ceea ce ne-a ajutat să calibrăm bunele practici. Am folosit atât instrumente care se integrează în mediile de dezvoltare (IDE), cât și din acelea care sunt disponibile prin interfețe web.

Prezentarea generală a bunelor practici

Începem prin a enunța câteva concepte cheie care stau la baza bunelor practici:

Abordarea noastră inițială s-a bazat pe comportamentul implicit al instrumentului IA, care a produs rezultate inconsistente — cod util, dar și mult „zgomot” (informații irelevante). Pentru că am dorit să avem rezultate cât mai bune folosind acest instrumente, am mutat accentul pe generarea de teste unitare (Unit Tests). Aceasta s-a dovedit a fi o abordare cu mult mai succes atunci când a fost combinată cu context engineering: prin furnizarea de instrucțiuni structurate, instrumentul a generat teste fiabile și aliniate la proiect, pe care echipa le-a adoptat cu încredere.

Contextul este dat de următoarele:

Bazându-ne pe acest succes, am formalizat procesul prin introducerea unor fișiere de instrucțiuni partajate (shared) în repository-ul proiectului.

Acestea includeau:

Am observat că acest „pachet de context” poate servi și ca material de onboarding pentru noii dezvoltatori (software engineers) și a îmbunătățit calitatea și consecvența rezultatelor oferite de instrumentele IA. Echipa a devenit mai încrezătoare în utilizarea instrumentelor IA integrându-le în fluxurile de lucru zilnice, în loc să-l trateze ca pe un add-on experimental.

Pe parcursul integrării acestor fișiere de context am identificat câteva provocări:

Folosind aceste bune practici am reușit sa îmbunătățim calitatea codului generat, codul devenind aliniat cu cerințele proiectului. Totuși, am observat în continuare inconsistențe între codul generat și specificații. Concluzia la care am ajuns după mai multe iterații pe fișierele de instrucțiuni a fost că o fereastră de context largă conduce la rezultate mai puțin deterministe. Din cercetările noastre, am dedus că un context mai larg care include toate specificațiile proiectului diluează anumite părți mai importante din context pentru problema curentă. Pentru a ajunge la rezultate mai bune, am început să împărțim taskurile mai mari în subtaskuri și să folosim instrucțiuni specifice pentru fiecare subtask. Scopul nostru a fost de a reduce ambiguitatea și de a crește în importanță din perspectiva instrumentului IA a anumitor părți din context. O analogie pe care o facem cu instrumentul IA în acest caz este aceea a unui programator care nu cunoaște proiectul. Acest programator va avea nevoie de informațiile contextuale relevante implementării subtaskului fără a fi nevoit să citească toată documentația.

Un exemplu concret ar fi implementarea unei interfețe grafice pe baza unui design de tip Figma. La prima încercare, am putea scrie un prompt care să ceară instrumentului IA să genereze întreaga interfață. Această abordare va necesita un context foarte larg pentru a putea genera un astfel de cod și are șanse foarte bune să nu fim mulțumiți de rezultat. O abordare care ne face sa fim mai preciși ar fi să împărțim implementarea în mai mulți pași. Primii pași ar putea fi să cerem instrumentului IA să genereze cod doar pentru părți din interfața grafică, descriind și unde să se limiteze și oferindu-i doar contextul specificațiilor generale despre cum să implementeze interfețe grafice conform proiectului. Următorii pași ar putea fi să implementeze conform arhitecturii proiectului interfața stratului de prezentare (presentation layer) pentru interfața grafică. În final, să cerem să genereze cod pentru fiecare acțiune a utilizatorului de pe interfața grafică.

Reducând contextul ajutăm instrumentul IA să se axeze pe mai puține cerințe. Codul generat astfel va fi mai aproape de specificații pentru ca cerințele și instrucțiunile nu sunt ignorate, nu sunt diluate. Reducând halucinațiile crește încrederea echipei în a folosi instrumentele IA și crește viteza de lucru.

Un alt avantaj al modului acesta de lucru este că procesul de revizuire al codului generat este mai ușor, codul fiind mai scurt. De altfel, acesta poate fi un mod de a măsura dacă un subtask ar trebui împărțit. Dacă acel cod generat este prea lung, probabil ar trebui regenerat cu pași mai mici. Un cod care e greu de revizuit poate ascunde multe cazuri subtile care pot cauza probleme.

Concluzie

Instrumentele IA pot deveni un partener puternic în dezvoltarea aplicațiilor software, atunci când este utilizat împreună cu o abordare disciplinată a prompt și context engineering. Câștigurile sale de productivitate depind mai puțin de capacitățile IA și mai mult de claritatea inputurilor (datelor de intrare) furnizate. Echipele care investesc în context structurat, mențin o documentație vie și adoptă bune practici iterative, ajungând să transforme un instrument IA dintr-un simplu instrument de sugestii de cod într-un coechipier de încredere care accelerează livrarea, îmbunătățește calitatea și face din IA o parte de încredere a procesului lor de inginerie.