E pa, konačno je došao. Naš legendarni ByteDance („svemirska fabrika") zvanično je objavio da ove godine zapošljava 7.000 novih ljudi, u najvećoj letnjoj praksi u istoriji, sa stopom prelaska u stalni rad preko 50%.

Majku mu.
Ovoga puta zaista je obimno i obilato — od toga istraživačko-razvojne pozicije čine 4.800+, među njima veliki broj AI pozicija.

Braćo i sestre, ovu priliku obavezno iskoristite.
Proverio sam za vas i zaista ima mnogo pozicija vezanih za AI Agent, sa izuzetno visokim udelom AI-ja u opisima posla. Uzmimo za primer praksu u razvoju Agent-a.

Da li ste primetili jednu stvar: u opisu posla Java, Go, Python i CPP su jednostavno nestali — možete li da poverujete?

Prošle godine toga nije bilo.
Upravo je to najveća promena AI doba — više se ne ograničavamo na jedan programski jezik, jer ako ti ne znaš Java, AI zna; ako ne znaš Python, AI zna; ako ne znaš Go, AI zna.
Baš zato svima stalno naglašavam: ne idite protiv verzije.
U budućem traženju posla čist back-end razvoj više neće postojati. Čak i ako nakon zapošljavanja i dalje radiš CRUD, dok se spremamo za traženje posla cilj nam je samo jedan — osnaživanje AI-jem.
Jezik više nije bitan.
Pogledajte ključne zahteve u ovom opisu posla:
- Poznavanje principa i metoda glavnih velikih jezičkih modela;
- Razumevanje Multi-Agent sistema, dekompozicije zadataka, automatizovanog planiranja i Prompt Engineering-a;
- Praksa u projektima vezanim za AI Agent prednost je;
- Ljubav prema AI tehnologijama i interesovanje za primenjenu i inženjersku stranu;
- Bogato iskustvo u praksi i optimizaciji Prompt-ova;
- Veliko praktično iskustvo sa AI-driven IDE-ovima.
Ranije su se neki prijatelji uvek brinuli da će dva AI projekta u biografiji možda izgledati previše.
Mogu vam dati jedan jasan odgovor: neće.
Jer ove godine interesovanje za AI mnogo je veće nego prošle.
Jutros sam gledao prenos Tencent Cloud-a — majka je gurala dečija kolica do lokacije da instalira OpenClaw, i bio sam u šoku (iako ne želim toliko da preuveličavam svoju reakciju, zaista mi je to proširilo vidike).

A prema slici sa prenosa, red je bio prilično dugačak.
I ja sam poslednje vreme intenzivno delio mnogo AI članaka; iako čitanost na zvaničnom nalogu još uvek zaostaje za mojim vrhuncem, kada se sadržaj sinhronizuje sa „Jishu Pai" sajtom, promet se već udvostručio.

Pretraga ključnih reči, posebno Claude Code, OpenClaw, Agent, očigledno se povećala.

U prevodu na jezik igara: koji je heroj „overpowered", igrajte njime, sigurno ćete napredovati; „sewer" heroje nemojte igrati.
Dalje, podeliću s vama još nekoliko uobičajenih pitanja sa AI intervjua, i to opet na primeru dva projekta — PaiFlow Agent i PaiAgent.

PaiAgent je na GitHub-u već skupio preko 100 zvezdica: https://github.com/itwanger/PaiAgent čime je time ispunjen i jedan mali prvobitni cilj — sledeće je da ga više promovišem.

Pošto je prethodni članak o pitanjima iz MCP-a, Skills-a i Function Calling-a mnogima se dopao i tražili su nastavak, danas nastavljamo.
Bilo da je u pitanju mikroservisna verzija PaiFlow ili Vibe Coding verzija PaiAgent, sledeći referentni odgovori su univerzalni. Želite li što pre da se „iskrcate na suvo" i dobijete što više ponuda, morate više naučiti napamet i što više se povezati sa AI-jem.
1. Predstavite projekat PaiFlow Agent
Tema provere: razumevanje projekta, izražavanje poslovne vrednosti
Referentni odgovor:
PaiFlow je platforma za enterprise orkestraciju AI radnih tokova koja korisnicima omogućava da vizuelnim prevlačenjem povežu velike modele, sintezu govora i razne alate-plugine u automatizovani pipeline, i da bez programiranja izgrade svoju AI aplikaciju. Slično platformama kao što su n8n, Coze i Dify.

Na primer, imam jedan tehnički članak koji želim da pretvorim u podcast. Klasičan pristup zahteva da sam prepravljam tekst, tražim alate za sintezu govora i rešavam skladištenje. U PaiFlow-u dovoljno je nacrtati dijagram toka, povezati čvorove za prepisivanje velikim modelom i sintezu govora, uneti originalni tekst, i sistem samostalno odrađuje ceo proces i direktno izdaje audio koji se može puštati.
Ono što ovaj projekat čini zaista zanimljivim jeste dizajn arhitekture. Koristili smo višejezičnu mikroservisnu arhitekturu: front-end u React-u odgovara za vizuelnu orkestraciju, Spring Boot služi kao poslovni middle tier za orkestraciju radnih tokova, a izvršenje radnog toka može se raditi u Python-u (FastAPI + interni engine), ili u Java verziji (SpringAI + LangGraph4J, realizovanoj u okviru projekta PaiAgent).

Implementirali smo execution engine zasnovan na DAG-u, sa podrškom za uslovne grane, paralelno izvršenje i čvorove za petlje. Po završetku svakog čvora izlaz se upisuje u pool promenljivih, a nizvodni čvorovi putem referenci na promenljive mogu dobiti podatke iz uzvodnih čvorova. Status izvršenja trajno se čuva u bazi, tako da ako neki čvor ne uspe, podržano je ponavljanje od breakpointa i nije potrebno ponovo pokretati ceo tok.
Drugi tehnički izazov bio je dizajn sistema plugin-a. Naš radni tok ne poziva samo velike modele, već i razne eksterne alate — sintezu govora, generisanje slika, RPA operacije i slično. Na osnovu MCP protokola napravili smo mehanizam za plugin-e: eksterni alat se registruje prema standardnoj šemi i potom postaje čor koji se može orkestrirati.
Pored toga, celokupni lanac pokriven je OpenTelemetry-jem. Jedan radni tok u izvršenju može pozvati tri-četiri servisa, a ako nešto pođe po zlu, preko TraceID-a možemo povezati logove, vreme trajanja i poruke o greškama duž celog lanca i brzo locirati problem.
Što se tiče deploymenta, pripremili smo Docker Compose za pokretanje jednom komandom — zavisnosti više od desetak servisa, enviroment varijable i mrežna konfiguracija sve su unapred pripremljene. Prva instalacija oduzeta nešto vremena, ali nakon preuzimanja zavisnosti sve je spremno za oko 30 minuta.
2. Možeš li opisati ukupnu arhitekturu PaiFlow-a?
Tema provere: sistemska arhitektura, odnosi poziva između servisa
Referentni odgovor:
PaiFlow je tipična višejezična mikroservisna arhitektura, podeljena na četiri sloja: prezentacioni front-end sloj, middle tier sloj, sloj za izvršenje radnih tokova i sloj za plugins sposobnosti.

Front-end je napisan u React-u, a jezgro je vizuelni editor radnih tokova zasnovan na React Flow-u, gde korisnik prevuče čvorove, poveže ih i podesi parametre. Front-end je preko Nginx reverse proxy-a objedinjen na portu 80, i svi API zahtevi idu preko Nginx-a do back-end servisa.
Middle tier (kod nas se zove Console Hub) napisan je u Java 21 + Spring Boot 3.5 i radi na portu 8080. Ovaj sloj odgovoran je za „poslovnu logiku", a ne za „logiku izvršenja" — npr. prijavu i autentikaciju korisnika, CRUD nad radnim tokovima, kontrolu prava, upravljanje tržištem alata. Kada korisnik na front-endu sačuva radni tok, Hub zapravo pohranjuje definiciju toka u MySQL; kada klikne na pokretanje, Hub prosleđuje zahtev nizvodnom engine-u za radne tokove.
Više tutorijala: https://paicoding.com/column/13/23

Engine za radne tokove ima dve verzije — jednu u Python-u, drugu u Java-i — i obe rade na portu 7880 (naravno, istovremeno može biti aktivan samo jedan). Uzima definiciju toka i ulazne parametre koje prosledi Hub i izvršava čvor po čvor po DAG topološkom redosledu. Na primer, prvo pokrene čvor „prepisi velikim modelom", uzme izlaz, a zatim pokrene čvor „sinteza govora". Status izvršenja Python verzije u realnom vremenu se upisuje u PostgreSQL, dok Java verzija piše u MySQL, pa u slučaju pada možete nastaviti od breakpointa. Redis služi za distribuirano zaključavanje između čvorova i za keširanje dela podataka koji se često čitaju — na primer prava za third-party plugin-e.
Sloj za plugin-e takođe ima dve verzije, Python i Java: Python verzija servisa Tools radi na portu 18668, dok Java verzija deli port sa engine-om za radne tokove. Kad engine stigne do čvora plugin-a, poziva te plugins servise preko HTTP-a, a nakon što dobije rezultat nastavlja dalje.
Uzmimo radni tok za AI podcast: korisnik na front-endu klikne „pokreni radni tok", zahtev prvo ide u Nginx, Nginx ga prosleđuje u Hub, Hub nakon autentikacije prosleđuje zahtev Workflow Engine-u. Engine kreće sa izvršenjem — prvi čvor je start, drugi je LLM čvor koji poziva API DeepSeek-a ili drugog modela i prepisuje originalni tekst u podcast scenario; sledeći je čvor za sintezu govora u kom Engine poziva plugins servis i generiše audio, koji se pohranjuje u MinIO; konačno Engine vraća rezultat Hub-u, a Hub front-endu, gde korisnik može preslušati generisani podcast.
Zašto ovakva podela servisa? Prvo, neka svaki jezik radi ono u čemu je najbolji.Java u enterprise scenarijima ima zrelo okruženje — Spring Security za autentifikaciju i autorizaciju, MyBatis za trajnost podataka.
Ali Python u AI domenu ima znatno bogatiji ekosistem — pozivanje velikih modela, obrada streaming odgovora, povezivanje sa raznim AI SDK-ovima ide glatko, a FastAPI ima jako dobre asinhrone performanse, što ga čini pogodnim za execution engine, tipično IO-intenzivan posao.
Međutim, kao Java back-end inženjer, nisam želeo da ceo engine za radne tokove prepustim Python-u, pa sam dodao i Java verziju, zasnovanu na SpringAI + internom engine-u za tokove (u drugoj fazi planiram i LangGraph4J). Kroz ovaj projekat moja inženjerska sposobnost znatno je ojačala.
Još jedan detalj vredan pomena jeste proširivost plugin-a. Sposobnosti kao što su sinteza govora ili RPA napravili smo kao zasebne servise koji se povezuju preko standardnih HTTP interfejsa (u drugoj fazi ćemo uvesti i MCP protokol). Tako, ako ubuduće želimo da dodamo novu sposobnost — generisanje slika, obradu videa — dovoljno je podići novi servis i registrovati ga na tržištu alata, a engine za radne tokove ne mora da menja ni jednu liniju koda.
3. koje tipove čvorova PaiFlow podržava?
Tema provere: razumevanje domena, dizajn tipova čvorova
Referentni odgovor:

Trenutno su podržani sledeći ključni tipovi čvorova:
Start čvor: ulaz u radni tok, definiše ulazne parametre koje korisnik prosleđuje, npr. „unesite tekst za obradu".
LLM čvor: poziva veliki model; podržani su DeepSeek, Tongyi Qianwen i slični. Može se podesiti System Prompt za zadavanje uloge, dok je User Prompt konkretni zadatak.
Plugin čvor: poziva eksterne alate, npr. ultra-realističnu sintezu govora ili prepoznavanje slika. Preko plugins servisa poziva API tih alata.
End čvor: izlaz iz radnog toka, definiše šta se konačno emituje — tekst, URL audio fajla i sl.
Za svaki tip čvora postoji odgovarajuća NodeExecutor implementacija, a proširenje je rešeno strategijom (Strategy pattern).
4. Kako izgleda generisanje AI podcasta u projektu?
Tema provere: razumevanje end-to-end procesa
Referentni odgovor:
To je naš ključni scenario. Kompletan tok izgleda ovako:
①. Korisnik na front-endu unese tekst — temu te epizode podcasta.
②. Start čvor prihvata korisnikov ulaz i pohranjuje ga u pool promenljivih.
③. LLM čvor poziva DeepSeek (ili drugi model). U Prompt-u se zadaje uloga „ti si voditelj podcasta", sa zadatkom da originalni sadržaj preradi u scenarij za monolog-podcast, dok se dvostrukim vitičastim zagradama referencira originalni korisnikov ulaz. Izlaz koji LLM vrati (scenarij) pohranjuje se u pool promenljivih za upotrebu u TTS čvor.
# Uloga
Ti si Chenmo Wang Er, tehnički bloger koji se šali na rečima, ali ispod toga zaista zna stvari. Sada vodiš emisiju pod imenom „Wang Er radio“ — emisija koja, kako da kažem, nudi malo suštine, malo ćaskanja, ali nikad nije dosadna.
# Zadatak
Preradi originalni sadržaj koji korisnik dostavi u doslovni scenario (transkript) pogodan za stil monologa ili podcast emisije. Zvuči prirodno, kao radio ćaskanje — sa ritmom, sa emocijom, sa pokojom forom.
# Napomene
Vodi računa da jezik bude razgovoran, kao da zaista čavrljaš sa slušaocima. Stručne termine objasni „ljudskim rečima“, što prosto moguće — toliko razumljivo. Drži opšti ritam opušteno, sa malo humora, malo topline, da zvuči kao razgovor sa prijateljem, a ne kao predavanje. Održavaj prirodne prelaze u dijalogu, ne dozvoli da slušalac oseti skokove. U izlazu daj samo scenario za naraciju, bez formatiranja i bez metasadržaja u promptu.
# Primer
Dobrodošli na Wang Er radio, u ovoj emisiji nema velikih pouka ni lažne dubine. Današnja tema je zanimljiva — garantujem da ćeš posle razmišljati: „e, pa može i ovako!“. Hajde, bez oklevanja, krećemo.
# Originalni sadržaj:
{{input}}④. Plugin čvor poziva ugrađeni ultra-realistički TTS alat iFlytek/Qwen ili neki drugi third-party TTS alat, koji prerađeni tekst pretvara u audio. Ako je tekst obiman, prethodno se seče na isečke i tek onda poziva plugins servis, a konačna spojena audio datoteka uploaduje se u MinIO i vraća URL.
⑤. End čvor taj URL audija postavlja kao konačni izlaz, a front-end ga treba prikazati kao audio player.
⑥. Proces izvršenja radnog toka putem SSE-a u realnom vremenu se gura ka front-endu, tako da korisnik može da prati status izvršenja.

Ceo proces traje oko 10 do 30 sekundi, zavisno od dužine teksta.
5. Šta je u ovom projektu ono što ti daje najviše zadovoljstva?
Tema provere: lični doprinos, tehnički rast
Referentni odgovor:

Zadovoljstvo mi je svakako prepravljanje engine-a za radne tokove iz Python-a u Java-u. Kad sam tek preuzeo projekat, postojala je samo Python verzija engine-a, ali je naš tim uglavnom na Java steku, pa nam je održavanje išlo prilično teško.
Zato sam preuzeo tu odgovornost i napisao sve iznova u Java-i. Dizajnirao sam arhitekturu izvršioca zasnovanu na Strategy paternu: WorkflowEngine implementira generički DAG (usmereni aciklički graf) scheduler koji parsira DSL, upravlja zavisnostima između čvorova i izvršava radni tok.
Apstraktna baza AbstractNodeExecutor služi za obradu opšte logike (retry mehanizam, kontrola timeout-a, hvatanje grešaka), tako da se konkretni izvršioci čvorova (kao LLMNode, PluginNode) fokusiraju samo na svoju poslovnu logiku — npr. LLM izvršilac čvora obuhvata streaming poziv ka velikim modelima poput DeepSeek-a, dok plugins izvršilac čvora implementira standardizovano pozivanje third-party alata.
Pored toga, dizajnirao sam i mehanizam za rešavanje promenljivih koji podržava dinamičko izvlačenje podataka iz izlaza uzvodnih čvorova (npr. {{node_1.output}}) i mapira ih u snažno tipizirani ulaz trenutnog čvora.
Tu su i SSE + model proizvođača/potrošača koji donose milisekundno guranje statusa izvršenja radnog toka. Sve ovo učinilo je da od korisnika okvira zaista postanem dizajner okvira — i uživao sam u tom putu.
6. Koji je najveći izazov na koji si naišao tokom razvoja projekta?
Tema provere: sposobnost rešavanja problema
Referentni odgovor:
Korisnici u konfiguraciji čvorova vole da referenciraju uzvodne promenljive pomoću Jinja2-slične šablonske sintakse, npr.:
{{node_1.response.choices[0].message.content}}, ali je Java snažno tipizirana i ne možemo unapred znati koje će JSON strukture uzvodni čvor isporučiti. Direktno mapiranje u POJO nije realno, a korišćenje Map-a otežava obradu dubokog ugnježđivanja i pristup po indeksu niza (poput [0]).
Da bih to rešio, dizajnirao sam dinamički pool promenljivih VariablePool koji simulira mehanizam pristupa memoriji iz dinamičkih jezika. Najpre, u VariablePool-u sam odustao od snažno tipiziranih objekata, i uz pomoć FastJSON2 sve izlaze čvorova (bilo List, Map ili custom objekat) objedinio u JSONObject ili JSONArray za pohranu.
// VariablePool.java L42-53
public void set(String nodeId, String outputName, Object value) {
// Prinudno konvertuje u JSON strukturu, izravnavajući razlike u tipovima
if (value instanceof List) {
value = JSON.parseArray(JSON.toJSONString(value));
} else {
value = JSON.parseObject(JSON.toJSONString(value));
}
variables.computeIfAbsent(nodeId, k -> new HashMap<>()).put(outputName, value);
}Zatim, da bih podržao složene reference poput data.result[0].value, ručno sam napisao rekurzivni algoritam za parsiranje getVal koji pametno prepoznaje tačku . i zagrade [] i precizno locira podatke kroz ugnježdene Map-e i List-e.
// Ključna logika parsiranja
private Object getVal(Map map, String key) {
// ... parsira rootKey i subKey ...
// obrađuje pristup preko indeksa niza, npr. "list[0]"
if (index > 0 && rootKey.endsWith("]")) {
// ... izdvaja indeks i pristupa List-i ...
}
// rekurzivno traži sledeći nivo
return getVal(subMap, subKey);
}Na kraju, VariableTemplateRenderer.java pre izvršenja čvora dinamički skenira ulazne parametre, regularnim izrazima pronalazi {{...}} placeholdere i u realnom vremenu poziva pool promenljivih da ih zameni.
Ovaj mehanizam omogućava Java engine-u da ima sposobnost obrade podataka kao dinamički jezici.
zaključak
Za one koji žele da krenu sa Vibe Coding-om, važna napomena: tutorijali za projekat PaiAgent potpuno su otvoreni: https://paicoding.com/column/14/1

Ako Qoder zamenite sa TRAE ili sa Claude Code, možete dobiti slične rezultate.
ByteDance-ova letnja praksa ujedno je i pokazatelj pravca zapošljavanja u čitavom internet gigantu.
Naučite da idete u pravcu vetra i da koristite taj trend.
Kada jezična barijera nestane, a granice alata se suoče sa rušenjem, prava konkurentska prednost prelazi sa „koji kod umem da napišem" na „da li umem da definišem problem, raščlanim cilj, orkestriram AI i zatvorim petlju provere".
AI nije zamenitelj, već pojačivač; Agent nije krajnja tačka, već start nove produktivnosti.
Vođenje se trendom nije jurnjava za senzacijama, već kalibrisanje frekvencije sopstvenog rezonovanja sa osnovnom logikom vremena u kojem živimo. Vetar je dunuo, jedra su podignuta — pravo „iskrcavanje na suvo" kreće od toga da samouvereno skočite u centar talasa.
😄
