Всё о разработке | Леонид Ченский – Telegram
Всё о разработке | Леонид Ченский
639 subscribers
93 photos
7 videos
2 files
74 links
Рассказываю об актуальных проблемах, с которыми сталкивался в своей работе. Делюсь полезными материалами, курсами, статьями и просто своими мыслями.

GitHub: https://github.com/moguchev
Linkedin: https://www.linkedin.com/in/leonid-chenskii-b034a9229
Download Telegram
Ozon Tech Community TeamLead Meetup

21 августа | 18:30 мск | офлайн и трансляция

Такое событие в календаре — первый тимлидский митап в Ozon! Прокачай софты в компании экспертов Ozon комьюнити и других бигтехов.

В программе: два доклада, панельная дискуссия, угощения и время для неформального нетворкинга.

📌 Доклад 1: «Как окунуться в новую предметную область и не утонуть»
Юлия Лукина, старший менеджер проектов, поможет сориентироваться на новом месте — погрузиться в неизведанную область и справиться с синдромом самозванца.

📌 Доклад 2: «(Хороший_инженер) != (Хороший_тимлид)»
Иван Миронов, руководитель отдела разработки, объяснит, на какие характеристики будущих руководителей нужно опираться при найме.

🗯 Дискуссия: «Быть или не быть: тимлид или эксперт?»
Обсудим горизонтальное и вертикальное развитие, метрики эффективности и подходы к принятию технологических вызовов.

Если вкратце, научимся принимать верные решения. Попрактикуйте прямо сейчас, чтобы успеть занять место офлайн или получить ссылку на трансляцию.
5👍2🔥2
👩‍💻 3 МОИХ ЛЮБИМЫХ ШАБЛОНА КОДА В GO

Приветствую, гоферы! Хочу поделиться с вами шаблонами, которые я часто использую в своих проектах. Они помогают мне писать более структурированный, поддерживаемый и читабельный код.

1. Функциональные возможности (Functional Options)

Этот шаблон позволяет удобно настраивать параметры структуры или функции с помощью опциональных аргументов. Особенно полезно при создании конструкций с большим количеством настроек (например соединение с БД, брокером и т.д.)

Пример:
// Непубличная конфигурируемая структура опций.
type connectionOptions struct {
maxPoolSize int
readTimeout time.Duration
// ...
}

// Опции как функции
//
// Из-за того, что connectionOptions - не экспортируемая структура, потребители не смогут реализовать данный тип.
type Option func(*connectionOptions)

// Реализация функциональных возможностей
func WithMaxPoolSize(s int) Option {
return func(o *connectionOptions) {
o.maxPoolSize = s
}
}

// Реализация функциональных возможностей
func WithReadTimeout(d time.Duration) Option {
return func(o *connectionOptions) {
o.readTimeout = d
}
}

// Функция инициализации
func NewConnection(address string, opts ...Option) *Connection {
cfg := &connectionOptions {
readTimeout: 60 * time.Second, // значения по-умолчанию
maxPoolSize: 10, // значения по-умолчанию
}

// Тут изящно применяются все наши опции
for _, opt := range opts {
opt(cfg)
}

return &Connection{
address: address,
config: cfg,
}
}

func main() {
conn := NewConnection("127.0.0.1:5432",
WithMaxPoolSize(20),
WithReadTimeout(5*time.Second),
)
// ...
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍42👀1
2. Билдеры (Builder Pattern)

Билдеры позволяют создать сложные объекты пошагово, обеспечивая читаемость и облегчая управление объектами с множеством параметров.

type House struct {
floors int
color string
garage bool
}

type HouseBuilder struct {
house *House
}

func NewHouseBuilder() *HouseBuilder {
return &HouseBuilder{house: &House{}}
}

func (b *HouseBuilder) SetFloors(floors int) *HouseBuilder {
b.house.floors = floors
return b
}

func (b *HouseBuilder) SetColor(color string) *HouseBuilder {
b.house.color = color
return b
}

func (b *HouseBuilder) SetGarage(garage bool) *HouseBuilder {
b.house.garage = garage
return b
}

func (b *HouseBuilder) Build() *House {
return b.house
}

func main() {
builder := NewHouseBuilder().
SetFloors(2).
SetColor("blue").
SetGarage(true)

house := builder.Build()
fmt.Printf("House: %+v\n", house)
}
🔥8👍52👏1
3. Неявное внедрение зависимостей (Dependency Injection)

Этот шаблон позволяет легко управлять зависимостями между компонентами, повышая модульность и упрощая тестирование.

Пример:
type Database interface {
Query(query string) string
}

type Deps atruct {
Database
// other interfaces...
}

type Service struct {
Deps
}

func NewService(deps Deps) *Service {
return &Service{Deps: deps}
}

func (s *Service) GetData() string {
return s.Database.Query("SELECT * FROM data")
}

type MySQL struct{}

func (db MySQL) Query(query string) string {
return "MySQL query result"
}

func main() {
service := NewService(Deps{
Database: MySQL{}
})

fmt.Println(service.GetData())
}

За счет гибкого расширения структуры зависимостей, не приходится менять API конструктора NewService, следовательно сохраняется обратная совместимость и не требуется редактировать старые тесты.

Эти шаблоны помогают мне писать гибкий, легко поддерживаемый код, который можно адаптировать под различные нужды проекта.

А какие шаблоны используете вы? Делитесь своими любимыми в комментариях!
⬇️⬇️⬇️

#golang #шаблоны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍42🤩11
Коллекционирую всевозможные ачивки в Ozon 🏅
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥14114👍31🆒11
Сегодня закончил четырехдневный курс ораторского мастерства (естественно с отличием, а как иначе). Теперь мои доклады должны стать еще лучше!😅

А вообще словил невероятный кайф от оффлайн обучения, знакомств и курса в целом.

Поделитесь в комментариях, какой последний курс проходили, или какую книгу читали, для прокачивания своих скилов?
🎉7❤‍🔥3👍3🔥2🆒21
🙏 С ДНЕМ ПРОГРАММИСТА!

Друзья, сегодня отмечается день программиста (256 день года). И в честь этого приглашаю всех вас на свой открытый урок:

🆓«ПАТТЕРНЫ ОТКАЗОУСТОЙЧИВОСТИ МИКРОСЕРВИСОВ НА GO»

📆 14 сентября 18:00 по МСК

На открытом уроке расскажу о самых важных паттернах, которые позволят вам создавать стабильные и надежные микросеврисные системы!
Жду всех вас, до встречи!

🔗 Регистрация по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84👍42🆒2
🦫ВНИМАНИЕ ГОФЕРЫ - КОНФЕРЕНЦИЯ!

3 октября пройдет онлайн конференция GoFunc, на которой я буду выступать с очень интересным докладом 🧑‍💻

Не упустите возможность, следите за новостями и до встречи!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5431❤‍🔥1👍1
🤔ТАК ЛИ GOLANG ХОРОШ В HIGHLOAD?

Golang обладает многими преимуществами для разработки высокопроизводительных, многопоточных программ. Именно за свои простоту и эффективность Go занял свое почетное место среди самых популярных языков для разработки микросервисов.

Однако при разработке высоконагруженных приложений на Go, в которых очень важны минимальные задержки, отзывчивость , могут возникнуть неожиданные проблемы…

Проблема 1. Непонятные задержки при большом количестве горутин.

Go использует ограниченное число потоков (М) для выполнения множества горутин (G), и увеличение числа горутин приводит к увеличению накладных расходов: балансировка горутин (G) между потоками (M), блокировки в глобальной очереди горутин, переключение контекста в потоке и т.д.

Также планировщик в Go не гарантирует четкого порядка исполнения горутин. Это означает, что каждый раз, когда мы создаем горутину, блокируемся где-то на мьютексе, системном вызове или канале, она идет «парковаться». Через какое время горутине посчастливится вновь исполняться дальше на потоке — мы не знаем… Чем больше горутин, тем выше шанс, что какой-то из них (а может нескольким) сильно не повезет и она будет очень долго ждать своего часа… Все это замедляет выполнение пользовательского запроса в нашем сервисе, особенно в 99 перцентиле.

Проблема 2. Сборщик мусора.

Go - язык со сборщиком мусора (GC) и его тюнинг может стать тем еще испытанием.
Частые паузы на сбор мусора (Stop The World) создают задержки, что непременно усугубляет проблемы с производительностью. Но это не главная проблема (операции STW довольны быстрые и не заметные в последних версиях Go). Главная боль - это сканирование heap-а за счет Mark Assist горутин- специальные горутины, которые начинают исполняться на потоках вместо наших горутин. Таким образом приложение по сути испытывает голодание потоков, потому что они заняты «полезной работой» по разметке объектов в куче. Когда сборщик мусора работает часто, наше приложение работает не на полную мощность и это все также ведет к замедлению обработки пользовательских запросов…

Как понять, что вы столкнулись с этими проблемами?

Вот метрики, за которыми точно нужно следить и подскажут вам, что что-то идет не так:
- Количество горутин. Тут нет конкретной универсальной цифры. Для каждого приложения есть свой определенный порог, после которого необходимо увеличивать количество инстансов вашего приложения.
- Время ожидания горутины на исполнение. Тут все просто: если 0.99q >= 1ms, стоит напрячься: добавить ресурсов приложению, увеличить количество потоков, увеличить число инстансов приложения, оптимизировать сборку мусора.
- Количество вызовов сборки мусора за минуту. В идеале этот показатель стоит держать в диапазоне 1-10 раз в минуту (не для всех типов приложений такое число актуально). Если чаще, стоит начать оптимизировать ваш код, и стараться добиться уменьшения количества вызовов GC.

В своем старом докладе рассказывал про работу сборщика мусора в Go и варианты его оптимизации.
🔥9👍311👏1💯1
МОЙ ПЕРВЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ В КОММЕРЧЕСКОЙ РАЗРАБОТКЕ

Добрый день, дорогие подписчики. Решил поделиться с вами необычным фактом о себе, о котором мало кто знает.

Программирование я начал изучать с первого курса. За год изучения я уже знал на уверенном уровне С, С++ и немного Python. Как и все студенты, я мечтал попасть на стажировку в крупную IT компанию и получить свой первый опыт разработки. Однако меня (к сожалению или к счастью) не взяли ни в Яндекс, ни в Mail, ни в Авито, ни в Ozon. Оказалось, что знание С/С++ кроме Яндекса было мало кому интересно, а в Яндекс, к тому же, еще были очень высокие требования к знанию алгоритмов, которые на тот момент я особо глубоко не изучал. Так я впервые столкнулся с жестокой реальностью и понял, что изучение универсальных языков программирования совсем недостаточно для того, чтобы попасть на работу в IT.

В итоге моя мечта о работе в крупной BigTech компании была отложена, и так получилось, что я попал в небольшую IT компанию, которая специализировалась на разработке ERP систем для крупных российских компаний. В ней требовалось разрабатывать не на С/С++, не на Python и не на PHP… Моим первым коммерческим языком разработки стал… (барабанная дробь🥁) - ABAP!Да-да, многие из вас никогда даже не слышали о нем! ABAP — язык программирования специально разработанный для создания и поддержки приложений на платформе SAP.

Чтобы как-то кратко поведать о специфике этого языка и передать вам ощущениях от работы с ним, представьте 90-ые годы. Вы устроились программистом в компанию, вам дают маленький компьютер со стеклянным толстым монитором, вы запускаете IDE, которая выглядит как браузеры и сайты того времени на HTML 1.0. Вы открываете программу и видите: смесь SQL, C и Pascal. Комьюнити особого тут нет, в помощь вам 3-х томик по SAP и пару русскоязычных форумов… Куда я попал…?

У меня ушел месяц, чтобы погрузится в этот язык. После С++ он был чем-то очень примитивным и простым, но все же понятным. Итак, мне достается первая боевая задача, которая звучит как пофиксить какой-то небольшой баг в поле, где выводится не та циферка. Уф, здорово, я сейчас ворвусь в разработку! Моя первая таска - держись! Но не тут-то было… Следующие 3 дня я провел в отладке в монолитной программе, которую разрабатывали с 2007 года и столько разных людей и в разных компаниях, что, боже упаси, вам когда-то окунуться в такие дебри, legacy и монолит! Архитектура кода, паттерны, документация?! Нее, тут только хардкор в мире ABAP-а: только монолиты, только спагетти-код, только огромные SELECT-ы и VIEW на 400+ полей… За пару дней я пережил невероятные чувства разочарования, досады и гнева. Неужели разработка это вот ЭТО вот все?!

В общем и целом, как вы могли догадаться, надолго я там не задержался😅 Зато я получил необычный и, на мой взгляд, ценный опыт в разработке (не советую вам его повторять). Эта стажировка и работа с ABAP научили меня следующему:

1️⃣Работа с SQL - запросы в ERP системах бывают настолько сложными, что не каждый Senior сразу такой напишет… И все еще усугублялось большими таблицами и большим количеством данных. В итоге SQL был изучен на 200% и далее это мне помогло уже в работе в другой компании.

2️⃣Архитектура кода и паттерны: я понял, что просто писать код, который что-то делает - нельзя! Это не поддерживается, это не гибко и не расширяемо. После этого я окунулся в мир архитектурных паттернов, стал изучать их досконально и следить за тем, чтобы мой код был читабельным и масштабируемым!

3️⃣И самое главное на мой взгляд — нужно постоянно изучать что-то новое, следить за трендами в IT и новыми технологиями. Не стоит тратить свою жизнь на legacy…

Потом, естественно, я узнал про Go, микросервисы, WEB разработку и стал в это погружаться, но это уже совсем другая история… 😉


А какой ваш первый опыт разработки? Какая была у вас первая задача?


P.S. картинка - это скриншот из SAP с программой на ABAP.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥113😱21👍1👏1🤯1🗿1🆒1
Если есть море Java, то почему нет Go🤔

А вообще мое хобби во время полета рассматривать карту мира и смотреть полеты в приложении Flight Radar😅
13😁4🤣4👍1🗿1
Онлайн трансляция GoFunc 2024
1🔥83👍31
Стало интересно, что сейчас в Go community популярно использовать для генерации спецификации или кода из спецификации API в Go?
Anonymous Poll
14%
swagger-api/swagger-codegen
31%
go-swagger/go-swagger,
29%
swaggo/swag
31%
grpc-ecosystem/grpc-gateway
9%
OpenAPITools/openapi-generator
30%
oapi-codegen/oapi-codegen
🤔432👀2
Продолжаем опросы)

Второй год подряд ребята из DevCrowd проводят большое исследование Go-разработчиков:
• Что входит в обязанности и каких навыков не хватает
• Сколько в среднем зарабатывают в профессии в зависимости от грейда
• Какие инструменты, сервисы наиболее популярны
• Что читают, слушают и смотрят для профессионального развития.

Проходите опрос, делитесь своими мнениями и помогите сделать исследование максимально охватным. Организаторы обещают сравнить данные с прошлым годом и поделиться выводами публично уже в конце ноября.
Результаты опроса помогут вам сравнить свои ожидания с рыночными, построить план своего развития, и просто понять, что происходит с индустрией!
👉Пройти опрос

👀Посмотреть результаты прошлого года
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👀2🔥1🆒1
Podlodka Go Crew снова в деле! Это онлайн-конференция, где обсуждаются актуальные темы для go-разработчиков.

В новом сезоне особое внимание уделяется архитектуре приложений на Golang. Сессии проводятся в удобное время — утром и вечером.

Чего ожидать?
- «От 1000 скриптов на Bash к (микро)сервисам на Go» — Максим Набоких поделится опытом миграции на Go в рамках крупнейшей kubernetes-платформы.
- «System design: Saga from zero to Temporal» — Антон Цитульский рассмотрит принципы оркестрации и хореографии, используя Temporal, и объяснит, как управлять бизнес-процессами в сложных системах.
- «Спецификации и код: Как выбрать правильный путь между генерацией и интеграцией?» — Леонид Ченский покажет плюсы и минусы разных подходов к работе с API-спецификациями и представит обзор инструментов, которые помогут с автоматизацией.

Билеты в продаже на сайте: https://podlodka.io/gocrew

Также делюсь с вами промокодом:

go_crew_4_drzJzG

Который даёт скидку в 500 руб💖
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥8👍321
ТРИ СПОСОБА РАБОТЫ С SQL БД В GO

В Go существует множество инструментов для работы с SQL базами данных. На данный момент я выделяю три основных подхода: автогенерация, ORM, и Query Builder-ы. Каждый из них предлагает свои преимущества и ограничения. Давайте я поделюсь своим мнением о каждом из них, чтобы понять, когда какой стоит выбирать.


1️⃣ Автогенерация
Автогенерация - генерация Go-кода на основе SQL-запросов. Данный подход чем-то напоминает работу со спецификациями API. Самый популярный инструмент на данный момент, который используется многими: sqlc. Он позволяет писать SQL-запросы, которые затем транслируются в чистый Go-код. Этот подход отлично подходит для случаев, когда требуется строгий контроль над SQL и высокая производительность.

Плюсы:
1. Статическая типизация: генерация строго типизированного Go-кода снижает вероятность ошибок и экономит время.
2. Высокая производительность: работает с «чистым» SQL, без лишних оберток.
3. Простота: нет необходимости изучать ORM или API библиотеки для написания запросов.
4. Поддерживает MySQL, PostgreSQL, SQLite.

Минусы:
1. Отсутствие гибкости: не подходит для сложных запросов с динамической логикой.

Когда использовать: если проект требует строгого контроля над SQL, и важна производительность.

2️⃣ ORM
Ох, сколько вопросов мне задавали про ORM-ки в Go... Большинство разработчиков пришедших в Go из других языков любят ORM и ждут, что в Go они тоже есть. Да они есть (к сожалению или к счастью). Но мне, как человеку, работавшему с ERP системами, где приходиломь писать огромные SQL запросы, на разработку которых могло уйти несколько дней, чтобы сделать его оптимальным, правильным да еще подобрать нужные индексы, ORM кажутся чем-то несерьезным (хотя возможно это не так). В общем новичкам я бы советовал вначале избекать ORM любой ценой.

Однака в Go, как я уже упомянул выше, есть ORM, и самая известная — GORM. GORM — фантастическая (как ее называют) ORM, предлагающая множество инструментов для работы с БД в стиле Active Record. Подходит для проектов, где требуется сложная логика запросов и удобная работа с моделями.

Плюсы:
1. Абстракция: значительно упрощает взаимодействие с базой данных (считайте что SQL, индексы вам знать не обязательно🙂).
2. Большая поддержка разного функционала (все-таки Gorm довольно давно развивается активно, так что там можно найти все что нужно)

Минусы:
1. Производительность: за абстракцию приходится платить сниженной производительностью.
2. Нужно погрузится в API библиотеки.

Когда использовать: отлично подходит для CRUD-приложений, где важнее скорость разработки, чем производительность.

3️⃣ Query Builder-ы

Query Builder-ы — незаменимая класика: гибкость, баланс и универсальность. Query Builder-ы (например, squirrel) позволяют писать SQL-запросы в Go-коде, сохраняя гибкость, но без излишней абстракции ORM. Это средний вариант между sqlc и GORM.

Плюсы:
1. Гибкость: удобно для динамических SQL-запросов.
2. Читаемость: позволяет строить сложные запросы пошагово.
3. Производительность: близка к ручному SQL, но проще в использовании.
4. Универсальность: легко встроится в любой проект, а API Query Builder-ов интуитивно понятны.
5. Низкий порог входа (если знаете SQL).

Минусы:
1. Типизация: не так безопасен, как sqlc, т.к. не генерирует типизированный код.
2. Требует понимания SQL и логики работы базы и индексов (ну а как без этого?)).
3. Не все Query Builder-ы cпособны осилить сложные запросы.
4. Для простых CRUD может стать утомительно писать одно и тоже (решается путем генерации шаблонного кода)

Когда использовать: оптимально для приложений со сложными, динамическими запросами.

Ставь 👍, если хочешь углубиться в эту тему поподробнее.
👍18🔥6👏2🙏21
Закрыт гештальт - мой первый контрибьют в "большой" OpenSource.

А вообще за последний год мне пришлось столкнуться с большим числом opensource проектов и погрузиться в них. Надеюсь сделаю когда-нибудь либу, которая наберет 1000 звезд на github😅

У кого есть принятые PR?)
🔥18322❤‍🔥1👍1👏1
В выходные записал практикум по gRPC. Оказалось, что 3 часов записи мало, чтобы уместить все темы и фишки😥
👍13🔥43👏1
Настало время постигать opensource и делать свои проекты. Хочу поделиться с вами своей реализацией менеджера транзакций: https://github.com/moguchev/transaction_manager (не претендует на 1000 звезд). Посмотрим хватит ли времени ее развивать дальше😅

Для тех, кто не знаком с тем, что такое менеджер транзакций и зачем он нужен в Go советую прочесть эту статью от Авито. В ней очень хорошо передана вся боль работы с транзакциями в коде и обяснено зачем в чистой архитектуре он нужен и какие проблемы решает.
752👍1🔥1