Microsoft Interview Questions

29 April 2008

Am ales titlul ca să fie search engine friendly :) Nu vreau să vorbesc doar despre întrebări de la interviu, vreau, după cum am promis, să explic cum se poate ajunge la un interviu şi ce trebuie ştiut acolo.

Cum ajungi să dai interviu la Microsoft? Păi nu e foarte greu. Adică nu trebuie pile, PhD sau alte chestii. Fiind o firmă în expansiune continuă, cam tot timpul este nevoie de oameni. Cred că e de ajuns să depuneți un CV la http://www.microsoft.com/careers/, indiferent dacă pentru internship sau full-time şi veți fi contactați. Şi, dacă sunteți studenți, nu fiți intimidați de faptul că CV-ul vostru nu are 10 pagini, tocmai de acea există internship-uri, poziții entry-level şi altele. Dacă sunteți anul 2-3 la facultate, nici nu se aşteaptă de la voi să fi lucrat în n firme pe n poziții. Din câte ştiu eu, de contactat contactează majoritatea oamenilor care par interesați. Aici este primul pas – un phone screening. Un interviu live presupune deplasarea într-o locație din zonă (eu am dat interviuri în Bucureşti şi în Varşovia) unde vine şi o echipă din SUA sau de unde se fac angajări pentru a susține interviurile. Microsoft asigură transportul par-avion, cazarea şi masa. Phone-screening-ul îi convinge că merită să cheltuiască banii aferenți pentru aplicant. Acest interviu este mai mult unul de HR (Human Resources), nu tehnic – detalii mai jos. Odată trecut screening-ul, urmează interviul on-site. Interviul de angajare se dă cu 4, 5 sau 6 persoane, pe rând, aproximativ 45 de minute cu fiecare şi pauze de 15 minute între interviuri. Interviul penru internship se dă doar cu 3 persoane. La ambele, unul din interviuri se dă cu o persoană de la HR.

Interviul cu o persoană de la HR, după cum ziceam, nu presupune întrebări tehnice deoarece angajaţii de la Human Resources nu sunt persoane tehnice. Aici se pun câteva întrebări de genul dacă eşti dispus să te muţi, din ce dată ai putea începe etc. Adică date de care ei au nevoie, şi câteva întrebări din care să afle ceva despre personalitatea ta, de exemplu care este ultima tehnologie învăţată pe cont propriu, când ai învăţat-o, care este proiectul realizat de care eşti cel mai mândru etc. Pentru un om pasionat, aceste întrebări nu ar trebui să pună o problemă – trebuie doar să dai dovadă de entuziasm, să vorbeşti cu plăcere despre ce ai făcut şi ce ştii.

Interviurile tehnice decurg puţin altfel. Am să generalizez deşi, în funcţie de poziţia pentru care aplici, unul sau două din interviuri poate să difere puţin de ce voi prezenta. În primul rând se dă o problemă de algoritmică. Exemple de probleme ce le-am primit (scuze dacă nu o să dau enunţul “ca la carte”):

Se dă un vector sortat cu n numere. Să se elimine copiile numerele (adică pentru numerele care apar de mai multe ori – să rămână fiecare o singură dată).

Se dă un vector cu n numere, a1, a2… an. Elementele pot forma sume astfel: un element distinct (a[i]), câte două elemente alăturate (a[i] + a[i+1]), câte trei (a[i] + a[i+1] + a[i+2]) şamd. până la suma tuturor elementelor (a[1] + a[2] +…+ a[n]). Să se determine suma maximă ce poate fi obţinută astfel.

Se dau două noduri într-un arbore binar. Să se determine primul lor părintele comun (de jos în sus, desigur). Nodurile din arbore au legături atât spre copii cât şi spre părinţi.

Căutarea binară a unui element într-un vector sortat.

Adăugarea unui nod într-un arbore binar de căutare.

Aici e foarte important feedback-ul. Oamenii cu care dai interviu vor să vadă cum gândeşti astfel încât, cum ai primit enunţul, e bine să gândeşti cu voce tare posibile soluţii, nu să iei foaia şi să amuţeşti 15 minute. Nu e nici o problemă dacă soluţia gândită nu e cea mai bună, sau dacă te blochezi, pentru că te ajută cu întrebări de genul “Dar dacă x atunci cum ar fi?”. E foarte important să vadă şi cum abordezi problema.

Apoi urmează implementarea, adică să scrii codul soluţiei. Asta se face pe hârtie într-un limbaj la alegere (C, C# etc.). Nu se depunctează dacă ai uitat să pui ; sau să închizi ghilimele. Odată scris codul, te întreabă ce complexitate are – de obicei soluţiile nu ar trebui să aibă mai mult de O(n). Analiza algoritmului cerută nu e complexă fiindcă e dată pe probleme ce au soluţii relativ simple. Trebuie ştiut doar ce înseamnă big O notation şi care sunt complexităţile la parcurgerea unui arbore binar de căutare şi la un for de la 1 la n.

După asta ţi se cere să înşiri test-cases pentru problemă. Aici atenţie pentru că test-cases sunt destul de multe. Pentru cine nu are experienţă cu testarea formală (de exemplu la mine la facultate nici vorbă de vreun curs despre testare), cade în capcana de a crede că testarea unui program înseamnă butonarea lui până la apariţia unei eventuale erori. Complet eronat. Aici trebuie ştiut ce înseamnă unit testing, performance testing, boundary value testing, security testing, usability testing şi altele (dacă nu aţi mai auzit nu vă speriaţi că nu e foarte complicat, puteţi începe să citiţi de aici). Ca să dau un exemplu, înşir câteva test-cases pentru problema cu adăugarea nodului în arborele binar de căutare:

1. Un arbore “gol” (unde root e null)

2. Un arbore cu un singur nod

3. Un arbore invalid (unde, de exemplu, un nod are copil un nod superior)

4. Un arbore cu 1.000.000 de noduri

5. Introducerea unui nod care nu are valoare numerică

6. Introducerea unui nod cu valoarea numerică egală cu un nod frunză

7. Introducerea unui nod cu valoarea numerică egală cu nodul rădăcină

etc.

Idea e să vii pe moment cu cât mai multe astfel de teste. Şi, neapărat, să pui întrebări – dacă vorbim de performanţă, pe ce maşină rulează, dacă vorbim de numere, ce numere (naturale, întregi, reale)?

Dacă problema pusă este simplă, se poate să mai primeşti o a doua problemă sau o întrebare strict de testing, de exemplu:

Avem un program care adună două numere (primeşte input două numere şi întoarce suma). Spune test-cases.

Cam aşa decurge un interviu tehnic. Mai există şi excepţii – de exemplu cum ai proiecta un lift? Întrebare de design pe care o rezolvi la tablă, dar cel puţin 2-3 din interviurile tehnice, dacă nu toate, decurg cum am spus mai sus.

Cam ce trebuie ştiut când te prezinţi la interviu: structuri de date (liste, cozi, stive, arbori), algoritmi de bază (parcurgerea listelor, parcurgerea arborilor binari etc.), analiza algoritmilor (după cum am spus mai sus, nu toată teoria, doar să ai habar), testare. Din experienţa personală pot spune că s-a renunţat la puzzle-questions – nu pot garanta pentru toţi, depinde de norocul fiecăruia – dar oricum mai bine ştii ce complexitate are quicksort decât cum împart piraţii banii ;)

Nu trebuie să te prezinţi la costum, nu se ţine cont de asta. Interviurile se dau în limba engleză şi durează, cu pauze cu tot, în jur de 5-6 ore.

Baftă!


De ce nu bloghez în ritmul în care aș vrea

5 April 2008

Pentru că nu am timp. În ultimele două săptămâni am fost foare ocupat. În primul rând am primit Telefonul. Telefonul fiind de la Microsoft, unde am dat un interviu pe la începutul lui martie, unde se pare că m-am descurcat. Dacă toate merg bine (adică iau licența cu bine, iau viza și sunt bine sănătos), în octombrie plec, împreună cu viitoarea mea soție, în Vancouver la echipa Atlas. Ce legătură are asta cu faptul că nu am mai postat nimic de atât timp? Păi m-am sărbătorit :P Am fost la bere.

A doua cauză principală a faptului că nu am mai scris nimic este o restanță pe care o aveam de anul trecut, restanță la Sisteme de Operare II. Cum plecatul meu din țară depinde direct de obținerea licenței la vară care, la rândul ei, depinde direct de luatul tuturor examenelor, am învățat din răsputeri ca să reușesc să trec de restanță (și am și trecut). Și pe urmă m-am sărbătorit :) Și dacă tot vorbesc despre sisteme de operare, cartea pe care a trebuit să o citesc, Operating System Design and Implementation, mi s-a părut chiar foarte interesantă și o recomand.

Oricum nu am scăpat încă de toate grijile având în vedere că semestrul se gată în patru săptămâni și până atunci trebuie să predau o grămadă de teme și proiecte, așa că nu promit că mă voi apuca de postat în ritmul în care aș vrea dar promit că voi scrie, pentru cine e interesat, cum am ajuns să dau interviul de angajare la Microsoft, în ce constă, cum decurge și cam ce trebuie să știi înainte să te prezinți acolo.

Seria de posturi despre construcția compilatoarelor, pe care vreau să o las în cyberspace pentru posteritate, o voi continua când mă voi apuca din nou de lucru la licență – deocamdată timpul nu îmi permite.