Программирование паяльником, пыльное железо и тонны легаси? Как на самом деле устроена разработка ПО в телекоме

11714cfccb191bd0bb9fc7959c39da33.pngАвтор статьи — Александр Иргер

Архитектор программного обеспечения в YADRO. Работает в телекоме 15 лет. Принимал участие в проектах по внедрению 4G, а затем и 5G. Всё это время участвовал в разработке программного обеспечения,  в основном ядер сети.

Хабр, привет! Недавно я спросил нескольких коллег — вчерашних студентов, как они представляли себе разработку в телекоме до того как пришли в эту сферу. Их ответы были очень далеки от реальности. Многие считали, что разработка в телекоме — это возня со старым пыльным железом на чердаках и в подвалах. Внедрять новые и современные решения невозможно из-за тонн легаси, в сторону которого все боятся даже дышать. А большинство коллег — бородатые деды, которые программируют паяльником и строго следуют парадигме каскадной разработки. Да и задачки в целом довольно скучные: перекладываешь байты — и, в общем-то,  больше ничего не происходит. Нечего будет рассказать внукам, когда сам станешь бородатым дедом.

Мой сегодняшний пост — рассказ о том, что на самом деле происходит в разработке телекоммуникационного оборудования для сотовых сетей с точки зрения программиста,  и почему эта работа чертовски вдохновляет.

Иллюстрация сгенерирована нейросетью

Иллюстрация сгенерирована нейросетью

Старое странное пыльное железо

Мне встречалась цифра, что за последние 20 лет быстродействие железа увеличилось примерно в тысячу раз. Но вместе с производительностью, а порой и опережая её, растут и потребности решаемых с его помощью задач в скоростях, объемах вычислений, трафике и так далее. Поэтому телеком-инфраструктуры регулярно модернизируются и прирастают новым, более современным оборудованием.

Мы как программисты редко имеем дело непосредственно с железом. В основном работа идёт на эмуляторах, причём аппаратная платформа, на которой будет работать код, может быть ещё даже не произведена. Всё, с чем мы взаимодействуем в процессе разработки — это серверы, виртуальные машины и эмуляторы. Непосредственно с оборудованием мы напрямую не контактируем. А вообще современное железо в основном выглядит так. Посмотрите, какая красота.

Элегантно, современно и совсем не пыльно

Элегантно, современно и совсем не пыльно

Легаси везде

Телеком-разработчикам, конечно, приходится работать с большими кодовыми базами. Но этот код покрыт тестами и не устаревает, а принцип «Работает — не трогай» больше не актуален. Неподдерживаемое легаси практически исчезло. На мой взгляд, это произошло по следующим причинам.

Постепенная унификация оборудования

В начале 2000-х годов все глобальные вендоры телекоммуникационного оборудования,  такие как Motorola, Siemens,  Ericsson,  сами производили аппаратное обеспечение. Исповедовался «коробочный» подход: большая часть функционала реализовывалась в те времена в железе, код почти всегда писался один раз под конкретное оборудование, тестировался и поставлялся как одно готовое конечное изделие или продукт.

В середине 2000-х начался процесс унификации:  появился стандарт ATCA, а вскоре появились и производители off-the-shelf-компонентов под него. Как следствие, снизилось разнообразие аппаратных платформ, появилась возможность переиспользовать код.

В начале 2010-х завершился перевод телекоммуникационного оборудования с cell-switched-сетей на IP-сети,  что позволило уйти от использования специфичных транспортных протоколов (например, ATM),  малоизвестных широкому кругу не занятых в телеком-разработке инженеров. Это стало началом разработки телекоммуникационного оборудования на железе общего назначения и в облаках. В этом случае код может жить очень долго, потому что такое аппаратное обеспечение,  как правило,  имеет долгую обратную совместимость.

Внедрение CI-практик в разработку

Ещё не так давно при любом изменении кода нужно было проводить полный цикл тестирования в лаборатории: многие ошибки можно было обнаружить только на этом этапе, а затем исправлять и снова проводить полный цикл тестирования. С появлением CI-практик широкая автоматизация тестирования позволила находить ошибки на гораздо более раннем этапе,  и быстрее их исправлять. Как следствие, стоимость и сложность внесения изменений в код сильно упала. То, что раньше боялись трогать, стало возможно относительно быстро отрефакторить и быть уверенным, что цикл «тестирование-поиск ошибок-тестирование» не затянется на годы. Это тоже способствует более долгому времени жизни кода, облегчает его поддержание в рабочем состоянии и переиспользование.

Бородатые деды с паяльниками

Телеком — это гонка, и надо постоянно «бежать со всех ног, чтобы только оставаться на месте». Конкуренты не дремлют, а операторы хотят получать новые фичи вчера, а еще лучше — позавчера. Поэтому команды разработки непрерывно растут, а кодовые базы модернизируются. Старых технологий, которые обычно характеризуют как программирование паяльником,  теперь в телеком-области нет:  ассемблер я вообще не видел ни разу в жизни, чистого С практически тоже нет. Основной язык разработки в телекоме — это С++, кое-где встречаются Go и Python. Старые промышленные практики, которые ассоциируются с телекомом, в частности«водопад», сейчас тоже практически нигде не используются.

В 2008 году я пришел в большую международную телеком-компанию, которая ещё работала по старым принципам. На фичу, которая выражалась в написании 20 строчек кода (это я точно помню),  давалось три месяца, потому что:

  • сначала эту фичу надо обдумать,

  • написать под нее документацию,

  • потом архитектор должен ее одобрить,

  • затем надо подумать над ее тест-планом,

  • написать тест-план,

  • его должны одобрить,

  • потом нужно написать план разработки,

  • его тоже должны одобрить,

  • только потом ты пишешь код,

  • тестируешь его,

  • снова получаешь одобрение,

  • и, наконец, фича оказывается в проде.

Эта большая международная телеком-компания вскоре перестала существовать. Вся остальная отрасль перестроилась и перешла на современные практики:  Agile подход,  CI/CD,   код-ревью и постоянный рефакторинг.

А что касается бородатых дедов, то я специально прикинул: в моей команде примерно 50 человек,  их средний возраст — менее 30 лет. Конечно, у нас есть и сотрудники, которые застали времена работы с 2G. Но могу сказать, что, во-первых, их опыт бесценен, потому что они многое повидали,  ведь в разработке серьезных решений очень часто то,  что может пойти не так — и идёт. А во-вторых,  их знания очень актуальны и сейчас. Проникновение 2G в России до сих пор высокое — его используют старые телефоны, шлагбаумы, модемы, сигнализации, банкоматы. В других сетях они просто не будут работать.

Так чем же на самом деле софтовые разработчики заняты в телекоме

Последнее заблуждение про разработку в телекоме — самое глубокое и распространенное — это то,  что мы все тут занимаемся перекладыванием байтиков. Давайте разберёмся, где можно развернуться инженерам, разработчикам и архитекторам.

Антенный радиотракт: радиофизика, электроника, схемотехника и FPGA 

Это самая «железная» часть работы. Если что-то и можно назвать программированием паяльником — о да, это оно. Современная антенна — это не просто пассивная железка, которая что-то куда-то излучает. Это довольно хитрое устройство, которое занимается синтезом, декодированием и оцифровкой радиосигнала. Для разработки антенного радиотракта нужно профильное образование в области радиофизики, а также хорошие знания цифровой и аналоговой электроники, схемотехники и FPGA. Программирования в привычном смысле здесь почти нет.

Разработка базовой станции: real-time, C++ и немного Go 

Это массовый продукт,  который производится и покупается десятками и сотнями тысяч. С точки зрения программиста, базовая станция состоит из нескольких разных плат и вычислительных модулей, которые объединены между собой внутренней сетью. Считайте это просто средой исполнения и особенностями вашей платформы. И вот где здесь нужен код. 

  • Байтодробилки. Это название, конечно, условное. Эти модули обрабатывают физический и канальный уровни протокола связи между базовой станцией и мобильным устройством (сюда же относится планировщик). С точки зрения программиста,  это вычислительные железки, которые занимаются обработкой больших объемов цифровых данных. Они кодируют и декодируют радиосигналы от множества абонентов, распределяют их по доступным ресурсам и планируют передачу ответов. В работе с ними используется жёсткий real-time — нужно делать множество операций за ограниченное время. Как следствие, в качестве инструмента — сильно ограниченный С++, нет операционной системы, а большая часть задач связана с тем, чтобы применять к данным специализированные алгоритмы.

  • Модуль управления мобильными устройствами. Здесь используется железо общего назначения, с которым сталкивались почти все разработчики, на базе распространенных архитектур — ARM или x86. Пишется это всё на С++. Единственная особенность программирования этой части — обработка бинарных протоколов, по которым мобильные устройства общаются с базовой станцией. С этим, как правило, разработчики не знакомы и сталкиваются впервые только после начала работы в телекоме.

  • Модуль управления базовой станцией. Его используют операторы, чтобы через API отправлять команды и менять конфигурации, вести мониторинг и статистику. Разработка этого компонента представляет собой наименее специализированный спектр технических задач. Здесь используются C++ и Go.

Ядро сети: C++, базы данных и REST API 

Это коллекция сетевых сервисов, с которыми общается базовая станция. Вместе они дают тот набор услуг, который нужен абонентам от мобильного устройства и сети:  аутентификацию, управление услугами и политиками доступа (например, какую скорость интернета оператор может предоставить этому абоненту), выставление счетов, маршрутизацию пользовательского трафика внутри сети оператора. В наши дни всё это базируется на облачных технологиях и пишется на С++, который обеспечивает необходимое быстродействие. Что отличает работу с ядром сети от других классов задач разработки софта в телекоме — это множество задач по кратко- и долгосрочномухранению данных. В опорной сети пятого поколения сервисы общаются по REST API — на базе облачных платформ довольно удобно реализовывать ядро сети,  в то время как в предыдущих поколениях связи использовались бинарные протоколы.

Весь этот набор сервисов сейчас пишется под аппаратные платформы общего назначения. Исключение — сервис по маршрутизации пользовательского трафика. Он реализуется либо на специализированном железе, либо на обычных серверах, в которые вставляются особо сильные сетевые карточки, умеющие обрабатывать сотни гигабит в секунду.

Система управления сетью и бизнес-поддержка системы:   JavaScript, Python, Go

Это поддерживающие функции, мониторинг, управление сетью и другие сервисы, которые видны клиенту, партнерам или сотрудникам этой сотовой сети. Работа с клиентами, продажа сим-карт, личный кабинет,  который должен работать на любом телефоне и другие поддерживающие сервисы относятся к системе управления сетью.

Эта система — очень разношерстная коллекция сервисов, которые общаются между собой и с сотовой сетью через API и довольно традиционно разделяются на фронтенд и бэкенд. Их можно писать на любом языке — JavaScript, Python, Golang. В этом классе задач вы встретите меньше всего специфики, связанной с передачей данных.

Что ждёт начинающих разработчиков ПО в телекоме

Чтобы попасть в любую компанию, которая занимается телеком-разработкой, нужно хорошо владеть современным С++, уметь программировать под Linux и неплохо разбираться в том, как работает сеть, какие бывают протоколы, как они устроены и как передаются пакеты. Остальному начинающих специалистов учат уже в процессе работы: никто не ожидает от вчерашних студентов специализированных знаний.

В телекоме вас ждут менторинг и обучение. Вам объяснят, помогут, плавно введут в эту область, расскажут, что нужно подучить и подтянуть, чтобы успешно развиваться — я это точно знаю, потому что и сам обучаю начинающих специалистов.

Чего ещё можно ожидать, если вы пришли в телеком?

  • Промышленные практики разработки. Мне кажется, что этому невозможно научиться в теории. Единственный способ понять, что такое промышленная разработка — это в ней участвовать. Только так ты можешь ощутить и понять, какие практики придумали компании, чтобы код был надёжным, хорошим, легко поддерживался и зарабатывал деньги.

  • Очень специфичные отраслевые знания. Придётся много и быстро учиться. Вас ждут десятки тысяч страниц спецификаций и стандартов, о которых вы до этого даже не слышали.

  • Долгоиграющие проекты. Среднее время смены технологий сотовой связи — 10 лет. Проекты в телекоме длятся 5–10 лет, причём повторяющихся и однотипных среди них нет.

  • Высокий темп разработки. Несмотря на то, что проекты живут долго,  операторы хотят получать новые фичи как можно скорее, поэтому мы создаем минимальный рабочий продукт, выкатываем его в поля и дорабатываем.

В полях иногда происходят весьма любопытные истории. Например, однажды моя команда разрабатывала маленькую частную сотовую сеть для аэропорта, чтобы собирать данные с датчиков и управлять устройствами. Сеть замечательно работала и обслуживала клиентов, но раз в несколько месяцев по непонятным причинам падала.

Оказалось, что в аэропорту был трап, который управлялся по сотовой сети. У него был модуль связи — сотовый модем. Так вот, он периодически приезжал в зону действия сети, пытался в неё зайти и ронял. А потом уезжал. Поиски этого трапа заняли у нас несколько месяцев, но, к счастью, мы его вычислили и сделали так, чтобы наша сотовая сеть по его вине больше не падала.

Приходите к нам в телеком,  здесь интересно. У нас разные масштабные задачи и современные технологии, ведь это действительно передний край разработки.

Вакансии телеком-направления YADRO для опытных и только начинающих специалистов вы найдете здесь. А не так давно мы открыли стажировку, в том числе для студентов!

В YADRO мы создаём телекоммуникационное оборудование для беспроводных мобильных сетей и сопутствующих услуг. Приглашаем в нашу команду! Мы активно растем, поэтому ждем специалистов разных направлений. А если вы пока в начале карьерного пути, приходите на стажировку. Вот ссылки:

Телеком — это долгосрочные проекты и уникальная возможность увидеть, как ошибки проектирования на начальных этапах могут потом больно укусить вас. А потом мучительно (и победоносно) исправлять их.

Телеком — это очень требовательная профессиональная среда, поэтому навыки, которые вы получите здесь, пригодятся и в других смежных областях. По своему опыту знаю, что телеком-разработчики высоко ценятся на рынке, даже если в дальнейшем работают в другой области.

И, наконец, телеком — это прямая, ощутимая каждому польза. Системами, в создании которых вы поучаствуете, будут пользоваться сотни тысяч, а может и миллионы людей. Когда я звоню или отправляю какие-то данные, я понимаю, что это происходит через сервисы, к появлению которых я приложил руку. Это довольно интересное и приятное чувство. Я думаю, что вам оно тоже понравится.

© Habrahabr.ru