В этом интервью своим уникальным опытом освоения Scala и Spark поделится Михаил Кузнецов, ведущий инженер департамента разработки компании «Криптонит». Его карьерная лестница сделала крутой разворот, в результате которого из ритейла он перешёл в Big Data и анализ данных, полностью сменив не только привычные инструменты, но и сами подходы к программированию. — Михаил, расскажи, с чего вообще началось твоё знакомство с программированием? — Серьёзное программирование вошло в мою жизнь недавно, года три-четыре назад. Изначально заинтересовался программированием после выпуска из университета. В 2008 году я закончил Орловский государственный технический университет (ОрелГТУ) по профилю «Проектирование и технология электронно-вычислительных средств».  — Как затем ты пришёл в ИТ? — Как ни странно — через ритейл. После университета я работал во Francesco Donni. В основном я занимался настройкой программ от «1С», их поддержкой и доработкой, но быстро захотелось чего-то большего. Я решил учиться по программе сертификации и выбрал направление «1С: ERP». Это большой программный комплекс, нацеленный на производственные предприятия полного цикла, с тысячами пользователей. После этого перешёл в частную лабораторию, которая занимается медицинскими анализами, где начиналось внедрение этого продукта.  — Что тебе понравилось в этом направлении? — Это очень крутая штука: спецификации, планирование, наряд-заказы, циклы производства — всё это интересно, сложно и нужно как-то автоматизировать. Я стал заниматься внедрением и доработками «1С:ERP», которая замыкает все эти проблемы в круг и позволяет их эффективно решать. — Тогда что побудило тебя изучать Spark и другие языки? — Особенности бизнес-процессов у всех свои, поэтому иногда возможностей «1С» не хватало. Для решения таких эпизодических задач я использовал Delphi. За десять лет я достиг своего «потолка» в «1С» — получил все возможные «лычки» по программам сертификации, крутую зарплату, но начал постепенно выгорать. Было страшновато уходить в другой язык, но ещё страшнее было оставаться и заниматься рутиной. Очень хотелось освоить что-то новое. Подтолкнуло принять решение участие в одном плохо организованном проекте, на котором у меня совсем нервов не осталось. Тогда я подумал: «Всё, хватит!». Финансовая подушка к тому времени была, и я спокойно стал думать, чем бы мне хотелось заниматься дальше. — Какие рассматривал варианты? — Направление frontend оказалось совсем не моё. Backend-разработка была ближе, но это опять классика жанра: запрос / обработка / ответ. Python я отмёл просто потому, что он динамически типизированный. Стал посматривать на типобезопасные языки, и увидел большой спрос на Java. После первичного знакомства оказалось, что язык в освоении не тяжёлый и в нём есть свои интересные парадигмы. Начал читать книжки, понемногу кодить, общаться… и в какой-то момент заинтересовался Scala. Нарвался на него в статье, которая описывала бэкенд в функциональной парадигме с использованием фреймворка Cats Effect и паттерна Tagless Final. Эффект на меня он произвёл очень сильный, просто потрясающий! Первая реакция была: «Ничего не понятно, но жутко интересно!» — Что именно понравилось в Scala? — Это совершенно другой мир. Вот читаешь код на Java — там всё привычно: циклы, ветвления… скучная классика. Посмотришь на код Scala… господи, это как будто инопланетяне писали! Хочу в этом разобраться! Мне было важно найти новую работу, которая была бы мне интересна достаточно долго. Значит, она должна быть связана с интересным языком. — Scala подходил на эту роль? — Да. Я стал читать всё о Scala и выяснил для себя два важных момента: этот язык активно используется в бэкенде и в дата-инжиниринге. Оба направления мне нравились. В data engineering оказалось много общего с тем, что меня привлекало на прошлой работе: изучение бизнес-процессов и поиск путей их оптимизации, сбор и преобразование данных, их нормализация, глубокий анализ и генерация отчётов. Так я определился с направлением и стал копать в сторону дата-инжиниринга. — На этом этапе уже пробовал искать вакансии? — Я смотрел на HH, чего ждут от специалистов по data engineering, какой пул скиллов, что мне нужно подтянуть, а что освоить почти с нуля. Соответственно, читал по этой теме разные книжки, смотрел онлайн-курсы... На это ушло месяцев пять. — Так мало? — Только потому, что мне было жутко интересно. Я занимался ежедневно и тратил больше времени, чем обычно на рабочий день. Буквально с головой погрузился. В какой-то момент меня ждала очередная развилка. Оказалось, что дата-инженеры тоже бывают разные. Есть «софтовые», которым достаточно знать SQL, а есть «хардкорные», которым нужно уметь программировать на разных языках, уметь в алгоритмику, знать паттерны… Я выбрал второе. Начал изучать инструменты, которые Scala предлагает дата-инженерам, и наткнулся на Spark.   — В какой момент ты решил начать работать по этому профилю? — Сначала я работал у одного интегратора в подразделении, занимающимся разработкой аналитической платформы на базе Spark. Если кратко, эта платформа позволяет аналитикам ворочать терабайтами данных «почти» в real-time. — Это уже сфера «больших данных»? — Big data и data engineering тесно связаны. Эта платформа была своеобразным «ответом Западу» в области больших данных. Её основной компонент был написан на Spark. Для пользователя он выглядит как красивое окошко в браузере. Ты пишешь в него запрос, и он быстро обрабатывается, а по ту сторону сети выполняется анализ огромных массивов данных. В основном эта платформа использовалась банками и в нефтегазовой промышленности. Также её активно применяли для поиска различных «инсайтов», «узких мест» — способов оптимизации технических и бизнес-процессов. Например, датасайентисты определили, в каком режиме лучше эксплуатировать насос, чтобы он качал столько же нефти, но ломался реже и потреблял меньше электроэнергии. — А пробовали применять эту платформу для прогнозирования? — Конечно! Например, для прогнозирования выхода из строя различного оборудования и корректировки сроков его эксплуатации. Когда обслуживание плановое и превентивное, оно стоит относительно дёшево, а вот срочный ремонт и тем более замена какой-нибудь сломавшейся турбины всегда влетает в копеечку. — Что было самым сложным на этой работе? — Глубокая оптимизация. Spark — это классика дата-инжиниринга. Архитектурно он проектировался под максимизацию объемов обрабатываемых данных, а не времени отклика. Сегодня аналитику нужен результат сразу, максимум — в течение минуты. Мне пришлось лезть «под самый капот», чтобы сделать максимально производительное решение. Я тюнил JVM, «игрался» с параметрами Spark и его внутренними «хаками»… да много всего. — Как ты получил необходимые для этого знания? — Я параллельно учился. Посещал различные курсы, из которых хотел бы особо выделить Spark Advanced от NewProLab, который вели Андрей Титов и Егор Матещук. Конечно, можно было и самостоятельно это освоить, изучая код Spark, читая книги и статьи, прогоняя тесты, но это потребовало бы огромного объема времени, а задачи были в стиле «сделать красиво и ещё вчера». — Что заставило вновь сменить работу? — Внезапно ушёл единственный человек с большим опытом работы и в Scala, и в Spark. Планировалось, что он будет учить меня и ещё несколько джунов. Без него смысла оставаться не было. Я стал искать альтернативу. Хотелось найти вакансию, на которой можно было бы и выполнять задачи на своём уровне, и учиться дальше. Одновременно я осознал, что тот набор скиллов, который можно получить при самостоятельном изучении, уже достигнут, а дальше мне нужен опытный наставник и работа в профессиональной команде. — Такая команда нашлась в «Криптоните»? — Да. Наш HR-отдел вышел на меня буквально сразу после размещения резюме на HH. Может быть, они даже до его публикации как-то меня нашли. Собеседование было достаточно тяжёлое. В нём затрагивались не только хорошо знакомые мне темы по обработке данных, но и классический скаловый бэкенд. По дата-инжиниринговой части я отстрелялся хорошо, а вот по бэкенду — мягко говоря, плохо. Я не планировал развиваться в эту сторону и честно об этом сказал, на что мне ответили: «Нам нужно и то, и то». Я подумал, что не прошёл, но расстраиваться времени не было, так как меня ждали три недели каждодневных собеседований в другие компании. Почти во всех получил офферы.  — А потом тебе перезвонили из «Криптонита»? — Позвонили и сказали, что бэкендщиков довольно много, а вот скалистов и спарководов, которые могли бы двигать дата-инжиниринговые проекты, сейчас трудно найти. Скалисты — действительно редкие ребята, а скалисты-спарководы совсем редко встречаются. Причём, среди них если кто-то и находится, то это в основном джуны. В «Криптоните» уже был сеньор по Scala и Spark, но ему сложно было тянуть всё одному, а я готов был у него учиться. — Сразу приступил к работе? — После ещё одного собеседования с будущим руководителем. Кстати, все собеседования в «Криптоните» мне запомнились их глубиной. Они хоть и оказались технически сложными, но не были нервозными. Все разговоры проходили доброжелательно и честно. Это были не шаблонные вопросы, вроде «Кем вы видите себя через N лет?», и не дурные провокации, типа «В чём разница между уткой?», а толковые беседы по существу. Прямо по кирпичикам всё разбиралось. Сразу говорили, кого конкретно ищут, чего ждут, что реально готовы предложить, какие возможны варианты… Видно, что люди серьёзно настроены, и я был очень рад попасть в профессиональный коллектив. Ну и руководитель понравился как специалист. Я понял, что хотел бы с ним работать, научится у него чему-то новому. — Когда ты в итоге устроился?  — В самое «весёлое» время — в конце февраля 2022 года. Мне тогда звонили из других компаний, где я тоже недавно собеседовался, и говорили, что сворачивают свою деятельность в России. Предлагали релокацию и работу в офисе, но я отказался. Живу в Орле, работаю из дома. Не вижу смысла ни переезжать, ни тратить время на дорогу в офис и обратно. — Над чем ты сейчас трудишься? — Работаю по профилю дата-инжиниринга. Если в общих чертах, то я занимаюсь обработкой дата-сетов на Spark. Делаю агрегацию, консолидацию, очистку данных для очень мощной платформы с простым интерфейсом. Грубо говоря, для эффективной работы приложения необходимо подготовить качественные данные, создать разнообразные представления по этим данным и их агрегатам для последующей наглядной визуализации бизнесу. Финальным пользователям проще принимать решения на основе данных, когда они представлены наглядно и расставлены акценты. — Чувствуешь ли ты потребность освоить какие-то другие языки программирования в ближайшее время? — Периодически хочется копнуть глубже Rust. Этот язык оставил очень положительное впечатление при первом знакомстве, но реальной необходимости его изучать у меня пока нет, да и времени тоже. Посмотрим, как сложится дальше. ИТ-сфера суперизменчивая, а дата-инжиниринг изменчив в квадрате. Помимо того, что постоянно появляются новые инструменты, уже освоенные быстро меняются. Они обрастают дополнительным функционалом, его изучение требует времени. — Можешь порекомендовать книги, курсы и веб-ресурсы по Scala и Spark, которые действительно тебе помогли? — В основном я читал книги издательства O’Reilly (Spark: The Definitive Guide, Learning Spark 2nd Ed, Stream Processing with Apache Spark). Насчёт курсов: я очень советую не просто их просматривать, а параллельно проверять всё увиденное и вести какой-то pet-project. Без кодинга и решения реальных задач всё быстро забудется. Мне очень помогли курсы NewProLab, где было много «подкапотной» практики по спарку. Они довольно хардкорные и имеют строгие дедлайны. Если возникнет желание их пройти — закладывайте на это значительный объём времени. — Что посоветуешь молодым людям, которые только сейчас начинают карьеру программиста и стоят на распутье, как и ты в своё время? — Смотрите не только на деньги и востребованность специальности. Попробуйте оценить свой интерес к будущей профессии. Для успешной карьеры нужно постоянное желание копаться во всём новом и сложном, что появляется в вашей профессиональной среде. Выбранное направление должно сразу вас зажигать, тогда и остальное приложится. Со временем будет и хорошая зарплата, и карьерный рост, а вот подходящий коллектив и толкового тимлида придётся найти самостоятельно.