Juče sam na Računarskom fakultetu, u okviru seminara RAF IT Days, održao predavanje pod nazivom “Od srednje škole do Silicijumske doline”, i veoma mi je drago da se to desilo, pošto je u pitanju tema o kojoj želim da pišem već neko vreme. Tačnije, želim to da uradim preko godinu dana, još otkad je izašao tekst “From college to Silicon Valley”, ali sam to stalno odlagao zbog obilja informacija koje bih u takav tekst mogao da uključim.
U okviru Start konferencije sam takođe držao slično predavanje, ali pod nazivom “Od fakulteta do Silicijumske doline”, i ono je bilo svojevrsan podskup ovog teksta — ipak, složićete se da nije imalo smisla da studentima pričam o tome šta treba raditi tokom srednje škole. Zbog toga je ovo predavanje na RAFu bila odlična prilika da te informacije i savete skupim i organizujem, i najzad prezentujem u ovom tekstu.
Neki će se zapitati, zašto već u srednjoj školi brinuti o ovim stvarima? U Srbiji imamo dobre srednje škole koje mogu da pruže odlično osnovno znanje, i onda da učenici sa tim znanjem krenu na bilo koji fakultet; to je funkcionisalo godinama, pa će tako funkcionisati i dalje. Međutim, računarstvo je previše slično matematici da bi se učilo tek na fakultetu. Naravno, neko ko želi da radi sajtove može to da nauči i sâm za nekoliko meseci, ali ono programiranje koje se radi u velikim softverskim kompanijama zahteva zaista veliko znanje i razumevanje mnogih koncepata… Zahteva poseban način razmišljanja koji se razvija već od detinjstva. I to je ono što se u školama (nažalost) ne uči. Čak i u Matematičkoj gimnaziji je akcenat na matematici i fizici, a ne na programiranju, ali se barem uz to razvija i taj odgovarajući način razmišljanja, pa oni koji upišu računarstvo kasnije nemaju nikakvih problema.
Isto kao što učenici retko svojom voljom uzimaju da programiraju (ili uče matematiku), tako i studenti imaju određenu “kočnicu” kada je u pitanju rad na sebi, jer ne konkurišu na prakse dovoljno često. Kada sam ja upisivao fakultet, nosio sam se mišlju da će mi on značiti samo zato što ću lako naći posao nakon što diplomiram, ali sam se već nakon godinu i po dana odlučio da prvo okušam sreću sa praksom, pa sam se prijavio na konkurs Microsoftovog razvojnog centra. Ovo se ispostavilo kao jako dobar potez, jer sam tu praksu dobio, stekao iskustvo, i praktično obezbedio sebi posao na polovini studiranja. Zato je bitno razmišljati ne samo o poslu, već i o praksama koje predstavljaju odličan prelaz između studiranja i zaposlenja.
Ali vratimo se na osnovne stvari…
Šta je potrebno za uspeh?
Za početak, potrebna je ljubav. I nemojte se smejati, džabe vam sve znanje ovog sveta ukoliko ne volite to što radite. Da li uživate u tome da provedete celu noć rešavajući neki problem? Da li, kada vam je dosadno, ponekad uzmete da programirate? Da li imate svoje projekte, koliko god oni kompleksni bili, koje želite da realizujete, čisto onako? Ako krenete da se bavite programiranjem zato što je to danas isplativo, a zapravo vas smara i lako odustajete, omašili ste poziv.
Ako ste već shvatili da vam programiranje zaista prija, ono što vam dalje treba je engleski jezik. Do sada bi ovaj jezik već trebalo da znate, ali ako to nije slučaj, moraćete dodatno da se pomučite. U principu, sintaksa svih programskih jezika je na engleskom, a čak i da to naučite napamet, nećete moći da napredujete ukoliko ne znate jezik. Pored formalnog obrazovanja, veliku ulogu kod učenja programiranja igra i samostalno unapređivanje, a to je najlakše učiniti čitanjem tekstova na Internetu koji su, krajnje neočekivano, na engleskom. A opet, čak i da nađete dobre tekstove na srpskom (iako ih je malo), doći ćete do trenutka u svom životu kada treba da imate neki intervju na engleskom, ili, ako radite u srpskoj firmi, da komunicirate sa stranim saradnicima. Dakle, ovo je pod obavezno.
I najzad, poslednja stvar koja vam je potrebna da biste mogli da krenete sa ozbiljnim programiranjem jeste omražena matematika. Nema ‘leba bez motike, iliti nema programiranja bez matematike. Danas je količina podataka koji se obrađuju toliko velika da je ponekad jako teško efikasno ih obraditi bez matematičkih pristupa — sâm Facebook u svom socijalnom grafu ima toliko čvorova i ivica da oni ne mogu ni da se smeste u serversku radnu memoriju, a kamoli da se lako obrade upotrebom standardnih algoritama; Google je svojevremeno za računanje PageRank-a, koji zavisi od mnogo faktora, koristio matrični račun, odnosno linearnu algebru. Dakle, bilo kakva ozbiljna obrada podataka zahteva matematiku, a priča se samo još više razvija ukoliko želite da radite, recimo, engine za neku igru, pa morate da se bavite i analitičkom geometrijom. Za neka izračunavanja će vam trebati numerička matematika, za aproksimacije će vam trebati verovatnoća i statistika, a ne treba zaboraviti ni da je teorija grafova u suštini grana matematike. Žao mi je, ali stvari tako stoje.
Kako unaprediti svoje znanje
Pored prethodno navedenih predispozicija, najbitnije je da se okrenete vežbanju. Kao što sam već napomenuo, u školi nećete naučiti ono što vam je neophodno za intervjue i posao, ali zato postoji mnoštvo dobrih sajtova za vežbanje, od kojih bih ja izdvojio sledeće:
- USACO — ovaj sajt često koriste ljudi koji tek kreću sa takmičenjima, jer je podeljen po oblastima, i korisnika korak po korak uvodi u razne probleme iz programiranja, zajedno sa objašnjenjima kako i zašto se nešto radi
- Arhive zadataka — ovde se uglavnom nalazi ogroman broj zadataka za koje vi pišete rešenja, nakon čega šaljete kôd na testiranje i dobijate povratnu informaciju da li ste uspešno rešili neki problem, ili je došlo do neke greške (netačno rešenje, prekoračenje vremenskog ograničenja, previše memorije iskorišćeno i sl.)
- Z-Trening — verovatno najinteresantnija arhiva zadataka, jer je drži naš čovek, pa je tako i zajednica pretežno srpska/regionalna, a tamo možete naći i skoro sve zadatke sa naših takmičenja iz programiranja
- TopCoder
- Timus Online Judge
- Sphere Online Judge, itd.
Pomenuvši ove arhive zadataka dotakao sam se i jednog od najboljih načina za učenje programiranja, a to su takmičenja. Ona su odlična iz više razloga:
- Rešavaćete probleme u kompetitivnom okruženju i dobićete motivaciju da se usavršavate
- Nateraćete sebe da naučite neke nove tehnologije (ja sam tako naučio XNA i razvoj Metro aplikacija, zbog dva hakatona na kojima sam učestvovao)
- Upoznaćete nove ljude sa kojima ćete možda kasnije sarađivati, bilo u poslovno bilo u takmičarskom smislu, a ako se nijedno od ta dva ne desi, imaćete zaista divna poznanstva
- Ukoliko dobro prođete, mogu da vam se otvore razna vrata — na primer, možete dobiti stipendiju za fakultet, što je slučaj sa Računarskim fakultetom, a mogu i da vas primete headhunteri iz raznih firmi
Ako ništa drugo, možete lepo da se provedete, pa vam zato predlažem da se informišete o sledećim takmičenjima, pa da neki put i učestvujete:
- Takmičenja u organizaciji Ministarstva prosvete — srednjoškolcima najlogičniji i najbolji prvi korak, pošto je na ova takmičenja najlakše otići, a postoji i prilika za odlazak na svetsku olimpijadu iz informatike
- BubbleCup — meni lično najdraže algoritamsko takmičenje, pošto sam na njemu učestvovao i prolazio u finale svake godine od osnivanja, a otvoreno je i za srednjoškolce
- Challenge24 — jedno od ozbiljnijih takmičenja, otvoreno za sve uzraste, uz finale koje traje 24 časa i održava se u Budimpešti
- ACM — fakultetski pandan takmičenjima u organizaciji Ministarstva, s tim što je ovo svetsko: fakulteti šalju studente na regionalno takmičenje (za nas je to takmičenje u Bukureštu), nakon čega nekoliko najboljih timova ide u finale
- AI Olympics – relativno mlado takmičenje na kome se razvija veštačka inteligencija
- Razni hakatoni — prošle godine su se izdvojili Nordeus i Start Conference hakatoni, i ispostavilo se da je u pitanju jako zanimljiv tim takmičenja, jer ne testira samo znanje, već i brzinu, snalažljivost i timski rad
“Vanprogramerske” aktivnosti
Za kraj, ne smemo zaboraviti da nije sve u “suvom” kodiranju, jer postoje i druge stvari koje mogu podjednako da doprinesu vašem uspehu. Na primer, da li ste ikada razmišljali o pisanju bloga?
Vreme koje uložite pišući blog je vreme koje ulažete u sebe.
Eniac, na Blogomaniji u decembru 2012. godine
U pravu je, iz više razloga. Kao prvo, razvićete kod sebe neke bitne aspekte komunikacionih veština, jer ćete se bolje izražavati, što baš i nije odlika progamera; dalje, bolje ćete istražiti teme o kojima odlučite da pišete, pa ćete usput i naučiti nove stvari iz programiranja i zainteresovati se za neke nove oblasti; najzad, ljudi će vas primetiti, i steći će bolju sliku o vama i o tome koliko ste kompetentni. Ovaj moj blog je zapravo bio jedan od dva razloga što su mene kontaktirali iz Facebook-a za praksu — prvi je bio BubbleCup (seriously, prijavite se).
Osim online prisustva u obliku pisanja bloga, isto je veoma bitno kako se prezentujete na društvenim mrežama. Možda vam sada to izgleda nebitno, ali kroz nekoliko godina ćete vršljati po forumima koje ste nekada posećivali i proveravaćete šta ste sve pisali. Avaj, mnoge od tih stvari ne mogu tek tako da se obrišu, ali zato možete barem svoj Facebook i/ili LinkedIn profil da “upristojite”, i da navedete ko ste, koje škole ste završili i na čemu ste radili, a ne da piše “Works at Svi mi koji bojler”. Ni Twitter nije loša opcija, a posebno je zgodan ukoliko vam ta microblogging forma više odgovara od pisanja pravog bloga.
I naravno, nemojte da vam se sve vrti oko računara – da, programiraćete na njemu, i koristićete ga za pisanje bloga i prezentovanje svojih radova, ali pravi razgovor je i dalje nezamenljiv. Ja sam to naučio na teži način, kada sam u Silicijumskoj dolini bio jedan od retkih koji nije bio raspoložen za tzv. networking, a to je fenomenalna stvar, i ljudi iz IT-a su generalno veoma raspoloženi za priču. Upitajte ih gde i na čemu rade… Razgovor će se odatle sâm razviti.
Da li je sve ovo za mene?
Jeste. Iako učenici i studenti u Srbiji toga nisu svesni, oni imaju veliki potencijal, koji im uz dobro obrazovanje — koje jeste dostupno — omogućava da postignu više nego što misle da mogu. Potrebno je samo da pokušate.
Ja volim programiranje i zelim se time baviti ali lose mi ide matematika a i nisam je bas ucio u osnovnoj sad sam 2 razred srednje ima li nade za mene da nadohnadim propusteno znanje iz matematike
Odgovorio sam ti već direktno, ali valja i ovde dati malo opširniji odgovor.
Drugi razred srednje, po meni, ostavlja i više nego dovoljno vremena da se nadoknadi bilo kakvo znanje, odnosno stekne neko novo. Imam utisak da su ljudi navikli da se maltene isključivo oslanjaju na znanje koje se dobija tokom školovanja, i onda nisu uvek svesni koliko brzo se zapravo može napredovati na svoju ruku.
Ovo kažem zato što znam ljude koji su u različitim trenucima svog života krenuli ozbiljnije da se bave programiranjem/matematikom – neki su krenuli u toku srednje škole, neki na fakultetu, a neki tek nakon što su diplomirali na sasvim nevezanim fakultetima. Ono što je svima bilo zajedničko jeste to što su zaista bili motivisani i zainteresovani da uče, pa su tome posvetili i svoje slobodno vreme van “standardnog” školovanja.