Instagram Direct pregradio je Android UI na AI-nativnu arhitekturu na Jetpack Compose

  • PublicPublic
  • 01 Oct, 2026
Instagram Direct pregradio je Android UI na AI-nativnu arhitekturu na Jetpack Compose

Instagram Direct jedna je od najvažnijih površina Instagrama: kroz nju svaki dan prođu milijarde poruka. Dugi niz godina tim je cijedio mikrooptimizacije iz zastarjelog sustava Android View, dok nije naišao na problem: održavati i širiti snažno optimiziranu, ali zastarjelu površinu postajalo je sve skuplje — rastao je tehnički dug i inženjerski troškovi, osobito s obzirom na to da su deklarativni UI i AI-pomoćnici za pisanje koda postali norma. Umjesto da prihvati uvođenje Composea kao još jednu modernizaciju sučelja, Meta je postavila ambiciozniji cilj — redizajnirati kodnu bazu i njezinu arhitekturu tako da od početka bude prilagođena AI-ju, čime je višestruko pojačala učinak AI-ja u odnosu na ono što bi dala puka dorada postojećeg koda.

Rezultati su precizno izmjereni. Jetpack Compose omogućio je Instagram Directu da smanji ukupni obujam UI koda za 50%, ubrza izvršavanje zadataka AI-agentima za 35%, za 32% smanji broj razmjena između inženjera i agenta te za 33% snizi potrošnju tokena po sesiji agenta. Ključnu ulogu ovdje igra deklarativna priroda Composea: kod postaje jezgrovit, predvidljiv i strukturno jasniji AI-modelima — manje nuspojava, manje implicitnog stanja, jasnije granice komponenti. Upravo ta svojstva omogućuju AI-ju da daje rezultat više kvalitete, a manji obujam generiranog koda izravno utječe na manju potrošnju tokena po zadatku.

Tim je izvukao ozbiljne lekcije iz onoga što se događa kada se AI usmjeri na miješani kod. U kodnoj bazi s puno RecyclerViewa postoji primamljiv prečac — ugrađivati Compose komponente unutar postojeće View hijerarhije. Kao kratkoročni korak migracije to je prihvatljivo, ali dugoročno AI alati idu putem najmanjeg otpora: kada su deklarativni i imperativni kod pomiješani, AI ih počinje pogrešno spajati, stvarajući jedva primjetne bugove, tehnički dug i regresije performansi. Konkretni primjeri: feature flag pročitan je u imperativnom kodu, a zatim zarobljen unutar Compose lambde; ili se promjenjivo polje nalazi na klasi elementa, a ne u njegovom UI stanju — pa zbog toga preživljava ponovno povezivanje i ponovno korištenje RecyclerViewa među redovima, uzrokujući bugove koje je mučno reproducirati. Ograničenja i vještine pomažu, ali nisu dovoljni, jer AI, naišavši na otpor, pronalazi zaobilazne puteve.

Rješenje je par praktičnih pravila. Element liste može zadržati vlastitu apstrakciju, ali sav Compose kod mora biti u konstruktoru kao content, a argumenti konstruktora jedini su izvor podataka, bez pristupa članovima klase i promjenjivom stanju. Tako element postaje ekvivalentan običnoj @Composable funkciji, ostajući pritom unutar postojeće arhitekture. Migraciju su provodili etapno, po dva koraka po ekranu: najprije su identificirali uobičajene obrasce i rubne slučajeve, zatim ih sustavno primjenjivali, prepustivši jednom inženjeru da unaprijed utemelji arhitekturu i složena mjesta, a ostalima da sve dovedu do produkcije. Nekoliko inženjera pokretalo je vlastite AI agente nad zajedničkom bazom znanja s ponovno upotrebljivim vještinama i konvencijama, što je sinkroniziralo radne procese i najbolje prakse diljem tima te uklonilo ponovno iznalaženje već donesenih odluka.

Razmjeri su bili golemi. Pojedine UI komponente mogu se prikazivati u više od 160 različitih kombinacija stanja, a jedan ekran razgovora opslužuje preko 200 različitih tipova poruka. Tim je postupno preveo na Compose nekoliko stotina elemenata liste unutar postojeće RecyclerView arhitekture i izbacivao ih u malim nezavisnim grupama pod A/B testovima s nultim vidljivim utjecajem na iskustvo dopisivanja. Performanse su ostale cilj broj jedan: metrike su se pratile u runtimeu na produkciji, što je timu omogućilo pokretanje A/B testova uspoređujući migrirani Compose UI sa zastarjelim.

Interna analiza usporedila je sesije AI agenata koji su radili na Compose UI-u s istim zadacima na Android Viewsima, koristeći ocjenu rizika koja procjenjuje kvalitetu koda i vjerojatnost da će promjena izazvati incident u produkciji. Kada se akumulirana ocjena rizika datoteke udvostruči, Android Viewsi smanjivali su resursnu učinkovitost agenta — to jest potrošnju tokena, vrijeme izvršavanja i broj interakcija inženjera s agentom — za 30% po svakom unesenom znaku, dok je Compose UI pao tek za 9%. Sljedeći prirodni korak: tim zamjenjuje jezgru temeljenu na RecyclerViewu s LazyColumnom, držeći Compose komponente apstrahiranima od okružujućeg okvira i preklopivima u runtimeu putem feature flagova, kako bi se sačuvalo A/B testiranje i neprekinuto stablo kompozicije.