Всё о разработке | Леонид Ченский – Telegram
Всё о разработке | Леонид Ченский
640 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
ИЗЯЩНАЯ РАБОТА С ОШИБКАМИ В GO, ИЛИ КАК ИХ СРАВНИВАТЬ

Обычное err == myErr в Go работает не всегда так, как ты ожидаешь. Особенно если ты оборачиваешь ошибку через fmt.Errorf("context: %w", err). В таких случаях Go предоставляет более мощные инструменты — errors.Is и errors.As.

Как работает errors.Is

Когда ты используешь %w в fmt.Errorf (врапинг ошибки), ты как бы упаковываешь одну ошибку внутрь другой, добавляя контекст. errors.Is умеет разворачивать такие обёртки и проверять, есть ли внутри нужная ошибка:

var ErrNotFound = errors.New("not found")
err := fmt.Errorf("ошибка в поиске: %w", ErrNotFound)

if errors.Is(err, ErrNotFound) {
fmt.Println("Ничего не найдено")
}


Под капотом errors.Is делает так: если ошибка обёрнута через %w, она вызывает Unwrap() и идёт по цепочке, пока не найдёт нужную. Если ты просто сравнишь err == ErrNotFound, то получишь false, потому что это уже не тот же объект — он обёрнут.

А что делает errors.As

Иногда нужно не просто узнать, была ли ошибка определённого типа, но и получить доступ к её полям. Например:
type MyError struct {
Code int
Msg string
}

func (e *MyError) Error() string {
return fmt.Sprintf("code: %d, msg: %s", e.Code, e.Msg)
}

err := &MyError{Code: 499, Msg: "custom"}
var myErr *MyError

if errors.As(err, &myErr) {
fmt.Println("У нас ошибка кода", myErr.Code)
}


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

Как кастомизировать сравнение — метод Is()

Ты даже можешь сам определить, когда твоя ошибка считается «равной» другой. Для этого нужно реализовать метод Is(target error) в своей реализации:
type HttpError struct {
Code int
Msg string
}

func (e *HttpError) Error() string {
return fmt.Sprintf("HTTP %d: %s", e.Code, e.Msg)
}

func (e *HttpError) Is(target error) bool {
t, ok := target.(*HttpError)
return ok && e.Code == t.Code
}


Теперь, даже если сообщения об ошибках разные, но коды совпадают — errors.Is вернёт true:
var Err404 = &HttpError{Code: 404}
err := fmt.Errorf("обёрнутая ошибка: %w", &HttpError{Code: 404, Msg: "page not found"})

if errors.Is(err, Err404) {
fmt.Println("Обнаружена 404")
}


Когда и где это реально нужно (примеры из практики)

— В библиотеках: ты возвращаешь ошибки вроде ErrInvalidConfig или ErrNotConnected, и хочешь, чтобы пользователи могли их отловить независимо от контекста

— В сервисах: API может возвращать ошибки с кодами, а внутри тебе удобно описывать их кастомными типами — и потом ловить их по errors.Is

— В middleware: например, хочешь логировать всё, кроме ErrUnauthorized — тогда errors.Is(err, ErrUnauthorized) спасёт от лишнего шума

— В gRPC/HTTP-хендлерах: удобно классифицировать ошибки и автоматически подставлять нужный статус код в ответе

— В CLI-инструментах: логика выхода с кодами ошибок может зависеть от типа ошибки, а не только от текста

Если ты до сих пор сравниваешь ошибки через ==, самое время освоить errors.Is и errors.As. Это делает твой код гибким, читаемым и гораздо ближе к надёжной архитектуре. Go даёт тебе все инструменты — просто используй их.

Больше примеров работы с ошибками даю в бесплатном уроке на своем курсе Go!

P.S. все еще действует промокод на скидку 30% - FEIN
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1273👏2🔥1
Я конечно знал, что курсы по SQL творят чудеса, но чтоб настолько…
😁19🤣12🆒2
Всё о разработке | Леонид Ченский pinned «Всем привет! Меня зовут Леонид Ченский, и я решил начать вести свой канал, посвященный разным темам из жизни разработчика. Расскажу немного о себе: ➡️мне 25 лет ➡️закончил университет им.Баумана, факультет Информационного Управления с красным дипломом »
👩‍💻 Почему в Google придумали Go? — Потому что устали.

В середине 2000-х инженеры Google — Роб Пайк, Кен Томпсон, Роберт Грисмер — писали миллионы строк на C++ и Java.

Они строили распределённые системы, писали под высокие нагрузки, но с каждым годом сталкивались с одними и теми же болями:

👩‍💻 C++ заставлял компилироваться по 45 минут, даже при мелких изменениях кода (собрать серьезный проект на C++ тот еще квест).
👩‍💻 Java требовал абстракции ради абстракции: «фабрика фабрик интерфейсов» (абстракции это круто, когда это уместно, но не всегда это требуется)
👩‍💻 Python тормозил в проде (на масштабах Google это сильно решало)
— Код расползался, его невозможно было читать, а уж тем более — быстро понимать

Роб Пайк прямо говорил:
Мы были недовольны масштабируемостью программирования — не систем, а команд.


Именно тогда в Google всерьёз задумываются о новом языке.

Что они хотели от него?
– минимальный синтаксис
– быстрый компилятор
– простую конкурентность
– читаемость на первом месте
– минимум магии и синтаксического сахара

Go не должен быть «умным». Он должен быть понятным.


👩‍💻 Так родился Go.
Не как игрушка.
А как ответ на очень конкретную боль — в реальной разработке, с реальными дедлайнами, в самых нагруженных системах мира.

Пару цитат от создателей:

🗣 Rob Pike:
"Go was born out of frustration with existing languages.

"C++ compilation times were killing us. We’d make a small change and wait forever."

"Go is not about innovation. It’s about making the right compromises."

Go at Google (2012)

"I can’t tell you how many times I’ve had to dig through 5 layers of indirection in Java just to understand what a function does."

Google Tech Talk (2012)

🗣 Robert Griesemer (V8, Go):
"It was time to ask: what do we actually need? Go is the result of that question."

"Languages that grew organically became too complex. We wanted to reset the baseline."

Go Proverbs Talk (2015)

Постепенно Go стал вытеснять Python в инфраструктуре, Perl в автоматизации, Java в микросервисах. Сегодня Go — основа k8s, Docker, Prometheus, Etcd и тысяч продакшн-сервисов в Google, Meta, Uber, Netflix и т.д.

Go придумали, чтобы писать быстро, читать легко и меньше страдать (я бы сказала начать наконец-то получать удовольствие от процесса разработки).
И это работает!
Просто открой Go-код — и всё поймёшь.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍165💯2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Ставь 🔥, если так было и ❤️, если не закомо)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥187🤣3💯2
Минута новостей. Теперь можно получить сертификат IT-шника.
Попробую пройти на этой неделе 😅
😁8🤡3🔥1🤣1🆒11
Обработка ошибок в Go остаётся прежней — и это прекрасно.

Недавняя статья от команды Go напомнила:

if err != nil 


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

От себя добавлю: мне близка такая идеология. Ещё в C++ я впервые почувствовал радость, когда увидел
boost::error_code

— вместо try/catch можно было просто передавать ошибку по ссылке:

boost::system::error_code ec;
do_something(ec);
if (ec) {
// обработка ошибки
}


Никаких исключений, никакой ловли в неожиданных местах — всё явно и под контролем. Go взял эту идею и довёл до максимальной чистоты. Удобно, прозрачно, по делу.

P.S. Подробно о работе с ошибками рассказываю в бесплатном уроке на своем курсе Go!
👍9🔥6🆒3👎11
🔥 На этой неделе было жарко — и не только из-за погоды.

Мне досталась задача с категорией «что это вообще такое?» — реализовать аутентификацию в БД через JWT. Да-да, не в backend-приложении, а прямо в базу данных.

На первый взгляд — странная идея. На второй — всё ещё странная. Но раз надо, значит, разберёмся.

Первая остановка — знакомство с CQL и SASL. Сначала всё выглядело как очередная боль с патчами в движок БД. Но потом пришла гениальная здравая мысль: «А может, не будем трогать исходники БД, а обойдёмся встроенным механизмом saslauthd + pam

Почему бы и нет. Чтобы быстро проверить гипотезу, накидал мини-сервер на Python, который выступает в роли PAM-скрипта. Почему Python? Потому что
не надо компилировать,
править и деплоить, когда нужно ковыряться в auth flow прямо на тачке, скорость важнее всего.

На бумаге всё работало. В реальности — нет.
Документация уверяла, что всё ок. Но мы же с вами знаем: лучшая документация — это исходный код.

Погружаюсь в C++ код БД — и, неожиданно, кайфую.
Там тебе и coroutines, и lambda, и futures, и promises, и iterators. Весь код на C++23 как он есть. После Go, где всё прямолинейно, минималистично и «пресно», это было как попасть в пряничный домик. Уровень сахара подскочил до предельного уровня, частота пульса подскочила. Еще пару дней придется отходить…

Увы, выяснилось, что в моей версии БД нужного функционала просто нет — поддержка saslauthd появилась позже.
Собираем образ с нужной версией. Через ONE HOUR LATER я вспоминаю, почему не скучаю по C++: сборка проекта — это медитация, но против воли.

Обновил базу. Начинается весёлый блок под названием «танцы с бубном вокруг saslauthd и pam». Попытка номер ∞, и наконец — успех. Скрипт принимает тестовый admin/admin — можно жить!

Теперь самое интересное: пробуем отправить JWT. И… ничего! Ошибка! Даже не ошибка — тишина. В логах — пусто. Скрипт даже не вызвался.

Значит, где-то на пути client → DB → saslauthd → pam → мой скрипт
что-то сломалось. Подозрение на длину токена.

Лезу в код БД — там всё ок, длина пароля кодируется 2 байтами, ограничений на буфер жестких нет, можно пихать токены хоть длиной 65536. Лезу глубже — в исходники saslauthd (да-да, снова та самая документация).
И вот он, убийца надежды:
#define MAX_BUF_LEN 256
🙃 Да, кто ж в 2000-х думал, что кто-то будет пихать в пароль пару килобайт JSONа. Протокол может, а реализация — нет.

Ладно, значит, пишем свой saslauthd.
Снова Python, снова быстрая проверка. И... ура! Всё работает!
Теперь можно коннектиться к БД с JWT в 2025 году. Без хаков, без патчей. Просто красиво.

Осталось дело за малым: переписать всё на Go, для скорости, стабильности и душевного спокойствия перформанса. Но это уже не сегодня…

Итого, за неделю удалось потрогать Python и Go, вспомнить C и С++, поперекладывать байтики и доказать работоспособность идеи.

А у вас как неделя прошла? Были задачки на стыке "невозможно" и "ну попробуем"?
2👍214🆒31
А какого «кабанчика» выберешь ты на выходных?)
😁226🤣4👍3
Ozon Tech Community Platform Meetup

20 июня | 19:00 | Москва и онлайн

Команда платформы Ozon раскроет в красках с чем сталкивается и какие решения внедрили!

Регистрация — занимайте себе место заранее.
🔥42🆒211
В Go 1.25 подъедет синтаксический сахар для WaitGroup. Это, конечно, здорово, однако такое уже давно реализовано в библиотеке github.com/sourcegraph/conc. Могли бы добавить больше конструкций...

В своих проектах охотно использую conc, а вы?
🔥10💔3👍2🆒21
В продолжение к предыдущему посту...

в Go 1.25
- появится новый пакет synctest для удобного тестирования concurrency кода (реально долгожданная вещь)
- json/v2 - "быстрее, выше, сильнее"
- GOMAXPROCS теперь корректно работает в контейнерах
- Новый эксперементальный сборщик мусора Green Tea (обещает работать лучше при аллокации маленьких объектов в большом количестве)

Больше деталий можно найти в гайде тут
👍83
В этом году Ozon снова делает большую инженерную конференцию E-CODE. На этот раз я член программного комитета секции Backend и объявляю сбор заявок📲

Если вы — миддл+ и глубоко копаете в Go, C# или Java, нам есть о чём поговорить.

🔍 Что мы ищем:
— Хардкорные доклады (пару настоящих мясных штук)
— Практические и универсальные темы, понятные всем из бэкенда

👂 Что особенно хочется услышать в этом году:

👩‍💻 Go
— Внутрянка Go, сети оптимизации и новые фичи языка, которые принесли пользу
— Архитектура больших приложений
— Как писать масштабируемый Go-код
— Нативные решения (не коробки)
— Работа с БД: что используете, как, зачем, полехные лайфхаки и workaround

👩‍💻 C#
— Архитектура, паттерны, практики — с оглядкой на реальный опыт
— И тоже — глубже, чем поверхностная обёртка SDK

👩‍💻 Java
— Без Spring'а, пожалуйста (ничего личного)
— Теория языковых фич
— Сборщики мусора и внутренняя кухня JVM

👩‍💻 Универсальное (для всех языков):
— Алгебраические типы данных
— Отказоустойчивость: гарантии доставки и обработки
— Архитектурные подходы, применимые в любой стеке

Если вы давно хотели рассказать что-то сложное, важное, нетиповое — самое время.

🔗 Подать доклад можно по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
18🔥7👍42
BACKEND-МИТАП В МОСКВЕ

Сентябрь обещает быть жарким по митапам и конференциям😅

Приглашаю вас на мощный митап для backend-разработчиков!

Я буду одним из спикеров и поделюсь полезными инсайтами. Ждём всех, кто хочет прокачать свои навыки, обменяться опытом и завести крутые знакомства в IT.


📆Когда: 20 сентября
📍Где: Москва, Лофт-пространство «Весна»
Спартаковский переулок 2с1, подъезд №7

5 минут от м. Красносельская
7 минут от м. Бауманская


📋Программа

15:00 – 15:30 – Общий сбор

15:30 – 15:50 – Нетворкинг - разделимся на группы, пообщаемся и заведем новые знакомства

15:50 – 16:30 – Игорь Панасюк (Senior в Яндекс)

«Особенности и ловушки модели памяти в Go: тайны синхронизации»

16:30 – 17:10 – Леонид Ченский (TeamLead в OzonTech)

«Пишем микросервисы на Go как в BigTech, с нуля»

17:10 – 17:30 – Перерыв на фуршет

17:30 – 18:10 – Александр Алексеев (CTO в BigTech)

«Зачем и как изучать алгоритмы»

18:10 – 18:50 – Владимир Балун (ex-TeamLead в Яндекс)

«Как пройти System Design интервью: взгляд со стороны интервьювера и кандидата»

18:50 – 19:00 – Завершение контентной части, фотосесия

19:00 – 20:00 – Фуршет и нетворкинг на площадке

20:00 - Afterparty: по желанию едем в бар неподалеку и продолжаем общение в неформальной обстановке

🎁 Подарки за лучшие вопросы:

— книги по backend разработке от спикеров
— сертификаты на бесплатное обучение на любом из курсов школы
— бесплатные mock-собеседования в it-interview.io
— скидки на обучение в нашей школе

❗️Билеты еще не в продаже, но уже доступна предзапись. В зале до 200 мест, поэтому оставляйте заявку, чтобы не упустить возможность. Бронирование бесплатное и не обвязывает к покупке.

➡️ Заполнить анкету предзаписи
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥64333👍2
ПРИГЛАШАЮ НА E-CODE

Осталось чуть более месяца до конференции E-Code от Ozon Tech.

Я приглашаю вас на секцию Backend, которая состоится 13 сентября.

Отобрали лучшие доклады для вас: доклады будут как на тему Go, C#, Java , так и на общие темы.


Также будет много других секций на любой вкус😉

Успейте зарегистрироваться и до встречи!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🆒5👍4
Пожалуй лучшее объяснение, почему я оставляю вещи на стуле😅
😁24👍5💯2
Как фреймворк для построения REST API на Go вы используете
чаще всего?
Anonymous Poll
20%
Gin
12%
Echo
4%
Gorilla
25%
gRPC-gateway
40%
Просто посмотреть 🙂
2🗿222
Чтобы было честно:) Какой из этих фреймворков используете чаще всего для построения REST API на Go?
Anonymous Poll
15%
Gin
8%
Echo
5%
Gorilla
17%
gRPC-gateway
7%
Fiber
18%
Chi
3%
fasthttp
16%
Ванильный net/http
11%
Кодогенерация (oapi-gen, go-swagger, …)
🗿32
This media is not supported in your browser
VIEW IN TELEGRAM
Первый месяц на позиции TeamLead выглядит именно так😅
3😁18🤣6💯4🔥1