Fullstack Engineer
17 лет в вебе · Vue 3, TypeScript · Node.js, Python, PostgreSQL · деплой и эксплуатация
Беру продуктовое направление и довожу его до пользователей. Код сейчас пишется быстро — разработку я выстроил вокруг ИИ-инструментов, и цикл «идея → прод» считается днями. Дефицит давно не в наборе кода, а в том, кто решает, что строить, держит весь контекст и отвечает, что оно работает в проде.
Сделать MVP
Первая версия до пользователей — не прототип на выброс, а работающий продукт с метриками, по которым видно, взлетело или нет. Дальше правим по фидбеку, пока гипотеза не станет продуктом или не закроется.
Новое направление в продукте
Компания хочет пощупать смежный сегмент или рынок. Собираю отдельную ветку продукта, не ломая основную, и довожу до запуска — так, чтобы её можно было и развернуть в полноценную линию, и безболезненно свернуть.
Расширить линейку
К одному продукту добавляется второй и третий. Общее — авторизация, биллинг, дизайн-система, деплой, мониторинг — выношу в переиспользуемый слой, чтобы каждый следующий продукт стоил дешевле предыдущего, а не повторял всю стройку заново.
Автоматизации
Процессы, которые держатся на людях и таблицах: админки, внутренние инструменты, интеграции между сервисами, регулярные выгрузки и отчёты. Работа неяркая, но освобождает дорогое время команды и убирает ошибки ручного ввода.
Понятно, масштабируемо, надёжно.
Делаю код, который выдерживает рост продукта. Главный принцип — меньше скрытой логики, понятные состояния, строгие типы, предсказуемое поведение. Такой код легко читать, безопасно менять и просто передать другому разработчику.
Обе половины приложения.
Основная глубина — продуктовые интерфейсы на Vue 3 и TypeScript: коммерческие платформы с нуля, canvas- и 3D-карты, конструктор форм с условными ветвлениями, дизайн-системы, корпоративный SSO. Бэкенд — две рабочие линии: Node.js с Effect‑TS и DDD, и Python с FastAPI. К языку не привязан: в моих проектах есть бэкенды на TypeScript, Python и Rust — выбираю инструмент под задачу.
- Продуктовые SPA с нуля — Vue 3, TypeScript, FSD с проверкой границ линтером
- Бэкенд: Node.js (Effect‑TS, DDD) и Python (FastAPI, SQLAlchemy async, Alembic)
- Контракт API до кода: OpenAPI как источник правды, типы фронта — из спеки
- PostgreSQL: схема, миграции, доменная модель по ограниченным контекстам
- Сложный интерактив: canvas, карты (Cesium, Mapbox GL), графики
- Дизайн-системы и компонентные библиотеки на Storybook
- Эксплуатация: собственный сервер, Docker, nginx, CI/CD, Prometheus + Grafana
- Тесты: Playwright e2e поверх всего, pytest и node:test на бэкенде
Ege.plus — образовательный портал
Крупный проект в продакшене: создание, поддержка и развитие. Портал входит в экосистему сайтов и сервисов «Национального образования» — издателя популярного пособия для подготовки к ЕГЭ. Для ege.plus я полностью собрал фронтенд (Vue 3 + TypeScript + Pinia, Redux store — как эксперимент), а вместе с ним Storybook и дизайн-систему.
В проде сайт подключён к Sentry: ошибки видны в реальном времени, и это сильно упростило работу с QA-командой. Даже больше — в системе видно всё взаимодействие пользователей с сайтом, и часть багов находилась раньше, чем их замечали QA.
Экосистема «Национального образования»
Другие проекты для издательства поменьше, но не менее важные: лендинги, легаси-сайты на React, корзина покупок в каталоге, интеграция с корпоративным SSO. Полный спектр работ по визуальной части экосистемы. Бизнес-метрик от продуктового отдела хотелось бы больше — в работе была только Яндекс Метрика.
Проекты под NDA
Участвовал во многих проектах, в основном на Vue. Один из последних — система анализа экономических показателей для экономического отдела крупной компании: множество виджетов, графиков и таблиц, много данных на одной странице. UI-библиотека из 100+ элементов, серьёзный бэкенд на Python. Там же поработал с картами: метки объектов и дополнительная информация по ним в модалках.
Htracker — трекер здоровья пациента
Свои full-stack проекты я делаю для себя и знакомых; несколько работают в продакшене.
Задача. Медицинская история человека рассыпана по бумагам: справки, заключения, анализы. Пока это бумага — с ней ничего нельзя сделать. Нужно собрать всё в одном месте, превратить в данные, вести лечение как процесс с видимым прогрессом и приходить к врачу с этой базой — чтобы разговор был предметным.
Решения. Границы модели: обследования, анализы, консультации, болезни и курсы лечения, доступ врача — самостоятельные контексты со своими правилами (DDD). Ключевое продуктовое решение — «болезнь» и «курс лечения» как сущности с таймлайном, к которым привязываются записи. Стек под задачу:
- логика — Python FastAPI + PostgreSQL,
- фронтенд — Vue 3 + TypeScript, типы фронта из OpenAPI,
- e2e-тесты на Playwright,
- деплой — Docker + nginx + CI/CD на своём сервере.
Как это устроено. Бэкенд разрезан на восемь bounded-контекстов (Identity, MedicalRecord, Examinations, Analyses, Consultations, Conditions, DoctorAccess, References), внутри каждого четыре слоя: domain — агрегаты и инварианты без единого импорта фреймворка, application — use cases, infrastructure — SQLAlchemy и репозитории, api — HTTP-обвязка. Зависимости идут строго в одну сторону, контексты общаются только через application-слой соседа — каждый остаётся отдельно бутабельным.
Фронт — Vue 3 / TypeScript по Feature-Sliced Design: фронтовое зеркало того же правила «связи между модулями — только через публичные точки входа». Типы фронтенда генерируются из OpenAPI-спеки, поэтому контракт API и клиент физически не могут разойтись. Авторизация — JWT в httpOnly-cookie с тихим refresh на 401. Есть самодокументирующаяся страница дизайн-системы.
Код на GitHub, сайт работает на сервере — доступ по запросу.
Booking widget — один виджет, три системы типов
Виджет бронирования номера в отеле: выбор дат в календаре, подбор номера под число гостей, занятость на выбранные даты, расчёт ночей и стоимости, переключение языка (ru/en) и темы, поток «выбор → проверка → подтверждение».
Базовую версию я собрал на Vue 3 + TypeScript в строгом режиме, а дальше написал ещё две — на Effect-TS и на Elm. Компилятор закрыл больше десяти дыр в корректности, которые TypeScript пропускал.
| Срез | Vue 3 + TS (база) | Effect-TS / foldkit | Elm |
|---|---|---|---|
| Дыры закрыты структурно | — (эталон, 13 открыто) | 9 из 13 | 12 из 13 |
| Закрыты «на практике» | — | 4 | 1 |
| Осталось открытыми | 13 | 0 | 0 |
| Невозможные состояния | Date | null × 2 поля независимы; флаг status оторван от валидности | sum-типы; Reviewing/Confirmed несут ValidBooking (smart-constructor) | то же + непрозрачный BookableDate: прошлую дату нельзя построить |
| Граница I/O | as RoomDto[], as RoomId — проверка выключена | Schema есть доменный тип: декодер и тип не расходятся | Json.Decode: плохой вход не доходит до домена |
| Даты | локальные getMonth/Date, риск off-by-one по TZ | CalendarDate — день без времени и зоны | justinmimbs/date — день без времени и зоны |
| Ошибки | confirm() не делает эффекта, упасть не может | типизированный канал catchTags → исчерпывающие сообщения | ADT SubmitError (409 → RoomTaken), сообщение на причину |
| Полнота разбора случаев | тернарники locale === 'ru' ? … молча ловят 3-ю локаль | Match.exhaustive — новая локаль ломает компиляцию | case по Locale — то же |
| Тесты | 47 Vitest + 4 Playwright | 32 (Story/Scene + property-based на fast-check) | 77 elm-test (юнит / fuzz / update-истории) |
О ремесле и о том, куда оно движется.
Короткие тексты о разработке: как я работаю с ИИ, что понял про дизайн-системы и каким вижу будущее профессии.
ИИ в разработке — год спустя
Почти год я пишу код вместе с ИИ. Главное, что я понял: он умножает того, кто понимает, что делает, — и так же быстро умножает того, кто не понимает.
Дизайн-система, которая доживает до второго проекта
Дизайн-систему легко начать и трудно сохранить. Я поднимал их несколько раз — и почти всё ценное узнал из того, что не получилось.
Фронтендер через десять лет
Я думаю, профессию ждёт трансформация: фронтенд-разработчик станет UX/UI-инженером, который держит интерфейс и продукт в одной голове. И мне такое будущее скорее по душе.
Открыт к интересным задачам.
Ищу команду, где нужен человек, которому можно отдать направление целиком — MVP, новую линию продукта, автоматизацию — и получить работающий результат, а не отчёт о ходе работ. Интересны задачи, где важны архитектура, типобезопасность и аккуратный UX. Пишите в Telegram или на почту — отвечаю быстро.