Инженерия · Продукты · Заметки

Разбираю системы и рассказываю, как создаю продукты.

Ruby всё ещё в продакшене. Но кто будет писать на нём через 10 лет?

Rails получает релизы, большие системы работают, но вход в профессию сузился: рынку нужны middle и senior, а мест, где ими становятся, заметно меньше. Почему ставка на агентов этот разрыв не закрывает.

DHH перестал писать код руками. Как мнение одного инженера влияет на целую индустрию

DHH за год прошёл от страха потерять навык из-за AI до отказа писать код руками. Почему разворот одного инженера меняет то, какие инструменты другие считают допустимыми, и где заканчивается применимость его опыта.

PostgreSQL: три источника времени в одной таблице

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

River: периодические задачи без cron

Почему самодельный планировщик джоб это костыль и как заменить его периодическими задачами River: расписание у лидера, диспетчер вместо жирной задачи и защита от повторной постановки.

Закон Гудхарта

Когда метрика становится целью, люди начинают улучшать метрику, а не то, ради чего её придумали.

Границы модулей в Go: интеграционные тесты с PostgreSQL

Интеграционные тесты Go-модуля: изоляция схемой на тест, проверка репозитория на настоящей базе, откат транзакции, участие в чужой транзакции и сквозной тест сценария.

Границы модулей в Go: тесты use case, адаптеров и клиента

Как тестировать модульный монолит на Go: стабы для локальных интерфейсов, табличный unit-тест оркестрации, проверка перевода типов и ошибок в адаптере и тест HTTP-клиента на httptest.

ElasticAPM: три бага одной интеграции

Три неочевидных нюанса в связке Gin, GORM и pgx, из-за которых интеграция с Elastic APM работала лишь частично: GORM незаметно игнорировал настройку simple protocol, SQL-спаны не доходили до Kibana, а передача gin.Context вместо request context заодно ломала отмену запросов и таймауты.

Закон Паркинсона

Работа заполняет всё время, которое на неё выделили.

Эффект Рингельмана

Чем больше группа, тем меньше в среднем вклад каждого отдельного человека.

Границы модулей в Go: транзакции и контроль импортов

Как проверить границы Go-модулей на практике: преобразовать модели хранения и DTO, вынести внешний вызов из SQL-транзакции и запретить нежелательные импорты.

Границы модулей в Go: use case, порты и адаптеры

Как описать зависимости use case в Go локальными интерфейсами, перевести типы и ошибки в адаптерах и связать реализации в Composition Root.

Sentinel-ошибки в Go: сохраняем смысл между слоями

Почему общий ErrNotFound смешивает разные причины ошибки, где объявлять sentinel-ошибки и как переводить ошибки GORM или database/sql на границе репозитория.

Проекты в Onplate: почему агент ведёт себя иначе в соседней папке

Проект это папка, и то, что получит в ней агент, зависит от области установки, приоритета клиентов, файлов инструкций и каталога запуска. Как увидеть все четыре причины и сравнить два репозитория.

Onplate: инвентаризация пяти AI-клиентов

Что накапливается в Claude Code, Codex, Cursor, GLM и OpenCode за год и как это разобрать: откуда взялся каждый файл, что находит сканер, сколько он стоит на каждом запросе и срабатывает ли скилл вообще.

Astro для блога

Инженерный блог без CMS и базы: статья это файл в репозитории, локальная и production-сборки идут по одному коду, а в бою работает только nginx.

Сейчас строю

В разработке

onplate

Локальный аудит и управление AI-контекстом: настройки Claude Code, Codex, Cursor, GLM и OpenCode в одном приложении.

Go · Wails · TypeScript

Открыть проект