Как стать автором
Обновить
158.74
Яндекс Практикум
Помогаем людям расти

С Python на Go и обратно: мой опыт

Время на прочтение9 мин
Количество просмотров12K

Привет! Меня зовут Денис, я ведущий 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? 

Теги:
Хабы:
+1
Комментарии17

Полезные ссылки

Jaeger для трассировки в микросервисной архитектуре

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров14K
Всего голосов 17: ↑17 и ↓0+17
Комментарии1

Как работает PGO-оптимизация в Go «на пальцах»

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров5.7K
Всего голосов 14: ↑13 и ↓1+15
Комментарии2

Переходим на Go: 16 материалов для самостоятельного изучения языка

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров42K
Всего голосов 16: ↑12 и ↓4+11
Комментарии12

Информация

Сайт
practicum.yandex.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
Ира Ко