
Наем на в Яндекс продължава. Той обхваща пет направления: бекенд, ML, мобилна разработка, фронтенд и аналитика. В този блог, в други блогове на Хабра и извън него можете да намерите множество инсайдерски информация за това как протича стажът. Но много от този процес остава загадка за тези, които не работят в компанията. А когато се погледне от гледна точка на ръководителите на разработка, възникват още повече въпроси. Как правилно да се провежда стаж, как да се максимизира взаимната полезност със стажанта, как да успеем да го опознаем за три месеца и да му предадем всичко необходимо за продължаване на работата?
Подготвихме тази статия в петима. Нека да се представим: Игнат Колесниченко от службата по технологии на разпределени изчисления, Миша Левин от службата за машинен интелект на Маркета, Денис Малих от службата за разработка на приложения, Серьожа Бережной от отдела за разработка на търсачки и Дима Черкасов от групата за разработка на антифрод. Всеки от нас представлява своето направление в стажа. Всички сме ръководители, имаме нужда от стажанти и имаме известен опит в работата с тях. Нека да споделим част от този опит.
Събеседване преди стажа
Кандидатите очакват няколко технически интервюта. Успехът на интервюто зависи в по-малка степен от soft skills (умения за ефективна комуникация) и в по-голяма — от hard skills (умения в математиката и програмирането). Въпреки това ръководителите оценяват и двете.
Игнат:
Дори ако човекът е много добър, но абсолютно некоммуникативен — той няма да може да приложи всички умения. На това, разбира се, обръщаме внимание, но това не е причина да не вземем някого на стаж. За три месеца всичко може да се промени, а освен това, първоначалното ви впечатление може да се окаже неправилно. А ако всичко е вярно — трябва да обясните на човека, да потърсите други екипи за него. За стажантите комуникабельността определено не е ключов фактор. Все пак професионалните умения са много по-важни.
Денис:
Харесвам хората, които разказват истории — в добрия смисъл на думата. Човек, който може да разкаже как е сътрудничил с екипа си, за да се справи с някаква трудна ситуация, е интересен. Започвам да задавам допълнителни въпроси, когато такава история излезе наяве. Но това рядко се случва, ако просто помоля „разкажи нещо интересно за твоите проекти“.
Един кандидат веднъж изрече забележителна фраза, която дори записах: „Успешно избягвах решаването на скучни задачи“.

Тъй като времето за общуване е малко, интервюиращият се опитва всяка минута от срещата да получи полезна информация за кандидата. Страхотно е, ако стажантът предварително е обмислил какви аспекти от своя опит (не от резюмето) може да сподели. Това трябва да бъде кратка история, строго по същество.
Денис:
Обърнах внимание, ако човек споменава, че е пробвал много езици и подходи. Хората с по-широк мироглед измислят по-елегантни решения в динамична обстановка. Но това е двусмислено предимство. Може да навлезеш в много теми, а сериозно да не научиш нищо.
Времето за историите, които описва Денис, обикновено остава само за финалното интервю. Дотогава е необходимо да се демонстрират основните и практически познания, които ще лежат в основата на бъдещата работа. И, разбира се, ще е нужно да пишете код на дъската или на лист хартия.
Миша:
Ние проверяваме познанията по теория на вероятностите и математическа статистика. Гледаме дали човекът има опит с метрики, с алгоритми за машинно обучение, с настройка на техните параметри, с преобучение и т.н. Очакваме, че човек може да пише код в достатъчна степен, за да бъде аналитик.
Денис:
Хората, които идват на интервю, основно знаят езици: в Екатеринбург има добра школа по основни езици, добри институти. Но, за да бъда честен, кандидат за стаж с добри hard skills е рядкост, поне в нашето епсилон-окръжение. Например, Swift. В него работата със стрингове е много сложна, и хората, които могат да работят с тях от раз, са малко. Веднага се забелязват. Често давам на интервютата задача, която точно е свързана с обработка на стрингове. И за всичкото време имаше само един човек, който веднага, на листче, успя да напише такъв Swift код. След това ходех и разказвах на всички, че някой накрая успя да реши тази задача на Swift на листче.
Проверка на алгоритмите на интервюто
Това е отделна тема, тъй като кандидатите все още се питат — защо винаги оценяваме познанията по алгоритми и структури от данни? Дори бъдещите мобилни разработчици и фронтендъри преминават през такава проверка.
Миша:
На интервюто задължително давам някаква алгоритмична задача. На кандидата му трябва да измисли как да я реализира на Python, за предпочитане без грешки. Трябва да се разбере как да проверява програмата си и самостоятелно да я коригира.

Опитът с алгоритми е полезен по три причини. Първо, очевидно ще е необходим в алгоритмичните задачи — които не се срещат често, но все пак се случват. Второ, разработчикът ще може по-ефективно да решава задачи, свързани с алгоритми, макар и да не изискват да навлиза в самите алгоритми (а такива вече има доста). Трето, ако не сте изучавали алгоритми в университета, а все пак знаете как да работите с тях, това характеризира вас като любознателен човек и ще повиши вашия авторитет в очите на интервюиращия.
Денис:
Доброто част от мобилната разработка е "преместването на JSON". Но веднъж на шест месеца се случва да са нужни алгоритми. В момента рисувам красиви карти за Яндекс.Погода. И ми се наложи да реализирам алгоритъм за изглаждане, алгоритъм на Сазерленд-Ходгман и алгоритъм на Мартинес в рамките на седмица. Ако човекът не знаеше какво е хешмап или опашка по приоритет, той щеше да остане заседнал с това дълго време и не е ясно дали щеше да се справи без чужда помощ.
Алгоритмите са основата на разработката. Това е това, което помага на разработчика да бъде разработчик. Няма значение с какво се занимавате. Те са необходими и в несложни проекти, където основната работа е 'пренастройване на JSON'. Дори ако не пишете алгоритми сами, но неосъзнато използвате някакви структури от данни, е по-добре да ги разбирате. В противен случай приложенията, които създавате, ще работят бавно или неправилно.
Има програмисти, които са влезли в разработката по академичен път: кандидатствали са в университета, честно са учились пет години и са получили специалността си. Те знаят алгоритмите, понеже са им били преподавани. И тогава самото познание за алгоритмите по никакъв начин не характеризира кръгозора на човека, трябва да проверите този кръгозор по друг начин.
А има и самоучки, към които включвам и себе си. Да, формално имам IT образование, диплома на инженер-программист. Но самоучките са се научили да програмират 'вопреки'. Те нямат университетска програма. Обикновено те не са запознати с алгоритмите, защото никога не са срещали необходимостта да ги изучат. И когато такъв човек разбира алгоритмите, това означава, че е прекарал време и ги е изучил. След като завърших университета, осъзнах, че имам бели петна в частта за фундаменталните алгоритми — става дума, че специалността ми беше приложна. Отидох и изучих онлайн курсовете на Принстънския университет, добре известния Робърт Седжуик. Разбрах, направих всички домашни. И когато човек на интервюто разказва подобна история, веднага ми става интересно, появява се желание да работя с него или поне да продължа разговора.

Игнат:
Когато интервюираш стажант, в известен смисъл очакваш дори повече, отколкото от опитен разработчик. Става дума за способността да решава алгоритмични задачи, бързо да напише някакъв коректен код. Кандидатът за стаж е все още в университета. Точно година преди това му разказваха всичко за алгоритмите в детайли. Очаква се, че той може да ги възпроизведе. Ако човекът е адекватен и е слушал лекциите внимателно, той просто ще знае всичко, ще го извади от кеша.
Какви задачи решава стажантът
Обикновено програмата за стажуване може да се планира и обсъжда на финалните интервюта. На стажанта в самото начало на работата могат да се дадат тренировъчни задачи, чийто резултат няма да бъде използван в продукцията. Освен това — вероятността да получи такива задачи е малка. По-често се дават реални проекти от беклога, тоест признати за достойни внимание, но не приоритетни и 'отделяеми' — така че реализирането им да не зависи от другите компоненти. Ръководителите се опитват да ги разпределят така, че стажантът да се запознае с различни части на услугата и да работи в същата среда с другите членове на екипа.
Игнат:
Тези задачи са изключително полезни. Възможно е да не увеличат използването на клъстера с 10%, да не спестят милион долара на компанията, но ще направят стотици хора щастливи. Например, в момента имаме стажант, който работи с наш клиент за стартирането на операции на нашите клъстери. Преди старта операцията трябва да зареди определени данни в клъстера. Обикновено това отнема 20–40 секунди, и преди това ставаше безмълвно: стартираш я в конзолата и седиш, гледаш в черния екран. Стажантът дойде и за две седмици направи функция: сега се вижда как файловете се зареждат и какво става. От една страна, задачата не е сложна в описанието, но от друга — има какво да се проучи, какви библиотеки да се разгледат. Най-приятното е, че ти си го направил, минала е седмица, това се е оказало на клъстера, хората вече го ползват. Пишеш пост в вътрешната мрежа — и ти казват благодаря.

Миша:
Стажантите подготвят модели, събират данни за тях, измислят метрики и провеждат експерименти. Постепенно просто започваме да им даваме повече свобода и отговорност — проверяваме дали се справят. Ако да — преминават на следващото ниво. Не предполагаме, че когато стажантът дойде, той вече знае всичко това. Ръководителят му помага да се ориентира, дава му връзка към вътрешен ресурс или онлайн курс.
Ако стажантът се представя отлично — може да му бъде дадено нещо приоритетно, важно за отдела или за други услуги.
Дима:
Нашият стажант в момента работи по сериозни подобрения на антифрод системата. Това е система, която се бори с различни видове злоупотреби и измами в услугите на Яндекс. Първоначално смятахме да му даваме не много сложни задачи, които не са от съществено значение за продукцията. Ние предварително се опитваме да планираме задачите на стажанта, но след това видяхме, че той се справя много бързо и ефективно. В крайна сметка започнахме да му възлагаме стартирането на антифрод системата за нови услуги.
Освен това, има малък шанс да получи задача, с която колегите преди това не са се захващали заради обема ѝ.
Дима:
Има стара система и нова, която все още не е завършена. Трябва да се проведе миграция от едната на другата. В перспективата това е важен проект, макар и с висока несигурност: необходимо е много комуникация, четене на неясен легаси код. На финалното интервю честно казахме на стажанта, че задачата е сложна. Той отговори, че е готов, присъедини се към нашия екип и успя. Явно той притежава качества не само на програмист, но и на мениджър. Беше готов сам да се разходи, да проучи и да пингва.
Менторство над стажанта
На стажанта му е нужен ментор за по-добро внедряване в процесите. Това е човек, който е в течение не само на своите задачи, но и на задачите на стажанта. Има редовна комуникация с ментора, към когото винаги може да се обърне за съвет. Ментор може да бъде или ръководител на групата (ако е малка група), или някой от колегите, които са постоянни участници в екипа.
Игнат:
Аз се опитвам поне през ден да се доближа и да питам как е стажанта. Ако виждам, че е затънал, се опитвам да му помогна, да питам какъв е проблемът и заедно да го разрешим. Ясно е, че това отнема моите сили и прави работата на стажен не толкова ефективна интегрално — аз също отделям времето си. Но това позволява на него да не затъва, да получава резултати. И все пак това е по-бързо, отколкото ако сам го правех. Трябва ми условно 5 часа за задачата, докато стажантът би я изпълнил за 5 дни. И да, за тези 5 дни ще отделя 2 часа, за да говоря с него и да му помогна. Но поне 3 часа спестявам, а на стажанта ще му е приятно, че му е предложена помощ. Важно е просто да се комуникира интензивно и да се наблюдава какво прави човек, да не се губи контакт.

Серёжа:
Стажант постоянно е свързан с менторa си и комуникира с него по няколко пъти на ден. Менторът преглежда кода, упражнява парно програмиране със стажанта и помага, когато възникнат проблеми. Именно по този начин, чрез комбинация от помощ от ментора и реални задачи, обучаваме фронтенд разработчици.
Дима:
За да не се окаже стажантът оставен на произвола, още преди наемането обсъждаме кой ще бъде неговият ментор. Това е и голямо предизвикателство за самия ментор: подготовка за ролята на лидер на екипа, проверка на способността да задържи в ума си както собствената задача, така и задачата на стажанта. Има редовни срещи, на които понякога присъствам и аз, за да бъда в течение. Но точно менторът общува редовно със стажанта. В началото отделя много време, но това се възвръща.
Обаче наличието на ментор не означава, че всички възникнали въпроси се решават чрез него.
Миша:
При нас е прието, че хората, сблъскали се с проблем, питат съседите и колегите за съвет и бързо намират помощ. Колкото по-бързо расте човек, толкова по-често му е необходимо да се обърне към колегите, за да научи нещо ново. Полезно е дори просто да се информираш за задачите на другите, за да измислиш нови задачи. Когато стажантът е в състояние сам да се договори, да разбере какво е важно за другата страна и да достигне до резултат в екипа, той расте много по-бързо от този, за когото всичко това трябва да прави ръководителят.
Серёжа:
Има документация, но по-голямата част от информацията е разтворена във въздуха. Ако я усвоиш в началото на кариерата си, това е допълнително предимство и можем да фокусираме човека върху това, което трябва да изучи.
Идеалният стажант е този, който стажува няколко месеца, става младши разработчик, след това просто разработчик и след това ръководител на екип и т.н. За това е необходим архетип на ученика, който не се притеснява да пита, ако нещо му е неясно, но същевременно е способен на самостоятелна работа. Ако му кажат, че може да прочете нещо на определено място, той ще отиде, ще прочете и наистина ще се върне с нови знания. Може да бърка, но не трябва да бърка повече от един или максимум два пъти на едно и също място. Идеалният стажант трябва да се развива, да възприема всичко като гъба, да учи и да расте. Този, който седи и се опитва сам да се справи, дълго се мъчи, не задава въпроси, едва ли ще се задържи.
Край на стажа
Преди да започнем работа, подписваме с всеки стажант срочен договор. Разбира се, стажът е платен, оформен по Кодекса на труда на Руската федерация, и стажантът получава същите предимства като всеки друг служител на Яндекс. След три месеца програмата приключва — много от стажантите след това ги приемаме в штат (на безсрочен договор).

От една страна, за ръководителя е важно разработчикът да изпълни минималните изисквания за стажа. Именно това следим за стажанта още от интервюто. Въпреки това, това е само началото на историята. Стажантът за нас винаги е потенциален кандидат за штат. Минималната програма за ръководителя — още в самото начало да разпознае такъв човек, който след три месеца ще бъде с гордост препоръчан за други отдели. Максималната програма — да го запази в същия екип, приемайки го в штат. При това имаме предвид, че на студент от втори или трети курс — дори когато е станал стажант — с настъпването на учебната година ще се наложи да продължи да учи в университета.
Серёжа:
На първо място, стажантите за нас са кадровия потенциал. Опитваме се да отгледаме хора в Яндекс, за да паснат идеално на нашите задачи. Даваме им всичко, от култури на общуване и взаимодействие в екипите до енциклопедични знания за всички наши системи.
Игнат:
Когато вземаме стажант, веднага проверяваме дали той ще може да се присъедини към нашия екип. И обикновено единственото препятствие е липсата на вакантно място. Стремим се да наемаме достатъчно млади хора каквито и да са обстоятелствата. Ако човек има пет години опит в разработката, стига до Яндекс, а по ниво е стажант, за нас това означава, че независимо колко добър е, ако кандидатства в Яндекс с пет години опит, той няма да може да се развие до старши разработчик. Обикновено причината е в скоростта: бавният напредък в миналото ще означава бавен напредък и при нас. Да, понякога осъзнаването, че човек не става, идва само след трите месеца. Но това е силно рядко. В повече от половината случаи сме готови да наемем хора за постоянна работа. Не си спомням случай, в който стажант да е завършил успешно, но да не е могъл да премине интервюто за постоянна позиция.
Миша:
На всички успешни стажанти предлагаме да останат в компанията. След стажировка взимаме за постоянна работа повече от половината. С летния стаж е по-сложно, защото често при нас идват студенти, например, от трети курс, и им е трудно да съчетават работа с учене.
Дима:
Да предположим, стажантът се справя отлично със задачите и има много перспективи да се развие в добър разработчик — нека дори сега да няма достатъчно опит. И да предположим, че няма вакантна позиция за постоянен договор. Тогава всичко е просто: трябва да отида при моят ръководител и му кажа — ето, много добър човек, трябва да направим всичко възможно да го задържим, да предложим нещо, да намерим къде да го продадем.
Истории за стажанти
Денис:
Момичето, което се присъедини при нас на стаж през 2017 година, беше от Перм. Това е на около 400 километра на запад от Екатеринбург. И всяка седмица тя идваше от Перм с влак в Школата за мобилна разработка. Пристигаше през деня, учеше вечерта и късно вечерта се връщаше обратно. Оценявайки такова старание, я поканихме да работи, и това се оправда.
Игнат:
Преди няколко години участвахме в програма за обмен на стажанти. Работата с чуждестранни младежи беше интересна. Но стажантите оттам не са по-добри от например, тези от ШАД или ФКНа. На пръв поглед, EPFL е в топ-20 на университетите в Европа. По онова време — когато бях още не особено опитен интервюиращ — имах такова очакване: невероятно, интервюираме хора от EPFL, те трябва да са супер. Но хората, които са получили базово образование по кодиране от нас — включително в ключови регионални университети — се оказват напълно на ниво.
Или една друга история. В момента в екипа ми има младо момче, около 20 години. Работи в Санкт Петербург, идваше на стаж. Той е много добър. Както обикновено, даваш му задачи, той ги решава, и след месец идва и казва: ‘Реших задачите, виждам, че архитектурата ви е зле построена. Нека я пренапишем. Кодът ще стане по-прост и по-ясен.’ Разбира се, опитах се да го разубедя: обемът на работа е голям, няма полза за потребителите, но идеята звучи напълно разумно. Човекът разбра сложния многопоточен процес и предложи подобрения — може би не навременни, рефакторинг за рефакторинг. Но когато се наложи да усложним този код, все пак можем да направим рефакторинга. Всъщност минаха няколко месеца и ние започнахме да работим по тази задача. С удоволствие го взех в екипа. Няма как всички да сме гении. Може да дойдеш, да разгледаш нещо и да ни посочиш проблемите. Това се цени.
Миша:
При нас има идеални стажанти. Въпреки липсата на опит, те разглеждат задачата не само на техническо, но и на глобално ниво. Предлагат принципни подобрения. Имат разбиране как да преведат задачите от реалния свят в технически, без да изгубят смисъл. Разсъждават за крайната цел, дали сега е времето да се задълбочава в детайлите или може да се промени напълно подхода към задачата или дори самото задаване на задачата. Значи, те имат потенциал да бъдат на няколко нива над другите. За да преминат този път, просто трябва да развият някои умения и вътрешни инструменти. Плюс да стартират няколко успешни проекта.

Източник: habr.com
