środa, 3 czerwca 2015

Jak wyjść zwycięską ręką z rozmowy kwalifikacyjnej z Amazonem, Facebookiem czy Google?

Cieszą nas Polacy, którzy trafiają na bloga szukając informacji o Seattle, gdyż znaleźli tu pracę w Google lub w Amazonie i przygotowują się do wyjazdu. Dzisiejszy post kieruję do podobnej grupy: tych, którzy dopiero tej pracy szukają i zastanawiają się co trzeba zrobić, żeby dostać ofertę od Google. Uwaga! Tylko dla programistów!

Od jakiegoś czasu rekrutuję ludzi dla Amazona, więc wiem jak to wygląda za kulisami. Wiem też jak to wygląda z punktu widzenia kandydata, bo sam przebrnąłem z różnym skutkiem przez rozmowy w kilku amerykańskich korporacjach. Mam wielką nadzieję, że ktoś na moich doświadczeniach skorzysta!

Wszystko co poniżej napiszę odnosi się do modelu rekrutacyjnego stosowanego przez duże amerykańskie firmy: Google, Amazon, Facebook, Microsoft itd. Opowiem tylko o rekrutacji na typowe programistyczne stanowisko, gdzie oczekuje się ogólnego obycia w dziedzinie informatyki, a nie jakiejś wiedzy specjalistycznej typu układy elektroniczne czy sieci komputerowe.

Zanim zacznę, jedna rada, ważniejsza niż cała reszta tej notki razem wzięta. Nie ma lepszego sposobu na przygotowanie się do rozmowy kwalifikacyjnej niż rekrutowanie innych. Stojąc po drugiej stronie, zobaczysz czego oczekuje się od kandydatów i dużo łatwiej będzie ci wpasować się w wymagania rekrutujących. Motywacja do podszlifowania podstaw informatyki to darmowy bonus.

Dorzucę jeszcze jedną, a co! Niezależnie od tego kim jesteś, przyda się odrobina szczęścia. Przygotuj się najlepiej jak potrafisz, ale koniec końców twój los zależeć będzie od rekrutujących. Ludzi których uczy się, że dużo łatwiej kogoś przyjąć do firmy niż zwolnić. Twój sukces będzie zależał m.in. od tego kto w danym dniu będzie cię pytał i jakie zada ci pytanie. Czasem się nie uda. Większość dużych firm pozwala próbować co pół roku, więc startuj co pół roku. Za którymś razem dopisze szczęście! A teraz do rzeczy...

Proces rekrutacji technicznej zaczyna się zwykle od rozmowy lub rozmów telefonicznych (phone screen), trwających około godziny każda. Jeżeli popiszesz się wiedzą, firma zaprosi cię na właściwą rozmowę w swoim biurze (onsite). Ta trwa najczęściej 4 do 6 godzin z przerwą na lunch i upakowana jest po brzegi wyzwaniami, najczęściej z szeroko rozumianych podstaw informatyki. Co trzeba umieć?

1. Algorytmika i struktury danych


Materiał? To czego uczyli cię na pierwszym roku studiów i... tyle. Tu nikogo nie interesuje czy jesteś mistrzem sztucznej inteligencji, systemów rozproszonych czy systemów operacyjnych: nie zwalnia cię to z rozumienia podstaw. Nie interesuje ich jakiego języka programowania użyjesz, ale musisz wiedzieć wszystko o:
  • Iteracji i rekurencji.
  • Analizie algorytmów: złożoność obliczeniowa i pamięciowa.
  • Strukturach danych: tablice, listy, mapy, stosy, kolejki, kopce, kolejki priorytetowe, drzewa, grafy.
  • Rozwiązaniach typowych zagadnień: sortowanie, wyszukiwanie binarne, hashowanie, BFS i DFS w grafach.
  • Rzadziej zapytają cię o operacje na bitach i programowanie wielowątkowe.
Czemu pytają? Bo przy skali na jakiej operują te firmy różnica między algorytmem O(log(n)) a O(n) miewa znaczenie. Przede wszystkim jednak dlatego, że takie zagadnienia poddają się łatwo obiektywnej ocenie. I są dobrym sposobem na oszacowanie zdolności kandydata do rozwiązywania problemów. Jeżeli nie dostałeś oferty, możesz być prawie pewny, że przyczyniła się do tego algorytmika.
Przykładowe zadania:
  • Mając dane repozytorium Git z kodem zawierającym buga oraz API sprawdzające czy dana rewizja posiada ten bug, przedstaw funkcję która odpowie na pytanie: w której rewizji bug pojawił się po raz pierwszy.
  • H-index to numer przypisywany publikującym naukowcom. H-index naukowca to największe h takie, że naukowiec opublikował conajmniej h prac, a każda z jego prac miała conajmniej h przytoczeń. Dana jest lista publikacji naukowca - wyznacz jego h-index.
  • Wyobraź sobie macierz liczb modelującą teren. Liczba w elemencie macierzy reprezentuje jego wysokość nad poziomem morza. Lewa i górna krawędź macierzy to Ocean Spokojny. Prawa i dolna to Ocean Atlantycki. Znajdź wszystkie elementy macierzy takie, że jeśli umieścisz tam źródło rzeki, woda spłynie do obu oceanów. Woda rzecz jasna spływa z elementów macierzy o większej wysokości do sąsiadów o niższej wysokości, nigdy odwrotnie.
Jak wykazać się wiedzą:
  • Upewnij się, że rozumiesz zadanie. Uściślij wymagania pytaniami.
  • Zaproponuj różne rozwiązania, o różnej złożoności obliczeniowej.
  • Zakoduj jedno z zaproponowanych przez siebie rozwiązań. Kod musi być elegancki i łatwy do zrozumienia.
  • Przetestuj swoje rozwiązanie na oczach rekrutującego: sprawdź krok po kroku czy działa na kilku przykładach. Uwzględnij edge cases.
Jak się przygotować? Przeczytaj dobrą książkę o algorytmach (na przykład taką), żeby odświeżyć podstawy. A potem już tylko koduj, koduj, koduj. Im więcej tysięcy linii kodu tym lepiej... Przydadzą się książki z katalogiem problemów i rozwiązaniami, np. dobrze znana i mniej znana. Koniecznie odwiedź też strony z przykładowymi zadaniami od ludzi, którzy przebrnęli przez rozmowy, np. tu.

2. Systemy rozproszone.


Materiał? Znacznie trudniej to usystematyzować... Na pewno przyda się znajomość web services, systemów kolejkowych, modelu publish-subscribe, baz danych, NoSQL, cloud computing, big data, search, cache, REST, uf...

Czemu pytają? Bo tym będziesz zajmował się w pracy. Pytania z tej dziedziny są często ubarwiane odniesieniami do biznesu, żeby sprawdzić jak kandydat radzi sobie z problemami o mniejszym stopniu abstrakcji. Opis problemu jest najczęściej nieprecyzyjny i niejednoznaczy, co wymusza na kandydacie dialog. W ten sposób sprawdzą jak radzisz sobie z wyjaśnianiem innym swoich pomysłów.

Przykładowe zadania:
  • Zaprojektuj web crawler.
  • Zaprojektuj system do wyszukiwania geograficznego: jakie restauracje znajdują się w pobliżu mnie.
  • Zaprojektuj gmail.
  • Zaprojektuj system do renderowania map całego świata z możliwością zoom.
Jak wykazać się wiedzą:
  • Niezbędna jest znajomość klocków, z których buduje się systemy.
  • Pytania z systemów rozproszonych to pytania otwarte - szczególnie ważna jest ciągła interakcja z rekrutującym. Odpowiadaj na pytania, sam zadawaj pytania, wykorzystaj tablicę.
  • Uściślij wszystko co przychodzi ci do głowy: ilu użytkowników, jak często odświeżane będą dane w systemie, ile tych danych, ile zapytań na sekundę, jak szybko system ma odpowiadać na te zapytania.
Jak się przygotować? Na pewno jest jakaś współczesna książka, która zgrabnie podsumowuje systemy rozproszone w dobie klastrów tanich maszyn i cloud computing. Niestety nic mi na jej temat nie wiadomo... Daj znać jeśli wiadomo ci więcej! Wertowanie internetu pomoże, ale jedynym skutecznym nauczycielem tego materiału jest doświadczenie. Najłatwiej zdobyć je w pracy, jeśli ma się to szczęście. W przeciwnym wypadku zamiast projektować prosty web crawler, siądź i go napisz. Napisz "mail na 5 minut" albo nowy Stack Overflow. Cokolwiek! Podepnij się pod AWS i wykorzystaj dostępne tam usługi. Nauczysz się w ten sposób niepomiernie więcej niż z książki.

3. Profesjonalizm i dopasowanie do kultury firmy.

Materiał? Ach, pytania behawioralne! Pora udowodnić firmie, że poza znakomitym warsztatem cechuje cię również profesjonalizm. Oraz znajomość produktów firmy i zasad którymi powinni kierować się jej pracownicy.

Czemu pytają? Bo stosunkowo łatwo (...) znaleźć zdolnego programistę, który zrobi co mu się każe. Dużo trudniej profesjonalistę, który zaangażuje się na sto procent, wykaże innowacyjnością i podniesie ducha w zespole. Bo nikt nie chce pracować z leniem, z arogantem.

Przykładowe zadania:
  • Opowiedz mi o projekcie, z którego jesteś najbardziej dumny.
  • Dlaczego chcesz pracować dla Google? Biuro Facebooka jest zaraz obok.
  • Opowiedz mi o sytuacji, gdy naprawiłeś coś w kodzie, choć nikt cię o to nie prosił.
  • Opowiedz mi o sytuacji, gdy przymuszony nadchodzącym terminem odpuściłeś sobie ścisłą kontrolę jakości.
  • Opowiedz mi o konflikcie ze współpracownikiem.
Jak wykazać się wiedzą:
  • Opowiadaj głównie o sobie i swoich osiągnięciach, nie o swoim zespole.
  • Odpowiadając na pytanie trzymaj się formuły: na czym polegał problem, jak go rozwiązałeś i jaki był efekt twoich wysiłków.
  • Bądź precyzyjny: "system który zaprojektowałem przyspieszył przetwarzanie o 20%" albo "algorytm który zaproponowałem przyniósł 10% więcej zysku".
  • Przygotuj się na pytania o tym czemu chcesz dla nich pracować i czemu powinni cię zatrudnić.
  • Bądź miły, uśmiechnięty i podekscytowany. Nawet po pięciu godzinach rozmów. Twój dobry nastrój udzieli się rekrutującym.
Jak się przygotować? Poszukaj na necie jakimi zasadami kieruje się firma i zastanów się jak wpasowałbyś się w takie środowisko. Dla przykładu, Amazon zawsze myśli o swoich klientach, a Facebook chełpi się swoim hacker culture. Zapoznaj się z produktami firmy i nowinkami na jej temat. Przeczytaj to. Zastanów się które z twoich dotychczasowych osiągnięć ukazują cię w najlepszym świetle i odnoś się do nich odpowiadając na pytania rekrutującego.

4. Programowanie obiektowe.

Materiał? Classes, decomposition, encapsulation, polymorphism, inheritance, composition, design patterns... Wszystko czego uczą na wstępie każdej książki o Javie.

Czemu pytają? Bo w większości dużych firm programowanie obiektowe jest wciąż dominującym paradygmatem i taki kod będziesz pisał na co dzień.

Przykładowe zadania:
  • Rozpisz diagram klas gry w szachy.
  • Rozpisz diagram klas talii kart.
Jak wykazać się wiedzą:
  • Usystematyzuj obiekty i operacje, które będziesz musiał zamodelować. Uściślij założenia z rekrutującym.
  • Przedstaw model za pomocną jasnej notacji, np. UML.
  • Zastanów się jak wzbogacić swoje rozwiązanie o wzorce projektowe. Dla przykładu, dodaj flyweight do twojej talii kart, żeby uniknąć konstrukcji zbyt wielu obiektów.
Jak się przygotować? Jeśli chcesz, przeczytaj dobry podręcznik, ale podobnie jak w przypadku systemów rozproszonych najlepszym nauczycielem jest tu doświadczenie. Jeśli uważasz że masz go za mało, to napisz web crawler. Albo system plików z dwiema implementacjami: lokalną i sieciową. Rozglądnij się za ciekawym projektem open source napisanym w C++ albo Javie i zaangażuj się trochę!

Na koniec link do starszego posta Basi, o rekrutacji odrobinę szerzej: klik.

8 komentarzy:

  1. This is a really good blog post. Google Translate is doing a better job than I thought it could :P

    OdpowiedzUsuń
  2. Good read. Fajnie że już miałeś okazję rekrutować, ja jeszcze nie miałem okazji na stanowiska programistyczne...

    Takie tylko uwagi:
    * h-index to NAJWIĘKSZA taka liczba. najmniejsza nie ma sensu, bo dla każdego wynosi 0.
    * nie czytelników a przytoczeń (citations) w cudzych artykułach, choć to sensu zadania nie zmienia

    OdpowiedzUsuń
    Odpowiedzi
    1. Poprawione, wielkie dzięki! Szczerze polecam rekrutację. Otworzy Ci wszystkie drzwi, jeśli jakieś są jeszcze przed Tobą zamknięte. ;) Diametralne różnice w postrzeganiu procesu przed i po, a poza tym w niewielkich dawkach to dobra zabawa!

      Usuń
  3. Fajny wpis, i gratulacje. Mozesz wyjasnic to pytanie o H-index? Jak podana jest informacja o ilosci przytoczen dla wybranego artykulu z listy? Bo jesli po prostu atrybut artykulu to jakos za proste sie wydaje (O(n)) albo czegos pewnie nie skumalem ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzieki! Mam nadzieję że nic nie pomylę, od rozmowy minęło już kilka tygodni... To akurat pytanie z Google.

      Na wejsciu masz liste z n elementami, gdzie każdy element reprezentuje jeden paper, a raczej ilość jego przytoczeń. Przykładowo: [3, 5, 7] oznacza, że opublikowano trzy prace. Pierwszą przytoczono 3 razy, drugą 5 razy, trzecią 7 razy. Zgodnie z definicją, h index w tym wypadku wynosi 3. [1, 1, 1] = 1. [1, 1, 2] = 1. [1, 2, 2] = 2 etc. Da się to rozwiązać liniowo, ale z użyciem dodatkowej pamięci.

      Jeśli za łatwe, to powalcz z wariantem streamingowym. Wyobraź sobie robota, który non stop publikuje prace, a ludzie na świecie zainteresowani są tym ile wynosi jego aktualny h index. Innymi słowy w chwili t dane masz wyżej opisaną listę prac robota i jego h index. W chwili t + 1 do listy dodawana jest jedna praca i musisz natychmiast zaktualizować h index.

      Usuń
    2. Hej, dzieki za sprostowanie. W miedzyczasie zgooglalem ten h-index i zrozumialem. Nie dotarlo do mnie ze chodzi o podzbior publikacji ktory daje najwiekszy h-index, teraz zadanko nabiera sensu. Wariant z robotem, tez ciekawy, bedzie o czym myslec w autobusie :)

      Usuń
  4. Jak zawsze super się czyta Wasz blot :).

    Paweł gratulacje z okazji zmiany pracy ! :)

    OdpowiedzUsuń
  5. Bardzo merytoryczny wpis. Rozmowa kwalifikacyjna w tak dużej korporacji to nie lada wyzwanie. Trzeba wykazać się niebywałą wiedzą i umiejętnościami oraz dodatkowo pokonać stres - jednak starania bardzo się opłacają.

    OdpowiedzUsuń