Ukoliko bacite pogled na prošli tekst koji sam ovde objavio, primetićete da se bavi testom za praksu u Microsoftu, odnosno u Microsoft Development Center Serbia. Dve nedelje nakon objavljivanja tog teksta, odnosno održavanja testa, pozvan sam na intervju kao jedan od N kandidata; vrednost broja N je, naravno, nepoznata.
Kao što je bio slučaj i kod testa, konkretne informacije je veoma teško naći na Internetu, pa bi bilo i više nego prikladno da ja sa vama podelim šta vas čeka na intervjuu, ako neke od sledećih godina odlučite da se prijavite za praksu.
Here be dragons…
Nakon što vam neko iz MDCS javi da ste pozvani na intervju, stići će vam e-mail sa bitnim informacijama, i jednim savetom:
When interviewing, it is important to feel comfortable. Microsoft prizes intelligence and contribution over style. The people that you interview with will probably be dressed a lot like the people on your college campus.
Ne znam da li e-mail iste sadržine šalju i onima koji konkurišu za posao, ali verujem da to jeste slučaj — od programera se ionako ne očekuje da svaki dan na posao dolaze u odelu (posebno ne po ovim vrućinama). Dakle, možete da očekujete da intervju bude krajnje opušten i ležeran.
Samo trenutak. Da li sam rekao “intervju”? Hteo sam reći intervjui. Dakle, nije u pitanju jedan intervju, već četiri komada kod četiri različita zaposlena u MDCS, svaki od po oko sat vremena, odnosno četiri sata ukupno. Ova brojka možda izgleda zastrašujuće, ali baš zbog gore pomenute opuštene atmosfere ovaj vremenski period veoma brzo prođe, i ni ne izmori čoveka toliko. Intervjui se međusobno ni ne razlikuju previše: sastoje se od nekoliko minuta razgovora o stavkama CVa, uz povremeno skretanje sa teme, i rađenja jednog zadatka ostalih 40-50 minuta. U svakom slučaju se ne mogu smatrati “tipčnim intervjuima”. Naravno, sva komunikacija se obavlja na engleskom.
Pitanja iz prvog dela intervjua nema smisla prenositi, pošto se razlikuju od osobe do osobe, pa ću odmah preći na zadatke. Kao što ćete verovatno primetiti, oni uopšte nisu teški, i brzo se rešavaju. Zašto onda taj deo intervjua traje preko pola sata? Zato što se kreće od najosnovnije verzije zadatka, ali se nakon toga dodaju zahtevi, menjaju početni uslovi, zalazi u detalje itd. Takođe, uglavnom se od vas traži i da napišete 100% tačan kôd u jeziku po izboru. Pretpostavljam da im je ovde najbitnije da vide vaš tok misli i kako se prilagođavate sve kompleksnijim i kompleksnijim problemima. Evo šta je mene dočekalo:
- Dat je niz od N stringova jednake dužine L. Potrebno je proveriti da li zadati string postoji u tom nizu. Na koje načine se ovo sve može obaviti? Koje su prekalkulacije potrebne? Koje su složenosti svakog od pristupa? Koji je najbolji? Osmisliti test primere za koje su ovi algoritmi najsporiji. Ono što sam ja uspeo da pređem za zadato vreme jeste:
- Binarna pretraga uz prethodno sortiranje niza
- Optimizovana binarna pretraga uz preskakanje karaktera na početku stringa koje ne moramo da proveravamo
- Pretraga upotrebom heširanja
- Upotreba trie-a
- Na drugom intervjuu su me sačekala dva pitanja, a prvo je bilo pomalo neočekivano:
- Potrebno je osmisliti chat sistem za veliku kompaniju sa puno zaposlenih. Kako bi on bio organizovan? Šta bi se nalazilo sa serverske, a šta sa klijentske strane?
- Data je sortirana skip lista. Potrebno je proveriti da li sadrži zadati element. Nakon što sam se izborio sa ovim zadatkom, usledilo je još jedno dodatno pitanje: koje još strukture imaju 2n pokazivača (što je slučaj kod skip liste)? Naravno, u pitanju su dvostruko povezana lista i binarno stablo.
- Za razliku od prethodna dva intervjua, treći se pomalo bavio i matematikom, i sastojao se od tri zadatka.
- Dato je K sortiranih nizova različitih dužina sa ukupno N elemenata. Potrebno je formirati jedan sortirani niz dužine N koji bi sadržao sve elemente. Trivijalno rešenje je prolaz kroz početke svih nizova za svaki element (složenost Θ(n*k)), dok se brži algoritam dobija upotrebom heap-a, gde je složenost Θ(n*logk).
- Data su dva realna intervala. Iz oba intervala se bira po jedan nasumičan broj, sa uniformnom raspodelom. Potrebno je odabrati jedan od ova dva intervala tako da je veći od ona dva nasumična broja češće baš iz tog intervala. Tačnije, potrebno je odrediti interval za koji je veća verovatnoća da je veći od dva broja generisan iz tog intervala. Konfuzno, znam. Postoje dva pristupa za rešavanje ovog problema. Prvi je da se ispišu verovatnoće za svaki od tri slučaja preklapanja intervala (nema preklapanja, delimično preklapanje, potpuno preklapanje), pa da se u kôdu na osnovu toga bira interval. Međutim, postoji daleko jednostavnije rešenje, a to je da se bira interval čija sredina ima veću vrednost — iako nije očigledno, grafičkim prikazom verovatnoće (jedan interval na X-osi, a drugi na Y-osi) se ovo lako dokazuje.
- U komunikaciji sa serverom klijent dobija neki niz objekata nepoznate dužine. Jedina metoda dostupna klijentu jeste dobavljanje sledećeg objekta, koja vraća null u slučaju dolaska do kraja niza. Nakon što se dođe do kraja niza, potrebno je da klijent nasumično vrati jedan od primljenih objekata, sa uniformnom raspodelom. Ne postoje resursi za čuvanje svih objekata. Rešenje se zasniva na tome da se u svakom trenutku čuva samo jedan objekat, koji se sa određenom verovatnoćom zamenjuje sledećim objektom. U ovom slučaju, ta verovatnoća je 1/brojPrimljenihObjekata.
- Poslednji intervju je opet bio “čisto programerski”, sa dva pitanja.
- Dato je binarno stablo i dva pokazivača na elemente iz tog stabla. Potrebno je odrediti njihovog prvog zajedničkog pretka. Kako bi izgledao algoritam ako čvor osim pokazivača na svoju decu ima i pokazivač na roditelja?
- Dato je binarno stablo. Svaki čvor osim pokazivača na decu ima i pokazivač na sledeći čvor u tom nivou (prvi desno od njega), koji nije inicijalizovan. Potrebno je inicijalizovati ove pokazivače za sve čvorove. Problem se rešava in-order prolaskom kroz stablo i pamćenjem poslednjeg čvora koji smo obišli za svaki od nivoa.
Sve u svemu, intervju na kraju i nije bio toliko teži od testa. Nekima će možda razgovor u četiri oka predstavljati problem, i izazvati pad koncentracije, ali ja intervju ipak vidim kao prednost — poslodavac može da čuje kako razmišljate, a i uvek možete da ostavite utisak da nešto znate iako to nije slučaj. Samo treba da budete dovoljno dobri sa rečima.
Super post. Zvuči kao da ćeš baš dobro da prođeš. Srećno! :)
Nikad se ne zna, sve zavisi od ostalih kandidata… Sada samo strpljivo sledećih nedelju dana.
I kako si prošao na kraju?
Dobio sam praksu, i već više od mesec dana radim tamo :)
Koristan post.
Da li po zavrsetku MS ponudi i posao nekima (ili svima) koji su bili na praksi?
Inace MS ponovo ima otvorena mesta.
Ukoliko su zadovoljni – ponude bez problema. Kolega koji je bio sa mnom na praksi, na primer, se ponovo vraća ovo leto (opet na praksu, pošto još nije diplomirao). To MDCSu čak i više odgovara, jer dolaze ljudi koji su već upoznati sa načinom rada i sa ostalim zaposlenima, pa sve ide mnogo brže. Naravno, to važi i za puno zapošljenje nakon obavljene prakse.
Hvala na postu. Pomoglo mi je da se pripremim i prosao sam na intervju. :-) Sad cekam odgovor… Jel se svima jave, ili samo onima koji se prosli? U koje doba su se javili prosle godine? Koliko je trajala birokratija i kad si poceo praksu? Tnx :-)
Mislim da svima javljaju – meni je odgovor posle intervjua stigao za dve nedelje. Birokratija je minimalna: dobiješ ponudu, prihvatiš je, izvadiš radnu knjižicu (ako nemaš) i potpišeš ugovor. Ponudu sam dobio sredinom juna, a počeo sam sredinom jula.
Evo ovako,imam par pitanja. Interesuje me da li ima nekoga od zaposlenih sa privatnih fakulteta? Posto moj fakultet saradjuje sa MS-om zato pitam,i da li je to bitno,t.j da li se gleda to kod njih da li si sa privatnog ili drzavnog,i da li je presudan prosek ili kako prodjes na testu? Hvala ! :)
Ne znam kakva je situacija sa drugim privatnim fakultetima, ali sa mog ima dosta ljudi u MDCSu — verovatno su jedna od kompanija kojoj je to najmanje bitno. Prosek isto tako nije presudan (ali ni nebitan, jer treba za početak da te pozovu na test), pošto selekciju prevashodno vrše preko testova i intervjua, što je onda dovoljno dobar pokazatelj kompetentnosti kandidata. Konkretno, mislim da u ovom trenutku ima oko 5 zaposlenih sa mog fakulteta, dok je letos na praksi bilo i više od toga, i ljudi uglavnom dobijaju i poziv da se vrate da rade za stalno.
Super postovi. Jedine iole konkretnije informacije koje sma uspeo da nađem na netu sem onih par zadataka iz FAQ na sajtu MDCSa..
Da nisi upoznat otprilike koliko ljudi primaju na praksu?
Mislim da nemaju konkretan broj, ali čini mi se da se obično kreće tu negde oko 10-15 ljudi.
Da li se konkretno ovi testovi vrte stalno, ili ih menjaju? Koj si fakultet završio?
Stalno smišljaju nove testove, ali je sadržaj uglavnom sličan – 5 zadataka iz programiranja (i lakših i težih), jedan iz verovatnoće, i jedan iz analize. Završio sam Računarski fakultet.
Jel za zaposljenje nakon zavrsene prakse mora da se pokaze diploma fakulteta ili moze i bez zavrsenog fakulteta da se dobije stalno zaposlenje. I molim te navedi cifru koja se dobija dok si na praksi posto takvi podaci ne mogu nigde da se nadju a jako su bitni ljudima koji ne zive bas blizu. Znam da je spomenuto u njihovim FAQ ali to nece skoro nikog zadovoljiti. Hvala unapred
Nije neophodna diploma, jer prvenstveno posmatraju učinak tokom prakse, ali se ipak očekuje da diplomiraš u nekom trenutku.
Što se tiče plate, ne bih zalazio previše u detalje (a i ova cifra varira od godine do godine), ali je zaista sasvim dovoljna da iznajmiš stan u centru Beograda, živiš komotno bez ustručavanja, i da ti pritom ostane neka ušteđevina.
Hvala svima na korisnim informacijama. Imam samo jedno pitanje: u kom programskom jeziku/jezicima je moguce na intervjuu i na pisanom testu (korak koji prethodi intervjuu) resavati programerske zadatke? Da li moze samo opis algoritma, neka pseudo forma… Ako ne, da li u obzir dolazi i npr. Java, ili samo nesto sto vise tezi MS-u, C/C++, C#?
Za test sam ti odgovorio na drugom komentaru, ali i za intervju važe slična “pravila” – može da se koristi bilo koji jezik osim pseudokôda (jedan kolega je radio u Javi, tako da može i to).
Naravno, za razliku od testa, ovde ima dosta razgovora sa osobom koja te intervjuiše, pa je bitno i kako razmišljaš o problemu, što ti omogućava da određene stvari izostaviš iz kôda ukoliko ih napomeneš.
Da li je moguce koriscenje struktura koje nisu deo osnovnog jezika? Konkretno mislim na npr STL kolekcije, koje cesto mogu u velikoj meri da skrate kod.
Hvala unapred!
Moguće je, naravno, osim ako neka struktura sâma po sebi rešava problem koji ti je zadat. U tom slučaju bi morao da je objasniš, odnosno da pokažeš da razumeš kako to zapravo radi. Dakle, neke obične stvari kao što su sortiranje iz ili stack/queue/vector možeš da koristiš bez problema.
Nenade na FAQ sam procitao da nije vazno ako ne znamo da programiramo odnosno kod da pisemo ni u jednom jeziku. Bio sam u MDCS i pricao sa ljudima koji su mi to i potvrdili. Moje pitanje je da li bi ja tu kao student masinca mogao da dodjem na praksu sa jakom voljom da naucim sta god je potrebno da jednog dana postanem dobar u tome? Oko tehnike se vrtim manje vise ceo zivot tako da ne bi mi bio problem da se upustim u bilo sta. Unapred hvala!
U principu ti znanje programiranja nije neophodno da bi konkurisao, ali teško da možeš da prođeš bez istog.
Naime, na inicijalnom testu se obično nađu dva matematička zadatka (sa tim ne bi trebalo da imaš problema), ali i pet algoritamskih problema. Kao što su ti i potvrdili, njihova rešenja možeš da objasniš rečima, ali da bi uopšte stekao to znanje morao bi i da kôdiraš algoritme, jer se oni tako najbolje uče.
Ako malo drugačije formulišeš pitanje i priupitaš da li je moguće spremiti se za test ako nikada ranije nisi programirao – naravno da jeste.
S druge strane, znam da je ranije u MDCSu postojao i hardveraški tim, ali ne znam da li oni imaju drugačije kriterijume.
Postovani, da li se intervjui vode na engleskom ili srpskom jeziku?
Pozdrav !
Ceo proces se obavlja na engleskom jeziku.
Ja bih samo da te pitam kako si se snasao sa tim matematickim zadacima sobzirom da su bili na Engleskom, da li si malo vezbao te matematicke izraze na engleskom i to? I da li si bas ono tecno i savrseno pricao Engleski na intervjuima?
Zanima me da li ci aplicirao za praksu u toku studija(ako jesi u toku koje godine)?
Programiranje mi zvuci zanimljivo,probao sam neke bas lake kodove u Pythonu,ali,idalje ne razumem svrhu programiranja,moze li pomoc i neki savet? ^_^