Блог

Все записи по порядку — от новых к старым.

Крупный план серверного оборудования

PostgreSQL: пять привычек, которые сэкономили мне ночи

25.06.2025

За годы работы с PostgreSQL у меня накопился короткий список привычек, которые кажутся мелочью, пока не спасут вас от инцидента в два часа ночи. Делюсь пятью, которые считаю обязательными для любого проекта, где база — не игрушка.

1. Индекс на внешний ключ — не автоматический

В отличие от некоторых других СУБД, PostgreSQL не создаёт индекс на колонку внешнего ключа автоматически. Если у вас таблица orders с user_id, ссылающимся на users, и вы не добавили индекс вручную — удаление пользователя с большим числом заказов может заблокировать таблицу на неприятно долгое время. Я завёл себе правило: индекс на FK добавляется в той же миграции, что и сам внешний ключ, без исключений.

Блокнот и печатная машинка на столе

Что я узнал, читая чужой код по вечерам

30.05.2025

Примерно год назад я взял за привычку раз в неделю по вечерам читать чужой код без всякой рабочей задачи — просто открывать случайный популярный open-source репозиторий и смотреть, как устроены решения, до которых сам бы не додумался. Привычка оказалась неожиданно полезной.

Почему не хватало кода с работы

На основной работе я, конечно, читаю чужой код постоянно — в рамках ревью пул-реквестов. Но это чтение всегда целевое: нужно проверить конкретное изменение, найти проблему, сравнить с существующим стилем. Это полезно, но узко — я вижу только дельту, а не архитектуру целиком.

Контейнеры в порту

Docker Compose вместо Kubernetes: когда простота выигрывает

22.04.2025

Когда я рассказываю коллегам, что в одном из рабочих проектов мы сознательно не стали переезжать на Kubernetes и остались на Docker Compose, реакция обычно одна и та же: удивлённо поднятые брови. Постараюсь объяснить логику этого решения.

Контейнерный порт с высоты птичьего полёта

Контекст проекта

Речь о внутреннем сервисе для одной команды из шести человек: один API, одна база данных, один воркер для фоновых задач и nginx перед всем этим. Нагрузка предсказуемая, пиков нет, серьёзного масштабирования не требуется — сервис используют около двухсот сотрудников компании в рабочее время.

Экран терминала с логами

Логи, которые не врут: заметки о структурированном логировании

18.03.2025

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

Как выглядела проблема

Классическая строка лога вида log.Printf("user %s created order %d", userID, orderID) прекрасно читается в консоли во время разработки. Но когда нужно найти все ошибки по конкретному пользователю за последний час среди миллионов строк в централизованном хранилище логов, текстовый поиск по подстроке — это очень медленный и ненадёжный способ.

Диаграмма архитектуры на доске

Почему я отказался от микросервисов в пет-проекте

20.02.2025

Полтора года назад я начал пет-проект — небольшой сервис для учёта личных расходов — и на радостях сразу нарисовал схему из семи микросервисов: авторизация, транзакции, категории, отчёты, уведомления, импорт банковских выписок и API-шлюз. Через месяц я всё это снёс и написал заново в виде одного монолитного приложения. Хочу объяснить, почему.

Соблазн красивой архитектуры

На работе я много имею дело с распределёнными системами, и мне казалось естественным переносить этот опыт на личный проект. Микросервисы выглядят солидно на диаграмме, каждый сервис — отдельная ответственность, всё по книжке. Проблема в том, что книжка писалась для команд из десятков человек и систем с реальной нагрузкой, а не для одного разработчика, который открывает ноутбук по вечерам два раза в неделю.