Всё о разработке | Леонид Ченский – 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
Пожалуй лучшее объяснение, почему я оставляю вещи на стуле😅
😁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
Говорят, чтобы стать профессионалом в любой сфере, нужно 10 000 часов практики.

Если тратить на развитие по 40 часов в неделю — это 250 недель, то есть примерно 5 лет непрерывной работы (именно поэтому в вакансиях для уровня senior требуют опыт работы от 5 лет). Надо 5 лет, чтобы выйти на уровень эксперта…

Но давайте честно: а можно ли быстрее?

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

По-настоящему мы растём, когда сами ищем новое, пробуем, экспериментируем, ошибаемся и исправляемся. Не ждём «особой задачи», которая вдруг нас вытащит на новый уровень, а сами становимся источником своего роста.

Потому что правда проста: ни ваш руководитель, ни компания, ни коллеги, ни даже ментор не заинтересованы в вашем развитии так, как вы сами.
За ваши навыки отвечаете только ВЫ.

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

А когда и что нового вы в последний раз изучили в своей сфере?
👍103💯3🔥1
🚀 PostgreSQL в микросервисах на Go

📆 25 августа в 19:00 по МСК пройдет бесплатный открытый урок по микросервисам, как в BigTech от Леонида Ченского (Team Lead в Ozon и ех-декан Route256)

На открытом уроке:
- изучишь основы эксплуатации: пуллеры, репликация, patroni, шардирование
- узнаешь почему микросервисам нужна своя база данных: паттерн Database per Service
- поймешь подходы к SQL-запросам: sql/database, pgx, билдеры запросов, ORM, кодогенерация
- изучишь миграцию схем с goose и best practices, которые помогут не сломать прод

Зарегистрировать на бесплатный открытый урок можно по ссылке

Кто я | Навигация | Спасибо
👍5🔥52🆒1
PostgreSQL в микросервисах на Go

Наконец-то дошли руки. Выкладываю запись c открытого урока:

📺 YouTube
📺 Rutube

И материалы:

👩‍💻 GitHub

Поделитесь в комментариях, что вам интересно в данной теме? О чем бы вы хотели узнать поподробнее? С какими трудностями и болями сталкиваетесь при работе с БД?
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍4🔥42🆒1
🚀 Меньше двух недель до нашего backend-митапа

Приходи, чтобы погрузиться в многопоточность, микросервисы, промпт-инжиниринг и System Design с разработчиками из BigTech. Разбираем то, что нужно для работы и успешных собеседеоний.

• Когда: 20 сентября
• Где: Москва, Пространство «Весна»

🎟️ Еще остались билеты, поспеши!

Приобрести билет можно по ссылке: https://clck.ru/3Nd8ea
5👨‍💻43🆒1
До встречи завтра на митапе 👋🏻

Осталось немного мест, но присоединиться еще можно по ссылке
🔥863👍1
Что происходит с Go-разработкой в 2025 году?

DevCrowd запускает ежегодное исследование Go-разработчиков.

Участвуйте и помогите собрать срез профессии — живой, честный, актуальный.

Зачем участвовать?
– сравните себя с другими: задачи, подходы, зрелость процессов
– узнаете, какие технологии и практики в ходу у коллег
– получите ориентиры для развития и найма
– сделаете профессию Go-разработчика прозрачнее для рынка

📊Результаты — в начале ноября на devcrowd.ru
Заполнение займёт 10–12 минут
👉Пройти опрос
👀Посмотреть результаты прошлого года
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥4👍2
Если от вас требуют оценку по задаче, вместо того, чтобы сказать «не знаю», используйте данную шпаргалку и переведите ваше ощущение в часы.

PM/TeamLead скажут вам спасибо 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12👍3🤡2💯2🤣2🗿1
🎥 Запись моего доклада с Backend-Meetup Balun!

Наконец-то дошли руки поделиться😅

В этом году я, увы, пропустил все большие конференции, но оставить сезон без выступлений — было бы преступлением. Поэтому — держите запись моего доклада 👉 ссылка

Тема — микросервисы и как их быстро и легко писать с нуля.

Митап получился насыщенным: живые обсуждения, острые вопросы и крутая атмосфера 🔥
Спасибо организаторам и участникам за энергию и интерес!

В следующем году точно надо наверстать упущенное 😉

🔗 Все доклады с митапа можно посмотреть в плейлисте
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥129👏4🆒2🏆1
Вот вам задачка на воскресное утро ☀️

👩‍💻 Тонкости миграций Postgres: как сделать поле явно NOT NULL и не уронить базу?

Есть огромная таблица some_big_table в которую непрерывно идут запросы на запись и чтение.

В этой таблице есть колонка foo_field, которая изначально NULLABLE, но фактически мы всегда туда пишем значение. И вот мы хотим сделать её явно NOT NULL.

Разработчик предлагает следующую миграцию:

0001_migration.sql:

BEGIN;

ALTER TABLE some_big_table
ADD CONSTRAINT some_big_table_foo_field_not_null
CHECK (foo_field IS NOT NULL) NOT VALID;

ALTER TABLE some_big_table
VALIDATE CONSTRAINT some_big_table_foo_field_not_null;

COMMIT;


Ваш вердикт на ревью?

Поставьте реакцию 👍 — если считаете миграцию верной, 🤡 — если не верной.
______________________

Ответ будет в следующем посте
Please open Telegram to view this post
VIEW IN TELEGRAM
🤡20👍5🔥2👀1
Отличная дискуссия получилась — и да, большинство гуру Postgres ответило верно! Давайте спокойно разберёмся, почему.

«Совсем плохой» способпросто сделать колонку NOT NULL:
ALTER TABLE some_big_table
ALTER COLUMN foo_field SET NOT NULL;


Почему так делать очень плохо на большой таблице?

Чтобы убедиться, что в столбце нет NULL, Postgres сканирует всю таблицу. Такие изменения вокруг ADD CONSTRAINT/SET NOT NULL обычно требуют ACCESS EXCLUSIVE — самый сильный DDL-лок, конфликтующий со всеми операциями, включая чтения. Это легко превращается в stop the world на таблице, если операция длится долго.

Правильный подход: через NOT VALIDVALIDATE

Идея — разделить «включить проверку для новых записей» и «проверить историю» на два шага.

1. Добавляем ограничение без проверки истории (не блокирует обновления надолго):
ALTER TABLE some_big_table
ADD CONSTRAINT some_big_table_foo_field_not_null
CHECK (foo_field IS NOT NULL) NOT VALID;


С флагом NOT VALID добавление не сканирует таблицу и может быстро зафиксироваться. Новые/изменённые строки уже обязаны удовлетворять условию.

2. Отдельно валидируем историю:
ALTER TABLE some_big_table
VALIDATE CONSTRAINT some_big_table_foo_field_not_null;


VALIDATE CONSTRAINT сканирует только существующие строки и берёт уже SHARE UPDATE EXCLUSIVE (гораздо мягче), так что записи не блокируются так сурово, как при прямом SET NOT NULL.

Что именно могло заблокировать таблицу в нашем кейсе?

Наша SQL миграция выглядит так (все в одной транзакции):
BEGIN;

ALTER TABLE ... ADD CONSTRAINT ... CHECK (...) NOT VALID;
ALTER TABLE ... VALIDATE CONSTRAINT ...;

COMMIT;


В примере я специально указал, что оба действия выполнятся в рамках одной транзакции (многие это заметили).

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

В таком случае:
- Мы берем блокировку ACCESS EXCLUSIVE для добавления CONSTRAINT
- Далее эта блокировка будет удерживаться до конца работы транзакции
- Валидация нагрузки происходит долго, что приводит к тому, что транзакция превращается в долгоживующую => таблица заблокирована надолго.

Практический вывод: Делайте ADD CONSTRAINT ... NOT VALID и фиксируйте сразу (быстрый COMMIT). А VALIDATE CONSTRAINT запускайте отдельной миграции и, желательно, в спокойный период.

А чтобы не переживать насчет ваших миграций, вы можете настроить линтер: squawkhq
🔥12114👍3🙏1
Cloudflare нашли редчайший баг — прямо в компиляторе Go для ARM64

Да, это не опечатка: не рантайм, не гасе condition в их коде, а чистый косяк в сгенерированном машинном коде Go. И баг был настолько редким, что проявиться он мог только в инфраструктуре масштаба Cloudflare при 84 миллионах НТТР-запросов в секунду.

Не завидую парням, сам пол недели фикшу баги в драйвере на go…
🤔52
This media is not supported in your browser
VIEW IN TELEGRAM
Признавайтесь, у кого так было?)
😁6🔥5💯3🤣3
⚠️ Когда API молчит - страдает клиент

Представьте, у вас есть метод:
rpc GetUsers(GetUsersRequest) returns (GetUsersResponse);

message GetUsersRequest {
repeated string ids = 1;
optional string city = 2;
int32 page = 3;
int32 page_size = 4;
}


Вы вызываете GetUsers с 200 идентификаторами, ожидаете получить всех.
А сервер молча возвращает 100.
Без ошибки и без всякого предупреждения.

Почему? Да потому что в коде спрятан жёсткий limit = 100, о котором никто не знал.

Такие вещи ломают доверие к API.
Когда контракт неявный, клиенту остаётся только гадать: это баг, фильтр, лимит, пагинация или оптимизация?

А ещё хуже, когда такое поведение всплывает на production, и выясняется, что система теряла данные неделями (классика жанра).

💡 Хорошее API — прозрачное API.

— если есть лимиты, они должны быть явно задокументированы или возвращаться в ответе;
Часто вижу, что разработчики в gRPC не оставляют никаких комментариев в .proto - поверьте, просто спецификации НЕДОСТАТОЧНО. Клиент должен понимать не только что вызвать, но и чего ожидать.

— если что-то отфильтровано, клиент должен понимать, почему;
даже простая метка filtered=true , partial=true или список missing_ids уже делает API дружелюбнее.

— если есть пагинация, требуйте её явно от всех потребителей;
не стоит выдавать неполный ответ и надеяться, что клиент догадается, сколько можно запросить за раз.

Хорошо спроектированное и описанное API спасает от множетсво багов и недопониманий в будущем. Проводите ревью API тщательно, господа.

P.S. На мой взгляд хорошее gRPC API описано примерно так:
// Pagination - пагинация
message Pagination {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
noscript: "Pagination"
denoscription: "Пагинация"
}
};

// page_number - номер страницы. По умолчанию 1
uint64 page_number = 1 [
json_name = "page_number",
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {default: "1"}
];

// page_size - размер страницы. По умолчанию 50
uint64 page_size = 2 [
json_name = "page_size",
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {default: "50"}
];
}

// PageInfo - информация о странице
message PageInfo {
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = {
json_schema: {
noscript: "PageInfo"
denoscription: "Информация о странице"
}
};

// total_count - общее кол-во записей
uint64 total_count = 1 [json_name = "total_count"];

// count - кол-во полученных записей на текущей странице
uint64 count = 2 [json_name = "count"];

// page_number - текущий номер страницы
uint64 page_number = 3 [json_name = "page_number"];

// page_total - общее кол-во страниц
uint64 page_total = 4 [json_name = "page_total"];

// page_size - размер страницы
uint64 page_size = 5 [json_name = "page_size"];
}

А вы как считаете?
👍13💯3🔥2🗿2👏1
Go 2025: главное из исследования DevCrowd

1. Почти половина Go-разработчиков уже используют AI в работе.

В этом плане я отстаю от большинства: я все еще не настроил в IDE нормального AI ассистента...

2. Многие совмещают Go с Python, но не собираются уходить с Go.

Сам грешу python-ом частенько)
На мой взгляд после разработки на Go у человека меняется подход к написанию кода на python: код становится чище и понятнее. Никто не замечал за собой?

3. Большинство сообщества — мидлы и сеньоры, джунов почти нет.

Зрелое комьюнити, это радует🥲

🔗 Исследование Go-разработчиков 2025 от DevCrowd
Please open Telegram to view this post
VIEW IN TELEGRAM
42