Academ Coder [Backend/Golang]
25 subscribers
6 links
Записки о программировании на Golang, backend-разработке, менторстве и жизни из Новосибирского Академгородка.

Я - Колосов Никита, Lead Go Developer в Купер (ex-Магнит, ex-Pushwoosh).

Более 10 лет опыта в Backend-разработке, более 5 лет опыта менторства.
Download Telegram
Возьмем типичный план "прокачки" Go-разработчика

- Базовые типы данных. Указатели. Строки, Slice, Map. Внутреннее устройство типов данных. Структуры. Интерфейсы.
- Процессы и потоки ОС. Модель памяти.
- Горутины. Планировщик Go. Go Runtime. GC.
- Работа с многопоточностью (каналы, мультиплексирование, контексты).
- Паттерны многопоточной обработки данных (Worker Pool, Pipeline)
- Обработка ошибок и паник в Go. Метрики и логирование.
- Работа с HTTP / gRPC в Go. Middleware.
- Алгоритмы и структуры данных.
- ACID. Типы индексов PostgreSQL. Репликация и партицирование. Работа с БД в Go.
- Брокеры сообщений. Kafka. Работа с Kafka в Go
- Тестирование приложений в Go. Профилирование. Race Detection.
- System Design. Паттерны микросервисной архитектуры.

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

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий
Далее посмотрим уже на детальные планы. Точный состав тем может отличаться в ту или иную сторону на занятиях, здесь публикую что-то усредненное.

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

Занятие 1
Пакет builtin. Базовые типы данных. Указатели. Zero-Value. Пустой интерфейс. Пустая структура. Пользовательские структуры. Pointer / Value Receiver.
Операции new / make
Выравнивание структур. Композиция и агрегация.

Упражнение
Данное упражнение не несет особого практического смысла с точки зрения бизнес логики, а скорее направлено просто на отработку базового синтаксиса языка, его основных конструкций и знакомит нас с Git, GoLand (или VS Code).

Реализовать структуру Point (координаты X и Y на плоскости)
Реализовать методы для вычисления расстояния между двумя точками.
Реализовать метод для проверки "попадает ли точка в радиус N относительно другой точки"
Реализовать структуру "Полигон" (набор точек, образующих замкнутый многоугольник)
Реализовать метод для проверки "Находится ли точка внутри полигона"
Написать тесты для этого.

При помощи пакета flag или pflag реализовать работу с точками через консольное приложение, пример
# ./point --point=2,0 --point=0,0 --distance
> 2

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие1 #Упражнение
На первом занятии мы подробно разобрали примитивные типы данных, на втором - начинаем разбирать составные типы, массивы и слайсы. Разбираемся, в чем их отличия и особенности использования, разбираемся как работает append.

Также, рассматриваем простейшие структуры данных, реализуемые при помощи слайсов, разбираемся, в каких случаях вместо массивов стоит использовать односвязные или двусвязные списки

Занятие 2
Массивы. Устройство массивов. Слайсы. Внутреннее устройство слайсов. Отличия массивов и слайсов. Адресная арифметика.
Команды make / append / copy.
Структуры данных. Стек. Очередь. Односвязный и двусвязный список.

Упражнение
Реализовать структуру данных "Стек"
Реализовать структуру данных "Очередь"
Написать тесты

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие2 #Упражнение
Строки в Go — во многом похожи на слайсы, однако имеют некоторые важные особенности. Иммутабельность, кодирование в UTF-8 и представление в виде байт и рун.
Разбираемся, чем отличается Unicode от UTF-8, как максимально эффективно работать со строками.

Занятие 3
Строки. Внутреннее устройство строк в Go.
Байты. Руны. Кодировка. Unicode. UTF-8.
Пакет strings, unicode/utf8.
Форматирование строк. Преобразование типов данных. Пакеты fmt, strconv.

Упражнение
Необходимо написать Go функцию, осуществляющую примитивную распаковку строки, содержащую повторяющиеся символы/руны, например:
"a4bc2d5e" => "aaaabccddddde"
"abcd" => "abcd"
"3abc" => "" (некорректная строка)
"45" => "" (некорректная строка)
"aaa10b" => "" (некорректная строка)
"aaa0b" => "aab"
"" => ""
"d\n5abc" => "d\n\n\n\n\nabc"


Как видно из примеров, разрешено использование цифр, но не чисел.
В случае, если была передана некорректная строка, функция должна возвращать ошибку. При необходимости можно выделять дополнительные функции / ошибки.

Написать тесты на весь функционал

(*) Дополнительное задание: поддержка экранирования через \:
(обратите внимание на косые кавычки)
`qwe\4\5` => "qwe45"
`qwe\45` => "qwe44444"
`qwe\\5` => `qwe\\\\\`
`qw\ne` => "" (некорректная строка)

Как видно из примера, заэкранировать можно только цифру или слэш.

(*) Дополнительное задание: Написать упаковку строк (обратное преобразование)
aaaabccddddde => a4bc2d5e

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие3 #Упражнение
Следующий тип данных в Go - это map. Map - это реализация структуры HashMap, которая обеспечивает сложность доступа по ключу в О(1).

Занятие 4
Тип данных map. Внутреннее устройство map. Бакеты.
Hash-функция. Коллизии. Алгоритмы разрешения коллизий.
Устройство памяти. Процесс эвакуации. Взятие указателя на значение map по ключу.
Многопоточная работа с map. Особенности работы с sync.Map

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4
Ранее мы познакомились с основными типами и структурами данных, теперь мы постепенно начинаем применять их на практике.

Одна из наиболее часто используемых структур в production - это LRU-Cache.
Структура представляет из себя кеш ограниченного размера, при этом при добавлении новых элементов, в ситуации, когда кэш заполнен, старые элементы - удаляются. При этом удаляются те элементы, которые давно не были использованы на чтение.
Предполагается, что те элементы, которые мы часто читаем - удалять из кеша не надо, а те элементы, что на чтение не используются - нет смысла в этом кеше хранить.

Упражнение
Реализовать LRU-Cache. При создании кеша указываем его размер при помощи функциональных опций. Если размер не задан - используем размер по-умолчанию.

Кеш должен быть вынесен в отдельный пакет.
Пакет должен иметь тесты на весь функционал.

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение
Зачастую, приходится работать со структурой под название "Множество" или "Set".
Данная структура представляет из себя набор уникальных элементов.

Упражнение
Реализовать структуру данных Set
Реализовать методы "Пересеченме двух множеств", "Объединение двух множеств", "Вычитание множества"

#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение
Какие источники стоит изучить при изучении Go и прохождении курсов?

☑️Основы
Основы Go на официальном сайте https://go.dev/learn/
Прохождение Go Tour https://go.dev/tour/

☑️Официальная документация
https://go.dev/doc/
Более подробная документация по внутренностям языка https://go.dev/doc/effective_go

Литература
☑️По языку
📓
Язык программирования Go, Алан А.А. Донован, Брайан У.Керниган
📓Golang для профи. Михалис Цукалос.
📓Go: идиомы и паттерны проектирования. Джон Боднер

☑️Алгоритмы и структуры данных
📓
Грокаем алгоритмы. Адидтья Бхаргава.
📓Совершенный алгоритм. Тим Рафгарден.
📓Продвинутые алгоритмы и структуры данных. М. Ла. Рокка

☑️ОС и сети
📓
Архитектура компьютера. Э. Таненбаум. Т. Остин
📓Современные операционные системы. Э. Таненбаум. Х. Бос.
📓Компьютерные сети. Э. Таненбаум. Д. Уэзеролл.

☑️Архитектура
📓Фундаментальный подход к программной архитектуре: паттерны, свойства, проверенные методы. Ричардс М. , Форд Н.
📓Современный подход к программной архитектуре: сложные компромиссы. Ричардс М. , Форд Н. , Садаладж П., Дехгани Ж.
📓Создание микросервисов. Сэм Ньюмен.
📓Микросервисы. Крис Ричардсон.
📓Высоконагруженные приложения. Программирование. Масштабирование. Поддержка. М. Клеппман.
📓System Design. Подготовка к сложному интервью. Алекс Сюй.

☑️Технологии
📓PostgreSQL 16 изнутри. Егор Рогов.
📓Apache Kafka. Потоковая обработка и анализ данных. Гвен Шапира, Тодд Палино, Раджини Сиварам, Крит Петти.

☑️Observability
📓Site Reliability Engineering. Надежность и безопасность как в Google. Бетси Бейер, Крис Джоунс, Дженнифер Петофф, Нейл Ричард Мёрфи.
📓Site Reliability Workbook: практическое применение. Бетси Бейер, Нейл Ричард Мёрфи, Дэвид Рензин, Кент Кавахара, Стивен Торн

#Go #Backend #Литература #ПолезныеМатериалы