
Первый день нового проекта — что я ставлю и в каком порядке
Раньше первый день выглядел так: открываешь пустую папку, идёшь читать, что появилось нового, находишь три статьи с противоположными выводами и к вечеру имеешь настроенный тулинг и ноль строк продукта. Иногда это растягивалось на неделю. Неделю, за которую не было сделано ничего, кроме выбора.
Сейчас первый день занимает часа полтора. Расскажу, что я ставлю и почему именно это - не как рекомендацию, а как разбор собственных решений.
Правило, по которому я выбираю
Оно одно: у каждого пункта в стеке должна быть причина, которую я могу произнести вслух одним предложением.
Не «это современно». Не «так все делают». Не «в вакансиях требуют». Причина. Вроде «я умею это чинить в три часа ночи» или «если авторы завтра разойдутся, я останусь с работающим кодом».
Звучит банально, но это сито отсеивает 70% того, что хочется поставить. Попробуйте ответить на вопрос, зачем в вашем проекте лежит половина зависимостей.
Фронтенд
Next.js, React, TypeScript. Причина простая: я знаю, как это ломается.
Это, кстати, недооценённый критерий. Все выбирают инструмент по тому, как он работает, а надо выбирать ещё и по тому, как он падает. У Next.js есть набор своих неприятных мест - кэширование, которое живёт своей жизнью, сборка, которая иногда требует снести .next и начать заново, граница между серверным и клиентским кодом, об которую регулярно спотыкаешься. Я все эти грабли знаю по именам. С новым фреймворком я бы знакомился с его граблями заново, и это происходило бы ровно в дедлайн.
TypeScript даже не обсуждается. Не ради «типобезопасности» из статей, а ради очень приземлённой вещи: через полгода я открою собственный код и не буду гадать, что лежит в этом объекте. Проект без типов - это проект, который ты пишешь дважды.
Стили - CSS Modules.
Тут я иду против течения, и это осознанно. Tailwind я использую, он хороший, но в своих проектах ставлю модули.
Причина: я хочу, чтобы разметка читалась. Когда у элемента 14 утилитарных классов в строке, я вижу инструкцию по сборке, а не структуру страницы. Мне важнее открыть компонент через полгода и за 5 секунд понять, что тут происходит, чем сэкономить эти пять секунд при написании.
Плюс с модулями у меня нет ещё одного слоя, который надо обновлять и конфигурировать. CSS я и так знаю.
Это не универсальный совет. В команде фронтендеров с общей дизайн-системой я бы, наверное, решил иначе.
Состояние - по возможности никакого.
Главный вопрос не «Redux или что-то полегче», а «нужно ли вообще хранить это на клиенте».
Фильтры, поиск, пагинация - в URL. Это не хитрость, это бесплатно даёт рабочую кнопку «назад» и возможность прислать коллеге ссылку на то, что ты видишь. Данные с сервера - на сервере, в серверных компонентах, а не в сторе, который потом надо руками синхронизировать с реальностью.
После этого остаётся совсем тонкий слой: открытые модалки, черновик формы, корзина. На это хватает одной маленькой библиотеки, а часто и обычного контекста.
Глобальный стор в проекте на две недели - это почти всегда не решение задачи, а перенос архитектуры с прошлой работы.
Бэкенд
Node.js и PostgreSQL. Тут коротко, потому что про постгрес я уже писал отдельно и повторяться не хочу.
Скажу только про то, чего я в первый день не делаю: не ставлю Redis. Не потому что он плохой - потому что у меня ещё нет проблемы, которую он решает. Кэш без нагрузки - это не оптимизация, это второе место, где данные могут разойтись с правдой.
Каждый элемент инфраструктуры должен сначала доказать, что он нужен. Доказательством считается медленный запрос в логе, а не ощущение, что «в продакшне так принято».
Деплой
Свой VPS, nginx, PM2.
Знаю, что сейчас принято иначе - одна кнопка, и оно само. Я пробовал, и для многих задач это правильно. Но я предпочитаю оставаться на своем.
Когда всё лежит, я могу зайти по SSH и посмотреть. Не написать в поддержку, не читать статус-страницу - зайти и посмотреть.
Порядок - вот что важнее списка
Первый день я трачу не на компоненты. Я трачу его на то, чтобы пустая страница с текстом «привет» открылась на боевом домене.
Пустая. С доменом, сертификатом, процессом в PM2, конфигом nginx и базой, в которую приложение умеет сходить. Ноль функциональности, весь путь до продакшна пройден.
Это выглядит как потерянный день, а на самом деле это единственный способ не обнаружить за неделю до сдачи, что сертификат не выпускается, порт закрыт, а база на другой машине.
Дальше я иду не по красоте, а по риску. Авторизация - потому что она всегда сложнее, чем кажется. Оплата - если она есть, то сразу, потому что там чужие правила, чужая модерация и чужие сроки. Реальные данные заказчика - потому что они всегда приходят в виде трёх экселек с объединёнными ячейками, и лучше узнать об этом в начале.
Интерфейс - последним. Он единственный, что можно переделать за вечер.
Настоящее преимущество нового проекта заключается в скорости, а не в новизне.

Комментарии