Думаю, ни для кого не секрет, что айтишники загребают деньги лопатой. Но о том, что нужно для получения такой работы, пишут редко. В марте этого года я решил сменить работу и весь апрель провел на собеседованиях, в результате получил несколько предложений по зарплате около 700к/мес. Вот об этом я и хочу поговорить.
Немного о себе: коммерческим программированием занимаюсь 13 лет, еще несколько лет работал в других сферах. Основной язык — C++, хорошо знаю Python и ML. Имею опыт работы как в небольших компаниях из 5 человек, так и в ИТ-гигантах.
Я искал работу программистом, а не менеджером. Это добавляло некоторых особенностей, ведь бытует мнение, что большие деньги можно получать только на руководящих должностях. Это не всегда так (но на руководящих должностях легче получить большие деньги, потому что менеджеров нужно больше, чем топовых специалистов).
В первую очередь, когда я решил сменить работу, я обновил свой профиль на linkedIn и на hh.ru, на следующий день мне начали писать рекрутеры. Меня стали звать в разные секции - и технические, и "разговорные". Я либо не буду переписывать свои ответы, либо очень кратко, т.к ответы легко можно найти гуглом (а где не получается, спрашивайте в комментариях), иначе пост разрастется совсем.
Huawei
Интересная часть была на совещании по социальному обеспечению в Huawei. Я пошел туда на позицию ML-разработчика, который не будет обучать модели, а сам будет писать библиотеки для обучения моделей. В социальной службе было 5 человек, и они меня по очереди спрашивали по каждой теме (все это длилось в общей сложности два часа):
- Знание C++ в первую очередь. Зачем нужны умные указатели, зачем виртуальный деструктор, как работает vtable и прочая хрень. Я ответил на все легко и уверенно, интервьюер быстро «кивал» и мы переходили к следующему.
- Аппаратное обеспечение и программирование на C. Какие существуют архитектуры кроме x86? Говорили об АРМ. Потом спросили про вычисления на GPU — рассказал про примерную архитектуру и принципиальные отличия от CPU. «Что еще можно использовать для расчетов?» Позвонил в ПЛИС, рассказал немного о функциях. Кроме того, тот же человек спрашивал о функциях C. Различные вопросы о разнице между int *a =malloc(20); и int a[5];, про блок управления памятью, про страницы памяти и виртуальную память (почему количество новых страниц всегда больше количества старых? что происходит с количеством удаленных страниц?), про механизм внешний, союзный, энергозависимый.
- Потом были вопросы по математике. Как вычислить синус и косинус без соответствующей функции? Он говорил о сериале Тейлор. Спрашивали что-то про градиенты, просили вычислить производную от |x| (x-модуль), а затем вторая производная. Итак, несколько вопросов о градиентах. Мы перешли к аффинным преобразованиям и методам их описания. Он говорил о матрице, собственных векторах и их связи с геометрическим смыслом преобразования. Затем они спросили о якобитах и гессенцах. Этот вопрос меня позабавил, но я сказал и в то же время упомянул, что эти вещи полезны при определении сходимости некоторых численных методов.
- Многопоточность. Тут как-то быстро все было, видимо люди уже заскучали после первых трех частей. Основы про примитивы синхронизации (мьютексы, семафоры), про атомарность, заодно про атомарность на уровне процессора. На это ответили, рассказали о загрязнении кеша и методах разрешения конфликтов в кеше процессора - хватит.
- Вообще-то МЛ. Какие бывают слои сеток, какие сейчас популярные архитектуры, почему это не взлетело 20 лет назад, хотя знаний тогда уже было много. Как получаются отсева, зачем нужна пакетная нормализация, почему регуляризация L1 позволяет увидеть значение функций. Как создавать вставки для слов, почему это вообще работает?
Интервью получилось очень разноплановым. Но это еще не все, после этого был еще один часовой телефонный разговор, где мы обсуждали (уже с другими) мой предыдущий опыт. В каких крупных проектах я участвовал, какие фичи продукта делал, какие решения принимал, как это повлияло на бизнес. Несмотря на то, что я был разработчиком, от меня ожидали, что я буду очень самостоятельным и иногда даже смогу помогать управлять/организовывать процессы. Практически не задавали технических вопросов.
В итоге мне предложили зарплату 480к (после налогов) и бонусы, которые зависят от разных факторов (моя результативность, общие финансовые показатели компании и т.д.), что должно было довести мой доход до 685к/мес на средний.
Сбер
В Сбербанке было несколько разделов с вводом кода и один для «чата». Раздел коммуникации везде примерно одинаков, поэтому повторяться здесь не буду. О написании кода:
- Чистый С++. Была часть, чтобы проверить мое знание самого языка. Мне показали код, где есть несколько классов, где-то виртуальные методы, какой-то класс наследуется от другого, где-то в конструкторах и деструкторах написано что-то нетривиальное. И вопрос был "что даст программа?" Был сделан вывод, что в родителе была функция печати (которая пишет что-то базовое) и она была переопределена в наследнике. Небольшой момент заключался в том, что функция не была объявлена виртуальной. Далее эти отпечатки появились в конструкторе и деструкторе. В общем, вопрос крутился вокруг того, что в каком порядке называется. Я почти успел, но пропустил один звонок из-за невнимательности. Но это был простой момент (а на сложные я отвечала), поэтому интервьюер как будто подумал, что это просто невнимательность, а не незнание. После этого спросили "о чем думал автор кода?" и попросил исправить. Такие вопросы будут очень сложными для юниоров, потому что «откуда мне знать, что он хотел?» и относительно легко для опытных разработчиков, потому что вы понимаете, каковы общие подходы и что «они обычно так пишут, но не так». Вообще вопрос прикольный для определения опыта человека. Потом дали другой код с многопоточностью и надо было сказать есть ли в нем ошибки. Потерялся lock_guard (типичный баг при работе с мьютексом), попросили исправить и объяснить, как именно раскручивается стек в многопоточности при обработке исключений.
Отличительной особенностью этой части было то, что весь код писался в онлайн-переводчике, и каждый раз, когда я отвечал на вопрос "что будет выдавать код" мы просто запускали и смотрели. Было особенно круто, когда я сказал, что "вылетит из-за std::terminate", и он действительно вылетел из-за std::terminate.
- Алгоритмы. Задания, которые можно писать на любом языке (но я писал на C++).
-
Датчики есть. Один датчик сначала выдает нули, а потом, с определенного момента, начинает выдавать единицы. Имеются синхронные показания N датчиков (в виде набора массивов, каждый из которых содержит M значений). Нужно найти номер датчика, который сработал первым. Это должно быть сделано эффективно, я реализовал это за O(N + log(M)).
-
Воссоздаем лотерею: есть набор людей, о каждом известно, сколько билетов человек купил. Нам нужно написать функцию, которая будет выбирать случайного человека с вероятностью, пропорциональной количеству купленных билетов (и отображать его имя на экране).
-
Было еще одно задание, но я не помню, что-то маленькое и скучное.
Про эту часть могу сказать, что на высоком уровне уже учитывают не только, решил ты или нет, но и как быстро и какой код пишешь. На каждое задание у меня уходило не более 15 минут, итого выслушивание условия и обсуждение своего решения, т.е просто написание кода занимало 5-10 минут.
- Раздел по МЛ. Были разные вопросы о том, как подходить к экспериментам с моделями (зачем нужна отдельная валидация и отдельные наборы тестов?), что такое ab-тесты и т.д. Довольно много вопросов по системам ранжирования (что это такое, в чем особенности) - он говорил о совместной фильтрации и встраивании. Было задано много технических деталей, например, почему декомпозиция матрицы выполняется с помощью SVD. Но в целом ничего особенного. Типичный раздел ML с обязательными вопросами типа "как понять, что модель переобучилась, что делать? Как понять, что данных недостаточно, что делать?"
- Общая часть. Ходил в SberDevices, так что тоже важно было разобраться в некоторых "железных" вопросах. Он рассказал об архитектуре процессора, кэшах, ядрах, конвейере, о том, что внутри процессора находится отдельный компьютер и за один такт выполняется несколько микрокодов, о TLB и так далее. Далее про видюхи, их функции по отношению к процессорам, про взаимодействие с памятью. Это был вопрос типа "вам нужно ускорить умножение матриц, как бы вы это сделали с видеокартой?" или например "можно ли ускорить поиск кратчайшего пути на графе с помощью видеокарты?".
Сбербанк предложил зарплату 455к и различные бонусы, всего 675к в месяц.
Яндекс
Я уже работал в Яндексе и даже успел провести больше сотни собеседований, поэтому достаточно хорошо понимал, что меня ждет. И несколько разделов ждали, пока я напишу код "в блокнот", т.е без возможности запуска. И еще часть про ML.
- Алгоритмы.
-
Удалить нули из массива. Здесь все просто, тест для полного новичка.
-
Напишите свою собственную реализацию shared_ptr. Скучный, но хороший тест для понимания внутреннего устройства языка.
-
Напишите условный ограничитель скорости. Это функция, которая принимает отметку времени события и максимальное количество таких событий, разрешенных за последние 600 секунд. Нам нужно отвечать на каждый вызов этой функции, будь то хороший запрос или уже «лишний», т.е запросов за последние 600 секунд было больше, чем порог. Отметка времени гарантированно не будет уменьшена.
-
Есть имена программ (на самом деле просто набор строк), и для каждого есть набор зависимостей (т е массив строк для каждой программы). Зависимости только из одного списка, т.е если у нас есть программы a, b, c, то программа b может зависеть от a, но не может зависеть от f (потому что в списке нет программы fi). Нужно отображать имена этих программ в "правильном" порядке установки, т.е так, чтобы если пакет был в списке - все его зависимости были перед ним в этом списке.
Были и другие задачи, но я точно не помню условий. Здесь тоже важна скорость написания и наличие ошибок. Если вы посадите хотя бы одно насекомое (и сами не поймаете) - это достаточно критично.
- МЛ. Не очень хочется подробно описывать эту часть, потому что она была почти "по учебнику". Если есть желание подготовиться, HR присылает ссылку на YouTube с роликами из Яндекс. Видео очень классные (можно поискать по ключевым словам "Лекции по машинному обучению, Воронцовский САД").
- Общая часть. Здесь самым главным была «соль». Годится только для решения алгоритмических задач - годится, но не за 700к. Состоялось общение с будущим менеджером и обсуждение потенциальных задач. Мне дали примеры задач (к сожалению, я не могу их раскрыть, т.к они сейчас в работе) и я тут же предложил какие-то идеи по решению этих задач. Чтобы не быть голословным, приведу примеры того, о чем можно спрашивать. Это геосервисы, поэтому вопросы вполне тематические:
-
Как построить маршрут, чтобы водитель приехал быстрее? это вопрос-бомба, убийственный вопрос. Потому что большинство программистов начинают говорить о хороших алгоритмах, а потом спотыкаются на вопросе "как вы измеряете то, что драйвер стал быстрее? Как вы доказываете, что вы заметно улучшили что-то для клиента?" Суть проблемы в том, что приходится думать не только о технической составляющей, но и о конечном пользователе. Недостаточно написать алгоритм, который быстрее или точнее прогнозирует маршрут. Он также должен быть полезен клиенту, а программисты часто об этом забывают.
-
Мы начинаем бизнес (например, такси) в новом городе. У нас есть примерная карта дорог, но статистики проезда по этим дорогам нет. Как спрогнозировать время в пути, чтобы честно оценить стоимость поездки? Опять же, вопрос о бизнесе, а не о технологиях. Да, здесь надо показать знание техники, но этого недостаточно. Типичный программист "в курсе" скажет, что нужно найти поставщиков данных, можно самому поездить по этим дорогам для сбора статистики и т.д. Но все эти этапы занимают минимум недели, а на деле - месяцы. А для компании зачастую выгоднее запустить с плохими данными на полгода раньше, чем через полгода, но с хорошими и точными данными. Поэтому хороший кандидат должен сказать за себя, что, мол, "купить данные можно - но это плохо и долго. А мы будем делать то и это, потом качество ухудшится, но быстро. Насколько качество ухудшится - мы посчитаем так.И на бизнес-целях(которые сам человек должен предложить) это отразится так.А потом спросим у стейкхолдеров сервиса готовы ли они запускать сервис с таким же(относительно плохого) качества, но на полгода раньше".
Это не все, но думаю суть ясна.
Яндекс предложил мне зарплату 490к и разные другие бонусы, итого 720к в месяц.
Другие компании
Кроме того, я также проходил собеседования в Тинькофф, ВК, 1С и некоторых небольших компаниях. Но общение с ними растянулось на сутки, и в целом этого оказалось достаточно, чтобы сформировать понимание, какие вопросы они мне задавали. Если у вас есть вопросы или нужны какие-то уточнения - пишите в поле для комментариев.
В итоге выбрал Яндекс, но текущую зарплату лучше не указывать во избежание казусов. Это больше, чем мне изначально предлагали.
Больше интересных статей здесь: История.
Источник статьи: Как пропили Великое княжество Литовское.