AI scrie codul, seniorii își asumă release-ul — pipeline-ul nostru de review
Pe un proiect cu aplicații native iOS și Android, un developer construiește fiecare funcționalitate pe iOS asistat de AI; după merge, un agent o portează 1:1 în Android nativ, un al doilea agent verifică portarea, cele două aplicații sunt testate în paralel, iar la final un inginer senior face review și testare. Cum funcționează pipeline-ul și ce prinde fiecare etapă.
„Construim cu AI” poate însemna două lucruri foarte diferite. Poate însemna că ajunge mai repede în producție cod pe care nu l-a citit nimeni cu adevărat. Sau poate însemna că AI-ul face cea mai mare parte din scris, în timp ce review-ul, testarea și responsabilitatea rămân unde au fost dintotdeauna — la ingineri cu experiență.
Noi facem a doua variantă. Articolul ăsta arată cum arată asta pe un proiect real: o pereche de aplicații native, una în Swift pentru iOS și una în Kotlin pentru Android, unde agenții AI fac o mare parte din muncă și totuși fiecare schimbare trece pe la un inginer senior înainte să ajungă la utilizatori. Nu putem numi clientul sau proiectul, dar putem arăta pipeline-ul.
Contextul: două aplicații native, un singur comportament
Clientul are nevoie de două aplicații native care să se comporte identic. Să scrii fiecare funcționalitate de două ori, de mână, e lent, iar cele două versiuni tind să se îndepărteze una de alta: o regulă de validare care există pe iOS, dar nu și pe Android, un caz limită tratat doar pe o platformă.
Așa că am împărțit munca după ce face fiecare participant cel mai bine:
- Un developer construiește funcționalitatea pe iOS, asistat de AI.
- Un agent o portează în Android nativ, unu la unu.
- Un al doilea agent verifică portarea.
- Cele două aplicații sunt testate în paralel.
- Un inginer senior face review și testare la final — și își asumă release-ul.
Pasul 1 — iOS: un developer cu AI și un pull request normal
Fiecare funcționalitate pornește pe iOS. Developerul lucrează cu Claude Code: AI-ul scrie prima variantă a implementării și a testelor, developerul o conduce, o corectează și o testează pe un iPhone real. Rezultatul trece printr-un pull request normal, cu teste obligatorii în CI și review de senior înainte de merge.
Schimbarea de iOS ajunsă în main e cel mai important artefact din tot pipeline-ul. Nu mai e „o descriere a unei funcționalități” — e o implementare care funcționează, verificată și testată, și devine specificația pentru Android.
Pasul 2 — Android: un agent portează schimbarea, 1:1
Când pull request-ul de iOS intră în main, lansăm un agent prin harness-ul nostru intern. Sarcina lui e îngustă și bine definită: să implementeze aceeași schimbare în aplicația Android nativă, unu la unu — aceleași ecrane, aceleași stări, aceeași validare, aceeași tratare a erorilor, aceleași cazuri limită.
„Unu la unu” nu înseamnă să traduci Swift linie cu linie în Kotlin. Comportamentul trebuie să fie identic; codul trebuie să fie Android idiomatic. Ciclul de viață, permisiunile, munca în background și navigarea urmează regulile Android, nu pe cele de iOS. O sarcină îngustă și bine specificată ca asta e exact locul unde agenții sunt puternici: specificația e completă, verificată și executabilă.
Pasul 3 — un al doilea agent verifică portarea
Agentul care portează nu își verifică singur munca. Un agent separat de review, cu context nou și altă instrucțiune — găsește ce e greșit — citește schimbarea de Android în comparație cu originalul de iOS. Caută tipurile de probleme pe care le introduce de obicei o portare:
- Comportament care diferă pe tăcute — un caz limită tratat pe iOS, dar pierdut pe Android, o valoare implicită diferită, o stare de eroare lipsă.
- Idiomuri de platformă pierdute la traducere — tipare de iOS forțate pe Android, unde ciclul de viață, firele de execuție sau modelul de permisiuni funcționează altfel.
- Teste care trec fără să testeze nimic — aserțiuni mereu adevărate, mock-uri care golesc testul de sens.
- Scurtături la securitate și date — date sensibile în loguri, validare relaxată, stocare mai puțin sigură decât pe iOS.
Problemele găsite se corectează în schimbare înainte ca vreun om să-și petreacă timpul pe ea.
Pasul 4 — testare în paralel, comparativ
Apoi cele două aplicații sunt testate în paralel și comparativ: aceleași scenarii rulează pe aplicația de iOS și pe cea de Android, iar rezultatele se compară. Întrebarea nu e doar „merge Android?”, ci „se comportă Android exact ca iOS?”. Testarea se face pe iPhone-uri și telefoane Android reale, prin build-uri TestFlight și Google Play Internal Testing, nu doar în simulatoare.
Pasul 5 — inginerul senior, la final
Nimic nu ajunge la utilizatori până când un inginer senior nu l-a verificat și testat. Indiferent cine — sau ce — a scris codul, seniorul verifică de fiecare dată aceleași lucruri:
- Arhitectură și design — se potrivește schimbarea cu arhitectura aplicației sau adaugă complexitate care va costa mai târziu?
- Securitate și date — autentificare, permisiuni, date sensibile, input nesigur.
- Teste reale — verifică testele comportamentul care contează sau doar trec?
- Pe dispozitiv — funcționează efectiv în aplicație, pe un telefon real?
Agenții fac review-ul seniorului mai rapid, pentru că o bună parte din zgomot a dispărut deja. Nu îl înlocuiesc. Seniorul e cel care spune „asta se lansează” — și cel care răspunde pentru asta.
Ce am învățat
- O implementare verificată e cel mai bun prompt. Portarea pornind de la o schimbare de iOS aflată deja în main și testată merge mult mai bine decât implementarea pornind de la o descriere scrisă.
- Agenții să verifice agenți — cu altă instrucțiune. Agentul care a scris codul e cel mai slab reviewer al lui. Un al doilea agent, pus să caute probleme, prinde altă categorie de greșeli.
- Compară, nu doar testa. Pentru două aplicații native, „ambele trec testele” e mai slab decât „ambele se comportă la fel în aceleași scenarii”.
- Un om la final, mereu. AI-ul schimbă cine scrie codul. Nu schimbă cine răspunde pentru el.
Vrei să construiești așa — cu viteza AI și responsabilitatea unui senior? Vezi cum abordăm dezvoltarea de produse AI sau citește cum am construit agenți Claude pentru o firmă de construcții.