imageПривет, Хаброжители!

К выходу перевода книги «Go: идиомы и паттерны проектирования, 2-е изд.» мы долго думали, чем же удивить читателя Хабра. Так мы возьмём рецензию Томаса Свояновского — full-stack разработчика с восьмилетним опытом. Он в рецензии постарался учесть отличия второго издания книги от первого, подробно объяснил, о чём Джон Боднер писал и какие знания вкладывал на страницы.

Приятного чтения!

Написав эту книгу, Джон рассказал о том, как пришёл к разработке на Go, поделился секретами мастерства, помогающими написать книгу по программированию, а также пояснил, в чём уникальность Go, благодаря чему он так выделяется в ландшафте современной разработки ПО.

От Java к Go: смена парадигмы


Начиная карьеру программиста, Джон выбрал язык Java – ещё в те времена, когда только вышла версия Java 1.0. Но со временем его стало раздражать усложнение языка Java и всё новые уровни опосредованности — в особенности такие фреймворки как Spring, сильно зависящие от аннотаций и неявных поведений. Он описал сценарии, в которых зависимости могут непредсказуемо отказывать из-за неявного автоматического разрешения и вызывать ошибки во время выполнения, сложно поддающиеся отладке.

Познакомившись в 2010 году с первой демо-версией языка Go, Джон сразу оценил его простоту и Unix-подобную философию. «Мы с Java расстались, но по моей, а не по его воле», — сказал он, подчеркнув, как хорошо прямота Go согласовывалась с его взглядом на программирование. Минимализм Go казался глотком свежего воздуха по сравнению с паттернами Java, которые перегружены абстракциями.

Как создавалась книга «Go. Идиомы и паттерны проектирования»


Книга Джона «Learning Go», вышедшая в издательстве O’Reilly в 2021 году, предназначена опытным разработчикам, только начинающим изучать Go. Второе издание, вышедшее в январе 2024 года, дополнено обратной связью от читателей, упражнениями и обновлёнными примерами. Джон очень старался, чтобы второе издание получилось ещё лучше первого. Так, признаётся он, один пример с конкурентностью из первого издания получился настолько замысловатым, что автор сам затруднялся объяснять его на презентациях. В новом издании этот пример доработан, теперь он стал гораздо понятнее.

Джон считает, что писать книгу — серьёзное занятие. Первое издание стало для него «пандемийным проектом». Этот опыт помог ему понять, как важно подбирать ясные примеры и хорошо представлять себе собственную целевую аудиторию. «Вы пишете книгу не только для себя», — отмечает он, — «но и для людей, которым придётся жить с вашими словами».

Философия идиом в Go


Красной нитью через книгу Джона проходит идея о том, что на Go нужно писать идиоматический код. Но что он под этим понимает?

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

Джон подчёркивает, насколько важно «работать с языком, а не бороться с ним». Особенно это касается разработчиков, переходящих к программированию на Go, имея опыт работы с объектно-ориентированными языками (например, Java) или динамическими (например, Python).

Сложности и улучшения в Go


Притом, что простота — одна из самых сильных сторон Go, Джон остановился и на тех областях, в которых языке можно улучшить, в частности, на неизменяемости.

«В Go нет серьёзного бэкграунда неизменяемости», — объясняет он. Разработчики не могут объявлять срезы или словари как неизменяемые, и из-за этого (особенно в конкурентных программах) могут возникать трудноуловимые баги. Добавляя константы времени компиляции и конструкции, обеспечивающие неизменяемость, разработчики смогут писать более безопасный код.

Джон также подчеркнул последние усовершенствования в области обратной совместимости, появившиеся в Go. Например, в версии 1.22 была исправлена наболевшая проблема с переменными циклов в замыканиях. В Go умно построено версионирование модулей, и благодаря этому разработчики могут воспользоваться новыми вариантами поведения, не ломая при этом старых баз кода.

Любимые инструменты Джона в экосистеме Go


Джон предлагает для разработки на Go инструментарий, в который, в частности, входят:
  • IntelliJ IDEA: с этой IDE Джон не расстаётся 20+ лет, хотя, время от времени пользуется и VS Code
  • Goimports: инструмент для форматирования кода и управления операторами импорта
  • GolangCI-Lint: полнофункциональный линтер, в котором предусмотрен набор полезных проверок
  • Go Vuln Check: недавно вышедший инструмент, помогающий находить уязвимости в зависимостях

Он также лестно отзывается об инструментальном оснащении Go, отмечая, что такие инструменты как Go Embed позволяют без труда связывать ресурсы непосредственно в двоичные файлы, тем самым отвечая философии Go, которая направлена на создание самодостаточных исполняемых файлов.

Совет разработчикам, знакомящимся с Go


Для разработчиков, переходящих на работу с Go, Джон подчёркивает, насколько важно изучить идиомы Go и освоить работу с системой типов этого языка. Он объясняет, что типы — это не бремя, они помогают писать более понятный и надёжный код.

“У любых данных есть тип,” — говорит он, — “просто в Go это обозначено явно, и язык даёт вам в помощь товарища-компилятора, который перепроверит вашу работу.”

Заключение


Энтузиазм Джона по поводу Go заразителен. Будь вы опытный разработчик или новичок, книга Боднера «Go. Идиомы и паттерны проектирования» послужит вам тем самым руководством, которое поможет вдумчиво изучить и освоить язык. Второе издание вышло как раз кстати, чтобы вы могли погрузиться в Go и самостоятельно оценить, почему многие разработчики так любят этот язык за его простоту, производительность и богатство инструментов.
До следующей встречи, воины… ?

Приобретайте «Go: идиомы и паттерны проектирования, 2-е изд.» у нас на сайте издательства.

» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Go

Комментарии (4)


  1. Posya
    18.02.2025 13:40

    А есть какие-нибудь книги по Го для программистов, опытных в языке? Что-нибудь более глубокое. Разбор практик принятых в разных известных компаниях и проектах. Что-то за пределами синтаксиса и GoTour...


    1. ph_piter Автор
      18.02.2025 13:40

      Предлагаем обратить своё внимание на:
      - 100 ошибок Go и как их избежать
      - Golang для профи: Создаем профессиональные утилиты, параллельные серверы и сервисы, 3-е изд.

      Книги для опытных Go-разработчиков, хорошо знакомых с синтаксисом языка.


    1. dan_sw
      18.02.2025 13:40

      В языке программирования Go, на самом деле, довольно много деталей скрыто за высокоуровневыми абстракциями, которые он активно использует. Там даже полноценного ООП нет в типичном его виде, а ключевых слов там очень мало (порядка 25 на текущий момент).

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

      Не думаю, что чего-то прям "глубокого" по этому языку можно узнать. Всё что глубже его синтаксиса, механизмов, модели памяти и псевдо ООП - это уже нужно углубляться в изучение платформы конкретной, на которой работает это приложение (Linux, Windows, MacOS), чтобы понимать что там с горутинами и каналами происходит (как они реализованы на низком уровне). А все основные подходы там жёстко зафиксированы (даже наименование методов нельзя контролировать - ошибки компилятора можно в разных случаях схватить).

      Мне он как язык программирования совсем не нравится, хоть и имел я с ним опыт работы порядка одного года. Очень он ограниченный, шаблонный и мне на нём просто сложно даже мысль свою выражать. Лучше чем C++ я ещё не нашёл :) Там прям хороший баланс между низкоуровневыми и высокоуровневыми вещами выдержан, рекомендую ;)

      Возможно моя оценка "глубины Go" чрезмерно критична, но всё же захотел ей поделиться :)


  1. ShuvalovEP
    18.02.2025 13:40

    Вот это совпадение, Вчера купил себе такую-же.