Перейти к содержимому
Основатель, Full-stack разработчик2026
#Python#FastAPI#PostgreSQL#Redis#Kafka#Celery#Next.js#TypeScript#Docker#OpenTelemetry

Tech Path Finder

Образовательная платформа для IT-специалистов с квизами, мок-интервью, code review и персональными рекомендациями на основе алгоритма деградации знаний

О проекте

Tech Path Finder — платформа для подготовки IT-специалистов к карьерному росту. Структурированные курсы по Agile, Python, Django, FastAPI, Kubernetes, System Design и десяткам других тем сочетаются с квизами, экзаменами, мок-интервью с AI-оценкой и практическим code review.

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

Ключевая идея — персонализация через данные: система не просто тестирует, а строит профиль компетентности пользователя с учётом времени. Знания, которые не применяются, постепенно «деградируют» — и платформа напоминает об этом раньше, чем это станет проблемой на собеседовании.

Ключевые возможности

Обучение и оценка знаний

65+ курсов по категориям: Agile/Scrum, Python, Django, FastAPI, Kubernetes, Docker, AWS, System Design, LLM/RAG, паттерны проектирования и другие. Каждый курс содержит:

  • Теорию — Markdown-статьи с диаграммами, глоссарий терминов
  • Квизы — вопросы трёх уровней сложности (junior / middle / senior) с детальными объяснениями
  • Экзамены — 20 детерминированных вопросов по варианту, история сдач
  • Прогресс — отслеживание завершения тем и точности ответов

Алгоритм деградации знаний

Ключевой механизм платформы: proficiency-score каждой темы снижается с течением времени, если пользователь не возвращается к материалу:

proficiency = accuracy × recency_factor × 100
recency_factor = max(0.3, 1 - days_since_last_answer / 30)

Темы автоматически классифицируются как «критичные» (< 40%), «слабые» (40–65%) или «не начатые» — и система строит персональную очередь для повторения.

Мок-интервью с AI-оценкой

Структурированные сессии мок-интервью по языкам и уровням (junior/middle/senior):

  • Загрузка вопросов по вариантам (express или полный формат)
  • Ответы пользователя оцениваются AI-моделью через OpenRouter
  • Итоговый скор и обратная связь по каждому ответу
  • Стоимость: 10 кредитов за сессию

Code Review

Практические задания с реальным кодом:

  • Репозиторий упражнений по языкам (Python, Go, Java, Ruby и другие)
  • Пользователь находит баги и нарушения — система сравнивает с эталоном
  • Три уровня оценки: 0 / 0.5 / 1.0 балла
  • Ежедневный челлендж со случайным заданием
  • Отслеживание слабых типов ошибок по языкам

Геймификация

  • XP-система: события-триггеры (завершение темы +50 XP, экзамен +100 XP, стрики +25/100 XP)
  • Достижения: разблокируются по милестонам (темы, точность, стрики)
  • Стрики: ежедневная активность поощряется бонусными XP
  • Дашборд прогресса: тепловая карта активности, динамика по сложностям, история экзаменов

Архитектурные решения

PythonFastAPIPostgreSQLRedisKafkaCeleryNext.jsReactTypeScriptTailwind CSSDockerNginxOpenTelemetryJaegerPrometheus

Backend: Domain-Driven Design

13 независимых доменов, каждый со своими api.py, service.py, models.py, schemas.py:

ДоменОтветственность
authJWT, OAuth (Google/Yandex/GitHub), восстановление пароля
usersПрофили, достижения, XP, настройки
contentКвизы, экзамены, прогресс, рекомендации
interviewМок-интервью, AI-оценка, расход кредитов
code_reviewУпражнения с кодом, ежедневные челленджи
billingКредитная система, промокоды, рефанды
adminАналитика, управление пользователями, модерация

Frontend: Feature-Sliced Design

Next.js 16 (App Router) + React 19 с тремя route group'ами:

  • (main) — аутентифицированные страницы с навигацией
  • (auth) — публичные страницы (вход, регистрация, восстановление)
  • (admin) — панель администратора

Все API-вызовы — Server Actions с 'use server'. Токены читаются из httpOnly cookies исключительно на сервере — ни один токен не достигает клиентского кода.

Контент как код

65+ курсов версионируются в Git как JSON/Markdown-файлы в /data/:

data/
  agile/
    meta.json           # Метаданные категории
    ceremonies.json     # Вопросы подтемы с объяснениями
    ceremonies.md       # Теоретическая статья
    glossary.json       # Глоссарий терминов
    exam.json           # 20 детерминированных вопросов

Обновление контента = коммит в Git + редеплой. Никакой CMS, никакой БД для контента.

Инфраструктура

nginx → next.js (:3000) + fastapi (:8000)
├── postgres     # Основная БД
├── redis        # Сессии, rate limiting, кэш
├── kafka        # Event streaming, аудит-лог
├── celery       # Фоновые задачи, email
├── jaeger       # Distributed tracing
└── plausible    # Privacy-first аналитика

Технические вызовы и решения

Тасование ответов без утечки правильного индекса

Проблема: Если тасовать варианты ответов только на фронтенде, пользователь может запомнить позицию правильного варианта в исходном массиве.

Решение: Тасование Fisher-Yates выполняется на сервере при каждом запросе. Клиент отправляет индекс в пространстве перетасованных вариантов, сервер переводит обратно в оригинальное пространство для валидации. Пользователь видит только перемешанные варианты.

Rate limiting через Lua + Redis

Проблема: Защита чувствительных endpoint'ов от брутфорса и злоупотреблений без внешних зависимостей.

Решение: Атомарный sliding window через Lua-скрипт в Redis — INCR + EXPIRE в одной транзакции. Разные лимиты на каждый endpoint:

POST /auth/login        → 5 / 15 минут / IP
POST /auth/register     → 3 / час / IP
POST /auth/forgot-pw    → 3 / час / IP

Кредитный биллинг без гонок

Проблема: Атомарное списание кредитов при параллельных запросах без двойного расхода.

Решение: Ledger-паттерн — append-only таблица CreditTransaction + денормализованный кэш User.credits_balance. Атомарное обновление через SELECT FOR UPDATE. Идемпотентность сессий мок-интервью через ключи идемпотентности.

Refresh-токены без race condition

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

Решение: Атомарный GETDEL из Redis при обновлении — токен читается и удаляется в одной операции. Второй запрос получает None и вынужден идти на /auth/refresh снова с уже обновлённым токеном.

Observability с нуля

Полный стек наблюдаемости без vendor lock-in:

  • Tracing: FastAPI + SQLAlchemy + Redis инструментированы через OpenTelemetry → Jaeger
  • Metrics: Prometheus + кастомные метрики (регистрации, XP, завершения тем)
  • Health checks: /health + /health/ready с проверкой DB и Redis
  • Graceful shutdown: дренаж in-flight запросов с 30-секундным таймаутом

Безопасность

  • Пароли: bcrypt с 12 раундами
  • JWT: HS256, access (30 мин) + refresh (7 дней) в httpOnly cookies
  • OAuth: state-параметр верифицируется через Redis (TTL 1 час) против CSRF
  • Чувствительные поля: Fernet-шифрование при наличии APP_ENCRYPTION_KEY
  • SQL: параметризованные запросы через SQLAlchemy
  • Linting: Bandit + Ruff в pre-commit hooks

Результаты

65+
Курсов
10 000+
Вопросов в базе
13
Доменов в backend
90%
Покрытие тестами

Что получилось построить

  • Полноценный SaaS с нуля — от архитектуры до деплоя
  • Алгоритм деградации знаний, дающий реальную персонализацию без ML-оверхеда
  • Контент как код — 65 курсов обновляются через Git без CMS
  • Продакшн-ready стек с трейсингом, метриками и graceful shutdown

Извлечённые уроки

Контент как код работает лучше CMS для технических курсов: версионирование, code review контента, откат изменений — всё из коробки через Git.

Алгоритм деградации знаний — неочевидно простое, но мощное решение. Не нужен полноценный spaced repetition с планировщиком. Достаточно time-decay функции, чтобы рекомендации стали ощутимо лучше.

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

Jwt в httpOnly cookies через Server Actions — элегантное решение проблемы безопасности токенов на фронтенде. Клиентский код никогда не видит токены, XSS не может их похитить.