Многие знают, что специалисты в IT-сфере могут зарабатывать очень хорошо, но редко кто подробно рассказывает, что именно нужно для получения такой высокооплачиваемой работы. В марте я принял решение о смене работы и весь апрель посвятил собеседованиям. В результате я получил несколько предложений с зарплатой около 700 тысяч рублей в месяц. Хочу поделиться этим опытом.
Немного о моем бэкграунде: я занимаюсь коммерческой разработкой 13 лет, до этого несколько лет работал в других областях. Мой основной язык — C++, также я хорошо знаю Python и машинное обучение (ML). Опыт работы включает как небольшие команды из 5 человек, так и крупные IT-корпорации.
Я искал именно позицию программиста, а не менеджера. Это добавляет свои нюансы, ведь распространено мнение, что большие деньги платят только на руководящих должностях. Это не всегда так, хотя менеджеров на рынке действительно требуется больше, чем топовых разработчиков.
Первым шагом я обновил свои профили на LinkedIn и hh.ru. Уже на следующий день мне начали писать рекрутеры. Собеседования делились на технические и «разговорные» (поведенческие) части. Я не буду детально переписывать все свои ответы, чтобы пост не превратился в книгу, но кратко опишу ключевые моменты. Подробные ответы на многие технические вопросы легко найти в интернете, а если что-то останется непонятным — спрашивайте в комментариях.
Собеседование в Huawei
Интересный опыт — собеседование в Huawei на позицию ML-разработчика, который будет создавать библиотеки для обучения моделей, а не просто их использовать. Техническая часть длилась около двух часов, и пять интервьюеров по очереди задавали вопросы по разным темам.
Знание C++: Спрашивали про умные указатели, виртуальные деструкторы, работу vtable и другие тонкости языка. Я отвечал уверенно, интервьюер быстро соглашался, и мы переходили дальше.
Аппаратное обеспечение и C: Обсуждали архитектуры (ARM, x86), программирование на GPU, принципиальные отличия от CPU, а также возможности ПЛИС. Были вопросы по управлению памятью в C: разница между динамическим выделением и массивами, страничная и виртуальная память.
Математика: Как вычислить синус и косинус без стандартных функций (ряд Тейлора). Спрашивали про градиенты, производные, аффинные преобразования, матрицы, собственные векторы, якобианы и гессианы. Я упомянул, что последние полезны для анализа сходимости численных методов.
Многопоточность: Вопросы были сжатыми, видимо, все уже устали. Обсудили примитивы синхронизации (мьютексы, семафоры), атомарные операции на уровне языка и процессора, а также проблемы с кэш-памятью.
Машинное обучение: Типы слоев в нейросетях, популярные архитектуры, причины всплеска ML сейчас в сравнении с 20-летней давностью. Обсуждали dropout, batch normalization, регуляризацию L1 и создание эмбеддингов для слов.
После этого был еще часовой разговор по телефону, где обсуждали мой предыдущий опыт: участие в крупных проектах, влияние моих решений на бизнес. Несмотря на позицию разработчика, от меня ожидали самостоятельности и даже элементов организации процессов.
Итог: Предложили зарплату 480k чистыми и бонусы, которые в среднем должны были довести доход до 685k в месяц.
Собеседование в Сбер
В Сбербанке (SberDevices) было несколько этапов с написанием кода и поведенческое интервью.
Чистый C++: Показали код с классами, виртуальными методами, наследованием. Нужно было предсказать вывод программы, включая порядок вызовов конструкторов и деструкторов, особенно когда функция печати не была виртуальной. Затем попросили исправить код и объяснить, что хотел автор. Это сложно для джуниоров, но опытные разработчики понимают типичные паттерны. Дальше был код с многопоточностью, где нужно было найти ошибку (пропущенный lock_guard) и объяснить раскрутку стека при исключениях. Код запускали в онлайн-компиляторе, что было наглядно.
Алгоритмы: Задачи решались на любом языке (я использовал C++).
1. Задача о датчиках: Есть N датчиков, каждый выдает M значений (сначала нули, потом единицы). Нужно эффективно найти датчик, который первым начал выдавать единицы. Я реализовал за O(N + log(M)).
2. Лотерея: Набор людей с известным количеством купленных билетов. Нужно выбрать случайного человека с вероятностью, пропорциональной числу его билетов.
3. Еще одна небольшая задача.
Важна была не только правильность, но и скорость написания кода — на каждую задачу уходило около 5-10 минут.
Машинное обучение: Вопросы о методологии экспериментов (валидация и тестовые выборки), A/B-тестах, системах ранжирования (коллаборативная фильтрация, эмбеддинги). Спрашивали технические детали, например, зачем использовать SVD для декомпозиции матрицы. Типичные вопросы: как определить переобучение и что делать при недостатке данных.
Общие вопросы по железу: Так как позиция в SberDevices, спрашивали об архитектуре процессора, кэшах, конвейеризации, TLB. Также о GPU: как ускорить умножение матриц или поиск кратчайшего пути на графе с помощью видеокарты.
Итог: Предложили зарплату 455k и бонусы, итого около 675k в месяц.
Собеседование в Яндекс
Я уже работал в Яндексе и провел много собеседований, поэтому знал, чего ожидать. Были этапы с написанием кода «в блокнот» (без запуска) и часть по ML.
Алгоритмы:
1. Удалить нули из массива. Базовая задача.
2. Реализовать свой shared_ptr. Скучно, но проверяет глубокое понимание языка.
3. Реализовать ограничитель скорости (rate limiter). Функция принимает timestamp события и лимит событий за последние 600 секунд. Нужно определять, превышен ли лимит. Время гарантированно не убывает.
4. Топологическая сортировка для установки пакетов. Есть программы и их зависимости (только из заданного списка). Нужно вывести порядок установки, при котором зависимости идут перед самим пакетом.
Критически важны скорость и отсутствие ошибок. Одна незамеченная ошибка может стать фатальной.
Машинное обучение: Этап был довольно стандартным, почти «по учебнику». Для подготовки HR даже присылает ссылки на отличные лекции по ML от Яндекса (Воронцов).
Общее интервью (самое важное): Здесь проверяли не только технические навыки, но и бизнес-мышление. Общался с будущим руководителем, обсуждали реальные задачи (которые не могу раскрыть). Приведу примеры тематических вопросов для геосервисов:
1. Как построить маршрут, чтобы водитель приехал быстрее? Это вопрос-ловушка. Многие начинают говорить об алгоритмах, но спотыкаются на вопросах: «Как вы измеряете „быстрее“? Как докажете пользу для клиента?» Нужно думать о конечном пользователе, а не только о технологии.
2. Запуск такси в новом городе без статистики по дорогам. Как прогнозировать время поездки для расчета стоимости? Типичный программист предложит собирать данные месяцами. Хороший кандидат должен оценить компромисс: запустить сервис быстрее с менее точными данными или ждать полгода для идеальных. Нужно предложить метрики для оценки ухудшения качества и обсудить это со стейкхолдерами.
Это показывает, что на высоких позициях ценят умение связывать технические решения с бизнес-целями.
Итог: Предложили зарплату 490k и бонусы, итого около 720k в месяц.
Другие компании
Я также проходил собеседования в Тинькофф, VK, 1С и несколько небольших компаний. Общение с ними было менее интенсивным, но в целом дало понимание о типичных вопросах на рынке. Если нужны детали — спрашивайте в комментариях.
В итоге я выбрал Яндекс, где итоговая зарплата оказалась выше первоначального предложения. Точную цифру указывать не буду, чтобы избежать недопонимания.
Больше интересных статей здесь: История.
Источник статьи: Как пропили Великое княжество Литовское.