Go #
Go - лидирующая платформа для бэкенд разработки, несмотря на возраст. Хороша для старта карьеры, после чего можно углубляться в другие платформы и смежные области, потому что технологии не стоят на месте и их актуальность меняется со временем.
Базовый синтаксис #
Под базовым синтаксисом понимаются основы - переменные и типы данных, ветвления, цикл for.
По этому материалу существует огромное количество ресурсов, книг, курсов. Я советую совмещать теорию с практикой. В качестве теории - книгу или курс, в качестве практики по закреплению синтаксиса - задачи.
Избранные курсы и учебные ресурсы #
- Курс “Ultimate Go Tour” Ardanlabs, курс по основам go, аналог go tour
- Курс “Go: шаг за шагом” хороший курс от Яндекса с множеством практических заданий, имеет 3 части
- Курс “Learn Go with Tests” изучения go с помощью написания тестов
- “Программирование на Go” - Алан А. А. Донован, Брайан У. Керниган, отличная книга для глубокого изучения go
- Мой live-coding стрим по написанию проекта в процедурном стиле - https://www.youtube.com/watch?v=PPikj1qHxrA
- Практика:
- Сборник задач с курса ШАД по go https://github.com/slon/shad-go
- Cайты с задачами, например https://www.codewars.com/. Важно не переборщить с задачами, как только рука будет набита, и задачи уровня medium решаются легко, следует идти дальше.
- Практика - Проект “Виселица”
Предлагаемый порядок изучения материалов:
- Выбрать 1 курс или книгу, точечно изучить те главы, которые я озвучил
- Параллельно изучению теории решать задачи
- Написать проект “Виселица”
Объектно-ориентированный стиль в Go #
Go не является классическим ООП-языком: в нём нет классов, наследования и виртуальных методов. Однако он поддерживает объектно-ориентированный стиль программирования - через композицию, интерфейсы и методы, привязанные к типам.
Этот подход требует осознанного проектирования: вместо иерархий наследования - чёткие контракты и переиспользуемые компоненты. “Глубина” здесь проявляется не в количестве паттернов, а в умении строить гибкие, тестируемые и расширяемые архитектуры без наследования.
Что нужно знать и уметь:
- Определять методы для структур и именованных типов (func (r Receiver) Method())
- Использовать встраивание (embedding) для композиции поведения - не как замену наследованию, а как способ делегирования
- Работать с интерфейсами: объявлять, имплементировать неявно, применять для инверсии зависимостей (например, io.Reader, http.Handler)
- Проектировать маленькие, сфокусированные интерфейсы (accept interfaces, return structs)
- Избегать интерфейсного перепроектирования: не создавать интерфейсы “на будущее”, а выделять их по мере появления второй реализации, задумываться о применение в тестирование
- Понимать разницу между структурной типизацией и номинальной, и как это влияет на рефакторинг и дизайн API
Избранные курсы и учебные ресурсы #
- Интервью создателя Go на тему интерфейсов https://evrone.com/blog/rob-pike-interview https://news.ycombinator.com/item?id=3371884
- Видео Николая Тузова про интерфейсы https://www.youtube.com/watch?v=eYHCCht8eX4
- Объяснение наследования, композиции, агрегации https://habr.com/ru/articles/354046/
- Практика:
- Практика - Проект “Симуляция”
Предлагаемый порядок изучения материалов:
- Изучить видео из списка
- Написать проект “Симуляция”
Паттерны проектирования #
Паттерны проектирования, общепринятые “рецепты” классов для решения повторяющихся задач. Большинство задач являются типовыми, или их вариациями, и паттерны проектирования предлагают набор решения для этих задач.
Каждый паттерн - класс или семейство классов с определённым стилем именования и набором методов.
Что нужно знать:
- Постепенно осваивать паттерны, начиная с самых популярных - Singleton, Factory
Избранные курсы и учебные ресурсы #
- Плейлист с реализациями паттернов https://www.youtube.com/watch?v=P9d4EBHcpI8&list=PLxj7Nz8YYkVW5KHnsb9qWUDP2eD1TXl1N
- Репозиторий с примерами реализации паттернов на Go - https://github.com/AlexanderGrom/go-patterns
- https://refactoring.guru/ - коллекция кратких статей по каждому паттерну с примерами
- Практика - проекты курса, начиная со 2, содержат проблемы, которые можно решить с помощью паттернов
MVC #
MVC - самый актуальный для бэкенд приложений паттерн.
Суть MVC - разбиение кода на “слои”, каждый из которых занимается одной задачей:
- Модели - описывают сущности приложения
- View - отображение состояния, в виде веб-страниц, JSON ответов
- Контроллер - принятие запросов от пользователя, создание модели и view для генерации ответа
Зачастую, MVC расширяется ещё одним слоем - Service, такой паттерн называется MVCS. Классы-сервисы описывают бизнес-логику приложения.
Избранные курсы и учебные ресурсы #
- Статья с примерами - https://www.calhoun.io/using-mvc-to-structure-go-web-applications/
- Практика - проекты курса, начиная с 3
LayeredArchitecture #
Слоистая архитектура (layered architecture) — один из самых распространённых и проверенных подходов к организации backend-приложений на Go. Она основана на идее вертикального разделения системы на логические слои, где каждый слой отвечает за строго определённую область ответственности и взаимодействует только со смежными слоями.
Избранные курсы и учебные ресурсы #
- Репозиторий с примером реализации - https://github.com/bxcodec/go-clean-arch
- Статья с примерами - https://evrone.ru/blog/open-source/go-clean-template
- Практика - проекты курса, начиная с 5
Чистый код #
Чистый код - это код, понятный и податливый к изменениям. Писать такой код - навык, развивающийся на протяжении всей карьеры.
Практические проекты в рамках этого курса подразумевают не только использование фреймворков и библиотек, но и реализацию логики своими силами. Написание кода с нуля и работа над ним является главным элементом в повышении чистоты своего кода.
Избранные курсы и учебные ресурсы #
- Книги - “Чистый код” Мартина, “Рефакторинг” Фаулера, “Совершенный код” Макконнелла
- Плейлист с избранными ревью реализаций проектов курса студентами - https://www.youtube.com/playlist?list=PLOVOZrcS3XMbS4iInU-7p6TbIQW-kATfz
- Практика:
- Писать проекты курса, отправлять их мне на ревью. Примеры готовых проектов с ревью
- Читать чужой код и оценивать его качество