Как ответить
На последнем проекте — веб-приложении для управления задачами — я отвечал за разработку как бэкенда, так и фронтенда. Стек был классическим для небольшой команды: Node.js + Express на сервере, React на клиенте, PostgreSQL в качестве БД. Я писал код на TypeScript, что помогало избегать типовых ошибок на этапе компиляции.
Бэкенд. Основной фреймворк — Express. Структура проекта строилась на роутах, контроллерах и сервисах. Для работы с базой использовал Sequelize — описывал модели, миграции, писал запросы с включением связанных сущностей. Например, чтобы получить задачу вместе с исполнителем и комментариями, делал Task.findByPk(id, { include: ['assignee', 'comments'] }). Аутентификацию реализовал через JWT, пароли хешировал bcrypt. Также поднимал Redis для кеширования списков задач — это снизило нагрузку на БД при частых запросах.
Фронтенд. Код на React 18 с функциональными компонентами и хуками. Стейт-менеджмент был на React Context + useReducer — этого хватило для управления списком задач и фильтрами. Роутинг — React Router. Для работы с API использовал axios, обернутый в кастомный хук useApi, который автоматически обрабатывал ошибки и токены. UI-библиотеку не брали — писали свои компоненты на CSS Modules: кнопки, модалки, формы. Сборка — Vite (раньше был Webpack, но перешли для скорости).
Инфраструктура. Локально поднимал всё через Docker Compose — три контейнера: сервер, клиент (с nginx) и база. На прод деплоили через GitHub Actions в VPS. CI/CD собирал образы и пушил в Docker Hub, на сервере запускал docker-compose.
Моя роль — full-stack разработчик в команде из трёх человек. Я вёл обе части: от проектирования схемы БД до вёрстки страниц. Ключевой результат — релиз MVP через 2 месяца, после чего добавили real-time уведомления через WebSockets (Socket.io).