Хабр, привет! Меня зовут Никита, я софтвер-инженер в Huawei. Мой путь в IT был не совсем обычным — я осваивал алгоритмы раньше языка, откатывался почти к старту на каждом месте работы, а однажды даже занял второе место в хакатоне для «питонистов» без знания Python. Но обо всём по порядку.
Почему я ушёл из сферы строительства
Я ещё в школе думал, что хочу заниматься чем-то на компьютере, но, к сожалению, таких перспектив в моей жизни долго не появлялось. В моей новосибирской школе не было информатики, и поэтому мне никто не разрешил её сдавать. Пришлось остановиться на физике с математикой. Так я волей случая попал в сферу строительства.
Окончил местный вуз, устроился на работу и… продержался меньше года. Я был обследователем, то есть подготавливал рабочую документацию для восстановления различных элементов зданий, выезжал на объекты, бурил шурфы, проводил вскрытие армирования железобетонных конструкций, занимался замерами и много чем ещё.
Что не нравилось? Основным минусом была, конечно, зарплата в 8 000 рублей в месяц, но вдобавок к этому и отношение начальства было ужасным — «ты всё нам должен, потому что мы тебе платим». Смешно, откровенно говоря.
Поступил в магистратуру на кафедру информационных систем и технологий. Немножко потрогал Java, немножко C++, но в основном занимался моделированием — в Revit, AutoCAD, 3ds Max. Затем переехал в Москву, поступил в аспирантуру в МТуСИ и устроился работать в ведущий институт Москвы по генеральному планированию.
Там я занимался BIM-моделированием — воссозданием в 3D строений и районов с прилегающей инфраструктурой и всеми коммуникациями. Чаще всего к нам приходили проекты по реновации. Работа была интересной, но через полгода пришли великие оптимизаторы и сократили 25% персонала. Я как новичок мог попасть под сокращение, но так как был одним из немногих, кто умел проектировать дороги в Civil 3D, эта участь меня миновала.
Ужасное отношение к сотрудникам — проблема не отдельных компаний, а, в большинстве случаев, всей сферы строительства. Если у вас иначе, то вам повезло гораздо больше, чем мне или моим друзьям, которые больше по специальности не работают
После момента с сокращениями я всерьёз задумался о школьной мечте стать программистом. А ещё один из моих друзей переобучился на тестировщика и рассказал, что, оказывается, в IT здорово — там по крайней мере люди общаются друг с другом более-менее адекватно. Я решился и стал совмещать работу с обучением.
Первые шаги: почему я почти сразу нашёл работу
Я выбрал C++ случайно. Ко мне приходил друг, разработчик C++, рассказывал про работу. Я сказал: «Вау, круто, а что ты можешь сделать?» Он открыл Visual Studio, написал какой-то простой цикл. Я повторил, мне понравилось. Вот и всё — никакой особенной рефлексии за этим не было.
Выбирал среди нескольких школ, но остановился на Яндекс Практикуме, потому что оттуда не названивали менеджеры по продажам. Правда, курса по C++ тогда ещё не было, поэтому я пошёл на «Алгоритмы и структуры данных», тем более друг-разработчик рассказывал, что это важная тема, которая всё равно пригодится (спойлер: сейчас я понимаю, что можно было «вкатиться» и без них, но кто же знал).
Это были четыре месяца мучения. Курс рассчитан на тех, у кого есть опыт, поэтому мне было очень тяжело. Приходилось много читать о синтаксисе, контейнерах, ещё какой-то гадости. Что это? Зачем мне это нужно? Короче говоря, приходилось с нуля изучать базу.
После обучения я поучаствовал в хакатоне от Практикума. Интересно, что они его организовали, но как-то упустили деталь, что на бэкенд в команды ищут именно Python-разработчиков. Естественно, я узнал об этом, когда команды уже были набраны. Пришлось разбираться на месте. Просидел 16 часов, но написал свою маленькую базу данных. Связка между фронтендом и бэкендом осталась незавершённой. Но это не помешало нам занять второе место! Было тяжело, но весело.
К этому моменту у меня были скромные знания C++ и неплохая база по алгоритмам. Я стал собеседоваться, и меня начали звать довольно хорошие компании, как наши, так и зарубежные. Например, я прошёл собеседования в Parallels, «Код безопасности», «Русбитех», которые делают Astra Linux.
Знаю, что на старте многим трудно найти работу. Думаю, что на моей стороне были несколько обстоятельств.
На рынке не так много «плюсовиков». Вакансий тоже меньше, чем, например, у Python-разработчиков, но всё равно — по ощущениям, разработчики C++ востребованы сильнее.
У меня было отличное резюме. Я хорошо его написал, добавил ссылку на GitHub, рассказал про предыдущий опыт. Спасибо акселератору Практикума — тонкостей создания резюме я нахватался там.
Сыграл мой прошлый опыт. Скажем так, он технический и совсем непростой. Программирование там тоже в каком-то виде было. Я проводил обучение специалистов из разных отделов, читал лекции и проводил практические занятия, вёл проекты и управлял командами.
Тогда в Практикуме появился курс «Разработчик C++», я решил записаться. В Parallels меня в итоге не взяли как раз поэтому — побоялись, что буду отвлекаться. Я пошёл в «Код безопасности».
Код безопасности: DevOps и CI/CD
Моя первая работа на «плюсах» была джуниором DevOps-инженером. Это был трэш.
В первые недели тебя начинают пичкать какими-то новыми словами, которые ты просто не знаешь. То есть тебе что-то говорят и ждут какую-то реакцию, а ты только и можешь, что сказать «ага» или «а-а». Спасибо «Коду безопасности» — к этому относились с пониманием, всё объясняли.
Я много работал с облачной платформой Microsoft Azure Devops Services, делал CI/CD, писал скрипты на XML. Вот последнее было самым сложным — скрипты были практически нечитаемыми, и проверять их можно было только при запуске самих пайплайнов. Задачи мне поначалу ставили простые (по их меркам, конечно): собери патч, внедри новый модуль, найди причину ошибки. Иногда на задачу, которая у тимлида занимала полтора часа, я тратил целый день.
Где-то через два месяца я уже мог спокойно выполнять рутинные задачи и начал придумывать, как это оптимизировать. Например, написал небольшой скрипт, который помогал собирать патчи, и сильно облегчил себе работу. Это было классно.
Через полгода размеренной работы меня поставили перед фактом: нужен совсем новый CI/CD и новые скрипты, кроме того, нужно глубоко изучить возможности Microsoft Azure Devops Services, чтобы использовать их в решении. Эта работа заняла у меня почти год. Когда прототип был близок к завершению, случилась всем известная ситуация, от которой все побежали в разные стороны. Побежать решил и я, но компания не разрешала удалёнку. Пришлось уходить.
Яндекс: работа с сетями
Я уже был в отъезде, когда со мной связался рекрутер из Яндекса. Я прошёл серию собеседований и устроился. Уже на позицию C++ разработчика.
И тут снова синдром самозванца: мне дико страшно, я вижу тонны кода, которые не понимаю, и сталкиваюсь с задачами, которые ещё не решал. Но поначалу они были не такими уж сложными: исправить баги, поработать с конфигурационными файлами, изучить какой-нибудь модуль, посидеть в саппорте и помочь пользователям разобраться с ошибками. В Яндексе я начал работать с сетью, выучил коды ошибок, понял, как работает JavaScript, как пишутся сайты.
Больше мне, впрочем, рассказать нечего. В один момент с задачами пришёл руководитель группы, и, к сожалению, с ним мы общий язык не нашли. Так я ушёл из Яндекса, проработав в нём около четырёх месяцев.
Huawei: LLVM и анализ кода
С тех пор я работаю в Huawei. Мы занимаемся внутренним продуктом для разработчиков, помогаем им не совершать ошибок при написании кода. Для этого я работаю с LLVM. И это очередная сложнейшая вещь в моей карьере. Такая работа может показаться не очень интересной, но знать в ней нужно прямо дофига. Как раз тут мне пригодились алгоритмы!
Кроме этого, нужно изучать кучу документации. Чтобы написать маленький чекер, у меня уходила неделя. Я переживал из-за каждой строчки кода и постоянно думал, что вообще не понимаю, что надо делать. Так было первые пять-шесть месяцев. К счастью, тут мне снова повезло с командой. Мне не давали сложных задач, всё объясняли и показывали.
В Huawei мы работаем по большей части со статическим анализатором, в частности Clang Static Analyzer. Пытаемся его модернизировать, пишем плагины, тестируем всё это дело. Пишем специальные правила для поиска различных уязвимостей в коде. Это очень кропотливая, сложная работа с огромным количеством false positives и false negatives. И она особенно помогает углубиться в знание самих «плюсов», потому что работа заключается как раз в анализе кода.
Самое важное: почему ничего не понимать — это норм
По сути, и в Яндексе, и в «Коде безопасности», и поначалу в Huawei я занимался джуниорскими задачами, просто разного характера. Там не было ничего сверхсложного, и даже к тимлиду было ходить необязательно — большая часть информации находилась и в легаси-коде, и на сайтах. Но даже эти задачи требовали много сил и времени. А ещё вызывали дикий стресс из-за синдрома самозванца и неуверенности в собственном коде. Это повторялось каждый раз, когда я менял работу. Спустя несколько месяцев такие задачи уже давались легче, и страх уходил.
Есть определённые направления, в которые ты можешь сознательно углубляться и совершенствоваться как специалист. Но есть и базовые вещи, необходимые для работы, которые не даст ни один курс. Они свои на каждом месте работы. То есть те же CI/CD в каждой компании могут быть написаны абсолютно по-разному, и тебе придётся в них погружаться, осваивать что-то новое.
У меня получилось так, что я поработал с CI/CD, с сетями, с LLVM. С одной стороны, я точно знаю, что всё это мне ещё пригодится. С другой, я понимаю, что в любом случае на каждом месте мне придётся осваивать даже знакомые инструменты с новой стороны.
Возможных направлений у разработчика C++ много. Например, сейчас очень востребованы специалисты по ROS — среде разработки для роботов и автопилотов. Насколько я знаю, туда берут даже людей без опыта, потому что с этим мало кто работает. Значительную часть информации придётся осваивать уже на месте, и это нормально.
Чтобы убедиться, можно открыть случайную вакансию. Скорее всего, кроме базовых пунктов, которые знают все, будут и какие-то новые, свойственные какой-то конкретной сфере. Я советую не бояться откликаться на такие вакансии. Ведь если ты чего-то не знаешь, это не значит, что тебя не возьмут. Мой опыт это подтверждает.