Go можно выучить за несколько недель. Синтаксис лаконичен, инструментарий удобен, стандартная библиотека хорошо документирована. Большинство программистов, имеющих опыт работы с Python или Ruby, осваивают азы быстрее, чем ожидают.

А затем следующие полгода они проводят в борьбе с этим языком.

Не потому, что Go сложен. А потому, что большинство туториалов обращают внимание новичков не на те аспекты.

Изучение Go 

Что не так с большинством туториалов по Go

В большинстве туториалов понятие многопоточности (concurrency) выносят в самое начало курса. Горутины, каналы, WaitGroup — все это в первые же часы. Это неправильный подход. Многопоточность — одна из сильнейших черт Go, но ценность языка не в нем. Осваивать горутины, еще не понимая, как писать чистые и идиоматичные функции на Go, — все равно что учиться водить на трассе, не освоив парковку.

Другая ошибка — поиск фреймворка. Разработчики, знакомые с Rails или Django, ищут аналог в Go: то, что по умолчанию обрабатывает маршрутизацию, промежуточные слои, аутентификацию и шаблонизацию. Они гуглят «Go web framework» и в первый же день сталкиваются с Gin, Echo или Fiber.

Так обучались почти все нанятые нами Go-разработчики. Они знали фреймворк. Но не владели языком, на котором он основан.

Что на самом деле важно в начале обучения

Стандартная библиотека Go — и есть фреймворк. net/httpencoding/jsoncontextdatabase/sql — этого достаточно для создания большинства реальных бэкенд-сервисов. Прежде чем браться за любые сторонние пакеты, нужно уметь: писать простой HTTP-обработчик, читать JSON из тела запроса, выполнять запрос к базе данных и передавать контекст через цепочку вызовов функций.

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

Второй важный момент — обработка ошибок. В Go ошибки явные: нет исключений, нет try-catch, нет магических блоков перехвата. При переходе с Rails язык Go может поначалу казаться слишком многословным. Но это не так. Язык говорит вам: ошибки — часть программы, а не пограничные случаи, которые нужно ловить где-то выше по потоку. Те, кто с самого начала не усваивают этот подход, всю карьеру грешат неаккуратной обработкой ошибок. Те, кто принимают его сразу, пишут код, который реально легче отлаживать в случае форс-мажора.

Что нашей команде было нужно с первого дня

Мы использовали Go для системы фоновых задач — с высокой пропускной способностью, управляемой очередями, требующей недорогого масштабирования. Нанимая Go-разработчиков, нам было все равно, пользовались они Gin или Echo. Нам было важно, умеют ли они читать и писать идиоматический Go.

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

Как я бы начал изучать Go сегодня

Если бы мне пришлось изучать Go с нуля сегодня, я бы потратил первые две недели на создание маленького HTTP-сервиса, используя только стандартную библиотеку. Никаких Gin, GORM, никаких фреймворков. Только net/http, драйвер PostgreSQL и все, что понадобится для его работы.

После этого я бы прочитал документ «Effective Go» («Эффективный Go») и блог, посвященный Go, — не как теоретический материал, а как справочник во время разработки. К многопоточности я бы перешел только тогда, когда это реально понадобилось бы для разработки ПО.

Вот и все. Go не сложен. Большинство туториалов делают его сложным, потому что обучают продвинутым функциям до того, как заложены основы.

Начинайте с простого. Используйте стандартную библиотеку. Позвольте языку быть тем, чем он является, — не фреймворком, не заменой вашему прошлому языку. Разработчики с таким подходом быстро становятся продуктивными. Те, кто ищет Rails внутри Go, обычно находят лишь разочарование.

Осваивайте основы этого языка с моим учебником «Get Set Go«. Если хотите быстро изучить язык и начать создавать готовые к производству сервисы, «Get Set Go» поможет вам уверенно ориентироваться в стандартной библиотеке Go. Мой учебник сосредоточен на основных принципах, которые мы обсудили: написании идиоматического кода, освоении явной обработки ошибок и создании надежных бэкендов без перегрузки ненужными фреймворками.


Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Amrit Pal Singh: What I’d Focus on in Golang If I Were Starting Backend Development Today

Предыдущая статьяО чем умалчивают гайды по проектированию масштабируемых бэкендов