
К выходу перевода книги «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
Posya
А есть какие-нибудь книги по Го для программистов, опытных в языке? Что-нибудь более глубокое. Разбор практик принятых в разных известных компаниях и проектах. Что-то за пределами синтаксиса и GoTour...
ph_piter Автор
Предлагаем обратить своё внимание на:
- 100 ошибок Go и как их избежать
- Golang для профи: Создаем профессиональные утилиты, параллельные серверы и сервисы, 3-е изд.
Книги для опытных Go-разработчиков, хорошо знакомых с синтаксисом языка.
dan_sw
В языке программирования Go, на самом деле, довольно много деталей скрыто за высокоуровневыми абстракциями, которые он активно использует. Там даже полноценного ООП нет в типичном его виде, а ключевых слов там очень мало (порядка 25 на текущий момент).
Собственно, он и разрабатывался поначалу с целью минимизировать какие-либо ошибки у начинающих разработчиков и жёстко их ограничить в возможностях (не представляю как сложно было разработать программы для контейнеризации на Go учитывая его чрезмерную ограниченность), чтобы они меньше ошибались.
Не думаю, что чего-то прям "глубокого" по этому языку можно узнать. Всё что глубже его синтаксиса, механизмов, модели памяти и псевдо ООП - это уже нужно углубляться в изучение платформы конкретной, на которой работает это приложение (Linux, Windows, MacOS), чтобы понимать что там с горутинами и каналами происходит (как они реализованы на низком уровне). А все основные подходы там жёстко зафиксированы (даже наименование методов нельзя контролировать - ошибки компилятора можно в разных случаях схватить).
Мне он как язык программирования совсем не нравится, хоть и имел я с ним опыт работы порядка одного года. Очень он ограниченный, шаблонный и мне на нём просто сложно даже мысль свою выражать. Лучше чем C++ я ещё не нашёл :) Там прям хороший баланс между низкоуровневыми и высокоуровневыми вещами выдержан, рекомендую ;)
Возможно моя оценка "глубины Go" чрезмерно критична, но всё же захотел ей поделиться :)