Ubisoft Beograd je krajem oktobra 2020. organizovao takmičenje – Decodemode.
Ideja je bila dosta jednostavna – postoji zadatak u kome se nalazi nenajavljeni broj bagova, a na učesnicima je da u 10 minuta nađu i isprave što veći broj njih. Izgleda da je izazov bio prilično interesantan, budući da se za učešće u njemu prijavilo preko 250 učesnika. Članovi našeg programerskog tima koji su zaslužni za kreiranje samog zadatka, Miloš Ivanović i Daniel Mottaghi su podelili svoje utiske o celom zadatku i takmičenju.
Q: Par reči o samom zadatku i bagovima?
A: Ideja nam je bila da napravimo zadatak koji će prikazati delove Game Dev-a u malom. Dakle, da možemo da proverimo znanje iz C++-a ali na nekom zadatku koji liči na nešto sa čime se mi susrećemo svakog dana u Game Dev-u, kako bismo zadatak napravili zanimljivijim za rešavanje.
Zadatak u sebi sadrži minijaturni svet, sa igračem i zombijima. Unutar njega postoji entitet igrača i entiteti protivnika, napadi i odbrane. Ono što smo uradili jeste da kroz funkcionalnost skidanja health-a i bacanje magija napravimo zanimljive bagove.
Q: Kako ste odlučili u kom pravcu cete razvijati zadatak?
A: Pre svega smo hteli da zadatak bude u vezi sa Game Dev-om, budući da je to ono čime se bavimo. Osim toga smo hteli i da proverimo znanje C++-a, kako bismo pokazali i da samo znanje C++-a ponekad može biti više nego dovoljno za rešavanje problema sa kojima se mi u Game Dev-u susrećemo, bez prethodnog poznavanja oblasti. Želeli smo da kreiramo zadatak koji bi se rešavao u kraćem vremenskom periodu, a u isto vreme da ne mora mnogo koda da se piše. To je razlog zašto smo smatrali da je najbolje rešavati upravo ovakve bagove, gde je potrebno izmeniti nekoliko karaktera ili prosto dodati jednu ili dve linije.
Naravno, u samom početku, dok još nismo imali sve osmišljeno, razmišljali smo i o drugim stvarima. Jedna od ideja je bila da to budu algoritamski zadaci ili da sam zadatak zahteva iskucavanje koda. Pitanje koje smo morali da rešimo je bilo i kako bismo ovako nešto merili i rangirali učesnike. Bilo je dosta alternativnih rešenja ali upravo zbog svih razloga koje sam spomenuo smo se na kraju odlučili upravo za ovaj.
Q: Koji od bagova koji postoje u zadatku se najčešće sreće u vašem poslu?
A: Pojavljuju se bagovi sa kopijom i referencom, gde se ne primenjuju izmene u nekoj for petlji kroz to što se iterira upravo zbog toga što se nije koristila referenca. Takođe, deo zadatka sa proverom health-a za čuvanje skidanja damage-a sa igrača može da nastane tako što neko nije napravio osnovnu proveru, pa je to bila jedna od stvari koja nas je inspirisala za bag u okviru zadatka. Imali smo i bag koji je bio inspirisan situacijom gde neko ne izbriše na vreme redundantne elemente iz niza.
Samim tim, svi bagovi koji postoje u zadatku nisu direktno ono što smo videli ali su vrlo analogni tome i inspirisani su stvarima koje smo videli u realnosti.
Q: Koji od ovih bagova je vama lično najzanimljiviji?
A (Miloš): Meni je najzanimljiviji bag koji je jako mali broj učesnika rešio – bag sa STD sort-om gde mora da se promeni operator poređenja sa manje ili jednako. Ovo je bag koji nije lako uočljiv, nešto što ni ja sam nisam znao do pre pola godine i nešto sa čime se ljudi neće sretati baš često u nekim drugim oblastima van Game Dev-a.
A (Daniel): Ovaj bag je definitivno i za mene najinteresantniji budući da ni sam nisam znao da taj bag postoji dok Miloš nije skrenuo pažnju na to. Međutim, zanimljivi su mi i svi ostali bagovi budući da predstavljaju ne algoritamske, nego više logičko-algoritamske zadatke. Na primer, bag sa izbacivanjem igrača nije nešto što može lako da se shvati implicitno, ali u suštini jeste nešto o čemu treba razmišljati u Game Dev-u svakodnevno – da li je neko pre tebe odradio sve kako treba, da li je potrebno prvo ispraviti nešto što je ranije napisano ili se osloniti na to da sa te strane sve funkcioniše i potencijalno naknadno imati neobjašnjive bagove.
Q: Kakvi su vam utisci o rezultatima učesnika? Šta vas je iznenadilo? Šta ste očekivali?
A: Rezultati su bili u skladu sa onim što smo i očekivali i targetirali da postignemo. Ono što nismo očekivali jeste da je bilo dosta mladih učesnika koji su uspeli da reše dosta veliki broj bagova, ali su rezultati generalno bili u skladu sa težinom zadatka koji smo napravili.
Takođe, naša očekivanja su bila da će se primetiti najbrže bag za čuvanje od health-a, kao i da će se nešto lakše primetiti problem sa referencom, te da će se jako mali broj učesnika snaći sa sort bagom.
Q: Jel imate neku preporuku za učesnike, šta su dobri izvori za one koje zanima C++ i ova oblast?
A: Sajtovi poput CPP references, C++.com, kao i Codingames koji je jako dobar za vežbanje znanja, dok je Stackoverflow koristan za konkretne bagove.
Kada je u pitanju problematika koja se javila u zadatku praktično iskustvo je najbolji način da se nauče ovakve stvari. Iskustvo u Game Dev-u ali i u mainframe sistemima, robusnijim aplikacijama u C++-u. Većina ovih stvari se u teoriji sreće i na fakultetima ali prosto, budući da ovo znanje ne bude primenjeno, često je teško odmah primetiti ovakve bagove. Samim tim, učenje putem pokušaja i pogrešaka je uvek dobra ideja. Potrebno je imati problem zbog tako nečega, da bi se zaista razradila ideja da je to pogrešna logika.
Takođe, razvijanje sopstvenih, manjih igara u engine-ima može doprineti da se susretnete sa problemom koji možete onda naknadno uvezati sa teorijom. Cilj je da to budu igre u robusnijim engine-ima, koji zahtevaju pisanje koda i nisu ograničeni samo na drag and drop funkciju.
Za kraj bismo dodali da se nadamo da je sam zadatak dao priliku da se u dosta maloj instanci vidi kako rad u Game Dev-u može da izgleda, i da bismo voleli da ohrabrimo sve da se oprobaju u ovoj oblasti čak i ako im ona možda na prvi pogled deluje kao neispitana teritorija.