Всё о разработке | Леонид Ченский
495 subscribers
66 photos
4 videos
2 files
58 links
Рассказываю об актуальных проблемах, с которыми сталкивался в своей работе. Делюсь полезными материалами, курсами, статьями и просто своими мыслями.

GitHub: https://github.com/moguchev
Linkedin: https://www.linkedin.com/in/leonid-chenskii-b034a9229
Download Telegram
ПРО АЛГОРИТМЫ НА СОБЕСЕДОВАНИЕ

Раньше я искренне не понимал, зачем некоторые IT‑компании так помешаны на алгоритмах.

Казалось, на реальных проектах алгоритмические задачи почти не встречаются, и фронт‑ и бэкенд‑разработка сводится к знанию фреймворков, «перекладыванию JSON-чиков» и API.
Однако за несколько лет участия в десятках собеседований и после собственного опыта в разработке я убедился: алгоритмы — это самый надёжный способ оценить не только знание синтаксиса, но и скорость разработки и качество мышления на собеседовании. Все остальное можно заучить и «натаскаться» проходя собеседования.

Личный пример.
В начале карьеры я мог быстро писать CRUD на знакомом фреймворке, но на реальную задачу уходило по несколько дней: то упирался в нестандартный кейс, то долго выстраивал логику, код писал не быстро. После целенаправленного изучения алгоритмов и регулярной практики на LeetCode время на решение типичных задач сократилось в разы: я просто «видел» шаблон и быстро его имплементировал.

Почему это не прихоть компаний
Алгоритмические задачи — это как игра на фортепиано: профессионал, играющий разные жанры и виртуозно владеющий инструментом, способен «прочувствовать» любую мелодию и сразу попасть в нужный темп и тон. Так же и разработчик, хорошо натренировавший алгоритмическое мышление, в коде «чувствует» структуру задачи и без лишних проб и ошибок строит оптимальное решение. А скорость выполнения задач - очень важный показатель.
Можно выучить и зазубрить любую теорию: computer science, устройство языка, SQL и NoSQL, брокеры сообщений. Но алгоритмы - это тот навык, который прививается со временем.

Конечно, перегибать палку не стоит: несколько тяжелейших секций на графах и динамическом программировании, далеких от повседневных задач, часто лишь валят кандидатов и отнимают время (возможно это тактичный способ слить кандидата). Главное, что дают алгоритмы — шаблоны мышления и «насмотренность», благодаря которым вы почти на автопилоте пишете чистый, понятный и эффективный код.

Пишите в комментариях, практикуете ли вы алгоритмические задачи, и если да, видите ли у себя прогресс в скорости разработки?
👍12🔥3🗿2👏1
🚀 Запуск! Мой авторский курс по Go теперь доступен на Stepik!

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

🧠 Если ты хочешь:
— быстро и системно освоить Go
— без воды, устаревших туториалов и "постоянно что-то гуглить"
— научиться писать реальные сервисы и пройти собес

🔥 Тогда тебе сюда: курс, основанный на моём 5-летнем опыте работы с Go — от junior до lead позиции. Я собрал только то, что реально нужно на практике — никакой теории ради теории, только то, что потребуется для решения конкретных задач.
Обновляется постоянно. Не как статьи или книги — он будет жить вместе с языком.

🎯 Что внутри:
— Лаконичные уроки + практика
— Пошаговая структура от азов до настоящих API и тестов
— Бесплатные модули для ознакомления
— Постоянные обновления под новые версии Go и best practices

🎁 СТАРТОВАЯ СКИДКА -30%
По промокоду UTOPIA до 15 мая.
Итоговая цена — 5179₽ вместо 7399₽
(И да, ты получаешь доступ навсегда, с обновлениями)

➡️ Учиться можно в любое время, в удобном темпе, без дедлайнов
➡️ Обучение на платформе Stepik
➡️ Уже сейчас можно зайти, посмотреть бесплатные уроки и принять решение

🔗 Переходи по ссылке, изучи бесплатные уроки и стартуй:
👉 https://stepik.org/a/212545
Если есть вопросы — пиши, помогу разобраться.

Go — это просто, когда тебя ведут по делу.


P.S. Это не просто курс. Это путь, который я сам когда-то прошёл. И теперь передаю его тебе — в концентрированной, работающей и честной форме.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍22🔥177🤔2🏆2🗿2👎1
С ДНЁМ ПОБЕДЫ
1🔥14🎉4🕊3
Go 1.24+ и фиксация инструментов: наконец-то по-человечески

Я тут узнал отличную новость: теперь оказывается можно нормально фиксировать dev-инструменты — прямо в go.mod, без костылей.

Например, если ты используешь oapi-codegen (а ты точно его используешь, если генерируешь сервер/клиента из OpenAPI v3, ведь так?)):
go get -tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest


Это добавит в go.mod строку:
tool github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen


И дальше можно:
go install tool


//go:generate go tool oapi-codegen -config cfg.yaml ../../api.yaml


Всё! Теперь:

— Версия oapi-codegen зафиксирована
— Команда go install tool установит его любому разработчику
— Можно забыть про tools.go и ручное go install

А раньше что?
Костыли:
tools.go с анонимными импортами (import _ )
makefile с GOBIN=./bin go install и GOBIN=./bin go generate
— магия в README, которую никто не читал

Теперь всё по-взрослому, понятно и воспроизводимо.
Go продолжает радовать! 🙌
Please open Telegram to view this post
VIEW IN TELEGRAM
123👍2🔥21
ИЗЯЩНАЯ РАБОТА С ОШИБКАМИ В 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🤣11🆒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
👍164💯2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Ставь 🔥, если так было и ❤️, если не закомо)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥176🤣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👍193🆒31
А какого «кабанчика» выберешь ты на выходных?)
😁196🤣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 (обещает работать лучше при аллокации маленьких объектов в большом количестве)

Больше деталий можно найти в гайде тут
👍73
В этом году 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🔥6👍42