Software Engineer

Mikhail Shokolov

Complex websystems.

I help turn difficult product tasks into systems that are readable, maintainable and ready for release.

Разработчик веб-систем

Mikhail Shokolov

Разработкасложныхвеб-систем.

Я помогаю превращать сложные продуктовые задачи в понятные системы, которые можно поддерживать и выпускать.

Cases Кейсы

AboutОбо мне

I work best in the space between product needs and engineering reality: where a vague workflow has to become a dependable tool, an overloaded process needs automation, or several systems need to behave like one product.

For 13 years I have been building web applications, internal systems, integrations, and backend services. My day-to-day work often sits across React and TypeScript interfaces, Node.js services, cloud infrastructure, data stores, queues, legacy systems, and the conversations that make technical decisions useful for a team.

I do not define myself by one platform. Tools change. The durable part is the ability to understand a business process, find the real constraint, design a maintainable solution, and ship it without making the next person pay for unnecessary complexity.

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

13 лет я разрабатываю веб-приложения, внутренние системы, интеграции и backend-сервисы. В повседневной работе это часто пересечение React и TypeScript-интерфейсов, Node.js-сервисов, cloud-инфраструктуры, хранилищ данных, очередей, legacy-систем и обсуждений, которые превращают технические решения в пользу для команды.

Я не определяю себя одной платформой. Инструменты меняются. Главное - уметь понять бизнес-процесс, найти настоящее ограничение, спроектировать поддерживаемое решение и довести его до результата без лишней сложности для тех, кто будет работать с этим дальше.

SkillsНавыки

Architecture and Code QualityАрхитектура и качество кода

  • Clean code
  • API contracts
  • Module boundaries
  • Refactoring
  • Code review
  • Documentation

Backend and IntegrationsBackend и интеграции

  • Node.js
  • TypeScript services
  • NestJS
  • Fastify
  • REST APIs
  • GraphQL gateways
  • ERP integrations

Reliability and DataНадежность и данные

  • PostgreSQL
  • DynamoDB
  • Redis
  • Queues
  • Worker pools
  • Retries
  • Observability

Infrastructure and DeliveryИнфраструктура и delivery

  • AWS
  • Google Cloud
  • Docker
  • CI/CD
  • Infrastructure as Code
  • Rollbacks
  • Release automation

Product InterfacesПродуктовые интерфейсы

  • React
  • State-heavy UI
  • Dashboards
  • Forms
  • Internal tools
  • Accessibility basics

Engineering CollaborationИнженерное взаимодействие

  • Technical trade-offs
  • Legacy modernization
  • Mentoring
  • Cross-functional work
  • Planning
  • Knowledge transfer

Case StudiesКейсы

Problems, decisions, results Задачи, решения, результат

Short public examples: context, engineering choice, outcome, and the stack used in each task. Короткие публичные примеры: контекст, инженерное решение, эффект и стек по каждой задаче.

erp-sync

Near real-time ERP synchronization and client portalNear real-time синхронизация ERP и клиентский портал

A backend service that turned limited ERP updates into prepared status data for a responsive client portal.

Backend-сервис, который превращал ограниченные ERP-обновления в подготовленные статусы для отзывчивого клиентского портала.

DecisionРешение
Turned limited ERP events into prepared portal statuses.
Превратил ограниченные ERP-события в подготовленные статусы портала.
ResultРезультат
Users saw current operational state without direct portal-to-ERP coupling.
Пользователи видели актуальное состояние без прямой связки портала с ERP.

SkillsСкилы

  • Node.js
  • TypeScript
  • Queues
  • DynamoDB
  • PostgreSQL

import-service

Import service refactor for heavy Excel and XML workloadsВынос тяжелых Excel/XML импортов в отдельный сервис

A reliability refactor that moved CPU-heavy imports away from the main backend so users could keep working while large files were processed.

Reliability-рефакторинг, который вынес CPU-heavy импорты из основного backend, чтобы пользователи могли продолжать работу во время обработки.

DecisionРешение
Moved heavy Excel/XML processing into controlled workers.
Вынес тяжелую обработку Excel/XML в управляемые workers.
ResultРезультат
Main app stayed responsive while imports became retryable and observable.
Основное приложение осталось отзывчивым, а импорты стали retryable и наблюдаемыми.

SkillsСкилы

  • Node.js
  • Workers
  • Queues
  • Performance
  • Reliability

recommendations-analytics

GraphQL gateway, recommendations, and view analyticsGraphQL gateway, рекомендации и аналитика просмотров

Recommendation and statistics work inside a microservice system where a GraphQL gateway composed data from auth, users, posts, reactions, views, and video services.

Работа с рекомендациями и статистикой в микросервисной системе, где GraphQL gateway собирал данные из auth, users, posts, reactions, views и video-сервисов.

DecisionРешение
Composed view, reaction, and content signals behind a GraphQL gateway.
Собрал сигналы просмотров, реакций и контента за GraphQL gateway.
ResultРезультат
Client received recommendation and statistics data through one fast path.
Клиент получал рекомендации и статистику через один быстрый путь.

SkillsСкилы

  • GraphQL
  • Microservices
  • Analytics
  • Recommendations
  • Events

tlog

TLoG: a tap-race game as a backend concurrency labTLoG: tap-race игра как лаборатория backend concurrency

A live tap-race project where the interface is only the visible layer, and the main work is backend concurrency, atomic scoring, leaderboards, and durable state.

Live tap-race проект, где интерфейс только видимый слой, а основная работа в backend concurrency, атомарном scoring, leaderboard и сохранении состояния.

DecisionРешение
Built a live tap-race product with auth, roles, Redis scoring, and persistence.
Собрал live tap-race продукт с auth, ролями, Redis scoring и persistence.
ResultРезультат
A working public project for testing concurrency, leaderboards, and product polish.
Публичный рабочий проект для проверки concurrency, leaderboard и продуктовой полировки.

SkillsСкилы

  • React
  • Vite
  • NestJS
  • Redis
  • PostgreSQL
  • Prisma

ExperienceОпыт

GMT+4GMT+4

13y Commercial engineeringКоммерческой разработки
7y+ TypeScript and Node.jsTypeScript и Node.js
6y+ React interfacesReact-интерфейсы
10y+ Backend and APIsBackend и API

Public snapshot without company timeline. Details can be discussed privately.

Публичный срез без таймлайна по компаниям. Детали можно обсудить лично.

Engineering rangeИнженерный фокус

  • TypeScript and Node.js systems
  • React product interfaces
  • API contracts and integrations
  • Clean code and refactoring
  • Infrastructure as Code
  • Observability and release automation

Company contextsКонтексты компаний

  • Product companies with operational workflowsПродуктовые компании с операционными процессами
  • Enterprise platforms and internal toolsEnterprise-платформы и внутренние инструменты
  • Marketing, media, and customer-facing web productsMarketing, media и customer-facing web products
  • Distributed teams with cloud deliveryРаспределенные команды с cloud delivery

Work focusФокус работы

  • Backend services, integrations, and API contracts.
  • Product interfaces, dashboards, forms, and state-heavy UI.
  • Reliability work: queues, retries, imports, observability, and release automation.
  • Backend-сервисы, интеграции и API-контракты.
  • Продуктовые интерфейсы, дашборды, формы и state-heavy UI.
  • Reliability-задачи: очереди, retries, импорты, наблюдаемость и автоматизация релизов.

Product ProjectsПродуктовые проекты

Selected product work: a public backend lab and a private-source offline-first platform case.Избранные продуктовые проекты: публичный backend lab и private-source offline-first platform case.

Live demo and backend labLive demo и backend lab

TLoGTLoG

The Last of GussThe Last of Guss

A public tap-race game that turns a simple UI into a backend load, consistency, and recovery demo.

Публичная tap-race игра, где простой интерфейс превращается в demo для backend-нагрузки, согласованности данных и восстановления состояния.

Real live project screen, not a mockup.Реальный экран live-проекта, не мокап.
1 tapreal backend routeреальный backend route
11thtap becomes a bonus scoretap дает bonus score
5 botsload generator in Bot Managerнагрузка через Bot Manager
30sRedis to PostgreSQL flush cycleflush Redis -> PostgreSQL
Backend stress testBackend stress-test

The project creates a controlled backend load scenario: players and bots send tap requests, the server validates each action, updates score and leaderboard state, and must keep the final result correct under concurrent traffic.

Проект создает контролируемый сценарий backend-нагрузки: игроки и боты отправляют tap-запросы, сервер проверяет каждое действие, обновляет счет и leaderboard, а итоговый результат должен оставаться точным при конкурентном трафике.

Intentional backend pathПочему каждый запрос идет на backend

Score is not trusted to the browser. Each tap goes through the backend route, so authentication, validation, scoring, persistence, and leaderboard updates are exercised on the real server path.

Счет не доверяется браузеру. Каждый tap идет через backend route, поэтому авторизация, валидация, scoring, сохранение данных и обновление leaderboard проходят по настоящему серверному пути.

Operational resilienceОтказоустойчивость

Redis keeps atomic scoring and leaderboard state, while a worker flushes Redis data into PostgreSQL/Prisma in batches with retry/backoff behavior. Docker Compose adds healthchecks, persistent volumes, and restart policies around the live deployment.

Redis держит atomic scoring и leaderboard state, а worker сбрасывает данные из Redis в PostgreSQL/Prisma batch'ами с retry/backoff. Docker Compose добавляет healthchecks, persistent volumes и restart policies вокруг live deployment.

Request pathМаршрут запроса

tap -> auth -> score -> statetap -> auth -> score -> state
  1. Player actionДействие игрока

    A tap is not trusted as a local-only counter; it becomes a real authenticated backend call.

    Tap не считается доверенным локальным счетчиком; он становится реальным authenticated backend call.

  2. Server rulesServer rules

    NestJS/Fastify validates auth, round phase, role behavior, and request limits before scoring.

    NestJS/Fastify проверяет auth, фазу раунда, поведение роли и request limits до scoring.

  3. Score consistencyScore consistency

    Redis Lua keeps tap counters, bonus scoring, and leaderboard updates atomic under pressure.

    Redis Lua атомарно держит tap counters, bonus scoring и leaderboard updates под нагрузкой.

  4. Durable resultDurable result

    A flush worker syncs Redis state into PostgreSQL/Prisma with retry/backoff semantics.

    Flush worker синхронизирует Redis state в PostgreSQL/Prisma с retry/backoff семантикой.

ArchitectureАрхитектура

GitHub + live deploymentGitHub + live deployment

Frontend surfaceFrontend surface

  • React 19
  • Vite
  • MUI
  • Redux Toolkit

Backend coreBackend core

  • NestJS 11
  • Fastify
  • JWT auth
  • Swagger
  • Throttling
  • Socket.IO

State and deliveryState и delivery

  • PostgreSQL
  • Prisma
  • Redis
  • Docker Compose
  • Healthchecks
Why it mattersПочему это важно

Not a game for the sake of a game.Не игра ради игры.

The same pressure exists in real products with counters, queues, dashboards, event processing, and state synchronization. TLoG makes the path visible: request, validation, atomic update, and durable storage.

В реальных продуктах такой же класс задач появляется в счетчиках, очередях, dashboards, event processing и синхронизации состояния. TLoG делает этот путь видимым: запрос, проверка, атомарное обновление и надежное сохранение.

What it provesЧто проверяет

Backend accepts high-frequency player and bot actions while keeping leaderboard state consistent.

Backend принимает частые действия игроков и ботов, сохраняя leaderboard state согласованным.

Why it mattersЗачем это нужно

The same pattern applies to real systems with queues, counters, events, and operational dashboards.

Такой же паттерн нужен в реальных системах с очередями, счетчиками, событиями и operational dashboards.

Product project 02Продуктовый проект 02

Private-source offline-first mobile and web platformPrivate-source offline-first мобильная и веб-платформа

Private-source offline-first mobile and web platformPrivate-source offline-first мобильная и веб-платформа

BoxMapBoxMap

Inventory and moving managementУчет вещей, коробок и переездов

An offline-first mobile and web platform for inventory and moving management: rooms, cabinets, boxes, and items become searchable inventory with optional cloud sync.

Offline-first мобильная и веб-платформа для учета вещей, коробок и переездов: комнаты, шкафы, коробки и предметы превращаются в поисковый инвентарь с возможной облачной синхронизацией.

AI resultsAI-результаты
Bounding boxesBbox-рамки
PlacementРазмещение
Inventory mapКарта хранения
AIphoto recognition and bbox reviewраспознавание фото и bbox review
offlineguest-first mobile flowguest-first mobile flow
syncconflict-aware inventory stateconflict-aware состояние
betagated mobile release flowgated mobile release flow
Product modelПродуктовая модель

BoxMap turns messy real-world storage into a structured product model: a user can map a home, cabinet, box, and item hierarchy, then search where things live instead of remembering it manually.

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

AI recognition pathAI recognition path

Photo flows go through upload, AI recognition, normalized bbox data, user review, item/container drafts, and placement recommendations before the inventory is persisted.

Фото проходит через upload, AI-распознавание, нормализованные bbox, review пользователем, черновики предметов/контейнеров и рекомендации размещения перед сохранением инвентаря.

Local-first reliabilityLocal-first надежность

The mobile app is designed around guest and offline use, local persistence, sync/conflict handling, private media storage, and gated beta delivery through Play/TestFlight-style release flows.

Мобильное приложение спроектировано вокруг guest/offline use, локального хранения, sync/conflict handling, приватного media storage и beta-доставки через Play/TestFlight-style release flow.

Request pathМаршрут запроса

photo -> recognition -> placement -> syncphoto -> recognition -> placement -> sync
  1. Photo capturePhoto capture

    A user photographs a drawer, shelf, or container and can crop/check the image before processing.

    Пользователь фотографирует ящик, полку или контейнер и проверяет/crop'ит фото перед обработкой.

  2. AI recognitionAI recognition

    The backend returns item and container drafts with confidence, normalized bbox anchors, and editable metadata.

    Backend возвращает черновики предметов и контейнеров с confidence, normalized bbox anchors и редактируемыми metadata.

  3. PlacementPlacement

    The app suggests where to store the detected items while keeping the current place as a safe default.

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

  4. SyncSync

    The inventory remains usable across guest/offline states, auth transfer, local persistence, and later sync.

    Inventory остается usable через guest/offline состояния, auth transfer, local persistence и последующий sync.

ArchitectureАрхитектура

private source + optional cloud syncprivate source + optional cloud sync

Mobile surfaceMobile surface

  • Expo
  • React Native
  • Expo Router
  • AsyncStorage
  • SQLite

Backend product APIBackend product API

  • NestJS
  • Fastify
  • Prisma
  • PostgreSQL
  • JWT auth

AI and operationsAI и operations

  • AI gateway
  • Vision recognition
  • Placement recommendations
  • Admin metrics
  • Play/TestFlight
Why it mattersПочему это важно

A product case, not just a code sample.Product case, а не просто code sample.

BoxMap is useful as a hiring signal because it combines product UX, mobile constraints, backend contracts, AI vision, private media, admin metrics, and release discipline in one private-source product.

BoxMap полезен как hiring signal, потому что в одном private-source продукте сходятся product UX, mobile constraints, backend-контракты, AI vision, private media, admin metrics и release discipline.

Private-source case studyPrivate-source case study

The source stays private, so the public proof is product screenshots, architecture notes, and a focused walkthrough.

Исходники остаются закрытыми, поэтому публичное proof — screenshots продукта, architecture notes и короткий walkthrough.

Play/TestFlight betaPlay/TestFlight beta

Demo access is intentionally gated through mobile beta flows instead of a frictionless public web demo.

Demo access намеренно закрыт через mobile beta flows, а не через frictionless public web demo.

Full product surfaceFull product surface

The project covers mobile UX, backend APIs, AI vision, sync, private media, admin metrics, and release operations.

Проект покрывает mobile UX, backend APIs, AI vision, sync, private media, admin metrics и release operations.

ContactКонтакты

Mikhail Shokolov

The shortest route is email. Telegram works for quick context and follow-ups. Самый надежный канал - email. Telegram удобен для короткого контекста и follow-up.