Nebudu se účastnit vašeho pohovoru k algoritmickému testu

Vydáno: Poslední aktualizace:
Algoritmický test Tomasz Nurkiewicz

Jak si běžný člověk najme špičkového krejčího? Požádají uchazeče, aby jim ukázal, co dosud ušil, a možná je i požádají, aby něco rychle ušili. Pak budou pozorovat výsledky, všímat si, jak dobře ovládají šicí stroj, organizace pracoviště a hodnotit krejčovský smysl pro detail. Neplýtvá příliš látkou nebo prostě neodvádí příliš dobrou práci?

Jak vývojáři softwaru najímají špičkové krejčí? No, asi by to vypadalo nějak takto: "Tohle je tabule. Nakreslete prosím rozdíl mezi Uzel Ghiordes a Senneh. Odvoďte délku nitě jako funkci plochy tkaniny".

Upřímně řečeno, věřím, že špičkový krejčí by měl poznat rozdíl, ale co zde vlastně ověřujeme? Chcete elegantní sako, nebo elegantní rovnici na tabuli?

Moje zkušenosti s vyhledávací společností a investiční bankou

Dovolte mi, abych se s vámi podělil o několik zkušeností, které jsem získal jako účastník pohovorů ve dvou velkých společnostech. První z nich prodávala reklamy občas prokládané skutečnými výsledky organického vyhledávání a druhá byla velká podniková banka. V té první jsem strávil několik hodin vymýšlením řešení netriviálních algoritmických úloh. V té druhé to bylo podobné, ale popisoval jsem své algoritmy po telefonu člověku, který seděl na druhé straně Atlantiku... a bylo to ještě podivnější.

Algoritmický test tweetu

Ve vyhledávací společnosti jsem hledal nejdelší příponu spojového seznamu, který dělal... něco. Upřímně řečeno, moc si toho nepamatuji. Stejně jako si nepamatuji, kdy jsem naposledy použil spojový seznam. Ano, chápu, v čem se liší od pole - důsledky pro výkon, jiné případy použití atd. Náhodou to vím i proto, že se mě na tuto otázku ptají při každém zatraceném pohovoru! Ale v reálné práci jsem prostě nikdy neměl příležitost je využít. Byla tam také otázka týkající se vyvažování nebo procházení stromu nějakým bizarním způsobem. Upřímně řečeno, nebyl to moc zapamatovatelný zážitek. Vlastně by ode mě bylo poctivé, kdybych řekl, že jsem toto cvičení znal předem. Ne z knihy o algoritmech, ale z příručky o tom, jak se nechat zaměstnat v této konkrétní společnosti. O tom ale až později.

V investiční bance jsem byl nejprve požádán, abych vytvořil všechny možné permutace seznamu prvků. Nezapomeňte, že se to všechno odehrálo během transkontinentálního telefonátu. Dobře, jen tak pro pobavení si představím, že bych si položil otázku tohoto typu. Zde jsou možné odpovědi, které jsem očekával, od nejhorší po nejlepší:

  • Hledejte řešení na internetu, prohlašujte, že je vaše, a myslete si, že neslyším ťukání do klávesnice.
  • Odříkejte řešení zpaměti řádek po řádku, protože jste se připravovali jako blázni a naštěstí jste řešení znali zpaměti. A nic víc.
  • Imperativní, složitý kód, který iteruje přes vstup. Nejlépe pomocí proměnných jako i, j, k.
  • Čisté, rekurzivní řešení, protože kandidát si uvědomil, že tento problém lze rozložit.
  • Znechucen ručně psaným kódem, hledejte trochu déle a najděte knihovnu, která přesně tohle dělá (např. Kolekce2 z Guava)
Testy algoritmů na tabuli

Vážně, pravděpodobně hledáš nového spoluhráče. Chtěl bys raději vidět pull request s elegantním rekurzivním kódem, nebo jediné volání knihovny? Knihovnu, která byla prověřena miliony vývojářů a je založena na knihovně Donalda Knutha "Umění počítačového programování"? Také mi chvíli trvalo, než jsem našel knihovnu, zatímco ručně vytvořené vnořené smyčky jsou na internetu všude. Jaký přístup hledáte? Učení se nazpaměť a slepé kopírování kódu z internetu, nebo skutečné pátrání po bitevně ověřených řešeních?

Další cvičení, které jsem dostal, vyžadovalo náhodné zamíchání pole, přičemž jsem měl k dispozici pouze náhodný hod mincí. To je sám o sobě zajímavý problém, který však zcela nesouvisí s pracovními podmínkami. Nějak jsem vymyslel algoritmus (a bylo to docela zábavné), ale po několika měsících jsem už jen předával kus XML z jedné strany banky na druhou. Stovky přízemních transformací za sekundu a mimochodem, každý hlavní jazyk. má podporu náhodného přehrávání: [1], [2], [3], [4]nebo balíček [5].

Algoritmické testovací otázky: zhouba náboru zaměstnanců

Protože jsem vystudoval informatiku, nepovažuji algoritmické testy za děsivé nebo nesmyslné. Vlastně je to naopak, jsou skvělé pro procvičení mozku, stejně jako řešení sudoku nebo hraní bridže. Zúčastnil jsem se několika algoritmických soutěží (např. Příchod kódu) a vždy jsem je považoval za příjemné. Ale to je jen můj koníček, možná byste raději studovali DDD nebo pokročilé SQL. A nejsem si jistý, že čisté algoritmy a datové struktury se pro většinu náborových procesů nějak zvlášť hodí. Ověřují sice abstraktní analytické schopnosti uchazeče a solidní CS a matematické zázemí (což jsou v softwarovém inženýrství důležité vlastnosti), ale nedokážou zachytit jiné důležité vlastnosti nebo jsou příliš spletité na to, aby byly průkazné.

V dnešní době vyžaduje většina práce v IT propojení rozhraní API a rámců. Jsme spíše krejčími než výrobci látek. Znalost algoritmů je užitečná při škálování jedné funkce systému, ale cílenější zkušenosti s distribuovanými systémy vás pravděpodobně dostanou dál. Cenná je například znalost teorie grafů nebo diskrétních funkcí. Mnohem větší dopad na vaši každodenní práci však mají praktické zkušenosti s rozsáhlou sítí replikovaných databází nebo pochopení toho, proč jsou některé hashovací funkce kompromitovány.

Testy algoritmů na tabuli

Pochopení toho, co je rekurze, je skutečně zásadní. Stejně jako vědět, proč HashMap je v Javě tak rychlý. Ale pochopit, proč Slovník je ještě rychlejší v C# je další úroveň. Nápověda: rozložení paměti, něco, co nesouvisí s teoretickou výpočetní složitostí. Mnozí se však domnívají, že pokládání čistě algoritmických otázek je nejjednodušší způsob, jak najít výjimečné, dobře vyškolené vývojáře. Takové přesvědčení je velmi romantické, ale často nesmírně naivní. Stačí se podívat, kolik knih vám pomáhá uspět právě v (proslulých algoritmických) pohovorech ve společnosti Google. Neučí základy CS, sotva vysvětlují, jak řešit konkrétní třídy problémů ve stylu Googlu.

Třídění je jednou z nejčastěji (ne)používaných otázek při algoritmických pohovorech. Vědět, jak Quicksort je cenná, i když například Java nepoužívá. téměř deset let. Pochopení toho, co je O(nlogn), se může také hodit. Ale mnohem častěji to nebyla algoritmická složitost, co způsobilo, že se můj systém zastavil. Místo toho to byl problém N+1 - něco, s čím jsem se neustále setkával, ale během mého CS vzdělání se toho téměř nikdo nedotkl. Pokud nemůžete odolat nutkání zeptat se na třídění, diskutujte alespoň o tom, co znamená, že je algoritmus stabilní. S největší pravděpodobností budete používat hotový, rychlý algoritmus. Stabilní vs. nestabilní je nejspíš vaše jediná starost. Nápověda: třídění v Javě je stabilní, v C# nikoli.

Testy algoritmů na tabuli

Mějte na paměti, že algoritmické otázky jsou skvělé, pokud je opravdu potřebujete denně. Odborníci na strojové učení musí rozumět tomu, co gradientní sestup je, a to vyžaduje značné matematické zázemí. Také statistika, výzkum, počítačová grafika a vývoj her obvykle vyžadují určité znalosti z oblasti CS. Jinak využijte časový prostor pro nábor moudře a pokládejte správné otázky.

Lepší přístup k algoritmický test: navrhovat a pracovat společně

Během své kariéry jsem vedl spoustu pohovorů, považuji to za součást své práce, zejména na vyšších pozicích. Mnoho pohovorů bylo zapomenutelných, ale občas byli kandidáti nadmíru spokojeni, i když práci nedostali. Buduje se tak skvělý vztah a značka vaší společnosti. Jak se mi podařilo vytvořit tak skvělou zkušenost?

  • Preferují řešení problémů v reálném životě. Navrhněte architekturu podobnou Twitteru nebo škálujte webové stránky podobné Instagramu - taková cvičení jsou mnohem zábavnější než hledání nejkratší cesty nebo nejdelšího palindromu.
  • Dejte přednost programování ve dvojicích před kreslením na tabuli. Vidět, jak kandidát pracuje, jak se pohybuje v kódu, hledá odpovědi, přistupuje k překážkám - to by vám mělo hodně napovědět. Také společná práce snižuje stres a činí proces lidštějším.
  • Dejte přednost existující kódové základně před prázdným editorem. Máme rádi projekty na zelené louce, ale úprava existující kódové základny je mnohem bližší skutečné práci.
  • Dejte přednost testování před čistě produkčním kódem. Kódování je skvělé, ale hledá nebo vyvíjí kandidát testy souběžně s implementací? Tento aspekt je při algoritmickém testování téměř všeobecně přehlížen.
Test algoritmu

Nezapomeňte, že spolupráce nevyžaduje setkávání na místě. Sdílení obrazovky a spolupráce v reálném čase jsou v dnešní době zcela bezproblémové, a to i díky tomu. DevSkiller.

Souhrn

Na algoritmických otázkách během pracovního pohovoru není nic špatného. Je to důležitá součást našeho oboru. Nicméně vzhledem k tomu, jak málo času máte na nábor, existují moudřejší způsoby, jak vybrat příštího nejlepšího inženýra. Procvičováním skutečných dovedností se ujistíte, že kandidát je skvělý v tom, co skutečně potřebujete. Také tím snížíte stres a zlepšíte vnímání vaší společnosti ze strany kandidáta.

Sdílet příspěvek

Další informace o najímání zaměstnanců v oblasti technologií

Přihlaste se k odběru našeho vzdělávacího centra a dostávejte užitečné informace přímo do své e-mailové schránky.

Bezproblémové ověřování a rozvíjení dovedností v oblasti kódování.

Podívejte se na produkty DevSkiller v akci.

Bezpečnostní certifikace a shoda s předpisy. Zajistíme, aby vaše data byla v bezpečí.

Logo DevSkiller Logo TalentBoost Logo TalentScore