Статистика

Открыт к предложениям Middle+ Frontend / Fullstack · Москва или удалёнка

Qwern_9876r

Сотников
Дмитрий

React · Next.js · TypeScript · Web Components

Делаю сложное — стабильным, быстрым и масштабируемым

01

О себе

BIO

Программирую с 14 лет: в 15 закончил Школу Разработки Интерфейсов Яндекса — самым молодым учеником за 12 лет её существования, а в 16 начал карьеру в Яндексе frontend-разработчиком. Закрывал сложные технические задачи — от оптимизации производительности интерфейсов до проектирования огромных проектов. Пишу высокопроизводительный, поддерживаемый код и всегда смотрю шире задачи: думаю о том, как решение влияет на продукт и бизнес в целом. Инициативен, довожу начатое до результата и не жду, когда скажут что делать. В свободное время развиваю Rook — свой язык программирования, который компилируется в JavaScript и запускает его на всех ядрах процессора.

Яндекс
МТС
02

Почему я

PERFORMANCE

Высокая производительность

Пишу код, который не просто работает — он работает быстро. Оптимизирую рендер, bundle size, сетевые запросы и время отклика. Метрики Lighthouse, Core Web Vitals и профилирование — обязательная часть работы, а не опция.

Эта страница в вашем браузере
LCP
—
полная загрузка
—
JS при загрузке
—
кадров/с в покое
—
Вся статистика вживую
INITIATIVE

Инициативность

Не жду постановки задачи — нахожу проблемы и предлагаю решения сам. Беру на себя сложные и неопределённые задачи, довожу их до конца без постоянного контроля. Работаю автономно и несу ответственность за результат.

PRODUCT FOCUS

Бизнес-мышление

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

03

Основа фронтенда

TypeScript · HTML5 · CSS3 · SCSS

04

React экосистема

React 19 · Next.js 16 · MUI · TanStack Query

05

Графика

Pixi · Three.js · Rive · Lottie

06

Web Components

Lit · Custom Elements

07

Качество и тестирование

Storybook · Jest · Playwright

08

Технологии

Нажми на иконку — перейдёшь на официальный сайт технологии

09

Опыт

Яндекс и МТС

Москва

МТС

Fullstack-разработчик

05.2026 – н.в. сейчас
  • Спроектировал и разработал админ-панель и модули для создания игр
  • Разрабатываю браузерные игры на WebGL: игровые механики и серверные API
  • Оптимизирую производительность игр в браузере
4 дня на игру−87% вес 3D-моделей Кейс «Проверил новый стек на игре»
Этот сайт — на том же стеке WebGL · Three.js · Pixi.js · Svelte · Threlte
TypeScriptGoReactViteFastify +1 Ещё: PostgreSQL

Яндекс

Frontend-разработчик

08.2024 – 03.2026
  • Разрабатывал и поддерживал высоконагруженные интерфейсы: новые фичи и оптимизация производительности
  • По своей инициативе создал новые страницы и расширил возможности фронтовой админки
  • Помогал смежным командам и обучил стажёра
+38% MAU+15% E-REACH Кейс «Один против огромного проекта»
TypeScriptReactNextSCSSGraphQL +3 Ещё: REST API, Jest, Storybook

Повышение за 3 месяца

Стажёр Frontend-разработчик

05.2024 – 08.2024
  • Разрабатывал новые фичи для продукта с многими миллионами пользователей
  • Создавал оптимизированные анимации, внедрял новые технологии и подходы
+53% DAU+31% E-REACH Кейс «Сделал лучше, чем кто-либо предполагал»
TypeScriptReactNextSCSSJest +2 Ещё: Storybook, GraphQL
10
Кейс 1 из 5

Сделал лучше, чем кто-либо предполагал

Яндекс

05.2024 - 06.2024

Во время работы: Стажёр Frontend-разработчик ↗
+53% DAU ежедневная аудитория
+31% E-REACH
+32.5% Прибыль

Летняя кампания 2024 года · продукт с миллионами пользователей

Роль и условия
  • Задача — небольшая анимация на главной, без макетов
  • Механика с призом — моя идея
Проблема

Была задача добавить небольшую анимацию на главную страницу — без макетов.

Решение
  1. 1

    Превратил анимацию в мини-игру

    Сильно улучшил анимацию и добавил интерактив

  2. 2

    Оптимизировал

    Ленивая загрузка и оптимизация самой анимации: идеально работала даже на самых старых телефонах

  3. 3

    Придумал механику с призом

    За интерактив в анимации пользователь получал символический приз

  4. 4

    Успех подхватил маркетинг

    Мини-игра привлекла много ежедневных пользователей, и всё лето вокруг неё шла кампания с блогерами

Подробнее

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

АнимацииИнициативность
11
Кейс 2 из 5

Один против огромного проекта

Яндекс

04.2025 - 05.2025

Во время работы: Frontend-разработчик ↗
+38% MAU ежемесячная аудитория
+15% E-REACH

Новая игровая страница, сделанная в одиночку к дедлайну

Роль и условия
  • 1 фронтенд вместо 3
  • Полставки
  • Rive и серверные компоненты — впервые
Проблема

Из трёх фронтенд-разработчиков один ушёл делать проект для другой команды, а второй — в долгий отпуск. Менеджеры принесли огромный проект, который нужно было сделать в кратчайшие сроки.

Решение
  1. 1

    Новая страница с игровой механикой

    Игровая механика и призы

  2. 2

    Новый стек впервые в проекте

    Серверные компоненты и REST API вместо GraphQL

  3. 3

    Освоил Rive с нуля

    Интерактив на Rive, который раньше в проекте не использовался

  4. 4

    Сдал в срок в одиночку

    Мой компонент для Rive стал основой для всей команды и Яндекс Плюса

Подробнее

Проект — новая страница с игровой механикой, призами и прочим. Я решил впервые в нашем проекте использовать серверные компоненты и REST API (раньше мы использовали GraphQL и решили от него уйти). Интерактив решили делать на Rive, который у нас на проекте никогда не использовался, — я впервые узнал, что это. В итоге, работая тогда ещё на полставки и засиживаясь допоздна, я разобрался в Rive и всём остальном и к дедлайну сделал всё необходимое в одиночку. Мой пример использования Rive и универсальный компонент для него стали базой для всех будущих интеграций Rive в нашей команде и по всему Яндекс Плюсу.

TypeScriptRiveReactNext.jsServer Components
12
Кейс 3 из 5

Проверил новый стек на игре

МТС

05.2026

Во время работы: Fullstack-разработчик ↗
4 дня на игру
−87% вес 3D-моделей
9,7 МБ грузится при старте

Май 2026, первый месяц в МТС. Вес моделей — после сжатия в октябре 2026, gzip

Роль и условия
  • В одиночку
  • Стек осваивал по ходу
  • Итог — стек взяли для новых проектов
Проблема

Для новых проектов в МТС нужно было решить, подойдёт ли связка Svelte + Threlte + Pixi.js: потянет ли она 3D, 2D-эффекты и интерфейс в одном приложении и насколько быстро на ней разрабатывать.

Решение
  1. 1

    Задача — выбрать стек

    Подойдёт ли Svelte + Threlte + Pixi.js для новых проектов МТС: 3D, 2D-эффекты и интерфейс в одном приложении

  2. 2

    Игра вместо демо

    За 4 дня — браузерная 3D-игра: лес с грибами, оранжерея с котлом, зелья

  3. 3

    Три слоя в одном кадре

    3D-сцены на Threlte, частицы Pixi.js поверх них, интерфейс и состояние на Svelte 5

  4. 4

    Стек взяли в работу

    По итогам проверки связку выбрали для новых проектов

  5. 5

    Модели в 8 раз легче

    gltf-transform и meshopt: 9,7 МБ при старте вместо 76,4

Подробнее

Чтобы проверить стек на настоящей задаче, а не на демо, я за 4 дня написал браузерную 3D-игру Alchemy Terrarium: собираешь грибы в лесу и варишь из них зелья в котле в оранжерее. 3D-сцены сделаны на Threlte (three.js), эффекты частиц — на Pixi.js поверх 3D, интерфейс и состояние игры — на Svelte 5, всё на TypeScript и SvelteKit со статической сборкой. Стек показал себя хорошо, и его взяли для новых проектов. Позже я сжал 3D-модели игры через gltf-transform и meshopt: при старте она грузит 9,7 МБ вместо 76,4 МБ.

Svelte 5SvelteKitThrelteThree.jsPixi.jsTypeScriptGSAP
13
Кейс 4 из 5

Этот сайт

Личный проект

09.2026

62 КБ JS на первом экране
0 кадров в покое
139 КБ 3D — после загрузки страницы

Замеры сборки, gzip

Роль и условия
  • Личный проект
  • Главное требование — скорость
  • GitHub Pages и свой сервис метрик на Go
Проблема

Портфолио разработчика, для которого производительность — главный аргумент. Сайт должен сам быть доказательством: 3D, анимации и интерактив — и при этом летать на любом телефоне.

Решение
  1. 1

    SvelteKit с пререндером

    Каждая страница — готовый HTML, на первом экране только нужный JS

  2. 2

    3D без веса на старте

    Призма на Threlte и Pixi-сцены грузятся после загрузки и рисуют кадры только во время анимаций

  3. 3

    Сайт меряет сам себя

    Живые метрики в браузере посетителя через Performance API, без библиотек

  4. 4

    PWA без лишнего трафика

    Service worker кэширует только то, что посетитель уже скачал

Подробнее

Сайт переписан с React на SvelteKit с пререндером: каждая страница — готовый HTML, на первом экране только нужный JS. 3D-призма на Threlte и Pixi-сцены грузятся после загрузки страницы и рисуют кадры только во время анимаций, а в покое засыпают. Метрики в «Почему я» — живые замеры в браузере посетителя через Performance API. Service worker превращает сайт в PWA и кэширует только то, что посетитель уже скачал.

SvelteKitSvelte 5ThrelteThree.jsPixi.jsWebGLPWA
14
Кейс 5 из 5

Свой язык: JavaScript на всех ядрах

Open source

10.2026

×8,1 быстрее с go for
×5,4 быстрее с горутинами счёт простых чисел: 10 горутин против одного потока
1291 тестов
30 тыс. строк на TypeScript

Цифры — из репозитория: go for — замер с главной страницы документации, горутины — пример из документации в Node; оба на Apple M4 Pro с 14 ядрами

Пример
func isPrime(n number) bool {
    for let d = 2; d * d <= n; d++ {
        if n % d == 0 {
            return false
        }
    }
    return n > 1
}

const primes = make([]uint8, 10_000_000)

go for i, _ in primes {
    primes[i] = isPrime(i) ? 1 : 0
}

Тот же цикл, на одно слово длиннее: go for делит массив на части, по несколько на ядро, и выполняет их горутинами на свободных ядрах. На 14 ядрах Apple M4 Pro — в 8,1 раза быстрее одного потока.

Роль и условия
  • Open source
  • Язык, компилятор и инструменты — с нуля
  • Опубликован в npm
Проблема

JavaScript выполняется в одном потоке: тяжёлое вычисление занимает одно ядро и блокирует всё остальное, а Web Workers требуют отдельных файлов, postMessage и ручного копирования данных. Хотелось писать параллельный код так же просто, как в Go, — со строгими типами и без платы за удобство в бандле.

Решение
  1. 1

    Горутины на настоящих потоках

    go f(x) запускает функцию в пуле воркеров, по одному на ядро, и даёт Promise с результатом

  2. 2

    go for — цикл на всех ядрах

    Массив делится на части, по несколько на ядро, и каждая выполняется на первом свободном: ×8,1 на 14 ядрах

  3. 3

    Каналы и select

    Горутины в разных потоках передают значения через каналы, ждут несколько сразу и выходят по тайм-ауту, как в Go

  4. 4

    Типы, которые знают о потоках

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

  5. 5

    Совместимость с TypeScript и npm

    Типы пакетов и DOM — из .d.ts, а для своих модулей компилятор сам пишет .d.ts

  6. 6

    Инструменты вокруг языка

    npm-пакет, CLI, плагин для Vite, расширение для VS Code и документация с песочницей, написанная на самом Rook

Подробнее

Я написал Rook — язык с семантикой JavaScript, синтаксисом Go и статической типизацией, главное в котором — скорость и конкурентность. go f(x) запускает функцию горутиной в пуле Web Workers или worker threads, по одному потоку на ядро, и даёт Promise с результатом; каналы, select, after и tick работают как в Go. go for — тот же цикл по массиву, на одно слово длиннее: массив делится на части, по несколько на ядро, и каждая выполняется на первом свободном ядре. На 14 ядрах Apple M4 Pro такой цикл в 8,1 раза быстрее одного потока. Компилятор сам переносит в воркер функцию и всё, чем она пользуется, и ещё до запуска проверяет, что уходящее в другой поток можно скопировать: функцию, экземпляр класса или DOM-элемент туда не отправить. Компилятор написан на TypeScript: лексер, парсер и проверка типов с дженериками, union-типами, null safety и сужением. Типы npm-пакетов и DOM он берёт из .d.ts, а для модулей на Rook сам пишет .d.ts — язык работает с любой библиотекой из npm в обе стороны. Код компилируется в читаемый JavaScript с маленьким рантаймом для каналов и горутин, который импортируется по именам; компоненты компилируются в прямые вызовы DOM, без виртуального DOM. Вокруг языка — npm-пакет rooklang, CLI, плагин для Vite, расширение для VS Code и документация, написанная на самом Rook, с песочницей прямо в браузере.

TypeScriptКомпиляторыМногопоточностьWeb WorkersViteVS Code

Qwern_9876r

Сотников Дмитрий

Делаю сложное — стабильным, быстрым и масштабируемым

© 2026 Qwern_9876r · Сотников Дмитрий