Всё о разработке | Леонид Ченский – 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
Я только что вернулся в Москву после самой долгой и насыщенной поездки в жизни.
Зимовка в Азии — мечта, которую я вынашивал много лет. И в этом году она наконец-то сбылась.

С ноября по март я не просто сменил обстановку — я прожил целую маленькую жизнь в путешествии.
Удалёнка дала свободу перемещаться, а я решил взять от этого максимум:
5 стран
🇻🇳🇰🇭🇲🇾🇱🇦🇨🇳, 14 городов, тысячи километров, десятки новых вкусов, встреч и открытий.

Я побывал в таких городах как:
Нячанг, Пномпень, Сиемреап, Хошимин, Фукуок, Далат, Куала-Лумпур, Дананг, Хюэ, Хойан, Вьентьян, Ванг Вьенг, Луангпробанг, Гуанчжоу.

Было невероятно!

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

— постоянная адаптация к новой среде
— нестабильный интернет
— разница в часовых поясах
— жара, которая выключает продуктивность
— соблазн “чуть-чуть полежать на пляже” — а потом уже вечер

Оказалось, что в таких условиях особенно важна самодисциплина.

Удалёнка требует структуры, если хочешь не просто выживать, а развиваться и расти.

Сейчас я снова в Москве.
С любимым рабочим местом, нормальным графиком, быстрым интернетом и сосредоточенностью.
А значит — начинается мой личный «рабочий сезон».

И уже завтра, в 19:00 по МСК, я проведу открытый бесплатный урок:
«Эволюция MVC до чистой архитектуры».

Разберем, как устроены MVC, 3-уровневая, гексагональная, луковая и чистая архитектуры, а также узнаем их историю, сильные и слабые стороны.

Регистрация по
ссылке — приходите, будет интересно и по делу.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2155👍22
Запись со вчерашнего открытого урока
📹RuTube
👀VK
👀YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥123👏3👍1🆒1
Вписаться в несколько активностей, а потом офигевать от количества мероприятий в календаре - это классика.

P.S. Готовлю курсы и делюсь экспертизой не только на публику но и внутри компании.
🔥72
Хорошая новость для тех, кто хотел перейти на Go-разработку или попасть в BigTech

Стартует набор на поток Route256🦎
Эксперты из Ozon научат всем азам в разработке на Go, кликайте для подачи заявки на участие в отборе.

➡️ 2 месяца онлайн-занятий по вечерам — можно совмещать с работой и учёбой;
➡️ Интересные задачи — реальные, под потребности компании;
➡️ Крутая команда — эксперты Ozon.

Route 256 — это демоверсия работы в BigTech (без преувеличения). Но у каждого студента будет свой персональный тьютор: поддержать, когда непросто, и поболтать, когда хочется.

Спешите подать заявку: тренировочный раунд уже открыт, а отборочный контест — 20 апреля.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👨‍💻3🙏2🆒1
ПРО АЛГОРИТМЫ НА СОБЕСЕДОВАНИЕ

Раньше я искренне не понимал, зачем некоторые 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👍25🔥197🤔2🏆2🗿2👎1
С ДНЁМ ПОБЕДЫ
1🔥15🎉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🤣12🆒2
Всё о разработке | Леонид Ченский pinned «Всем привет! Меня зовут Леонид Ченский, и я решил начать вести свой канал, посвященный разным темам из жизни разработчика. Расскажу немного о себе: ➡️мне 25 лет ➡️закончил университет им.Баумана, факультет Информационного Управления с красным дипломом »