PočetnaSoftverKorisniProgramiranje, algoritmi i natjecanje

Programiranje, algoritmi i natjecanje


Ako kojim slučajem programirate, onda znate da je to prilično zahtjevan posao. Morate znati puno toga da biste mogli napraviti smislenu aplikaciju. No, jedan segment programiranja je posebno zahtjevan, a to su specifični algoritmi i natjecanje u algoritmima. No, nagrade su i više nego primamljive, a oni najbolji iz svoje sobe dobiju posao u silicijskoj dolini. Čini vam se zanimljivo?

Biti programer danas je vrlo isplativo i to iz nekoliko razloga. Kao prvo nemate problema sa traženjem posla. Čak i totalni početnici sa malo prakse mogu dobiti ‘entry’ pozicije u raznim kompanijama i polako se početi profesionalno razvijati. Za programera riječ burza ne postoji (op.a. programer nije onaj tko je imao dva kolegija na fakultetu i smatra se programerom). Drugo, plaće programera su daleko iznad prosjeka Hrvatske, ali i svake one države u kojoj radite. Po nekim analizama, programer u hrvatskoj ima gotovo duplo veću plaću od prosjeka. Trebali vam dodatna motivacija? Treće – postoji bezbroj načina na koji se možete dokazati kao programer i vrlo lako je iz svoje sobe doći do silicijske doline. Sve što vam treba je računalo, Internet konekcija i znanje. Prije nego kažete da izmišljamo i da je nemoguće – stanite malo. Postoji način na koji se možete vrlo lako dokazati (iako ovo „lako“ uzmite sa velikom rezervom), te sklopiti odličan posao iz, kao što smo spomenuli, vaše sobe. O čemu se točno radi, čitajte u nastavku teksta.

Što i kako?

Ako imate prijatelja ili poznanika programera i ako ste s njim popričali o poslu onda ste upoznati sa onim što radi većina programera. Programere možete svrstati u nekoliko kategorija – postoje oni koji razvijaju razne desktop aplikacije, postoje programeri koji rade iOS/Android aplikacije, imate one koji su specijalizirani za web, no na kraju se sve svodi na isto. Svi oni programiraju CRUD (engl. „Create, read, update, delete“) aplikacije. To su aplikacije koje imaju nekakve forme preko kojih vi upisujete podatke, a zatim ih možete čitati, ažurirati ili brisati. Te aplikacije mogu biti složene ili manje složene, no svode se na isto. Nadamo se da se nitko neće uvrijediti na tu tvrdnju. Praksa je takva kakva je, a razlika je u detaljima. Sam posao programera je inače zahtjevan, no posebno je zahtjevan kada se dođe do složenih algoritama. I to je ono što nas danas zanima – algoritmi i programiranje. Algoritam je po definiciji „konačan niz koraka koji rješavaju određeni problem,“ što će reći da je svaki program koji programeri napišu skup algoritama. I to je točno.

No, postoje i matematički algoritmi, odnosno posebni algoritmi s kojima se rješavaju složeni, najčešće matematički, problemi i njih nećete vidjeti u standardnim aplikacijama. S takvim algoritmima se susreću oni koji se bave znanstvenim radovima i oni koji se bave istraživanjem određenog područja matematike, te manji broj programera koji u slobodno vrijeme uče te algoritme i pokušavaju ih implementirati u praksi. Da li je to korisno? Svakako, no zahtjeva posebno znanje, jako puno truda i vremena, te je upitno da li će vam ikada zapravo ti algoritmi i zatrebati i da li ih se isplati učiti ili problem riješiti na neki drugi način? Pitanje je omjera uloženog vremena i truda naspram dobiti koju imate od takvog učenja.

Natjecanja i algoritmi

Mi vjerujemo da učenje složenih algoritama ima smisla bez obzira da li se bavite znanstvenim radovima ili „običnim“ programiranjem jer učenje takvih algoritama razvija programera na mnogo razina. Kao prvo, da biste naučili spomenute algoritme morate naučiti i prilično puno matematike. Samim time razvijate poseban i apstraktan način učenja što je svakako dobro za programera, a vodi nas i do onog što smo rekli – možete se dokazati i dobiti fantastičan posao. Na Internetu postoji nekoliko web stranica i nekoliko programerskih natjecanja u kojima se programeri mogu dokazati, osvojiti novčanu nagradu (op.a. cifre nisu astronomske niti se natječete zbog novaca), ali i privući pozornost recruitera raznih velikih IT kompanija. Ova posebna natjecanja su stvorena kako bi se isfiltrirali ponajbolji (mladi) programeri na svijetu i kako bi kompanije imale pristup tim programerima.

Točnije, da ih mogu kontaktirati i vidjeti da li im odgovaraju ili ne. Neke od tih web stranica i natjecanja ćemo mi danas spomenuti u ovom tekstu. No, prije toga vratimo se na filtriranje programera. Svaka web stranica, odnosno web platforma na kojoj se programeri natječu ima statistiku vašeg učinka – što ste rješavali, koju vrstu problema, kada ste se uključili u natjecanje, da li ste osvojili isto, da li ste često pri vrhu što se bodova i rangiranja tiče … Na osnovu toga ste im zanimljivi. Ili niste. No u svakom slučaju vam te iste web stranice daju mogućnost da iz svoje sobe i sa svog računala nađete dobar posao. I sami smo svjedočili tome – nekolicina vrlo dobrih programera iz Hrvatske mlađih od 30 godina je rješavajući ove zadatke dobila ugovore koji su ih odveli u silicijsku dolinu. Istina, prve godine su stažirali i zarađivali u prosjeku 5000 dolara mjesečno, dok su im danas primanja prilično veća. Nije li to dovoljna motivacija da se i vi počnete baviti algoritmima? Posebice ako već programirate?

Knuth, Cormen, Sedgewick …

Odgovor na maloprije spomenuto pitanje je, nažalost – ne. Mnogi programeri se jednostavno ne žele zamarati novim učenjem, a posebice ne stvarima kao što su složeni algoritmi i matematika. Jednostavnije je graditi jednostavnije aplikacije, zaraditi pristojnu plaću i to je to. I u jednu ruku to je u redu. No kada se već bavite programiranjem, bilo bi dobro da iz glave možete napisati 50-ak osnovnih algoritama, a tiču se pretraživanja, sortiranja, analize podatkovnih struktura i slično. Samim time ćete si uštedjeti puno vremena kod izgradnje aplikacije, a može vam pomoći i u spomenutim natjecanjima.

Ako vas zanimaju algoritmi, a ne znate od kuda biste počeli učiti, preporučili bismo vam tri knjige. Dvije su praktički uvod u algoritme:
– Introduction to algorithms (Cormen, Leiserson, Rivest, Stein)
– Algorithms (R. Sedgewick)

S ove dvije knjige ćete naučiti spomenutih 50-ak algoritama koje bi svaki programer trebao znati. Naravno, postoji i jedna knjiga koja se u programerskim krugovima smatra biblijom za algoritme, a riječ je o ogromnoj seriji knjiga pod nazivom „The art of computer programming“. Iza nje stoji poznati matematičar Donald Knuth koji je ovu seriju knjiga počeo pisati jako davno i za sada je dovršio 4 knjige. Te knjige analiziraju jako puno algoritama (usudili bi se reći da ako u ovoj knjizi ne nađete rješenje za svoj problem, onda rješenje problema niti ne postoji) i imaju oko 3100 stranica. Da, dobro ste pročitali. U planu su još 3 knjige, no vrlo vjerojatno nikada neće biti dovršene. Razlog je što je Donald Knuth već debelo zagazio u sedamdesete godine. Kako god bilo, ove 4 knjige su vam i više nego dovoljne da naučite sve što trebate. Čak je i sam Bill Gates izjavio da ako je netko sposoban pročitati te knjige od korica do korica (pročitati, ne ih i naučiti), da mu pošalje svoj CV i da će ga primiti u Microsoft. Sve u svemu, materijala imate, pitanje je volje i truda koji ste spremni uložiti u to.

Google Code Jam

Mnogo puta smo kritizirali Google zbog njihovih poslovnih poteza. Od nekih loših poteza koje su napravili prilikom izrade Android operativnog sustava do njihovog špijuniranja korisnika i prikupljanja podataka o istima. Ako nas redovito pratite, nedavno smo pisali o privatnosti na Internetu i o tome kako Google prikuplja podatke. Sve je legalno i po zakonu, a kako korisnici ne čitaju EULA-u, ne znaju što se zapravo događa s njihovim podacima. Ukratko, prikupljaju se, obrađuju i prodaju marketing agencijama, te ustupaju raznim drugim agencijama koje mogu u bilo kojem trenutku zatražiti neki podataka o vama (op.a. kao recimo NSA).

No ima Google i dobrih stvari, a jedna od njih je Google Code Jam. Vjerujemo da mnogi od vas nikada nisu čuli za GCJ, pogotovo ako ne programirate. Riječ je o fantastičnom natjecanju koje je postalo iznimno popularno u zadnjih par godina. Sve je počelo 2003. godine kada je Google izgubio veliki broj dobrih programera i morao je naći način da filtrira programere na neki novi način. Svaki dan su dobivali na stotine životopisa i molbi za posao, a njihova politika je da se svaki CV mora pregledati i evaluirati. To je zahtijevalo puno vremena i ljudskih resursa, a davalo je jako malo dobrih programera. Naravno, s onim „odabranima“ su se morali raditi dodatni zadaci, intervjui, razgovori … U to isto vrijeme postojao je i određeni usmeni dogovor među IT kompanijama da si neće otimati međusobno dobre programere (op.a. taj dogovor je prekinuo Facebook 2007.-e godine kada je počeo svim kompanijama „uzimati“ što god je mogao i „kupovati“ ljude sa abnormalno velikim plaćama). Upravo iz tih razloga je 2003. godine pokrenuto natjecanje Google Code Jam kojem je cilj dati programerima zanimljive algoritamske zadatke te vidjeti tko su najbolji programeri koji se žele natjecati.

Oni koji dođu do kraja su svakako sposobni drugačije razmišljati jer da nisu, ne bi bili pri samom vrhu natjecanja. Struktura natjecanja je slijedeća: kvalifikacijska runda (svi koji prođu kvalifikacije idu u prvi krug natjecanja), zatim prva runda gdje ostaje X tisuća programera, zatim druga runda sa 500 ili 1000 najboljih (mijenja se u ovisnosti o broju prijavljenih programera u prvoj rundi), te se na kraju odabire 25 najboljih koji se uživo natječu za glavnu nagradu, s time da svi oni dobiju avionsku kartu do jednog američkog grada gdje se finale održava – najčešće u velikim gradovima poput New Yorka, Los Angelesa… Tih 25 programera se bori za nagradu koja varira od 10 do 15 tisuća dolara. Naravno da nagrada nije samo ta, nego svih 25 programera, u pravilu, dobije posao ili stažiranje u Googleu što je mnogo veća nagrada nego novac. Osim ovih 25 programera, mnogi drugi programeri (top 300-400) dobiju ponude nekih drugih kompanija koje koriste Googleove rezultate kako bi si našli mlade i sposobne programere.

Naravno da mnogi od njih ne traže posao jer su dobri programeri i imaju posao, no ima onih koji tu priliku odlično iskoriste. Što se broja natjecatelja tiče, on varira iz godine u godinu. Zadnjih par godina broj je se popeo sa 10.000 (2010.) na 35.000 (2013.). Ima i mnogo više ljudi u kvalifikacijskoj rundi, no mnogi se prijave bez namjere da se natječu. U svakom slučaju, ovo je natjecanje koje ne želite propustiti. Izgubiti ne možete ništa osim par sati programiranja, no zadaci su toliko zanimljivi da ćete ih htjeti sve riješiti. Natjecanje počinje svake godine 12. travnja (kvalifikacijska runda), a traje do ljeta jer su razmaci između rundi oko 3-4 tjedna. Preporučamo vam da otvorite zadatke od prijašnjih godina i vježbate na njima, te pogledate kako to natjecanje zapravo izgleda.

Facebook Hackers Cup

Kako to obično biva, Facebook pokupi tuđu ideju, preslika pravila, stavi svoje ime u naziv i stvori „tradiciju“. Facebook Hackers Cup (FHC) je nastao 2011.-e godine sa istim razlogom koji smo naveli maloprije za Google Code Jam. Programersko natjecanje je odličan način da si nađete potencijalne zaposlenike i da na brzinu filtrirate na desetke tisuća programera, s time da ćete naravno od svakog dobiti i source code njegovog rješenja pa možete vidjeti i kakav je njegov stil pisanja kôda i da li ima potencijala ili je samo „običan“ programer sa osrednjim rješenjem. Dobiti posao u Googleu ili Facebooku je prilično teško jer mjesta ima samo za one najtalentiranije, a ako ste talentirani, ovakva natjecanja vam nisu preteška ili uz malo truda možete doći do kraja. Ili bar u velikoj većini slučajeva možete.

Ponekad se poklope zadaci koji su jednostavno teški ili zahtijevaju točno određenu matematičku formulu da biste dobili točan rezultat. Ako ne znate istu, onda je nemoguće da problem riješite. Sva sreća, takvih zadataka je malo – većina ih je vrlo kreativna, no morate imati određene vještine da biste ih riješili. Uvelike pomaže ako znate razne algoritme za sortiranje, pretraživanje podataka i slično, no u početnim rundama se zadaci mogu riješiti na mnogo načina. „Brute force“ je vrlo popularna tehnika rješavanja zadataka koja je u kasnijim fazama natjecanja strogo zabranjena ili su zadaci koncipirani tako da spomenutom tehnikom ne možete doći do rješenja. Što se samog natjecanja tiče, rekli smo da je vrlo slično Googleovom.

Imate kvalifikacijsku rundu, dvije runde u kojoj ostaje 1000, odnosno 100 najboljih programera, te finale sa 25 najboljih. Prve tri godine – 2011., 2012. i 2013. godine – se finale održavalo u velikim svjetskim metropolama, dok je ove godine praksa da se finalisti natječu od doma. Svi u isto vrijeme mogu pristupiti zadacima i tko skupi više bodova – pobjednik. Možda nije loše jer ne mogu svi uvijek doći do Amerike i natjecati se. Problem je vize koje morate ishoditi da biste došli do Amerike, pa mnogi ne stignu riješiti svu potrebnu papirologiju jer je premalo vremena između zadnje runde i finala. No kako god bilo, FHC je također fantastično natjecanje koje počinje krajem godine i traje do početka travnja. Broj natjecatelja je vrlo sličan onome kod GCJ-a i čini nam se da se stalno isti ljudi natječu. Ili su bar isti ljudi konstantno u vrhu. Recimo, Petr Mitrichev je dvostruki pobjednik FHC-a i to 2011.-e i 2013.-e godine.

Zanimljivo je da je Petr zaposlenik Googlea i da se jednom na proglašenju pobjednika pojavio sa Googleovom karticom koju njihovi zaposlenici imaju zataknutom za remen. On se pravdao da ju je zaboravio skinuti, no teško je u to povjerovati. Također preporučujemo da se uključite u ovo natjecanje. Prilika vam je za 6-7 mjeseci kada će početi FHC 2015, a do tada stignete pročitati jedno od knjiga koja će vas uvesti u svijet algoritama.

TopCoder

Google Code Jam i Facebook Hackers Cup su natjecanja koja se događaju jednom u godini dana. Ako pogriješite, odnosno ne prođete kvalifikacijsku rundu, godinu dana nemate što raditi, osim rješavati stare zadatke kako biste se izvježbali ili naučili nešto novo. No natjecati se s drugim programerima ne možete. Zato postoje platforme poput TopCodera koje vam daju da se natječete cijele godine i to na raznim projektima, zadacima i protiv ogromnog broja programera. Sve je krenulo još prije 14 godina kada je Rob Hughes tražio način da nađe talentirane programere za jedna od svojih budućih projekata, a pošto je trenutačno bio nezaposlen (prodao je jednu kompaniju za veliku svotu novca, pa si je uzeo godinu dana pauze), ovo mu je bio hobi projekt. No, shvatio je da je to projekt za više programera pa je zaposlio brata i još 2 prijatelja, uložio svojih 500.000 dolara i krenuo u razvoj programerske arene u kojoj će se najbolji programeri moći natjecati. Godinu dana kasnije, TopCoder je rođen no pitanje je bilo kako privući one najbolje programere? Spomenuta četvorka je došla na ideju da ponudi velikim kompanijama svoju platformu kako bi riješili probleme koje njihovi programeri ne mogu riješiti. Prva velika kompanija koja je iskoristila ovu platformu je bio Sun Microsystems.

Nagrade su bile ogromne (preko 100.000 dolara) i vrlo brzo su razni IT portali i tiskovine počeli pisati o mladim i talentiranim programerima koji se natječu u rješavanju teških algoritamskih problema. Popularnost TopCodera je tada počela rasti eksponencijalno, broj registriranih programera je rastao po par tisuća tjedno, nagrade su bile i više nego primamljive, a i sve velike IT kompanije su počele na ovaj način tražiti programere i rješavati određene probleme koje imaju pri razvoju svojih softverskih rješenja. Neke od njih su bile Yahoo, Intel, Oracle, Google … Vjerojatno ćete dobiti dojam da se ovdje radi samo o velikim IT kompanijama i teškim problemima koje one imaju za riješiti. No, to nije u potpunosti točno. Da, najveća natjecanja su sponzorirana od velikih kompanija, no TopCoder nudi jako puno različitih natjecanja i to na tjednoj bazi. U tim natjecanjima su nagrade mnogo manje, no dakako vrijedne (kreću od par stotina dolara do par tisuća dolara za pobjedu).

Postoji nekoliko vrsta natjecanja:
– Natjecanje u algoritmima
– Natjecanje u dizajnu
– Razvoj softvera (natjecanje od tjedan dana pri čemu programeri moraju razviti određenu funkcionalnost)
– Maratonska algoritamska natjecanja
– Testiranje (testirate softver i dobivate novac za pronađene bugove)
– Rješavanje bugova
– Ostalo

Svaki programer koji pobjedi određeno natjecanje dobije novac i određenu reputaciju. Što vam je veća reputacija, to ste više rangirani na određenim ljestvicama i lakše će vas poslodavci uočiti. Ono što nam se iznimno sviđa je to što su poslodavci, većinom smješteni u silicijskoj dolini, počeli preko ove stranice nuditi ugovore ljudima koji žive u Indiji, Kini, Bjelorusiji … Više prednost kod traženja posla nemaju „domaći“ programeri, nego oni koji su se pokazali najsposobniji na ovim natjecanjima. Preporučamo vam da si napravite korisnički račun i krenete sa natjecanjima – vrlo brzo ćete postati bolji programeri. A tko zna – možda vas u bliskoj budućnosti čeka i novi posao.

CodeChef

I za kraj ostaje nam još CodeChef. Stranica vrlo slična TopCoderu, no sa nešto manje programera i manjim brojem različitih natjecanja. TopCoder broji oko 400.000 programera, dok je CodeChef ispod 200.000, no to ne znači da je CodeChef manje kvalitetan. Dapače, CodeChef je idealan za one koji se bave algoritamskim zadacima jer u pravilu nudi samo takva natjecanja. No, krenimo redom. Nakon registracije na ovu web stranicu (web-platformu), vidjeti ćete vrlo jednostavno korisničko sučelje sa 3 sekcije – Practice, Compete, Discuss.

Prva sekcija je sekcija gdje bi početnici trebali krenuti. Tu možete naći jako veliki broj problema razvrstanih po kategorijama – easy, medium, hard, challenge, peer, school. Odaberite onu težinu na kojoj vam je „ugodno“, odnosno rješavajte one zadatke koje mislite da možete riješiti. Kada njih riješite, pređite na višu razinu. Nakon što ste izvježbate, vrijeme je da se krenete natjecati. CodeChef ima natjecanja u pravilu svakih tjedan dana, odnosno ponekad i češće (svaka 3-4 dana). Velika natjecanja sa većim nagradama počinju prvog u mjesecu i traju nekoliko dana ili nekoliko sati. Ovisi o tome koliko je kompleksan problem.

Kao što smo rekli, ovdje se isključivo radi o algoritamskim problemima, dok na TopCoderu možete naći jako puno kategorija u kojima se možete natjecati. Ono što nam se iznimno sviđa ovdje su jednostavnost, brzina i dinamika natjecanja (manja natjecanja nikad ne prestaju i svaki dan u godini možete nešto kodirati ako želite), odličan forum za diskusiju problema, točnije starih natjecanja pri čemu možete naučiti jako puno. Pogotovo kada pogledate svoje rješenje i rješenje nekog veterana koji ove algoritme pojede za doručak. Da, to nas vodi do problema da je teško doći do vrha, no sa puno truda i kroz koju godinu i vi možete biti pri vrhu. Što se dobivanja posla tiče, službenih podataka nema, no sigurni smo da razni recruiteri bace pogled i na ovu web stranicu i da traže talentirane programere. U svakom slučaju, izgubiti nećete ništa, pa je naša preporuka da krenete sa CodeChefom, a kasnije se prebacite na TopCoder i spomenuta natjecanja. Puno sreće u natjecanjima.


RELATED ARTICLES

1 komentar

  1. Poštovani,

    dobar tekst.
    No, bilo bi zanimljivo asocirati čitatelje na mogućnosti koje se pružaju u nas. Naime, postoji izvanredno natjecanje HONI (Hrvatsko otvoreno natjecanje informatičara) iz područja algoritama, a pod okriljem HSIN-a (Hrvatskog saveza informatičara). Od tufa, ali i nekih povezanih asocijacija dolaze naši olimpijci…
    Upravo će u subotu završiti ljetni kamp HSIN-a na kojem se priprema i hrvatska “repka”, kako to volimo spomenuti.

    Jako pohvalno od vas što, osim samog “hardweraja”, spominjete toliko važnu “disciplinu” – algoritmi.

    osobno, predsjednik sam informatičke udruge “MIS” (udruga-mis.hr). Trudimo se da populariziramo algoritme. Teško je to u današnje vrijeme u Lijepoj Našoj, jer je lakše dobiti novac za neku priredbu, nego za učenje mladih naraštaja algoritmima.

    Stoga ste me doista “dirnuli” vašim člankom.

    Svaka čast!!!

    Srdačan pozdrav!!!

Komentiraj

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular