Как уменията за спортно програмиране помагат при интервюта за работа

Как уменията за спортно програмиране помагат при интервюта за работа?

програмиране

Този въпрос вълнува момчетата, успели в спортното програмиране, на които им предстои първо интервю в IT компания. Начинаещите също мислят за това - правилното решаване на състезателни задачи далеч не е лесно веднага, а между изучаването на алгоритми те търсят мотивация да преодолеят страха от провал и да продължат.

Quora сравнява трудността на проблемите с интервютата в Google с тези от втора дивизия и твърди, че проблемите с интервютата във Facebook са по-лесни от проблемите на състезанието. Една мисъл обединява всички дискусии по тази тема - спортното програмиране помага да научите алгоритми, учи ви да мислите бързо и да предвиждате възможни сценарии.

Интересно е да се знае мнението на програмисти, които вече са преминали през етапа на интервю. Кажете ни какво помогна, какво ви изненада, какво липсва - информацията "от вашите хора" се възприема много по-приятно :)

Идеята за тази публикация е на Емилбек Емилбек Сулайманов. Благодаря ти!

Напомням ви, че очаквам вашите предложения за новините на лични съобщения :)

По правило задачите на интервютата са наистина по-лесни, отколкото на конкурсите. Мисля, че това може да се обясни с факта, че много кандидати идват на интервютата, които не са се сблъсквали с олимпиадно програмиране преди. Рядко темата на задачите надхвърля сортирането, търсенията (включително бинарни търсения) и структурите на данни.

Опитът от участие в състезания по програмиране помага бързо да се измислят добри решения, което очевидно играе в ръцете на кандидата, правейки много положително впечатление на интервюиращия.

Друг въпрос е, че понякога на интервюта задават въпроси за езиците за програмиране и тук олимпиадите не винаги могат да помогнат: какПо правило в състезанията се използва много ограничен набор от всички функции, чипове и характеристики на езика.

В допълнение, олимпиадите, за съжаление, често развиват уменията за писане на лошо четлив код, отчасти защото е малко вероятно да се наложи да се върнете към този код, след като получите ОК за проблем. Този фактор също играе доста негативна роля при интервютата, ако пишете код в същия стил, както при конкурсите.

Как да се отуча от писането на лошо четлив код? Идва ли с времето и извън състезанието?

Всъщност задачите на интервюта в големи компании (MS, FB, Google) обикновено са на ниво divas 2 B, C, така че решаването им на олимпиадата не струва нищо)) плюс, в допълнение към самата идея на решението, като правило трябва да кодирате на дъската (в тетрадка) и всичко това отнема около 25-30 минути. Струва ми се, че за успешното преминаване на интервю е достатъчно да знаете: указатели, динамика, сортиране, binsearch, структури от данни (set, map, hash_set, hash_map, queue, stack, Segment tree), обработка на низове.

в малките компании често питат за тънкостите на езика, много слабо за алгоритмите. например се опитаха да ме бомбардират с въпроса: "Какво е двоично търсене"))

сегментно дърво в интервю? искам подробности)

веднъж готин приятел се натъкна, той много бързо реши проблема и те решиха да го усложнят :) Не помня точното състояние, но нещо като:

даден линеен масив от положителни числа, трябва да можете да изпълнявате заявки:

1) намерете продукта в сегмента

2) промяна на номера

трябва да приемем, че имаме готов BigInt.

И тогава на вашия приятел е казано, че искат да чуят отговора по линията? :)

Да, знам двоично търсене. Изглежда шансовете ми да си намеря работа скочиха до небето :)

Както бе споменато по-горе, има два вида компании:

Голямкомпании като Google, Facebook, Yandex и компании, където алгоритмичните умения са важни.

Останалите, т.е. тези, при които алгоритмичните умения не са толкова важни (по-важно е познаването на конкретни езици, шаблони за проектиране, опит в екипна работа и т.н.).

В компаниите от втория тип всичко е по-скоро случайно. Обикновено, от гледна точка на алгоритмите, въпросите са напълно тривиални. Като цяло не е много ясно защо спортен програмист ще отиде в тези компании (когато може да отиде в Google :)

Сложността на задачите в компаниите от първи тип е нещо на ниво Div1 A/B, Div 2 B/C. Но трябва да разберете, че времето е още по-ограничено, отколкото на олимпиадата, освен това често трябва да напишете решението не на компютър, а на лист /черна дъска/. Друг важен аспект е, че за разлика от олимпиадата, обикновено се изисква обосновка на верността на решението.

Отговор на въпроса в заглавието: едно от важните умения, които дава спортното програмиране, е способността да се пише правилен код в психологически стресови условия (поради сериозна липса на време, състезание и т.н.). Това умение със сигурност е полезно (и при всяко интервю).

За съжаление има умения, които спортното програмиране не учи (по-скоро, напротив), които обаче са полезни при интервюта и още повече в процеса на реална работа. Става въпрос за писане на разбираем код (нееднобуквени имена на променливи, липса на копиране и поставяне и т.н.).

P.S. Всичко написано е от личен опит от интервюиране в Yandex / Google / няколко по-малко известни компании.

Коя компания беше най-интересна за интервю? :)

Не бих сравнил интервюта със задачи от втора дивизия. Това са напълно различни области и опитът от участие в спортно програмиране помага само отчасти. Подходна участник в спортното програмиране е да реши нов проблем по всеки възможен начин, а решаването на проблем означава преминаване на неговите тестове. Успешният подход на интервю е да можете точно да разберете проблема със събеседника, да кажете алгоритъма за решаването му, да обясните кода си разбираемо, докато го пишете на дъската, да преминете отново през алгоритъма, след като го завършите, да го покажете чрез пример, да разгледате крайните случаи и в същото време да се покажете като отличен екипен играч и в никакъв случай арогантен.

В един случай задачата от втория раздел, чието преминаване би ми отнело не повече от 10 минути, ми отне поне половин час на интервюто, докато допусках доста глупави грешки. И накрая събеседникът ми каза, че очаква по-просто решение от мен.

Или обратното, веднъж на интервю получих проблем с ограничения за всички int32 и единственият алгоритъм, за който се сетих, беше O(n^3). Бързо записах това решение на бялата дъска и прекарах над 40 минути в разговор с другия човек (който бързо записваше всичко на лаптопа си), опитвайки се да разбера най-доброто решение. В края на интервюто го попитах дали има по-добро решение, а той ми отговори, че не знае и като цяло за първи път вижда тази задача.

Това прави голяма разлика, независимо дали говорите с BigCorp или SmallCorp.

Да кажем, че е BigCorp. Тогава:

Опитът в спортното програмиране наистина ще ви помогне да преминете интервюто. Задачата на BigCorp е да намира хора, които са умни. Те често имат свой собствен затворен набор от технологии и по принцип не се интересуват с какви технологии е работил човек преди. Проверка на хора с интервютаалгоритмичните проблеми далеч не са идеални, но са достатъчно добър начин за отстраняване на хора.

Популярни теми са: двоично търсене, дървета, графики, алгоритми, свързани със сортиране, свързани списъци, алгоритми, свързани с низове.

Познаването на O(n) асимптотиката е задължително, включително времева сложност & сложност на паметта. С това спортните програмисти нямат проблеми.

Докато пишете алгоритъма на дъската, можете да покажете знания за модели, можете да пишете на псевдоезик, в много случаи просто предполагайки, че такава функция съществува.

Хеширането е хлъзгава тема, с която трябва да се работи внимателно. Използването на хеширане, където можете да приложите ILC, не е добро. Твърдението, че заявките към хеш набор имат O(1) сложност, не е добро. От друга страна, писането на алгоритъм с O(n * log(n)) сложност, когато хеш набор може да постигне O(n), също не е добро.

На интервюта в BigCorp никога не ми беше зададен нито един въпрос за многонишковостта, но интервютата на място съдържат 1-2 проблема с дизайна, където може да са необходими познания за разпределени системи.

Ако говорите с SmallCorp, тогава

Можете да очаквате всичко. Всяка компания има свои собствени методи за набиране на персонал. И това, че не са ви наели, не означава, че сте се провалили на интервюто. Това обикновено означава, че в момента те не се нуждаят от вас.

Познаването на определени технологии, езици и принципи на разработка играе съществена роля.

Посочването на успех в спортното програмиране в CV може да играе важна роля.

Много SmallCorps провеждат интервюта за алгоритмични проблеми. Успоредно с това те могат да задават нюансите на езика и многонишковостта.

Най-популярната тема е различните структури от данни за писане на кешове. И е прекраснотрамплин за проверка на знанията за паралелизъм.

Има ужасно неприятни инциденти:

1) Интервюто мина много добре. На следващия ден съобщават за съжаление. Питам как е, интервюто беше отлично. Отговор: Ами да, интервюто беше отлично, но търсим човек с познания по други технологии / с различен опит. Заключение - HR си вършат работата зле.

2) Когато получават някои конкретни въпроси от събеседници и виждат доволните им лица, те вероятно си мислят: "Ха-ха-ха, аз знам отговора на този интересен въпрос, но той не." Е, да, не мога веднага да напиша формула за комбинативен въпрос, който никога преди не бях чувал, не знаех, че е от толкова голямо значение за компания за интернет на нещата. Също така този въпрос: „Ще ви дам масив от n + 1 числа от 1 до n, едно число се повтаря 2 пъти, как бързо да го намерите“, и веднага след това следващото: „n + 2 числа, 2 числа се повтарят 2 пъти“, и в същото време те очакват отговор почти веднага, както при първия. Изглежда, че те трябва да тестват способността да отгатнат добро решение, но вместо това те проверяват познаването на отговора.