Автор статьи — Александр Иргер
Архитектор программного обеспечения в 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 мы создаём телекоммуникационное оборудование для беспроводных мобильных сетей и сопутствующих услуг. Приглашаем в нашу команду! Мы активно растем, поэтому ждем специалистов разных направлений. А если вы пока в начале карьерного пути, приходите на стажировку. Вот ссылки:
Постоянно действующая программа найма начинающих специалистов.
Все вакансии телеком-направления.
Вакансии в мою команду: стажер, разработчик C++.
Телеком — это долгосрочные проекты и уникальная возможность увидеть, как ошибки проектирования на начальных этапах могут потом больно укусить вас. А потом мучительно (и победоносно) исправлять их.
Телеком — это очень требовательная профессиональная среда, поэтому навыки, которые вы получите здесь, пригодятся и в других смежных областях. По своему опыту знаю, что телеком-разработчики высоко ценятся на рынке, даже если в дальнейшем работают в другой области.
И, наконец, телеком — это прямая, ощутимая каждому польза. Системами, в создании которых вы поучаствуете, будут пользоваться сотни тысяч, а может и миллионы людей. Когда я звоню или отправляю какие-то данные, я понимаю, что это происходит через сервисы, к появлению которых я приложил руку. Это довольно интересное и приятное чувство. Я думаю, что вам оно тоже понравится.