Открыт к предложениям · Москва

Тот, кого зовут,
когда задача застряла

20 лет в JS/TypeScript-экосистеме. Не стаж — насмотренность: видел, как хорошие решения становятся плохими при росте. Работаю там, где инженеру дают ownership, а не кусок тикета.

Москва, Россия miniwe@mail.ru @miniwe github.com/miniwe

Настоящие кейсы,
не список технологий

Деньги не должны теряться

В пул-расчётах на N победителей обнаружился классический враг — number в JavaScript: бесконечная дробь, накопленная погрешность, потеря доверия пользователей. Не критичный баг, хуже — систематическая ненадёжность.

Выход не в аккуратности разработчиков, а в архитектуре: единая утилита на decimal.js как доменный примитив, decimal(12,4) на уровне БД, форматирование до двух знаков строго в UI. Атомарные транзакции: активация и списание либо оба, либо никакой. Финансовая точность стала свойством системы.

Node.js TypeScript NestJS PostgreSQL decimal.js TypeORM

HTTP-таймаут не должен рушить бизнес

Расчёт большого тура падал при превышении HTTP-таймаута. Состояние оставалось несогласованным. Операцию запускали вручную. Снова и снова.

Решение — вынос расчёта туда, где HTTP вообще не участвует. BullMQ + Redis: настраиваемый параллелизм, idempotent-дизайн, dead-letter queue ловит зависшие задачи. Массовые расчёты стали независимы от HTTP-инфраструктуры, наблюдаемы и восстанавливаемы.

Принцип: следующий инженер должен понять решение без звонка предыдущему.

BullMQ Redis NestJS TypeScript

Провайдер меняет схему в пятницу вечером

Спортивный провайдер изменил структуру ответа — упала половина обработчиков. Дежурство в выходные, ручные правки, объяснения на память.

Ответ — не быстрее реагировать, а сделать так, чтобы ситуация не возникала. Слой Raw Response → Adapter → Normalized DTO → Domain: исходные ответы логируются, ручной ввод — полноценный fallback с теми же контрактами. Теперь изменения провайдера изолированы в адаптере.

TypeScript NestJS Zod PostgreSQL Structured Logging

Чужие данные не должны утекать

Проектировал системы с изоляцией на уровне запросов: JWT + RBAC (USER / ADMIN / DEVELOPER), автоконвертация внешних идентификаторов во внутренние, tenant-aware middleware.

Архитектура, при которой случайный findAll() без фильтра tenant не становится инцидентом безопасности. Защита встроена в слой — не в дисциплину конкретного разработчика.

JWT RBAC OAuth2/OIDC NestJS Middleware TypeORM

Стек под задачу,
не цель сам по себе

Если ваш стек отличается — принципы переносятся: модульность, контракты между слоями, атомарность и наблюдаемость работают в любом фреймворке.

API и бизнес-логика
Node.js · TypeScript · NestJS (Fastify)
Данные и транзакции
PostgreSQL · TypeORM
Async и очереди
BullMQ · Redis
Контракты и валидация
Zod → DTO → Entity
Аутентификация
JWT · RBAC · OAuth2/OIDC
Фронтенд
React · RTK Query · Feature-Sliced Design
Инфраструктура
Docker · Docker Compose
AI-интеграции
OpenAI API · LLM-пайплайны (Node.js / Python)

Senior — не «пишет
правильный код»

Senior принимает решения при неполной информации и документирует trade-off явно, чтобы следующий человек понял, почему было сделано именно так.

Ownership от спецификации до production. Не «написать по задаче», а помочь выбрать, что строить и где нельзя накапливать долг.

Технические спецификации как основа кода и AI-инструментов. Хороший промпт = хороший brief: контекст, результат, запреты, способ проверки.

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

Code review как диалог. Замечания объясняю с обоснованием trade-off, не «перепиши».

Что ищу и что
не моё

Что не моё
  • Формальная бюрократия без результата
  • Роли, где «старший» означает только стаж без влияния на решения
Что ищу
  • Реальный ownership над задачами — не кусок тикета
  • Команду, где качество решений важнее скорости их производства
  • Среду, где через год я буду уметь больше, чем сейчас

Академический
фундамент

2000
Baku State University
Прикладная математика · Программист