es
Feedback
Бодрый кодер

Бодрый кодер

Ir al canal en Telegram

Меня зовут Лев, я руководитель направления в ПСБ. Это мой личный блог о DevOps, разработке, системном анализе, AI и управлении IT-командами. Делюсь своими мыслями, инсайтами, полезными инструментами и тем, что меня вдохновляет. Автор: @nemirlev

Mostrar más
506
Suscriptores
Sin datos24 horas
+17 días
+730 días
Archivo de publicaciones
Лекс Фридман записал большой подкаст с Павлом Дуровым. За четыре часа беседы основатель Telegram поделился подробностями о работе компании и собственными взглядами на разработку. Очень много про процессы разработки, но теперь надо как-то найти время послушать - даже на x2 это 4 часа :(

Всех с предстоящими выходными, а меня с предстоящими рабочими. Еду в Красноярск на неделю, в командировку. #пятничныйюмор
Всех с предстоящими выходными, а меня с предстоящими рабочими. Еду в Красноярск на неделю, в командировку. #пятничныйюмор

Понедельник начинается с хороших новостей - мой доклад про GitOps для аналитиков взяли на Analyst Days. В этом осенне-зимнем сезоне будет всего одно выступление, ну может два. #anystdays #доклады #выступление

Вместо #пятничныйюмор . Так выглядит 42 года прогресса. Мне правда еще не разу не удавалось держать стол таким девственно чис
Вместо #пятничныйюмор . Так выглядит 42 года прогресса. Мне правда еще не разу не удавалось держать стол таким девственно чистым.

Мой подписчик написал комментарий, который тянет на пост:
если бизнес логика у тебя полагается на монотонное возрастание uuidv7 (например дедубликация), а у тебя отсортировано не в том порядке — не самое приятное событие... uuidv7 "ориентированный по времени" а не "транзакционно ориентированный" тоесть у тебя может быть кейс когда транзакция с более поздним uuid закомитится раньше чем транзакция с более ранним uuid. а раз раньше закомитилась — раньше вернула поток управления коду. и связанные записи (например релейшены) получают другой ордер (если это важно). + точность ордера ограничена 1 миллисекундой. если прилетело 5 запросов в одну миллисекунду — нет способа зарезолвить порядок. это кстати касается и бэкенда если что... но (!) при смене мастера — если часы рассинхронизированы больше чем на 1 миллисекунду возможны уже скачки во времени. если у тебя реплики в разных датацентрах - скорее всего рассинхрон порядка 10-100мс, и значит точно будет прыгать. что собственно не защищает и бэк, находящийся на разных инстансах за балансиром... это не то что бы минусы uuid7, просто ограничение модели, но о них важно помнить, если не хочется гулять по граблям)

Вчера ездил на экскурсию в ЦОД Яндекс, во Владимир. Получилось классно. Инженерные решения конечно потрясающее. Особенно собс
+2
Вчера ездил на экскурсию в ЦОД Яндекс, во Владимир. Получилось классно. Инженерные решения конечно потрясающее. Особенно собственные стойки и решения по юнитам. Ну и конечно посмотрели сердце одного из суперкомпьютеров, на котором в том числе обучают Алису.

https://habr.com/ru/news/947188/ Тяжело будет сделать ревью после 7 часов такого кодинга.

Я тут хвалил новые веб приложения в телеге, тут вообще удивился. Открыл себе карту, для оплат, дополнительную. За 2 минуты. Б
Я тут хвалил новые веб приложения в телеге, тут вообще удивился. Открыл себе карту, для оплат, дополнительную. За 2 минуты. Банкинг - это конечно было для меня не обычно и удобно. P.S. Не реклама сервиса, только начал пользоваться , если понравился и проблем не будет - порекомендую.

PostgreSQL 18 уже почти на подходе, и одна из самых приятных новинок для разработчиков — нативная поддержка UUIDv7. Если раньше gen_random_uuid() выдавал только UUIDv4 (UUIDv4 генерируются случайно, поэтому новые записи вставляются в разные места B-tree индекса. Это вызывает фрагментацию, рост размера индекса и замедление операций), то теперь у нас появляется функция uuidv7(). Она генерирует идентификаторы, упорядоченные по времени, что решает старую боль с раздутием B-tree индексов (новые ключи ложатся в «хвост» индекса, как автоинкремент, и поэтому работают быстрее).

CREATE TABLE test (
    id uuid DEFAULT uuidv7() PRIMARY KEY,
    name text
);

INSERT INTO test (name) VALUES ('foo'), ('bar');
SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;
Теперь IDшники не только уникальны, но и красиво сортируются по времени создания 👌 Для распределённых систем и масштабных БД — прямо must-have. #postgresql #uuid #uuidv7 #базыданных

Всех причастных с профессиональным праздником, днём программиста! Спустя неделю, пишу другу, говорю «Зацени какая фича есть», это я так с оф.доки вылез, изучая что еще упустил. А он мне скидывает наш диалог, где как раз об этом рассказал, после чего я сделал пост. И тут я понял, что рабочая неделя была напряжённой.

Всех с выходными! #пятничныйюмор
Всех с выходными! #пятничныйюмор

Нашел прям лучший подход по видению ToDo.
# TODO(DEV-12346): Надо поправить конфиг
То есть не просто пишешь, а потом в IDE контролируешь, а сразу завешиваешь задачу. Прям гениально и просто. P. S. Понятно что все равно не гарантия исправления.

В продолжении поста про PostgreSQL, поделюсь про Redis. Чаще всего используют только строку, но он гораздо многообразнее. 🧱 String — Ключ-значение, базовый кирпич. Кэш, флаги, счётчики, токены. — Пример: SET key val, GET key, INCR views, SETNX, EXPIRE key 60 — Паттерны: rate-limit (`INCR + EXPIRE`), простые распределённые блокировки (`SET lock val NX PX 10000`) 🧩 Hash — «Объект» с полями: компактно хранит мелкие атрибуты. — Пример: HSET user:42 name Lev email lev@..., HGETALL user:42 — Когда: профили пользователей, настройки. Плюс — частичные обновления полей. — Нюанс: нет TTL на отдельные поля, ставится на весь ключ. 📚 List — Упорядоченная коллекция. Очереди (FIFO/LIFO), буферы, журналы. — Пример: LPUSH queue job1, BRPOP queue 0 — Когда: простые очереди, ретраи. Не забывайте LTRIM для ограничения длины. 🏷 Set — Множества без дубликатов. Теги, интересы, подписки. — Пример: SADD tags:post:1 go devops, SINTER user:42:tags post:1:tags — Когда: рекомендации по пересечению множеств, дедупликация. 🏆 Sorted Set (ZSet) — Множество с весом (score). Рейтинги, приоритизация, «календарь по времени». — Пример: ZADD leaderboard 1500 user42, ZRANGE leaderboard 0 9 WITHSCORES — Когда: топ-N, очереди с приоритетом, time-index (`score = timestamp`). — Хитрость: чистка старых данных — ZREMRANGEBYSCORE. 🧮 Bitmap — Битовые флаги по смещению. Ультра-дешёвая памятью аналитика по дням. — Примеры SETBIT active:2025-09-10 42 1, BITCOUNT active:* — Когда: «приходил ли пользователь в день D», воронки по дням, календари активности. 📏 Bitfield — Упакованные счётчики/флаги в одном ключе. — Пример: BITFIELD key INCRBY u8 10 1 — Когда: компактные счётчики для ограниченного диапазона (экономия памяти). 🔢 HyperLogLog — Приблизительное количество уникальных (distinct). — Пример: PFADD u:visits user42, PFCOUNT u:visits — Когда: уникальные посетители/поисковые запросы, где допустима погрешность. 📍 GEO (геоиндексы) — Геопоиск по радиусу/полигону. — Пример: GEOADD places 13.405 52.52 berlin, GEOSEARCH places FROMLONLAT 13.4 52.5 BYRADIUS 5 km — Когда: «что рядом», ближайшие точки интереса. 📨 Streams — Лог событий с потребительскими группами (Kafka-лайт). — Пример: XADD events * type=signup user=42, XREADGROUP GROUP g c COUNT 10 STREAMS events > — Когда: event sourcing, обработка событий с подтверждениями. 📣 Pub/Sub — Эфемерные сообщения «здесь и сейчас». — Пример: PUBLISH chan msg, SUBSCRIBE chan — Когда: оповещения в реальном времени, без хранения истории (не путать со Streams). 🧾 RedisJSON (Redis 8+) — Хранение JSON как дерево, выборка/патчи по путям. — Пример: JSON.SET user:42 $ '{"name":"Lev","age":33}', JSON.NUMINCRBY user:42 $.age 1 — Когда: нужны частичные обновления и индексирование полей (с RediSearch). — Альтернатива: String с сериализацией — просто, но без частичных апдейтов. ⏳ TTL и протухание — EXPIRE key 600 работает на ключ целиком. Для коллекций — либо TTL на контейнер, либо периодические джобы очистки (например, по score/time в ZSet). 🧠 Итог — В Redis выбор структуры = половина решения. Строка с JSON — ок для простого кэша, но для очередей, рейтингов, счётчиков и аналитики есть куда более точные инструменты. #Redis #БД #Кэширование #Backend #Шпаргалка #DataEngineering

Начался учебный год — у меня ещё нет пар, но в преддверии занятий делюсь полезной заметкой по БД. Часто вижу, как «на всякий случай» выбирают типы побольше — в итоге едим место, замедляем индексы и ловим баги. ❌ Антипаттерны, которые встречаю: - VARCHAR(255) «для всего подряд», даже если код фиксированной длины (например, 10 символов). - TEXT для email-адресов. - BIGINT для счётчика, где максимум — тысяча записей. - FLOAT для денег (теряется точность). ✅ Как делаю сам: - Строки — по задаче: VARCHAR(254)`/`VARCHAR(320) для email (под стандарты), CHAR(2) для кода страны. - Деньги — только NUMERIC(10,2) / DECIMAL(10,2) или целые «копейки/центы» в INT`/`BIGINT. - Булево — BOOLEAN, а не INT. - Даты/время — DATE / TIMESTAMP, не строка. - Автонумерация — INT по умолчанию; BIGINT — только если реально ждёте > 2 млрд строк. 📌 Пример -- Плохо price FLOAT; -- Хорошо price NUMERIC(10,2); ⚡️ Итог: грамотный выбор типов = меньше места, быстрее запросы, меньше багов. #БД #SQL #PostgreSQL #Оптимизация #Backend #DataEngineering

Самое смешное
Акции Apple начали падать после презентации новых гаджетов
Как правило растут, видимо ждали AI, но его не будет еще год.

Вышли новые iPhone, Watch и AirPods, как всегда лучше, больше, тише, круче и прочее эпитеты.
Вышли новые iPhone, Watch и AirPods, как всегда лучше, больше, тише, круче и прочее эпитеты.

Который раз убеждаюсь — профессия разработчика не даёт заскучать. Каждый день узнаёшь что-то новое. Недавно со мной поделились интересной находкой: оказывается, в Nginx Ingress есть встроенная поддержка телеметрии. Можно буквально «из коробки» настроить отправку трейсов в OTLP, например, в Jaeger. Я-то всегда был уверен, что в бесплатном Nginx такой возможности нет, и даже мысли не возникало искать её в Ingress. А зря 🙂 И самое приятное: даже для «чистого» бесплатного Nginx тоже есть решение — nginx-otel. Судя по описанию, этот модуль работает аж в 4 раза эффективнее официального варианта из Nginx Plus. #nginx #otel #observability #devops #ingress

Всех с выходными. #пятничныйюмор
Всех с выходными. #пятничныйюмор

Рубисты могут сильно сэкономить. Среда разработки RubyMine от JetBrains стала бесплатной для некоммерческого использования В 2024 году JetBrains сделала бесплатными для некоммерческого использования WebStorm, Rider и RustRover. В начале 2025 года к списку добавили CLion, а сейчас — RubyMine. По бесплатной некоммерческой лицензии доступны все функции IDE, кроме Code With Me. Для доступа к ней надо оформлять подписку.