<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Главная on Ночной билд</title><link>https://nrt.inrocket.org/</link><description>Recent content in Главная on Ночной билд</description><generator>Hugo</generator><language>ru</language><copyright>Ночной билд</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://nrt.inrocket.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Рефакторинг легаси: как не сломать то, что работает</title><link>https://nrt.inrocket.org/posts/legacy-refactoring/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/legacy-refactoring/</guid><description>&lt;p&gt;В прошлом году мне досталась задача, которую многие разработчики боятся больше, чем
писать код с нуля: привести в порядок модуль оплаты, которому было пять лет, без тестов и
с единственным человеком в компании, который хоть немного помнил, как он устроен — и этот
человек уже уволился. Вот к каким выводам я пришёл по итогам этой работы.&lt;/p&gt;
&lt;h2 id="первое-правило-сначала-понять-потом-менять"&gt;Первое правило: сначала понять, потом менять&lt;/h2&gt;
&lt;p&gt;Соблазн сразу начать переписывать код, который выглядит плохо, очень велик. Но за
уродливым на первый взгляд кодом почти всегда стоит история — часто это накопленные
исправления реальных багов и обработка граничных случаев, которые не видны из чтения кода
поверхностно. Прежде чем менять что-то, я потратил неделю просто на чтение: git blame по
ключевым файлам, старые тикеты, связанные с этим кодом, комментарии в коммитах.&lt;/p&gt;</description></item><item><title>Кеш — это не магия: разбираемся на пальцах</title><link>https://nrt.inrocket.org/posts/caching-basics/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/caching-basics/</guid><description>&lt;p&gt;«Просто добавьте кеш» — одна из самых частых рекомендаций, которую дают, когда сервис
начинает тормозить. Проблема в том, что кеш — это не переключатель «быстро/медленно», а
отдельная область со своими собственными способами всё сломать. Разберём по порядку.&lt;/p&gt;
&lt;h2 id="зачем-вообще-нужен-кеш"&gt;Зачем вообще нужен кеш&lt;/h2&gt;
&lt;p&gt;Кеш имеет смысл, когда вычисление или получение данных дороже, чем их повторное
использование. Классический пример — результат тяжёлого запроса к базе, который не
меняется каждую секунду: список категорий товаров, агрегированная статистика за день,
результат вызова внешнего API с лимитом запросов.&lt;/p&gt;</description></item><item><title>Почему я вообще завёл этот блог</title><link>https://nrt.inrocket.org/posts/why-this-blog/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/why-this-blog/</guid><description>&lt;p&gt;Меня иногда спрашивают, зачем разработчику, который и так весь день пишет тексты — код,
документацию, комментарии к пул-реквестам, — заводить ещё и блог. Отвечаю честно: изначально
это была попытка навести порядок в собственной голове.&lt;/p&gt;
&lt;h2 id="записки-для-себя-из-прошлого"&gt;Записки для себя из прошлого&lt;/h2&gt;
&lt;p&gt;Первые несколько статей я писал вообще без мысли о читателях — просто фиксировал решение
конкретной проблемы, чтобы через полгода не разбираться с ней заново с нуля. Оказалось,
что процесс написания объяснения «для будущего себя» заставляет разобраться в теме
гораздо глубже, чем если бы я просто решил проблему и забыл о ней.&lt;/p&gt;</description></item><item><title>Мониторинг без драмы: Prometheus и Grafana для одного разработчика</title><link>https://nrt.inrocket.org/posts/monitoring-without-drama/</link><pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/monitoring-without-drama/</guid><description>&lt;p&gt;Когда я в одиночку поддерживаю пет-проект или небольшой внутренний сервис, соблазн
пропустить мониторинг велик — кажется, что можно просто посмотреть логи, если что-то
сломается. На практике так и происходит: что-то ломается, а узнаёшь об этом от
пользователя, а не от системы. После пары таких случаев я всегда настраиваю минимальный
мониторинг ещё до того, как сервис уходит в прод.&lt;/p&gt;
&lt;h2 id="минимальный-набор-который-реально-нужен"&gt;Минимальный набор, который реально нужен&lt;/h2&gt;
&lt;p&gt;Мне не нужен полноценный observability-стек с распределённой трассировкой для проекта на
одного человека. Нужны три вещи: метрики (Prometheus), визуализация (Grafana) и алерты в
удобный канал — у меня это Telegram-бот.&lt;/p&gt;</description></item><item><title>Собеседования глазами того, кто теперь их проводит</title><link>https://nrt.inrocket.org/posts/interviews/</link><pubDate>Mon, 04 Aug 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/interviews/</guid><description>&lt;p&gt;Последние два года я по очереди сижу по обе стороны стола: иногда прохожу собеседования
сам, иногда провожу их для нашей команды. Взгляд с обеих сторон сильно изменил моё
отношение к процессу.&lt;/p&gt;
&lt;h2 id="что-я-понял-оказавшись-интервьюером"&gt;Что я понял, оказавшись интервьюером&lt;/h2&gt;
&lt;p&gt;Самое неожиданное открытие — насколько сильно на решение влияет не то, что кандидат знает,
а то, как он рассуждает вслух, когда чего-то не знает. Кандидат, который честно говорит «я
не уверен, но предположу вот так, и вот как бы я это проверил», почти всегда производит
лучшее впечатление, чем тот, кто уверенно называет неверный ответ.&lt;/p&gt;</description></item><item><title>PostgreSQL: пять привычек, которые сэкономили мне ночи</title><link>https://nrt.inrocket.org/posts/postgres-habits/</link><pubDate>Wed, 25 Jun 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/postgres-habits/</guid><description>&lt;p&gt;За годы работы с PostgreSQL у меня накопился короткий список привычек, которые кажутся
мелочью, пока не спасут вас от инцидента в два часа ночи. Делюсь пятью, которые считаю
обязательными для любого проекта, где база — не игрушка.&lt;/p&gt;
&lt;h2 id="1-индекс-на-внешний-ключ--не-автоматический"&gt;1. Индекс на внешний ключ — не автоматический&lt;/h2&gt;
&lt;p&gt;В отличие от некоторых других СУБД, PostgreSQL не создаёт индекс на колонку внешнего ключа
автоматически. Если у вас таблица &lt;code&gt;orders&lt;/code&gt; с &lt;code&gt;user_id&lt;/code&gt;, ссылающимся на &lt;code&gt;users&lt;/code&gt;, и вы не
добавили индекс вручную — удаление пользователя с большим числом заказов может
заблокировать таблицу на неприятно долгое время. Я завёл себе правило: индекс на FK
добавляется в той же миграции, что и сам внешний ключ, без исключений.&lt;/p&gt;</description></item><item><title>Что я узнал, читая чужой код по вечерам</title><link>https://nrt.inrocket.org/posts/reading-others-code/</link><pubDate>Fri, 30 May 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/reading-others-code/</guid><description>&lt;p&gt;Примерно год назад я взял за привычку раз в неделю по вечерам читать чужой код без всякой
рабочей задачи — просто открывать случайный популярный open-source репозиторий и смотреть,
как устроены решения, до которых сам бы не додумался. Привычка оказалась неожиданно полезной.&lt;/p&gt;
&lt;h2 id="почему-не-хватало-кода-с-работы"&gt;Почему не хватало кода с работы&lt;/h2&gt;
&lt;p&gt;На основной работе я, конечно, читаю чужой код постоянно — в рамках ревью пул-реквестов. Но
это чтение всегда целевое: нужно проверить конкретное изменение, найти проблему, сравнить с
существующим стилем. Это полезно, но узко — я вижу только дельту, а не архитектуру целиком.&lt;/p&gt;</description></item><item><title>Docker Compose вместо Kubernetes: когда простота выигрывает</title><link>https://nrt.inrocket.org/posts/compose-vs-kubernetes/</link><pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/compose-vs-kubernetes/</guid><description>&lt;p&gt;Когда я рассказываю коллегам, что в одном из рабочих проектов мы сознательно не стали
переезжать на Kubernetes и остались на Docker Compose, реакция обычно одна и та же:
удивлённо поднятые брови. Постараюсь объяснить логику этого решения.&lt;/p&gt;
&lt;img src="/img/containers-port-aerial.webp" alt="Контейнерный порт с высоты птичьего полёта" width="800" height="533" loading="lazy"&gt;
&lt;h2 id="контекст-проекта"&gt;Контекст проекта&lt;/h2&gt;
&lt;p&gt;Речь о внутреннем сервисе для одной команды из шести человек: один API, одна база данных,
один воркер для фоновых задач и nginx перед всем этим. Нагрузка предсказуемая, пиков нет,
серьёзного масштабирования не требуется — сервис используют около двухсот сотрудников
компании в рабочее время.&lt;/p&gt;</description></item><item><title>Логи, которые не врут: заметки о структурированном логировании</title><link>https://nrt.inrocket.org/posts/structured-logging/</link><pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/structured-logging/</guid><description>&lt;p&gt;Есть два типа логов: те, что пишутся для человека, который читает их глазами прямо сейчас,
и те, что пишутся для системы, которая будет их искать, фильтровать и агрегировать. Долгое
время я писал логи первого типа, и это работало ровно до тех пор, пока сервисов стало
больше одного.&lt;/p&gt;
&lt;h2 id="как-выглядела-проблема"&gt;Как выглядела проблема&lt;/h2&gt;
&lt;p&gt;Классическая строка лога вида &lt;code&gt;log.Printf(&amp;quot;user %s created order %d&amp;quot;, userID, orderID)&lt;/code&gt;
прекрасно читается в консоли во время разработки. Но когда нужно найти все ошибки по
конкретному пользователю за последний час среди миллионов строк в централизованном
хранилище логов, текстовый поиск по подстроке — это очень медленный и ненадёжный способ.&lt;/p&gt;</description></item><item><title>Почему я отказался от микросервисов в пет-проекте</title><link>https://nrt.inrocket.org/posts/microservices-pet-project/</link><pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/microservices-pet-project/</guid><description>&lt;p&gt;Полтора года назад я начал пет-проект — небольшой сервис для учёта личных расходов — и на
радостях сразу нарисовал схему из семи микросервисов: авторизация, транзакции,
категории, отчёты, уведомления, импорт банковских выписок и API-шлюз. Через месяц я всё
это снёс и написал заново в виде одного монолитного приложения. Хочу объяснить, почему.&lt;/p&gt;
&lt;h2 id="соблазн-красивой-архитектуры"&gt;Соблазн красивой архитектуры&lt;/h2&gt;
&lt;p&gt;На работе я много имею дело с распределёнными системами, и мне казалось естественным
переносить этот опыт на личный проект. Микросервисы выглядят солидно на диаграмме, каждый
сервис — отдельная ответственность, всё по книжке. Проблема в том, что книжка писалась для
команд из десятков человек и систем с реальной нагрузкой, а не для одного разработчика,
который открывает ноутбук по вечерам два раза в неделю.&lt;/p&gt;</description></item><item><title>Мой домашний сервер: три года экспериментов</title><link>https://nrt.inrocket.org/posts/home-lab/</link><pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/home-lab/</guid><description>&lt;p&gt;Три года назад я купил старый системный блок на «Авито» за смешные деньги — просто чтобы
не бояться экспериментировать с тем, что можно случайно сломать на работе. С тех пор
домашняя лаба превратилась в отдельное маленькое хобби, которое, как ни странно, регулярно
приносит пользу и на основной работе.&lt;/p&gt;
&lt;h2 id="с-чего-началось"&gt;С чего началось&lt;/h2&gt;
&lt;p&gt;Первая версия была наивной: один Raspberry Pi, на котором крутился Pi-hole для блокировки
рекламы на весь дом. Через месяц я добавил второй Pi под домашний DNS-резолвер, а ещё
через два — списанный ноутбук, на котором поднял Docker и начал пробовать всё, что было
интересно, но страшно тащить в рабочий контур: новые версии баз данных, необычные
конфигурации reverse-proxy, экспериментальные инструменты мониторинга.&lt;/p&gt;</description></item><item><title>Как я перестал бояться очередей сообщений</title><link>https://nrt.inrocket.org/posts/message-queues/</link><pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/posts/message-queues/</guid><description>&lt;p&gt;Три года назад я относился к очередям сообщений с суеверным страхом. Казалось, что стоит
только добавить в систему брокер — и вместо одной проблемы получаешь три: недоставленные
сообщения, дублирование и загадочные зависания консьюмеров по пятницам вечером. Сейчас я
понимаю, что боялся не самих очередей, а того, что не читал документацию дальше раздела
«быстрый старт».&lt;/p&gt;
&lt;h2 id="с-чего-всё-началось"&gt;С чего всё началось&lt;/h2&gt;
&lt;p&gt;Первый проект с очередью я унаследовал от коллеги, который уволился за неделю до релиза.
RabbitMQ был настроен так, что при падении одного консьюмера сообщения копились в памяти
брокера, пока диск не заканчивался. Это работало, пока нагрузка была маленькой, и
превратилось в еженедельный ритуал перезапуска, когда нагрузка выросла.&lt;/p&gt;</description></item><item><title>Выступления</title><link>https://nrt.inrocket.org/talks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/talks/</guid><description>&lt;p&gt;Пару раз в год выступаю на локальных митапах — обычно с разбором конкретного инцидента
или инструмента, а не с общими рассуждениями «как правильно».&lt;/p&gt;
&lt;h2 id="почему-очередь-не-резиновая-локальный-бэкенд-митап-2025"&gt;«Почему очередь не резиновая», локальный бэкенд-митап, 2025&lt;/h2&gt;
&lt;p&gt;Рассказ о том, как мы упёрлись в лимиты брокера сообщений во время распродажи и что
пришлось поменять в архитектуре, чтобы это не повторилось. Без слайдов с логотипами — только
графики нагрузки и код.&lt;/p&gt;
&lt;h2 id="логи-для-человека-а-не-для-машины-devops-встреча-2025"&gt;«Логи для человека, а не для машины», DevOps-встреча, 2025&lt;/h2&gt;
&lt;p&gt;Короткий доклад про структурированное логирование: как сделать так, чтобы дежурный в три
часа ночи находил причину инцидента за минуту, а не за час.&lt;/p&gt;</description></item><item><title>Контакты</title><link>https://nrt.inrocket.org/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/contact/</guid><description>&lt;p&gt;Проще всего написать по почте — отвечаю не мгновенно, но отвечаю всегда.&lt;/p&gt;
&lt;ul class="contact-list"&gt;
 &lt;li&gt;Почта: &lt;a href="mailto:dmitry@nochnoj-bild.cc"&gt;dmitry@nochnoj-bild.cc&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;Город: Нижний Новгород, Россия&lt;/li&gt;
 &lt;li&gt;Часовой пояс: UTC+3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если пишете по поводу статьи — укажите, о какой именно идёт речь, так быстрее найду
контекст.&lt;/p&gt;</description></item><item><title>Обо мне</title><link>https://nrt.inrocket.org/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/about/</guid><description>&lt;p&gt;Меня зовут Дмитрий Ласточкин, я пишу бэкенд уже больше десяти лет: начинал с PHP-скриптов
для интернет-магазинов, потом перешёл на Java, а последние годы почти всё время провожу в
Go и Python — в зависимости от того, что просит проект.&lt;/p&gt;
&lt;p&gt;Сейчас работаю в небольшой продуктовой команде, где отвечаю за сервисы, которые обычно не
видно снаружи: очереди, интеграции, фоновые задачи. Мне нравится, когда система работает
тихо и без сюрпризов — это и есть, на мой взгляд, признак хорошей инженерии.&lt;/p&gt;</description></item><item><title>Проекты</title><link>https://nrt.inrocket.org/projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nrt.inrocket.org/projects/</guid><description>&lt;p&gt;Небольшой список того, что делаю в свободное время — без стартаперского пафоса, просто
чтобы руки не забывали, как выглядит код без дедлайна.&lt;/p&gt;
&lt;h2 id="ночной-сторож"&gt;Ночной сторож&lt;/h2&gt;
&lt;p&gt;Маленький демон на Go, который раз в минуту проверяет доступность моих домашних сервисов
и шлёт уведомление в мессенджер, если что-то легло. Написан за один вечер, живёт на
Raspberry Pi уже третий год и ни разу не подвёл.&lt;/p&gt;
&lt;h2 id="заметки--rss"&gt;Заметки → RSS&lt;/h2&gt;
&lt;p&gt;Скрипт на Python, который превращает папку с markdown-заметками в RSS-ленту. Использую
его сам, чтобы читать собственные черновики в том же ридере, что и остальные блоги.&lt;/p&gt;</description></item></channel></rss>