Válaszolj őszintén: mennyire vagy jó a tech interjúkon? Az elmúlt években hány tech interjúra mentél, és hány ajánlatot kaptál? Mekkora cégeknél interjúztál? Hány teljesen angol nyelvű interjú volt ezek közül?
Ha az interjúk kevesebb, mint 60%-án kapsz ajánlatot, ha kevesebb, mint 5 ajánlatod volt, vagy ha főleg magyar nyelven interjúzol, akkor ez neked szól. Ha ennél jobban teljesítettél, a többség, amit írok, valószínű ismerős lesz, de azért olvasd tovább.
Ki vagyok én?
Programozni - vagyis inkább hekkelni - a középiskola utolsó 1-2 évében kezdtem el. Jobb ötlet híján jelentkeztem a BME informatikára, ahol aztán az egyetem utolsó 2 évében főállásban webet fejlesztettem. Az egyetem után a diplomával és útlevéllel a kezemben kis kitérő után Londonban kötöttem ki, ahol többek között a JP Morgannél brókereknek írtam szoftvert, a Skype for XBox One első fejlesztője voltam, a Skyscannernél iOS-t fejlesztettem és open source-oltam a kódom egy részét, most meg az Uber-nél fejlesztek Androidra.
Közben interjúztam (többnyire sikeresen) a fentiek mellett a Facebooknál, Microsoftnál, Blinkboxnál, Bank of Americánál, Bloombergnél, Morgan Stanleynél, Tatánál meg egy csomó kisebb-nagyobb magyar és brit startupnál és cégnél. Az interjú / ajánlat arányom 90% körül van, a magyar nyelvűeknél ez 100%.
És az asztal másik oldalán is elég sokat voltam. Több, mint 100 szoftverfejlesztőt interjúztattam az elmúlt években, bizonyos időszakokban havi 10-nél is többet. A 100-ból kb 10-15 ember kapott ajánlatot - de akikre igazán emlékszem, az közülük is az a 4-5 elképesztően jó mérnök, akikkel habozás nélkül bármikor dolgoznék együtt.
Alapok
Mennyire vagy jó szoftver mérnök? Élvezed a kódolást? Építettél a nulláról valamit - mobil appot, weboldalt, okosóra widgetet, desktop programot, hardverrel összekötött alkalmazást? Másodszorra meg tudnád csinálni gyorsabban és jobban? Ha nem működik a kódod, otthagyod, vagy csakazértis végig debuggolod, egészen a framework, nyelv és OS szintjéig? Gyorsan átlátod mások kódját? Keresed a kihívásokat? Keresed az újdonságot - új nyelveket, platformokat, gondolkodásmódokat?
Van egy jó hírem. A legjobb tech cégekhez egy jó mérnök simán bejuthat. Diploma nélkül a Facebookhoz. Magyarként a Google-be, Apple-ba, Quorába, Uberhez... mindenhol belebotlasz valakibe, akinek ez az anyanyelve és hátszél nélkül került be.
Viszont tuti, 100%-an működő recept nincs, amit kipipálva garantáltan bejutsz egy top tech céghez. Az interview anti-loop sajnos létezik és mindenkivel megtörténhet - én is beleestem már. Ez körülbelül az egyetlen dolog, amire nem tudsz felkészülni, minden másra viszont jó eséllyel igen.
Az angolra nem is vesztegetnék túl sok szót: az angol az informatika közös nyelve. Nem számít a nyelvvizsga, az akcentus vagy nyelvtani helyesség, amíg megérteted magad, érted és használod a szakzsargont. Ahogy a kódolásnak, ennek az elsajátítása is csak idő és rendszeresség kérdése.
Az egyetemi diploma nagyon sokat segít és szinte minden mérnöknek van a legjobb cégeknél. Ha nincsen ilyen végzettséged, azért ne csüggedj: viszont tuti sokat kell dolgoznod pluszban, hogy behozd ezt a hátrányt. Minél inkább algoritmikus az interjú - és a legnagyobb tech cégek és forró startupok, mint Facebook, Google, Quora, Airbnb mind ezt preferálják - annál inkább előnyben lesznek azok, akik néhány félévig algoritmus elméletet, illetve az ehhez kapcsolódó elméleti alapokat tanulták az egyetemen. És mivel az interjúztatottak jó része egyetemi hátszéllel jön és ezeket ott felszedte, neked is meg kell tanulnod a gyakorlati alapokat.
Szakmai felkészülés
1. Kódolj, kódolj, kódolj
A legfontosabb tanács, amit adhatok: kódolj, kódolj, kódolj. Ha gyorsan akarsz fejlődni, akkor irány a Leetcode, a Code Wars, a Topcoder és hasonló coding challenge-ek. Nagyon nem egyszerű elkezdeni - viszont ha nem vagy képes a legkönnyebb algoritmikus példákat csukott szemmel megoldani és a nehezebbekel is elboldogulni, akkor csak szenvedni fogsz egy komolyabb interjún. Kezdd brute force megoldásokkal, amíg el nem kezded sajátítani a kifinomultabb megoldásokat. Lehet, hogy nehezebben fog indulni, de ez a fajta felkészülés fog messze a legjobban segíteni a legtöbb kódolós interjún.
Rengeteg interjún még mindig whiteboard coding-ot fogsz csinálni - vagy ha nem is ezt, de egy papírlapon kódolni, esetleg egy szövegszerkesztőben írni kódot. Ha már eleget kódoltál, az interjú előtt pár héttel ezt a részét is gyakorold: könnyű lefagyni, ha nincs az IDE, ami autocomplete-el kisegít. A napi szintű kódolást semmi nem fogja helyettesíteni - ha valamit, ezt a részét ne aprózd el és szánj rá sok időt.
Ajánlott felkészülés: Codility algorithm lessons és challenges, Leetcode, Project Euler, Hackerrank. Elsőre biztos nehezen fog indulni - de a Wikipedia, Google és Stackoverflow a barátaid. Emellett papíron kódolás, majd az így készült kód begépelése és leellenőrzése is rengeteget segít.
2. Algoritmusok
Ezzel párhuzamosan, az egyetemen tanított néhány anyag messze fontosabb, mint az összes többi együtt interjúkon, első helyen az algoritmusokkal. Az O(n) / O(logn) / O(n^2) komplexitás ismerete, népszerű sorting algoritmusok, binary tree, BDS, DFS és leggyakoribb algoritmikus adatstruktúrák (heap, stack, queue, hashtable, B-tree) ismerete és használata mind alap kell, hogy legyen. Az egyik legjobb módszer, hogy megismerd ezeket, ha implementálod őket a nulláról - legyen az hashtable, B-Tree vagy sorting algoritmusok. Amikor interjújra készültem, én is gyakran így frissítettem fel a tudásom.
Az algoritmusok pont egy olyan rész egyébként, ahol az egyetemi diploma sokat segít: ugyanis aki egy mérnök infót elvégzett, az egy algoritmus elmélet tárgyat egy féléven át végig hallgatott. Ha nincs meg ez a hátszeled, akkor rendesen rá kell szánnod az időt. És persze, ha már régen volt az egyetem, illetve amikor legutóbb felfrissítetted ezt a tudást, akkor is ideje leporolni ezeket és nekiállni gyakorolni.
Ajánlott felkészülés: The Algorithm Design Manual, Algorithms, 4th Edition, nekem mindkettő ott ül a polcomon. És persze ezeket kódolni is, hogy jobban megmaradjanak. Kódolás gyakorlásához a Codility algorithm lessons-t ajánlom.
Az algoritmikus interjúkkal egy nagy gond van: az, hogy alig van köze ahhoz, amit napi szinten fogsz csinálni. Illetve ha fejlesztő vagy, akkor meg ezek a problémák szinte biztosan nagyon távol állnak attól, amit napi szinten kódolsz. De akkor miért preferálják a top tech cégek ezt a fajta interjút?
A fő ok: ezek a problémák meglepően jól mérnek egy csomó fontos dolgot, ami egy jó fejlesztő ismérvei. Egy jó fejlesztő gyakorlatiasan gondolkodik, időbeli nyomás alatt valami működőt összerak, és átlátja a problémát, illetve a megoldásának a korlátait. Emellett pedig ért a debuggoláshoz, és helyre tud rakni triviális hibákat a saját, és más kódjában.
Egy algoritmikus probléma a fentieket mind jól méri le. Az idő rövid - általában 30-60 perc - és a probléma kellően összetett ahhoz, hogy ránézésre ne lehessen megoldani. Az illetőnek aztán el kell döntenie, hogy egy kevésbé optimális, de egyszerűbb algoritmust kódol le, vagy egy bonyolultabbat. Viszont ennek minden esetben legalább alapjaiban működnie kell - és ennek demonstrálására az interjún a kódot általában végig debuggolja, illetve kijavítja, ha egy hibát talál.
Néhány kisebb startup, mint a Stripe, próbálnak elszakadni az algoritmikus interjúktól. A legnagyobb és legismertebb cégeknél viszont szinte kivétel nélkül át kell menni néhány ilyen algoritmikus probléma megoldásán - szóval jobb nekiállni ezekre felkészülni.
3. Tanulj meg alaposan egy OO nyelvet
Ha már kódolsz, alap, hogy egy objektum orientált nyelvet ismersz - és jól teszed, ha mélyre ásol benne. Lehet ez java, C#, swift, python, ruby - az interjún, amikor megkérdezik, hogy mi a kedvenc programozási nyelved, akkor kiderül, hogy mennyire mélyedtél el benne. Bónusz, ha funkcionális nyelveket is ismersz, de előtte legyen egy fő OO nyelved, amit kívülről-belülről ismersz (Nekem egyébként ez a nyelv a C# volt - és nem mellesleg egy nyelv mély ismerete nagyon megkönnyíti később más nyelvek tanulását és átlátását).
Hány bites architektúrákat támogat a nyelv? Mekkora a legnagyobb integer, hány tizedesjegyet tud tárolni egy lebegőpontos szám? Hogy működik a threading, mik a limitációi? Hogyan kezeli a nyelv a memóriát, hogyan foglalja és szabadítja fel? A stack és a heap számít-e bármit? Managed vagy unmanaged a nyelv, ha pedig managed, akkor hogyan működik a GC? Milyen beépített adatstruktúrákat támogat a nyelv, és hogyan implementálnál egy hashtable-t a nyelv primitívjeivel? És hogyan változtatnád thread safe-re? Hogyan fordul a kód bitkódra, milyen dolgokat optimalizálhat a compiler közben? Hány byte overhead egy reference type object egy value type-hoz képest? Milyen beépített adatstrúktúrák vannak a nyelvben és mik a legnépszerűbb standard könyvtárak?
Ajánlott felkészülés: "in depth" könyvek az adott nyelvre, pl C# In Depth, Javascript: the Good Parts, Advanced Swift stb. Sok nyelvnél a hivatalos dokumentációt is érdemes átbújni.
4. Architekturális tudás
Ha már valamivel több tapasztalatod van, az architekturális tudásodat is bőven le fogják mérni. Hogyan építenéd meg pl a Messengert, Netflixet vagy Snapchatet - a mobil app részét és a szerver oldalon? Milyen API-t terveznél hozzá, milyen adatbázist használnál, milyen rendszerben tárolnád a képeket a gépeken? Hány gépre vagy VM-re lenne szükséged, ha 1M új kép érkezne be naponta? A mobil appot milyen architektúra alapján építenéd fel, az MVC, MVP, MVVM közül mit használnál? A rendszert read intensive vagy write intensive használatra optimalizálnád? Milyen tradeoff döntéseket hoznál latency és cachelés között? Hogyan skálázódna a rendszer 10x-es, 100x-os loaddal? Vertikálisan vagy horizontálisan skálázódnál? Hogyan cachelnél, milyen load balance stratégiákat használnál, hogyan replikálnád vagy particionálnád / shardolnád az adatbázist?
Pár év tapasztalattal a hátad mögött alap, hogy az automatizált teszteléssel - unit, integration, E2E, CI, CD, TDD, BDD - illetve devops-al kapcsolatban is képben vagy, illetve tudod, hogy mikor érdemes ezeket használni.
Az elméletibb architechturális tudás mellett a nem kezdőknél elvárás, hogy egy gyakorlati problémára fel tudsz vázolni egy architektúrát, ami alapján például egy kisebb csapat el tudna kezdeni fejleszteni. Mielőtt beleugrasz a tervezésbe, érdemes az elvárásokat tisztázni: egy app, aminek pár száz felhasználója van, egyszerűbb architektúrával is összerakható mint egy napi több millió felhasználójú változat. Az általad választott architektúra előnyeivel és hátrányaival is tisztában kell, hogy legyél.
Ajánlott felkészülés: Learn to design large scale systems (interjú tippek), Preparing for a system architecture interview (még több tipp), High Scalability-n cikkek, mint a Whatsappról vagy a Flickr-ről szólók. Emellett real-world szakmai cikkek, mint a Facebook engineering írások.
Egy különösen ajánlott felkészülés az Interviewbit system design részlege. Itt alapos esettanulmányok vannak egy-egy problémáról, amihhez hasonlókkal az interjún találkozhatsz.
Egyéb felkészülés
1. Legyél motivált
Nézz utána, hogy az adott cégnek vagy csapatnak mik a céljai, az üzleti modellje, a célközönsége, a terméke. Ha van szakmai vagy engineering blogjuk, olvasd el. Ha te választhatnál két szakmailag hasonlóan erős jelölt közül, az egyikük kívülről-belülről utánanézett a cégnek, és érdekli, amit csinálsz, a másik pedig azt se tudta, hogy mi az új terméketek, amit nagy durral egy hónapja hoztatok ki... melyiküket vennéd fel?
Ugyanez vonatkozik a motivációdra. Ha nem tűnik elég érdekesnek egy cég vagy startup még azután se, hogy alaposan utánuk néztél - pl újfajta pénzügyi terméket fejlesztenek, viszont olyan emberekre sózzák rá, akik adósságspirálba kerülnek, és téged ettől kiráz a hideg - akkor feleslegesen interjúzol. Ugyanez igaz visszafele is: ha extrém módon motivált vagy, az akár szakmai hiányosságokat is ellensúlyozhat, főleg kisebb cégeknél.
2. Gyakorold a stresszhelyzeteket
Az interjúk rövidek, 30-60 percesek lesznek. A kódolás részéhez papíron stopperrel mintapéldákat gyakorolni elég jó módszer, és ha egy barátod interjúztatót játszik, az még jobb.
Ugyanígy érdemes összeírni - és elgyakorolni hangosan - gyakori soft skill kérdésekre válaszokat (ha minden alkalommal, amikor valaki megkérdezte a legnagyobb gyengeségemet, kapnék egy pacsit, már piros lenne a tenyerem). Elég kellemetlen tud lenni, ha amikor minden szakmai kérdésen végigrepülsz, és a végén feszengsz, amikor megkérdezik, hogy mondj egy nehéz problémát, amit megoldottál, neked meg semmi nem jut eszedbe.
3. Állj pozitívan, vidáman az interjúhoz
Akkor fognak felvenni a céghez, ha úgy ítélik meg, hogy szakmailag az elvárt szint fölött vagy, és hogy veled még több energia legyen a cégben és csapatban, mint nélküled.
Még ha ideges is vagy, az interjú elejétől a végéig mosolyogj - ez a legjobb stratégia arra, hogy gyorsan feloldódj. A kérdésekhez és emberekhez állj pozitívan - még ha valamire nem is tudod a választ, próbálj ne idegeskedni. Elvégre már az, hogy az interjúra eljutottál elég jó - egy csomó jófej mérnökkel dumálhatsz érdekes problémákról, a cégről jóval többet megtudhatsz. Illetve még ennél is fontosabb: ha már itt vagy, ha feszült vagy és stresszelsz, akkor rosszabbul fogsz teljesíteni, mint ha nem.
Egy belsős fórumon kérdezte valaki, hogy mire készüljön fel egy backend interjúra az Uberhez, Facebookhoz, Google-hez. A legvelősebb válasz ez volt:
- Gyakorolj sok Leetcode medium kérdéssel. Pár hard-ot is oldjál meg. Ha egy adott céghez interjúzol, a tageket is nézheted.
- Backend/fullstack fejlesztőjént készülj fel a System Design Primer-el az arhitekturális interjúra. Mobil/web fejlesztőként az elosztott rendszer alapok kevésbé fontosak, de egy appot az API-tól a UI-ig, stabil archtiektúrával és jó tradeoff-okkal összerrakni elvárás lesz. Nézd át az ismert architektúrákat (MVC, MVVM és társai), illetve a legnépszerűbb frameworköket.
- Alaposan gondold át a legfontosabb projekteket, amiken dolgoztál és hogy mi volt bennük a nehéz és mit tanultál. Ez főleg az egész napos interjún lesz fontos.
Ne higgy (csak) ennek a cikknek
Rengeteg - talán túlságosan is sok - interjúkra felkészítő anyag van a neten és könyvekben. Én az alábbi néhányat javasolnám - a többire pedig ott a Google és Quora:
- Könyvek
- Cracking the Coding Interview - jobban kevés könyv foglalja össze, és ad praktikus tanácsokat a legnagyobb tech cégek - Facebook, Google, Apple, Microsoft, Yahoo, Amazon - interjú típusaihoz. Javaslom, vedd meg a papír változatát és jegyzeteld tele, ahogy olvasod. Gyanítom, hogy a legjobb $30-os befektetésed lesz.
- Elements of Programming Interviews: The Insiders' Guide - ha interjú kódolási példákat akarsz gyakorolni, ez a könyv tele van velük. Csak ne a megoldásoknál kezdd, mert az elveszi az egész értelmét.
- Online anyagok:
- How to Prepare for a Technical Interview at Uber, Google, Amazon, LinkedIn, Microsoft, Facebook - a kollegám, Chris írása, aki staff engineer az Ubernél, Amsterdamban.
- Get that Job at Google - Steve Yegge klasszikus írása
- Get that Job at Facebook - a Facebook interjú folyamatának az áttekintése. (Ha interjúzol a Facebookal, a recruitered ezt a linket egyébként biztos át fogja küldeni)
- How to ace the architectue interview - egy, az Ubernél dolgozó interjúztató szempontjából.
- How to ace the algorithms interview - a Palantir, ami legendásan nehéz algoritmikus problémákat kérdez, jó tanácsokat ad ezeknek a szisztematikus megoldásához.
- Hacking the Google Interview - az MIT-n egy ilyen kurzus fut 2012 óta, a tárgy jegyzetei hasznosak.
- Getting a job in Silicon Valley, without a Computer Science Degree
- egy diploma nélküli, Ázsiából az USA-ba költözött iOS fejlesztő részeltezi, hogy hogyan készült fel a Silicon Valley-i interjúkra. Spoiler: nagyon sokat kódolt.
De ha csak egy tanácsot fogadsz meg az egész cikkből: kódolj sokat, kódolj gyakran, és fejleszd magad algoritmikus problémák megoldásával.