Привет! Меня зовут Герман, я backend-разработчик в команде Managed Service for Redis в компании #CloudMTS. В этой статье расскажу про свой приход в разработку на Go и поделюсь полезными ресурсами, которые мне помогли на этом пути.
Старт в ИТ
В школе мне нравились компьютеры, и я, как многие, любил играть в компьютерные игры, но программирование и информатика никогда меня не привлекали.
Я планировал делать карьеру в финансах, поэтому поступил на кафедру «Финансы и кредит» в РГГУ. Но когда писал диплом в 2019 году, о перспективах в ИТ уже говорили везде, я решил попробовать развиваться в этом направлении и планировал поступить в магистратуру на кафедру «Бизнес-информатика» в НИЯУ МИФИ.
Пока готовился к вступительным экзаменам, изучал ООП, информационные системы, базы данных, дискретную математику и Булеву алгебру. И это был абсолютно новый мир, который до сих пор очень интересен для меня.
Экзамены я сдал хорошо, но полученные мною баллы не гарантировали поступление на бюджет, поэтому я подал документы на другую кафедру «Финансовый мониторинг» куда проходил на бюджет со 100% вероятностью.
К счастью, в учебной программе, помимо классических финансовых/экономических дисциплин, были и технические:
- статистика. Так я впервые познакомился с языком программирования R;
- базы данных. На этих занятиях я узнал теорию БД, какие БД бывают, где применяются и, конечно же, изучил SQL.
Пары были вечером, поэтому у меня была возможность совмещать работу с учебой. Уже после первой сессии я устроился стажером в банк на роль продуктового аналитика / аналитика данных. Таким образом у меня появилась возможность применять на практике все знания, которые я получал в университете.
Я проработал в продуктовой команде год, где наблюдал, чем занимаются дизайнеры, разработчики (mobile, frontend, backend), тестировщики, аналитики. Самый большой интерес у меня вызывала работа backend-инженеров.
Промежуточным этапом на пути к backend стала позиция Data Science инженера: я уже хорошо знал БД и освоил Python. Параллельно с этим я изучал разработку backend-части на Python, фреймворки Django и Flask, также работал с БД через SQLAlchemy. Даже пытался создавать свои собственные сайты. Для этого немного разобрался с HTML и CSS. Это были маленькие пет-проекты, но они позволили мне изучить базовые вещи, например:
- что такое HTTP;
- какие есть коды ответа HTTP;
- что такое API и как с ним работать и прочее.
Тогда я уже точно осознавал, что хочу быть backend-инженером и снова готов пойти на стажировку, «просесть» в зарплате или даже работать бесплатно, но только заниматься тем, что мне интересно, и получить реальный опыт.
Примерно отсюда начался мой целенаправленный путь в backend-разработку.
Код на листочке и первый день в роли backend-инженера
На сборах по военной кафедре я познакомился с ребятами, которые разрабатывали на разных языках программирования. Я задавал им кучу вопросов, и их ответы помогли взглянуть на разработку под разным углом. Также у меня была с собой книга «Грокаем алгоритмы» А. Бхаргава, и так как у меня не было ноутбука под рукой, я изучал алгоритмы, придумывал задачи и решал их прямо в тетради.
Там же на сборах я договорился о собеседовании на стажировку на роль разработчика в компанию, которая помогает бизнесу делать СМС-рассылки. По возвращении домой я пошел на техническое интервью, где рассказал, что уже умею, что хочу делать и чему готов научиться. Они дали мне план того, что я еще должен изучить, и мы договорились созвониться повторно через месяц.
На протяжении месяца я изучал Ruby, Elixir, Ruby On Rails, Phoenix, git, работу с API, погружался в принципы микросервисной архитектуры и SOLID. Даже сделал небольшой проект на Phoenix — это был обычный таск-менеджер с регистрацией.
По итогу я получил предложение на оплачиваемую стажировку, и с того момента я стал работать backend-разработчиком.
Go, go, go
Эта стажировка была отличной возможностью поработать на реальных проектах. Мои ожидания от позиции backend-разработчика оправдались, и команда мне нравилась, но мне нужно было еще очень многому научиться, чтобы стать сильным специалистом. Ruby и Elixir — интересные языки, но на рынке было не так много связанных с ними вакансий.
Я решил посмотреть в сторону других языков, которые бы позволили без труда найти работу в России и за ее пределами. На помощь пришел мой брат, который сейчас работает solution-архитектором — он посоветовал обратить внимание на Go: «Язык на подъеме и интересен во многих аспектах».
На третьем и последнем месяце стажировки я начал знакомиться с новым языком, писать первые программы, проходить туториалы — в том числе бесплатный курс по Go от #CloudMTS.
Я плотно изучал Go всего лишь месяц, но решил пойти на собеседование в тот же #CloudMTS. И как это было ожидаемо, полностью его провалил. На вопросах по базам данных я держался неплохо, но почти на все вопросы по Golang я не смог дать четкого ответа, хотя на собеседовании мне задавали общие вопросы по теории. Например:
- Как реализовано ООП, инкапсуляция и наследование в Go?
- Что такое пакеты?
- Что такое слайс и чем он отличается от массива?
- Можно ли выполнить несколько условий в одном операторе switch case?
- Что будет, если писать в закрытый канал?
Я не очень расстроился, понимал, что шел ва-банк. Это интервью показало, на чем именно необходимо сосредоточиться и что еще нужно изучить.
Я понимал, что реальный опыт работы позволит мне быстрее освоить язык, поэтому продолжил искать стажировки на Golang. Спустя время мне все-таки удалось найти позицию стажера в компании-разработчике CRM-платформы. Там я писал внутренний чат. За три месяца я набрался практического опыта. Также курс от МТС дал очень качественную информацию по Golang, базам данных, брокерам сообщений, шине данных и даже по архитектуре приложений. С этими знаниями и опытом я решил снова попытать счастья в #CloudMTS.
Собеседование длилось около 2 часов, большая часть времени была посвящена технической части. В этот раз я готовился по шпаргалке, которой с нами поделился куратор курса. Это был список тем, которые, по опыту, чаще всего спрашивают на собеседованиях Go-разработчиков. Он включал в себя вопросы не только по Go, но и по технологиям вокруг — базам данных, Kafka, gRPC, микросервисной архитектуре и прочему. В целом на собеседовании было все, что мы так или иначе затрагивали на курсе. Были и задачки, но они были несложными и применимы к реальной жизни, и я достаточно быстро встретился с ними на практике.
В итоге вторая попытка оказалась успешной, собеседование в #CloudMTS я прошел и вот уже больше года работаю над интересными и сложными проектами в подразделении DBaaS. На данный момент мы с нуля написали Redis в облаке и продолжаем его совершенствовать, сейчас он уже доступен для реальных пользователей.
В команде я уже больше года и на текущий момент оцениваю свой уровень как middle/middle+. Быстро вырасти мне в том числе помогли коллеги по команде, которые терпеливо менторили меня.
Что почитать/посмотреть желающему стать Go-разработчиком
Мой путь в айти не из самых сложных и долгих, но в процессе пришлось пересмотреть множество руководств самого разного качества. Поделюсь материалами и подходами, которые показались мне — начинающему Go-разработчику — наиболее полезными.
- На мой взгляд, главное — как можно скорее начать писать код, делать что-то руками. Когда я изучил основы Go (структуры, маппы, слайсы, интерфейсы, объявление переменных и прочее), то сразу начал создавать сервисы, «ручки» и уделял много времени дебаггингу, чтобы понять, как код работает с данными. Уже потом я сосредоточился на синтаксисе языка, на низкоуровневых вещах, чтобы глубже понять, как работает код с железом.
- Чтобы систематизировать свои знания по Go, я обращался к курсам. Помимо курса от #CloudMTS, мне также понравился туториал по Go от Rebrain. И обязательно к прохождению Tour of Go от Google — авторов языка. Это бесплатный инструмент, который научит почти всему, что нужно знать о синтаксисе. Он на английском, но в этом и плюс — сразу учишь названия технологий на языке документации.
- Из литературы рекомендую три книги — «Чистый код», «Чистая архитектура» и «Грокаем алгоритмы». Первая книга учит, как правильно объявлять переменные и методы, как писать код, когда работаешь в команде. «Правило бойскаута» является одним из моих любимых. Я считаю, что эту книгу стоит прочесть всем начинающим разработчикам, вне зависимости от языка программирования.
«Чистая архитектура» дала понять, какие подходы есть при построении приложений и систем в целом. Эти знания пригодились, когда мы только начинали проектировать Managed Redis. Обязательно к прочтению.
В сообществе о книге «Грокаем алгоритмы» сложилось неоднозначное мнение, однако она помогла мне познакомиться с классическими алгоритмами. Они не всегда применяются в работе, но, на мой взгляд, их полезно знать. В любом случае на собеседованиях очень любят спрашивать алгоритмы. Чтобы закрепить знания, я расписывал код из книги на бумаге, дополнял его своими комментариями или собственными решениями. - Также есть очень много статей по Go. Например, блог-пост «50 ошибок начинающих разработчиков на Go» — затрагивает много нюансов в контексте взаимодействия с железом и управлением указателями. Что-то из этого могут спросить в качестве каверзного вопроса на собеседовании.
- Стоит также ознакомиться с книгами по системной архитектуре. Например, начать можно с System Design Алекса Сюя.
- Дальше уже на вкус и цвет, смотря чем человек хочет заниматься. На YouTube множество интересных каналов — я изучал контент BACKEND NINJA, The Art of Development и TutorialEdge. Много видеоруководств собрано на сайте GolangResourses. Авторы рассказывают обо всем, вплоть до архитектуры Go-приложений и лучших практик написания кода — хотя каждая компания формирует собственные ADR. Например, мы в команде не используем сокращения, поэтому репозиторий всегда repository, а не repo, а запрос — request, а не req.
Кроме синтаксиса и особенностей Go, следует обязательно изучить несколько технологий из смежных сфер: SQL и теория баз данных, Apache Kafka, gRPC и протокол Protobuf.
Надеюсь, мои рекомендации по ресурсам будут полезными тем, кто только начинает свой путь в Go, а моя история прихода в профессию лишний раз покажет, что все достижимо.