Привет!
Я — Колосов Никита, Senior Backend (PHP/Go) Developer с опытом работы более 10 лет. Живу и работаю в Новосибирском Академгородке.
Я работал в различных компаниях, занимался разными вещами в разработке. Прошёл путь от Junior до SRE Tech Lead.
Много работал с высокими нагрузками (около 100 000 RPS в API), в нескольких компаниях выстраивал Observability микросервисов с нуля.
Больше 5 лет участвую в программах менторинга и помогаю всем желающим освоить ключевые навыки для backend-разработчика, либо повысить свой грейд.
Меня можно найти на таких платформах
Solvery -https://solvery.io/mentor/nkolosov
Эйч Навыки — https://h.careers/curators/nikita-kolosov
GetMentor — https://getmentor.dev/mentor/nikita-kolosov-4184
В данном блоге буду рассказывать какие-то интересные случаи из практики, разбирать некоторые задачи по Golang, а также публиковать какие-то материалы, которые мне самому показались интересными.
Я — Колосов Никита, Senior Backend (PHP/Go) Developer с опытом работы более 10 лет. Живу и работаю в Новосибирском Академгородке.
Я работал в различных компаниях, занимался разными вещами в разработке. Прошёл путь от Junior до SRE Tech Lead.
Много работал с высокими нагрузками (около 100 000 RPS в API), в нескольких компаниях выстраивал Observability микросервисов с нуля.
Больше 5 лет участвую в программах менторинга и помогаю всем желающим освоить ключевые навыки для backend-разработчика, либо повысить свой грейд.
Меня можно найти на таких платформах
Solvery -https://solvery.io/mentor/nkolosov
Эйч Навыки — https://h.careers/curators/nikita-kolosov
GetMentor — https://getmentor.dev/mentor/nikita-kolosov-4184
В данном блоге буду рассказывать какие-то интересные случаи из практики, разбирать некоторые задачи по Golang, а также публиковать какие-то материалы, которые мне самому показались интересными.
Academ Coder [Backend/Golang] pinned «Привет! Я — Колосов Никита, Senior Backend (PHP/Go) Developer с опытом работы более 10 лет. Живу и работаю в Новосибирском Академгородке. Я работал в различных компаниях, занимался разными вещами в разработке. Прошёл путь от Junior до SRE Tech Lead. Много…»
Менторство — что это и зачем?
Для начала, хочется вспомнить старый анекдот
В менторство я пришел около 5 лет назад, кажется — во времена ковида. Сидел дома, времени свободного было много и я случайно наткнулся на такие программы. Сначала это была платформа HTML Academy. Схема там следующая: есть курс (даже несколько, по PHP), есть множество учеников и на этом курсе есть домашние задания. И вот задача ментора — проверять эти домашние задания, смотреть на корректность и качество кода и прочее, а также отвечать на вопросы. Длится это около двух месяцев, количество учеников ты выбираешь самостоятельно, по итогам курса HTML Academy оплачивает тебе за каждое проведенное занятие и проверенное домашнее задание.
Около года я подрабатывал на этой платформе, суммарно пройдя 3 или 4 потока. Однако примерно в тоже время я менял работу и менял стек, из PHP/Go переквалифицировался в чистый Go и вести курсы по PHP мне стало не интересно. При этом, экспертизы в Go такого же уровня, как по PHP у меня на тот момент не было.
И в какой-то момент я наткнулся на Solvery. Платформа меня заинтересовала, я там зарегистрировался и стал ждать первых менти. К слову, на удивление, они не заставили себя ждать, поток был постоянный, так что периодически приходится в профиле ставить статус "Не готов брать новых", просто потому что их слишком много.
В целом, все запросы на Solvery делятся на 2 типа
Менти хочет получить консультацию по одному конкретному вопросу (Например, "Как правильно сделать Dashboard в Grafana" или "Спроектировать архитектуру для сервиса N)" или "Хочу оценить свой текущий уровень прежде чем идти по собеседованиям".
Другая история — менти хочет подтянуть свой текущий грейд, либо изучить и получить практику "с нуля"
С такими менти типа #1 как правило проводится одна встреча, на которой мы решаем все эти вопросы и на этом наше общение заканчивается
А вот менти #2 как правильно подразумевают долговременное сотрудничество.
В стандартной схеме — первой встречей мы проводим mock-интервью в формате собеседования (5 минут — рассказ о текущем опыте и целях занятия, 35 минут — говорим про Go, 20 минут — платформа (БД, брокеры, архитектура)
По результатам этой встречи составляется примерный план по занятиям, по тем темам, которые стоит подтянуть.
При этом я никогда не ограничиваю план просто Level Up.
Что я тут имею ввиду?
Допустим, от Junior требуется знать X, от миддла — X + Y, от Senior — X + Y + Z.
Пришел менти Уровня Junior и хочет подтянуться до уровня Middle.
Мы будем разбирать на занятии X + Y + Z, то есть максимум информации, а не только "необходимый минимум" в виде "X + Y"
#Менторство #Менторинг #Менти #ИзЖизни
Для начала, хочется вспомнить старый анекдот
Учитель — учителю:
— Ну и класс мне попался тупой! Объясняю теорему — не понимают.
Объясняю второй раз. Не понимают! В третий раз объясняю. Сам уже понял. А они не понимают…
В менторство я пришел около 5 лет назад, кажется — во времена ковида. Сидел дома, времени свободного было много и я случайно наткнулся на такие программы. Сначала это была платформа HTML Academy. Схема там следующая: есть курс (даже несколько, по PHP), есть множество учеников и на этом курсе есть домашние задания. И вот задача ментора — проверять эти домашние задания, смотреть на корректность и качество кода и прочее, а также отвечать на вопросы. Длится это около двух месяцев, количество учеников ты выбираешь самостоятельно, по итогам курса HTML Academy оплачивает тебе за каждое проведенное занятие и проверенное домашнее задание.
Около года я подрабатывал на этой платформе, суммарно пройдя 3 или 4 потока. Однако примерно в тоже время я менял работу и менял стек, из PHP/Go переквалифицировался в чистый Go и вести курсы по PHP мне стало не интересно. При этом, экспертизы в Go такого же уровня, как по PHP у меня на тот момент не было.
И в какой-то момент я наткнулся на Solvery. Платформа меня заинтересовала, я там зарегистрировался и стал ждать первых менти. К слову, на удивление, они не заставили себя ждать, поток был постоянный, так что периодически приходится в профиле ставить статус "Не готов брать новых", просто потому что их слишком много.
В целом, все запросы на Solvery делятся на 2 типа
Менти хочет получить консультацию по одному конкретному вопросу (Например, "Как правильно сделать Dashboard в Grafana" или "Спроектировать архитектуру для сервиса N)" или "Хочу оценить свой текущий уровень прежде чем идти по собеседованиям".
Другая история — менти хочет подтянуть свой текущий грейд, либо изучить и получить практику "с нуля"
С такими менти типа #1 как правило проводится одна встреча, на которой мы решаем все эти вопросы и на этом наше общение заканчивается
А вот менти #2 как правильно подразумевают долговременное сотрудничество.
В стандартной схеме — первой встречей мы проводим mock-интервью в формате собеседования (5 минут — рассказ о текущем опыте и целях занятия, 35 минут — говорим про Go, 20 минут — платформа (БД, брокеры, архитектура)
По результатам этой встречи составляется примерный план по занятиям, по тем темам, которые стоит подтянуть.
При этом я никогда не ограничиваю план просто Level Up.
Что я тут имею ввиду?
Допустим, от Junior требуется знать X, от миддла — X + Y, от Senior — X + Y + Z.
Пришел менти Уровня Junior и хочет подтянуться до уровня Middle.
Мы будем разбирать на занятии X + Y + Z, то есть максимум информации, а не только "необходимый минимум" в виде "X + Y"
#Менторство #Менторинг #Менти #ИзЖизни
План обучения
В целом, за годы менторства план занятий более-менее пришел к единому виду и мало отличается от менти к менти.
Сначала мы разбираем базовую теорию по языку, закрепляем синтаксис, знакомимся с основными принципами разработки на Go.
Далее, мы постепенно изучаем платформу (БД, брокеры сообщений) и паттерны с ними связанные. Домашняя работа из небольших библиотек с конкретным функционалом превращается в разработку небольшого набора микросервисов, чтобы познакомиться со всеми технологиями, которые мы обсуждали на занятиях.
Как строится обучение?
В общем, обучение строится следующим образом:
Проводим мок-интервью
Я формирую верхнеуровневый план по темам и занятиям, которые нам необходимо пройти с менти
Подробно описываю темы и задание на практику на ближайшее занятие
Менти самостоятельно готовится по заданным темам. При необходимости, может обратиться ко мне за рекомендацией конкретных материалов по темам.
На встрече мы проверяем домашнее задание, я отвечаю на вопросы, которые возникли у менти в процессе подготовки, а также устраиваем такое же mock-интервью, но грубоко и по ограниченному списку тем (на первой встрече - обсуждаем "всё", на номерных встречах — небольшой объём тем
По итогам курса, когда у мы прошли все запланированные темы — проводим повторное мок-интервью для оценки прогресса, а также обнаружения проблем по каким-то темам, которые можем при необходимости повторить или рассмотреть чуть глубже.
Эйч.Навыки
Спустя какое-то время увидел рекламу менторской программы "Навыки", зарегистрировался в том числе и там. В остальном формат абсолютно аналогичен Solvery.
GetMentor
А недавно опубликовал свой профиль ещё и на платформе GetMentor, опять же, с точки зрения всего остального — по цели все платформы абсолютно идентичны. Есть ментор, есть менти, они находят друг друга, а далее уже взаимодействуют в удобном формате. Преимущество платформ Solvery и Эйч.Навыки для меня, как для ментора, в том, что я не беспокоюсь в целом об оплате, не заморачиваюсь с чеками самозанятого (всё формируется в приложении "Мой налог" автоматически), остаётся только раз в месяц оплатить налог.
#Менторство #Менторинг #Менти #ИзЖизни
В целом, за годы менторства план занятий более-менее пришел к единому виду и мало отличается от менти к менти.
Сначала мы разбираем базовую теорию по языку, закрепляем синтаксис, знакомимся с основными принципами разработки на Go.
Далее, мы постепенно изучаем платформу (БД, брокеры сообщений) и паттерны с ними связанные. Домашняя работа из небольших библиотек с конкретным функционалом превращается в разработку небольшого набора микросервисов, чтобы познакомиться со всеми технологиями, которые мы обсуждали на занятиях.
Как строится обучение?
В общем, обучение строится следующим образом:
Проводим мок-интервью
Я формирую верхнеуровневый план по темам и занятиям, которые нам необходимо пройти с менти
Подробно описываю темы и задание на практику на ближайшее занятие
Менти самостоятельно готовится по заданным темам. При необходимости, может обратиться ко мне за рекомендацией конкретных материалов по темам.
На встрече мы проверяем домашнее задание, я отвечаю на вопросы, которые возникли у менти в процессе подготовки, а также устраиваем такое же mock-интервью, но грубоко и по ограниченному списку тем (на первой встрече - обсуждаем "всё", на номерных встречах — небольшой объём тем
По итогам курса, когда у мы прошли все запланированные темы — проводим повторное мок-интервью для оценки прогресса, а также обнаружения проблем по каким-то темам, которые можем при необходимости повторить или рассмотреть чуть глубже.
Эйч.Навыки
Спустя какое-то время увидел рекламу менторской программы "Навыки", зарегистрировался в том числе и там. В остальном формат абсолютно аналогичен Solvery.
GetMentor
А недавно опубликовал свой профиль ещё и на платформе GetMentor, опять же, с точки зрения всего остального — по цели все платформы абсолютно идентичны. Есть ментор, есть менти, они находят друг друга, а далее уже взаимодействуют в удобном формате. Преимущество платформ Solvery и Эйч.Навыки для меня, как для ментора, в том, что я не беспокоюсь в целом об оплате, не заморачиваюсь с чеками самозанятого (всё формируется в приложении "Мой налог" автоматически), остаётся только раз в месяц оплатить налог.
#Менторство #Менторинг #Менти #ИзЖизни
Возьмем типичный план "прокачки" 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 #ПланЗанятий
- Базовые типы данных. Указатели. Строки, 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 реализовать работу с точками через консольное приложение, пример
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие1 #Упражнение
На первом занятии подробно проходимся по примитивам 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 #Упражнение
Также, рассматриваем простейшие структуры данных, реализуемые при помощи слайсов, разбираемся, в каких случаях вместо массивов стоит использовать односвязные или двусвязные списки
Занятие 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 функцию, осуществляющую примитивную распаковку строки, содержащую повторяющиеся символы/руны, например:
Как видно из примеров, разрешено использование цифр, но не чисел.
В случае, если была передана некорректная строка, функция должна возвращать ошибку. При необходимости можно выделять дополнительные функции / ошибки.
Написать тесты на весь функционал
(*) Дополнительное задание: поддержка экранирования через \:
(обратите внимание на косые кавычки)
Как видно из примера, заэкранировать можно только цифру или слэш.
(*) Дополнительное задание: Написать упаковку строк (обратное преобразование)
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие3 #Упражнение
Разбираемся, чем отличается 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
Занятие 4
Тип данных map. Внутреннее устройство map. Бакеты.
Hash-функция. Коллизии. Алгоритмы разрешения коллизий.
Устройство памяти. Процесс эвакуации. Взятие указателя на значение map по ключу.
Многопоточная работа с map. Особенности работы с sync.Map
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4
Ранее мы познакомились с основными типами и структурами данных, теперь мы постепенно начинаем применять их на практике.
Одна из наиболее часто используемых структур в production - это LRU-Cache.
Структура представляет из себя кеш ограниченного размера, при этом при добавлении новых элементов, в ситуации, когда кэш заполнен, старые элементы - удаляются. При этом удаляются те элементы, которые давно не были использованы на чтение.
Предполагается, что те элементы, которые мы часто читаем - удалять из кеша не надо, а те элементы, что на чтение не используются - нет смысла в этом кеше хранить.
Упражнение
Реализовать LRU-Cache. При создании кеша указываем его размер при помощи функциональных опций. Если размер не задан - используем размер по-умолчанию.
Кеш должен быть вынесен в отдельный пакет.
Пакет должен иметь тесты на весь функционал.
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение
Одна из наиболее часто используемых структур в production - это LRU-Cache.
Структура представляет из себя кеш ограниченного размера, при этом при добавлении новых элементов, в ситуации, когда кэш заполнен, старые элементы - удаляются. При этом удаляются те элементы, которые давно не были использованы на чтение.
Предполагается, что те элементы, которые мы часто читаем - удалять из кеша не надо, а те элементы, что на чтение не используются - нет смысла в этом кеше хранить.
Упражнение
Реализовать LRU-Cache. При создании кеша указываем его размер при помощи функциональных опций. Если размер не задан - используем размер по-умолчанию.
Кеш должен быть вынесен в отдельный пакет.
Пакет должен иметь тесты на весь функционал.
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение
Зачастую, приходится работать со структурой под название "Множество" или "Set".
Данная структура представляет из себя набор уникальных элементов.
Упражнение
Реализовать структуру данных Set
Реализовать методы "Пересеченме двух множеств", "Объединение двух множеств", "Вычитание множества"
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение
Данная структура представляет из себя набор уникальных элементов.
Упражнение
Реализовать структуру данных Set
Реализовать методы "Пересеченме двух множеств", "Объединение двух множеств", "Вычитание множества"
#Менторство #Менторинг #Менти #GoLang #Go #Backend #ПланЗанятий #Занятие4 #Упражнение