Архитектор программного обеспечения в YADRO. Работает в телекоме 15 лет. Принимал участие в проектах по внедрению 4G, а затем и 5G. Всё это время участвовал в разработке программного обеспечения, в основном ядер сети. Хабр, привет! Недавно я спросил нескольких коллег — вчерашних студентов, как они представляли себе разработку в телекоме до того как пришли в эту сферу. Их ответы были очень далеки от реальности. Многие считали, что разработка в телекоме — это возня со старым пыльным железом на чердаках и в подвалах. Внедрять новые и современные решения невозможно из-за тонн легаси, в сторону которого все боятся даже дышать. А большинство коллег — бородатые деды, которые программируют паяльником и строго следуют парадигме каскадной разработки. Да и задачки в целом довольно скучные: перекладываешь байты — и, в общем-то, больше ничего не происходит. Нечего будет рассказать внукам, когда сам станешь бородатым дедом. Мой сегодняшний пост — рассказ о том, что на самом деле происходит в разработке телекоммуникационного оборудования для сотовых сетей с точки зрения программиста, и почему эта работа чертовски вдохновляет. Мне встречалась цифра, что за последние 20 лет быстродействие железа увеличилось примерно в тысячу раз. Но вместе с производительностью, а порой и опережая её, растут и потребности решаемых с его помощью задач в скоростях, объемах вычислений, трафике и так далее. Поэтому телеком-инфраструктуры регулярно модернизируются и прирастают новым, более современным оборудованием. Мы как программисты редко имеем дело непосредственно с железом. В основном работа идёт на эмуляторах, причём аппаратная платформа, на которой будет работать код, может быть ещё даже не произведена. Всё, с чем мы взаимодействуем в процессе разработки – это серверы, виртуальные машины и эмуляторы. Непосредственно с оборудованием мы напрямую не контактируем. А вообще современное железо в основном выглядит так. Посмотрите, какая красота. Телеком-разработчикам, конечно, приходится работать с большими кодовыми базами. Но этот код покрыт тестами и не устаревает, а принцип «Работает — не трогай» больше не актуален. Неподдерживаемое легаси практически исчезло. На мой взгляд, это произошло по следующим причинам. В начале 2000-х годов все глобальные вендоры телекоммуникационного оборудования, такие как Motorola, Siemens, Ericsson, сами производили аппаратное обеспечение. Исповедовался «коробочный» подход: большая часть функционала реализовывалась в те времена в железе, код почти всегда писался один раз под конкретное оборудование, тестировался и поставлялся как одно готовое конечное изделие или продукт. В середине 2000-х начался процесс унификации: появился стандарт ATCA, а вскоре появились и производители off-the-shelf-компонентов под него. Как следствие, снизилось разнообразие аппаратных платформ, появилась возможность переиспользовать код. В начале 2010-х завершился перевод телекоммуникационного оборудования с cell-switched-сетей на IP-сети, что позволило уйти от использования специфичных транспортных протоколов (например, ATM), малоизвестных широкому кругу не занятых в телеком-разработке инженеров. Это стало началом разработки телекоммуникационного оборудования на железе общего назначения и в облаках. В этом случае код может жить очень долго, потому что такое аппаратное обеспечение, как правило, имеет долгую обратную совместимость. Ещё не так давно при любом изменении кода нужно было проводить полный цикл тестирования в лаборатории: многие ошибки можно было обнаружить только на этом этапе, а затем исправлять и снова проводить полный цикл тестирования. С появлением CI-практик широкая автоматизация тестирования позволила находить ошибки на гораздо более раннем этапе, и быстрее их исправлять. Как следствие, стоимость и сложность внесения изменений в код сильно упала. То, что раньше боялись трогать, стало возможно относительно быстро отрефакторить и быть уверенным, что цикл «тестирование-поиск ошибок-тестирование» не затянется на годы. Это тоже способствует более долгому времени жизни кода, облегчает его поддержание в рабочем состоянии и переиспользование. Телеком — это гонка, и надо постоянно «бежать со всех ног, чтобы только оставаться на месте». Конкуренты не дремлют, а операторы хотят получать новые фичи вчера, а еще лучше — позавчера. Поэтому команды разработки непрерывно растут, а кодовые базы модернизируются. Старых технологий, которые обычно характеризуют как программирование паяльником, теперь в телеком-области нет: ассемблер я вообще не видел ни разу в жизни, чистого С практически тоже нет. Основной язык разработки в телекоме — это С++, кое-где встречаются Go и Python. Старые промышленные практики, которые ассоциируются с телекомом, в частности«водопад», сейчас тоже практически нигде не используются. В 2008 году я пришел в большую международную телеком-компанию, которая ещё работала по старым принципам. На фичу, которая выражалась в написании 20 строчек кода (это я точно помню), давалось три месяца, потому что: сначала эту фичу надо обдумать, написать под нее документацию, потом архитектор должен ее одобрить, затем надо подумать над ее тест-планом, написать тест-план, его должны одобрить, потом нужно написать план разработки, его тоже должны одобрить, только потом ты пишешь код, тестируешь его, снова получаешь одобрение, и, наконец, фича оказывается в проде. Эта большая международная телеком-компания вскоре перестала существовать. Вся остальная отрасль перестроилась и перешла на современные практики: Agile подход, CI/CD,  код-ревью и постоянный рефакторинг. А что касается бородатых дедов, то я специально прикинул: в моей команде примерно 50 человек, их средний возраст — менее 30 лет. Конечно, у нас есть и сотрудники, которые застали времена работы с 2G. Но могу сказать, что, во-первых, их опыт бесценен, потому что они многое повидали, ведь в разработке серьезных решений очень часто то, что может пойти не так — и идёт. А во-вторых, их знания очень актуальны и сейчас. Проникновение 2G в России до сих пор высокое — его используют старые телефоны, шлагбаумы, модемы, сигнализации, банкоматы. В других сетях они просто не будут работать. Последнее заблуждение про разработку в телекоме — самое глубокое и распространенное — это то, что мы все тут занимаемся перекладыванием байтиков. Давайте разберёмся, где можно развернуться инженерам, разработчикам и архитекторам. Это самая «железная» часть работы. Если что-то и можно назвать программированием паяльником — о да, это оно. Современная антенна — это не просто пассивная железка, которая что-то куда-то излучает. Это довольно хитрое устройство, которое занимается синтезом, декодированием и оцифровкой радиосигнала. Для разработки антенного радиотракта нужно профильное образование в области радиофизики, а также хорошие знания цифровой и аналоговой электроники, схемотехники и FPGA. Программирования в привычном смысле здесь почти нет. Это массовый продукт, который производится и покупается десятками и сотнями тысяч. С точки зрения программиста, базовая станция состоит из нескольких разных плат и вычислительных модулей, которые объединены между собой внутренней сетью. Считайте это просто средой исполнения и особенностями вашей платформы. И вот где здесь нужен код.  Байтодробилки. Это название, конечно, условное. Эти модули обрабатывают физический и канальный уровни протокола связи между базовой станцией и мобильным устройством (сюда же относится планировщик). С точки зрения программиста, это вычислительные железки, которые занимаются обработкой больших объемов цифровых данных. Они кодируют и декодируют радиосигналы от множества абонентов, распределяют их по доступным ресурсам и планируют передачу ответов. В работе с ними используется жёсткий real-time — нужно делать множество операций за ограниченное время. Как следствие, в качестве инструмента — сильно ограниченный С++, нет операционной системы, а большая часть задач связана с тем, чтобы применять к данным специализированные алгоритмы. Модуль управления мобильными устройствами. Здесь используется железо общего назначения, с которым сталкивались почти все разработчики, на базе распространенных архитектур — ARM или x86. Пишется это всё на С++. Единственная особенность программирования этой части — обработка бинарных протоколов, по которым мобильные устройства общаются с базовой станцией. С этим, как правило, разработчики не знакомы и сталкиваются впервые только после начала работы в телекоме. Модуль управления базовой станцией. Его используют операторы, чтобы через API отправлять команды и менять конфигурации, вести мониторинг и статистику. Разработка этого компонента представляет собой наименее специализированный спектр технических задач. Здесь используются C++ и Go. Это коллекция сетевых сервисов, с которыми общается базовая станция. Вместе они дают тот набор услуг, который нужен абонентам от мобильного устройства и сети: аутентификацию, управление услугами и политиками доступа (например, какую скорость интернета оператор может предоставить этому абоненту), выставление счетов, маршрутизацию пользовательского трафика внутри сети оператора. В наши дни всё это базируется на облачных технологиях и пишется на С++, который обеспечивает необходимое быстродействие. Что отличает работу с ядром сети от других классов задач разработки софта в телекоме — это множество задач по кратко- и долгосрочномухранению данных. В опорной сети пятого поколения сервисы общаются по REST API — на базе облачных платформ довольно удобно реализовывать ядро сети, в то время как в предыдущих поколениях связи использовались бинарные протоколы. Весь этот набор сервисов сейчас пишется под аппаратные платформы общего назначения. Исключение — сервис по маршрутизации пользовательского трафика. Он реализуется либо на специализированном железе, либо на обычных серверах, в которые вставляются особо сильные сетевые карточки, умеющие обрабатывать сотни гигабит в секунду. Это поддерживающие функции, мониторинг, управление сетью и другие сервисы, которые видны клиенту, партнерам или сотрудникам этой сотовой сети. Работа с клиентами, продажа сим-карт, личный кабинет, который должен работать на любом телефоне и другие поддерживающие сервисы относятся к системе управления сетью. Эта система — очень разношерстная коллекция сервисов, которые общаются между собой и с сотовой сетью через API и довольно традиционно разделяются на фронтенд и бэкенд. Их можно писать на любом языке — JavaScript, Python, Golang. В этом классе задач вы встретите меньше всего специфики, связанной с передачей данных. Чтобы попасть в любую компанию, которая занимается телеком-разработкой, нужно хорошо владеть современным С++, уметь программировать под Linux и неплохо разбираться в том, как работает сеть, какие бывают протоколы, как они устроены и как передаются пакеты. Остальному начинающих специалистов учат уже в процессе работы: никто не ожидает от вчерашних студентов специализированных знаний. В телекоме вас ждут менторинг и обучение. Вам объяснят, помогут, плавно введут в эту область, расскажут, что нужно подучить и подтянуть, чтобы успешно развиваться — я это точно знаю, потому что и сам обучаю начинающих специалистов. Чего ещё можно ожидать, если вы пришли в телеком? Промышленные практики разработки. Мне кажется, что этому невозможно научиться в теории. Единственный способ понять, что такое промышленная разработка — это в ней участвовать. Только так ты можешь ощутить и понять, какие практики придумали компании, чтобы код был надёжным, хорошим, легко поддерживался и зарабатывал деньги. Очень специфичные отраслевые знания. Придётся много и быстро учиться. Вас ждут десятки тысяч страниц спецификаций и стандартов, о которых вы до этого даже не слышали. Долгоиграющие проекты. Среднее время смены технологий сотовой связи — 10 лет. Проекты в телекоме длятся 5-10 лет, причём повторяющихся и однотипных среди них нет. Высокий темп разработки. Несмотря на то, что проекты живут долго, операторы хотят получать новые фичи как можно скорее, поэтому мы создаем минимальный рабочий продукт, выкатываем его в поля и дорабатываем. В полях иногда происходят весьма любопытные истории. Например, однажды моя команда разрабатывала маленькую частную сотовую сеть для аэропорта, чтобы собирать данные с датчиков и управлять устройствами. Сеть замечательно работала и обслуживала клиентов, но раз в несколько месяцев по непонятным причинам падала. Оказалось, что в аэропорту был трап, который управлялся по сотовой сети. У него был модуль связи — сотовый модем. Так вот, он периодически приезжал в зону действия сети, пытался в неё зайти и ронял. А потом уезжал. Поиски этого трапа заняли у нас несколько месяцев, но, к счастью, мы его вычислили и сделали так, чтобы наша сотовая сеть по его вине больше не падала. Приходите к нам в телеком, здесь интересно. У нас разные масштабные задачи и современные технологии, ведь это действительно передний край разработки. В YADRO мы создаём телекоммуникационное оборудование для беспроводных мобильных сетей и сопутствующих услуг. Приглашаем в нашу команду! Мы активно растем, поэтому ждем специалистов разных направлений. А если вы пока в начале карьерного пути, приходите на стажировку. Вот ссылки: Постоянно действующая программа найма начинающих специалистов. Все вакансии телеком-направления. Вакансии в мою команду: стажер, разработчик C++.   Телеком — это долгосрочные проекты и уникальная возможность увидеть, как ошибки проектирования на начальных этапах могут потом больно укусить вас. А потом мучительно (и победоносно) исправлять их. Телеком — это очень требовательная профессиональная среда, поэтому навыки, которые вы получите здесь, пригодятся и в других смежных областях. По своему опыту знаю, что телеком-разработчики высоко ценятся на рынке, даже если в дальнейшем работают в другой области. И, наконец, телеком — это прямая, ощутимая каждому польза. Системами, в создании которых вы поучаствуете, будут пользоваться сотни тысяч, а может и миллионы людей. Когда я звоню или отправляю какие-то данные, я понимаю, что это происходит через сервисы, к появлению которых я приложил руку. Это довольно интересное и приятное чувство. Я думаю, что вам оно тоже понравится.  Компания YADRO