Dok je matematika oduvek bila 'bauk' za mnoge učenike, oni sa zadovoljstvom izučavaju kompjuterske nauke u nadi da će jednog dana postati uspešni programeri. A da li jedno isključuje drugo? Razgovarali smo sa 'game engine' developerom koji je karijeru otpočeo kao profesor matematike.
Andrej Bunjac je diplomirao, a potom stekao master i doktorsko zvanje na Fizičkom fakultetu Univerziteta u Beogradu. Matematika je oblast koja je zastupljena u svim segmentima njegovog obrazovanja i naučno-istraživačkog rada, a u jednom periodu karijere radio je i kao profesor matematike u više obrazovnih institucija.
Iako postoje brojne debate na ovu temu, matematika je i te kako prisutna u programiranju i u mnogim slučajevima znanja iz ove oblasti programerima daju prednost u odnosu na konkurenciju.
Vođen time, nakon mnogo godina ljubavi prema softverskom inženjerstvu, Andrej je odlučio da se prekvalifikuje i svoj hobi pretvori u profesiju. On je sada game engine developer, a o tome koliko mu je matematika značila na tom putu, da li je i u kojoj meri bitna za uspešno programiranje, te koja je njena budućnost u ovoj oblasti, govorio je u intervjuu za Netokraciju.
Andrej, u kom trenutku si odlučio da se prekvalifikuješ u programera?
Andrej: U modernijem pristupu naučno-istraživačkom radu na polju fizike, programiranje nekako dolazi ruku pod ruku sa samim istraživanjem. Nije važno da li se bavimo teorijom ili eksperimentom, uvek će biti potrebno da se uradi neka simulacija ili digitalna obrada podataka. U mom slučaju, koketiranje sa softverskim inženjeringom počelo je jako rano — još u osnovnoj školi, a naročito me je interesovao razvoj video igara.
Međutim, trebalo mi je dosta vremena da se usudim da napravim prvi korak u oblast izvan one za koju sam se školovao i kvalifikovao. Svakako, znanja koja sam stekao bavljenjem razvojem igara iz hobija su itekako poslužila i u naučnom radu. Iznenađujuće je — ili možda baš nije — koliko je sličnih koncepata moguće primeniti u domenu npr. kompjuterske grafike i izračunavanju potencijala nekakve rešetke atoma.
Blokovi koji grade pristup u dobijanju rešenja u ovim oblastima je vrlo sličan, razlika je možda samo što softver češće zahteva performanse iznad preciznosti dok je u nauci to obrnuto. Svakako ono što želim da kažem je da je fundamentalni set veština svakako bio tu, a i strast prema razvoju igara, tako da je za mene bilo potrebno samo da se ukaže prava prilika.
Da li smatraš da je matematika bitna za uspešno bavljenje programiranjem, i koliko je ona tebi pomogla u karijeri?
Andrej: Daću kratak odgovor: bila je neprocenjiva. Ne samo u smislu zdrave postavke logičkog i analitičkog pristupa u radu sa softverom, već i u konceptima iz vrlo konkretnih oblasti kao što su linearna algebra, statistika, geometrija i mnoge druge. Dobro utemeljeno znanje matematike uglavnom daje neverovatnu prednost nad konkurencijom u oblasti softverskog inženjeringa a definitivno je tip znanja koje je mnogo teže nadoknaditi nego poznavanje paterna u softverskoj arhitekturi ili konkretnih programskih jezika.
Naravno, znanje matematike nije preduslov za uspešnu progamersku karijeru — mnoge aplikacije koje obrću velike sume novca i donose ozbiljan profit rade tipski — te je retko potrebno zaista zasukati rukave u dizajnu nekakvih naprednih algoritama. Takođe, često kad to i jeste potrebno, mnoge gotove biblioteke taj posao već rade za nas, pa nas na neki način štite od “prekomerne” upotrebe matematike u našem radu.

Mislim da velika većina programera može lako da se provuče kroz čitavu svoju karijeru sa vrlo bazičnim znanjem matematike i da zadovoljno dočeka penziju, ali isto tako mislim da je bez ozbiljnijeg poznavanja naprednih matematičkih koncepata — šansa da se dobije angažman na nekom zaista inovativnom projektu koji probija mogućnosti trenutnih tehnologija skoro nikakva. Mnogi aspekti modernog softvera su izuzetno specijalizovani, tako da čak i u oblastima gde je matematika neophodna — moguće je snaći se i izučiti jedan podskup matematičkog znanja i pristojno baratati sa time.
Ali, nalazim da je ovakav reduktivan pogled često vrlo ograničavajući, i sprečava ljude da oforme dobre, originalne ideje specijalizovane za problem koji oni rešavaju, ili pak otežava mogućnost čitanja literature iz raznih oblasti kompjuterskih nauka koja često koristi više apstraktnu matematičku notaciju i koncepte.
Da li je matematičko znanje bitno za dobro razumevanje svih programskih jezika?
Andrej: Iako u biti svojih logičkih operacija svi programski jezici barataju nekom vrstom matematike, mislim da za razumevanje programskih jezika na ulaznom, a čak i na nekom višem nivou, nije potrebno mnogo matematičkog znanja. Viđao sam ljude koji se odlično snalaze u pisanju raznih skripti ili programa čije znanje matematike nije bilo na nekom zavidnom nivou i to je bilo prilično nezavisno od jezika.
Svaki jezik ima svoje barijera ulaska, i mislim da su definitvno jezici poput Python-a na primer više “prijateljski nastojen” za početnike ali ne vidim konceptualni razlog zašto bi matematika napravila razliku između ulaska u neki tradicionalno “teži” jezik kao što je C++.
Ono gde različiti jezici prave razliku u potrebi za boljim predznanjem matematike je u tome koliko lako dostupnih, a dobrih biblioteka imaju koje komplikovane matematičke operacije mogu da obave iza kulisa. Namerno sam rekao lako dostupne jer ovakve biblioteke postoje za sve jezike, ali jednom početniku je neuporedivo lakše da im pristupi koristeći Python nego na C++.
Tako da, mislim da je znanje matematike mnogo povezanije sa tipom projekta na kom se radi nego sa samim izborom programskog jezika. Za napredan rad često je potrebno razumeti detalje ovih biblioteka, nekad čak napisati svoje alternative optimizovane za neke specifične slučajeve i ni jedan jezik vas neće spasiti od matematike ako treba da stvorite realistične senke u 3D okruženju.
Koliko je po tvom mišljenju logičko razmišljanje važno za programiranje i u kojoj meri može da zameni matematička znanja?
Andrej: Logičko razmišljanje je neophodno i praktično je nemoguće raditi na ovom polju bez njega čak i na najosnovnijem nivou. Mislim da logičko razmišljanje ne može zameniti matematiku jer matematika JESTE sistematizacija logičkog razmišljanja. Neko ko je talentovan, ima razvijenu logičku inteligenciju i dobro barata silogizmima može lako doći do mnogih zaključaka koji su već poznati na polju matematike, ali to bi značilo ignorisati bazu znanja koja je formirana, “polirana” i “sažvakana” za moderne korisnike kroz vekove od strane jako pametnih ljudi koji su cele svoje živote posvetili tome.
Po toj logici, možemo i da uzmemo da pišemo naše programe u mašinskom jeziku — što je definitivno moguće ali svakako ne bi bilo efikasno. Pored toga, matematika je jedini predmet u školama koji zaista trenira analitički pristup rešavanju problema, odnosno razbijanju velikog zadatka na male rešive fragmente sa kojima umemo da se snađemo, što je takođe i preduslov za dobru, dugoročno održivu i ekstenzivnu softversku arhitekturu.
Da skratim, logičko razmišljanje je u srži programiranja i apsolutno je neophodno, a nema boljeg načina da se ta vrsta logike duboko internalizuje od matematičkog obrazovanja. Takođe, mnogi koncepti česti u programiranju nasleđuju svoju notaciju i način upotrebe direktno iz matematike te bismo svakako bili forsirani da neke od tih stvari pre ili kasnije naučimo.

Dok si radio kao profesor matematike, kako si uspevao da motivišeš svoje učenike da zavole ovaj predmet?
Andrej: Matematika kao predmet u školi, po mom mišljenju pati od dva teško rešiva problema koji stvaraju otpor kod dece. Prvo, izvan baratanja nekim osnovnijim operacijama, prezentacija matematike u školskim programima dovoljno je apstraktna da ne daje deci dovoljno stvari koje su samerljive sa njihovim životima i svetom koji vide oko sebe. Nažalost, matematika postaje sve zanimljivija i otvara šire vidike što je više znamo i razumemo ali to znači da onaj početni period kada još uvek učimo da hodamo na ovom polju moramo prebroditi na silu.
Kao kada vas neko moli da pogledate njihovu omiljenu seriju a ubeđuje vas da od sezone 7 postaje pravo remek delo! Ja bih rado nastupio u učionici sa pričom da ću im objasniti princip rada autonomnih vozila, ili kako funkcionišu Instagram filteri za slike ili kako se postiže realistična simulacija fizike u njihovoj omiljenoj igri, ali čak iako bih pokušao da prodam ove ideje, na sutrašnjem času bih morao da im pričam o operacijama sa polinomima.
Drugi problem je što sticanje operativnog znanja iz matematike zahteva naporan rad, koji repetivan, dugotrajan, nemilosrdan prema rupama u znanju i zahteva naprezanje sa vrlo apstraktnim konceptima. Zbog ovoga, mnoga deca upadnu u zamku da su nešto razumeli na časovima, ali zbog manjka vežbe postižu lošije rezultate na testovima.
Kao i u programiranju, jedini pravi način da se matematičko znanje sistematizuje je kroz samostalno rešavanje problema, a mnoga deca od toga beže i nalaze “spas” u drugim predmetima koje intuitivnije razumeju. Zbog ova dva problema, velika odgovornost u dobroj prezentaciji matematike leži na nastavniku koji mora da održi interesovanje kroz velika lutanja van onoga što programi propisuju.
Smatram da sam na tom polju u svom nastavnom radu imao veliku prednost jer dolazim iz domena fizike i kompjuterskih nauka i imao sam u rukavu jako veliku masu dobrih primera prave tehnološke ili svakodnevne upotrebe skoro svih koncepata koje sam morao da predajem, a i pomoglo je što sam nosio imidž nekoga ko je gejmer što bi u startu kupilo jedan deo publike.
Moje iskustvo sa matematikom kroz lični obrazovani put ukazalo mi je da je potrebno rebalansirati prezentaciju ovog predmeta i dati joj jedan celovitiji pristup koji će ga bolje povezati sa primenom. Naročito jer će se u 95% profesija ti mladi ljudi koristiti isključivo primenjenim aspektima. Ovo ne znači da teorijski, sistematični pristup nije bitan, već da on treba da dođe kao kruna sistematizacije znanja koje je motivisano primenom.
Trenutno radiš u domenu game engine-a. Koliko je matematika zastupljena u ovoj oblasti?
Andrej: Game engine je jako veliki komad softvera koji je namenjen da napaja čitave virtuelne svetove. Ti svetovi mogu biti 2D, 3D, mogu eksperimentisati sa nekim neeuklidskim geometrijama, mogu imati stilizovanu grafiku ili potpuni foto-realizam, animacije mogu biti klasične ili proceduralne i još mnogo mnogo toga.
Matematika koju koristimo u game engine-u će uvek biti prilagođena potrebama spektra mogućnosti koji želimo da pokrijemo. Jedna stvar koju svaki engine mora da ima je sistem za rendering grafike na ekran. Ovo je matematički izuzetno zahtevna oblast i gotovo je nemoguće baviti se time bez dobrog razumevanja nekolicine vrlo značajnih oblasti matematike.

Objekti koje vidimo na jednoj sceni postoje u nekom apstraktnom koordinatnom prostoru igre i potrebno ih je projektovati u ispravnoj perspektivi na dvodimenzioni ekran koji korisnici vide. Oni se sastoje od mreže tačaka sistematizovanih u trouglove koje je potrebno transformisati pri svakom pomeraju kamere ili samog objekta.
To je, pritom samo početak jer onda ovim objektima moramo obezbediti materijale, teksture, osvetljenje, bacanje senki itd. U ovoj širokoj oblasti, zahvaćena je pre svega geometrija, linearna algebra, funkcionalna analiza kao i delovi statistike ali za neke naprednije tehnike moguće je ići još dublje u neku prilično egzotičnu matematiku.
Pored rendering-a, game engine u sebi nosi brojne druge sisteme , od kojih je možda najzastupljenija fizika. Potrebe simulacija fizike se razlikuju od igre do igre, ali opseg ide od jednostavnih implementacija koje imaju samo gravitaciju i granice objekata koji se mogu sudariti do nekih složenih simulacija kao što su neelastični sudari ili volumetrijski fluidi. Iako simulacije fizike u igrama često “varaju’” u svojim fizičkim proračunima, to ne znači da manjkaju u komplikovanoj matematici.
U jednom obrtaju igre potrebno je ažurirati brzine i položaje svih pokretnih objekata u sceni i to se često postiže diskretizovanim rešenjem diferencijalih jednačine njihovog kretanja (iako neki programeri ni sami nisu svesni da ovo zapravo rade). Primeri matematike u jednom game engine-u zaista su bezbrojni, ali siguran sam da je gotovo svaka oblast matematike koju znam u nekom vidu bila zahvaćena kroz moj rad. Iako jako bitna, matematika je daleko od jedinog potrebnog znanja, možda čak bitnije od matematike, za rad na game engine-u jako je važno biti vrlo pedantan u optimizaciji performansi svakog segmenta koda.
Kod engine-a ne možemo da priuštimo prekomerne alokacije u memoriji, neoptimalna rešenja ili traljavo napisan zapleten kod. Kada uđe u upotrebu, cena ovih grešaka biće plaćena sa debelom kamatom a kada je kod već u upotrebi od strane korisnika, sve je teže napraviti jednostavne izmene ili popravke.
Konačno, da bi jedan engine bio kompetitivan na modernom tržištu, bilo da je komercijalan ili in-house, mora da bude u toku sa aktuelnim tehnologijama i poželjno je da nudi nešto što drugi engine-i nemaju što zahteva od programera da budu spremni da izlaze is svoje zone komfora i specijalizacije i čitaju naučnu literaturu iz kompjuterskih nauka i istražuju nove tehnologije koje se plasiraju na tržište.
Za kraj, koja su tvoja predviđanja za budućnost matematike u programiranju?
Andrej: Po mom mišljenju, uvek će biti tržište za specijaliste koji su sposobni da razumeju softver na fundamentalnom nivou. Matematika nije prestala da bude deo softvera, samo je sve više zapakovana u biblioteke koje možemo da koristimo bez razmišljanja. Veliki procenat tržišta za programiranje u sadašnjem trenutku su UI aplikacije koje u širokom luku izbegavaju direktnu upotrebu matematike o kojoj sam govorio.
To je otvorilo vrata ove industrije za mnoge ljude koji nemaju znanja ni afinitete prema matematici i stvorilo iluziju koju su mnogi prihvatili da matematika nije neophodan programerski alat. Ali ove aplikacije, iako zahvataju veliki deo tržišta, samo su vrh ledenog brega svih sistema koji grade naš digitalni svet.
Međutim kako takve aplikacije sve više i više liče jedna drugu, ja ne vidim konceptualni razlog zašto u vrlo bliskoj budućnosti veći deo koda u njima ne bi mogao biti generisan od strane veštačke inteligencije koje su se pokazale da jako dobro barataju oponašanjem dobro uspostavljenih paterna ali ne kao inteligencije koje mogu zameniti snagu ljudske nepredvidive inovacije.
Mislim da će zbog pravca u kom se tehnologija kreće u budućnosti zapravo biti potrebno sve više i više programera koji će umeti da izbore sa složenijom matematikom i da će njihova cena na tržištu rasti.
Želiš da podeliš svoje mišljenje o ovoj temi? Komentari su otvoreni na našoj Facebook i LinkedIn stranici!