Привет! Меня зовут Денис, я ведущий Golang-разработчик в МТС Диджитал. Еще год назад я работал экспертом по запуску новых сервисов и услуг в Корпоративном центре МТС и параллельно заканчивал курс «Продвинутый Go‑разработчик» от Практикума.
В этой статье я расскажу, как начал программировать на Python и зачем мне понадобился Go, как и чему я учился и почему теперь посматриваю на Rust.
Начну с моего пути в разработчики, но если вам не интересна эта часть, смело листайте в середину — там много полезного для тех, кто задумал изучать Go как второй язык программирования.
Как всё начиналось
В моей трудовой за последние десять лет нет записей типа «программист» или «разработчик». Хотя карьеру я начинал именно с этих позиций. Я окончил институт с профессией «учитель математики и информатики», но постепенно перекатился в финтех, где занимался цифровизацией банковского бизнеса.
Это сейчас нам привычно — достать из кармана телефон, зайти в банковское приложение и за пару кликов отправить деньги родителям или оплатить коммуналку. 20 лет назад всё было по-другому. Особенно страшно — когда на каждый чих, типа получения процентов по вкладу, нужно было идти в офис банка и стоять в многочасовой очереди. А для юрлиц был специальный человек, который ежедневно отрывал выписки по счёту со стометровой ленты перфорированной бумаги. На месте моего рабочего стола за год до этого стоял архаичный телетайп для связи с Центробанком. Сотрудники офиса, которые отвечали за перемещение денег между корсчетами, работали по 12–14 часов в день, — задач по автоматизации было много и в каком хочешь направлении.
Мы начинали с Perl — языка для творческого самовыражения, но позднее всю внутреннюю банковскую кухню переписали на Python. Тогда я впервые использовал язык, который позволяет команде писать понятный каждому код. В итоге я покинул финтех с поднятым дистанционным обслуживанием, настроенной безопасностью, развитой филиальной сетью, десятками тысяч зарплатных клиентов и жутким выгоранием после 9 лет работы 🙂
Друзья пригласили работать инженером в небольшом телеком-операторе. Это был тот ещё челлендж: Роскомнадзор грозил отзывом лицензии из-за замечаний. Примерно 15 тысяч клиентов как-то существовали в наколеночном биллинге с платежами по почте, без какой-либо поддержки. Мне с командой опять пришлось всё автоматизировать, погружаться в тонкости сетевого администрирования и программирования, внедрять нормальный лицензированный биллинг, писать компоненты для интеграции платёжных шлюзов, поднимать нормальную техподдержку вместо секретарши директора на телефоне.
Мы написали на Python компоненты observability, и downtime оборудования резко сократился — раньше мы узнавали о проблемах от той самой секретарши, теперь вживую видели состояние дел на дашбордах и получали алерты в Jabber. Через 3 года оператор имел надёжную масштабируемую инфраструктуру, растущую клиентскую базу и мог спокойно без валидола проходить все проверки РКН и других госорганов.
Потом я ушёл работать к производителю телеком-оборудования, который делал компоненты для Nokia и Huawei в России. Мы запускали IMS-услуги у «Мегафона», МТС, «Билайна» и «Сбертела». И я обнаружил себя ведущим SRE-инженером, который работал по 20 часов в сутки. Очень удачно мне предложили перейти в МТС и заниматься практически тем же, но на уровне экспертного менеджера, у которого основные инструменты — ежедневник, ручка, Outlook и Visio. Я запускал продукты в коммерческую эксплуатацию: VoLTE, WiFi Calling, RCS и «Мой Коннект». Все эти три года я думал вернуться в разработку, которая мне очень нравилась, что я и сделал.
Главные помощники на протяжении всего моего пути — мозг и Python. Мне хватало возможностей языка и того, как я вписывал его ограничения в решения задач. Это был незаменимый инструмент для анализа данных и создания внутренних приложений типа сервисов динамической конфигурации, вышеупомянутого мониторинга и т.п.
Что, если не Python, и почему Go?
Однажды мне поставили задачу собрать и проанализировать netflow трафика в 250 мегабит. Я понял, что решение на интерпретируемом Python проигрывает по производительности и надёжности программам, которые написаны на компилируемых языках со статической типизацией. Пришло время реализовать одну из давних мечт — научиться писать на компилируемом языке. Так мы и подобрались к выбору языка.
В мой топ языков для разработки этого сервиса вошли C++, Rust и Go. Времени было не очень много, а С++ я откровенно боялся 🙂 — поэтому я выбрал Go из-за простого синтаксиса и ушёл с головой в документацию языка. Довольно быстро понял, что для профессионального использования языка есть два варианта: учиться самостоятельно или пойти на курс.
В идеале, конечно, всё вместе
Если выбирать, второй вариант быстрее, поэтому я выбрал его. Кстати, этот принцип работает не только в программировании: если у коллеги или компании есть какая-то экспертиза в твоём вопросе — обратись к ним, и ты сэкономишь время на достижение результата (но не всегда деньги 🙂).
Go привлекает первоначально кажущейся простотой — многие говорят, что у Go и Python низкий порог входа. Да, но нет.
Да:
у обоих языков отличная читаемость: у Go всего 25 ключевых слов, у Python — 33, а значит, можно начать писать после недели погружения.
Но нет:
на старте знание языка будет поверхностным, а значит, и низким будет качество кода, на таких разработчиков могут повесить ярлыки плохой репутации.
Я против обобщений и знаю прекрасных Go-программистов, которые сами освоили язык за пару недель и теперь пишут продакшн-код. Но, к сожалению, общий тренд на рынке вакансий — недоверие к соискателям слабых хардов с кодом низкого качества. На мой взгляд, эту проблему может решить Практикум, потому что менторы заворачивают кривой код, объясняют проблемы в нём и заставляют переделывать — потом пригодится.
Как выбирал курс
Сейчас много хейта и негативных отзывов об образовательных платформах:
готовят специалистов, которых потом никуда не берут;
получаемое образование поверхностно;
и это частично правда.
Можно взять пачку денег, оплатить курс, сесть на стуле перед компьютером и сказать:
— Давайте теперь меня учите и в конце найдите мне работу, желательно в Яндексе.
А можно взять курс и получить базу. Плюс читать статьи, смотреть ролики на YouTube по теме, читать Хабр, тусить на форумах и Reddit — и эти знания сами собой налипают на ту самую базу. И в Яндекс уже не хочется из-за алгоритмов на собесах и вилок ниже рынка (о чём ты узнал в крупнейшем @gogolang, телеграм-канале, где общаются гоферы).
Я сделал небольшой ресёрч по рынку ed-tech и понял, что на нужный мне уровень (+/- сферический middle) готовят только в Практикуме, что и предопределило мои дальнейшие полгода. Есть ещё несколько сильных курсов по Go, самый интересный — бесплатный Route 256 от Ozon, но там большой конкурс на небольшое количество студентов, а день отбора напоминает фильм «Голодные игры».
Как учился
Пока учишься, не только обрастаешь знаниями, но и вливаешься в сообщество по изучаемому языку — моими первыми проводниками в Go стали менторы Практикума. Это получилось забавно: при распределении по группам на онбординге куратор услышала, что я работаю в МТС, определила меня в группу, где ментором был действующий разработчик МТС. На первом one-to-one я пообещал ему, что наше общение будет только в рамках Практикума и на работу никакого влияния не окажет, чем, видимо, снял с него огромный груз тревоги.
Весь вайб от обучения формирует команда курса, и мне повезло. Тут можно познакомиться с людьми, которые получают удовольствие от языка программирования даже на трудном этапе его изучения. Один из менторов оставил мне после презентации диплома свой контакт для экстренных консультаций, но первое и единственное сообщение с благодарностью я написал, когда получилось ротироваться на позицию разработчика Go в МТС.
Внутрянка курса
Воркшопы — одна из главных фишек курса. Действующий разработчик на реальных примерах объясняет нюансы работы с языком, терпеливо отвечает на вопросы, прививает best practices в проектировании программ. Кстати, было странно видеть, когда на онлайн-воркшоп из 50 студентов курса приходило 3–5 человек, ведь это реальный способ дополнительно помучать ментора вопросами. Ментор может в двух предложениях объяснить, если есть вопросы по теории из лекций. Плюс после каждого созвона были онлайн-афтепати — в непринуждённой атмосфере, не под запись менторы и студенты делились жизненным и профессиональным опытом.
С некоторыми сокурсниками мы поддерживаем связь до сих пор, помогаем друг другу. Недавно увидел в корпоративном чате сообщение от студента, который заканчивает тот же курс в другой когорте, с просьбой помочь в стажировке или ротации. Списались, договорились об интервью с CTO — после Практикума ты знаешь об уровне подготовки человека и какие задачи он может закрывать, поэтому спокойно можешь советовать человека в команду.
Ценность Практикума — не в платформе как таковой, а в том, что ты погружаешься в среду разработчиков, общаешься и учишься понимать специфические процессы языка. Вообще, Go-сообщество в России очень дружелюбное и нетоксичное, но сторонний человек подсознательно боится ответов типа RTFM и поэтому остерегается новых социальных групп. Практикум мягко ломает этот барьер — я часто вижу, как сокурсники, которые в начале курса были зажаты и избегали лишнего общения, активно общаются в тг-каналах о Go.
Дипломные работы
На курсе было два дипломных проекта — написать систему лояльности для абстрактного магазина и клиент-серверный мультидевайсный менеджер паролей с максимальными требованиями по безопасности.
Сервер должен реализовывать бизнес-логику:
регистрация, аутентификация и авторизация пользователей;
хранение приватных данных;
синхронизация данных между несколькими авторизованными клиентами одного владельца;
передача приватных данных владельцу по запросу.
Клиент должен реализовывать бизнес-логику:
аутентификация и авторизация пользователей на удалённом сервере;
доступ к приватным данным по запросу.
Функции, реализация которых остаётся на усмотрение исполнителя:
создание, редактирование и удаление данных на стороне сервера или клиента;
формат регистрации нового пользователя;
выбор хранилища и формат хранения данных;
обеспечение безопасности передачи и хранения данных;
протокол взаимодействия клиента и сервера;
механизмы аутентификации пользователя и авторизации доступа к информации.
Дополнительные требования:
клиент должен распространяться в виде CLI-приложения с возможностью запуска на платформах Windows, Linux и Mac OS;
клиент должен давать пользователю возможность получить информацию о версии и дате сборки бинарного файла клиента.
Авторы заявляют, что эти проекты не стыдно показать на собеседовании, — я согласен, но в моём случае второй проект нужно показывать с точки зрения «как не надо делать проекты на Go»:
Для клиента я выбрал GUI-реализацию c помощью [fyne], что превратило код в нечитаемого монстра с сотнями коллбеков — на защите диплома я сгорал от стыда. Интересно, все студенты на защите использовали [fyne] 😀, причём в ТЗ строго предлагалось использовать CLI, но мы, не сговариваясь, решили удивить менторов своим безумием. Не делайте так!
И всё-таки — как переключаться?
Переключаться между языками — это как использовать автомобиль и велосипед: спокойно садишься на велик, если в городе дикие пробки, или используешь автомобиль для передвижений с семьей. Принцип тот же, правила, правда, отличаются, но не критично. Процесс переключения интуитивен и не требует огромных мыслительных усилий.
Главное в смене стека или работы — чёткое осознание, для чего ты это делаешь и каких целей хочешь добиться. Цель «мне надоело и хочется чего-то другого» не подходит.
У психологов есть методика: задаешь себе вопрос «для чего?» несколько раз, до момента, пока не находишь чёткого и внятного ответа. Последний ответ — истинная цель и мотивация, вектор, к которому нужно стремиться.
Best practice для успешной работы на двух языках
Как переключаться и не накосячить:
- Набираться опыта, чтобы понимать, есть понимание, основанное на опыте, какой язык для чего использовать, — ты используешь (ваш кэп).
- Держать в голове, что при разработке сервисов ты используешь постоянное окружение типа баз данных, брокеров сообщений и тому подобного, что не зависит от используемого языка, а только от конкретных реализаций взаимодействия.
- Иметь IDE — я использую Idea с плагинами для Go и Python, но многие используют VSCode.
Моя карьера: что изменилось
Практикум в середине обучения настойчиво предлагал пройти карьерный трек, я согласился. На консультации с HR-ментором мы ещё раз зафиксировали мою цель — уйти в систему ротации внутри МТС, не отказываясь от других предложений.
Про ротацию
У нас в МТС можно сменить профессию. Огромное спасибо президенту МТС Вячеславу Николаеву за такой инструмент — он сам делал так несколько раз. Приходишь к руководителю, говоришь, что хочешь уйти в ротацию, и если он не против — попадаешь под опеку HR-менеджера. Он берёт на себя первоначальное общение с командами, где ты хочешь работать. Таким образом тебя выводят из-под скрининга рекрутеров, но не исключают из прохождения всех этапов интервью. Уверен, что МТС в этом плане не уникален и похожие инструменты есть у других компаний, поэтому для «свитчеров» это прекрасная возможность осуществить задуманное.
Пока я ротировался, прошёл все этапы интервью в Yadro и получил оффер. Но решил остаться в группе МТС, так как попал в отличную продуктовую команду.
Как изменилась жизнь после Go
Сейчас Go мой основной инструмент — я перетащил в архив телеграм-чаты по Python, но не бросил сам язык. Когда нужно сделать что-то быстро и пропустить этапы компиляции, выручает как раз интерпретатор.
Go мне нравится за многопоточность «из коробки», декаплинг через интерфейсы, статическую типизацию, большую стандартную библиотеку, экосистему, приятное и открытое комьюнити. Из минусов могу с натяжкой сказать, что из-за дизайна языка не всегда удобно решать некоторые задачи, но это вкусовщина, которую можно решить.
Что бы я изменил в своём пути смены работы? От первых мыслей до оплаты курса прошёл год, и я понимаю, что можно было бы сократить время, но я ни о чём не жалею.
Первая тема на курсе — пакет net/http и задание написать полноценный сервер и клиент. Это такая фишка — бросили в воду учиться плавать и смотрели, выплывет кто-то или нет. Выплыли все, правда с разной степенью успешности, — Практикум ставит жёсткие дедлайны по спринту, но может войти в положение и накинуть пару дней на доделку. Дальше понеслось — многопоточность, кодогенерация, паттерны и антипаттерны, дженерики, профилирование, безопасность, сети и многое другое. В процессе можно выбрать проект на эти полгода — сокращатель ссылок или мини-Prometheus.
Что дальше
Я посматриваю в сторону Rust. В бэклоге есть задача, которая подходит для языка с прямым управлением памятью, но она не горящая. Так что я сфокусирован на текущей работе и рад опыту, который получил благодаря Яндекс Практикуму и МТС.
Страх не учить новый язык понятен. Но это не так трудно, как кажется в начале. У кого-то есть пример, когда этот процесс закончился неудачей? Интересно было бы обсудить и поделиться опытом.
Питонисты, как у вас с Go и Rust?