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

«Как я структурирую свой проект React», «Архитектура CSS», «Как создать современную архитектуру внешнего интерфейса» и множество подобных статей, которые я читал, выглядят почти одинаково. Авторы много рассказывают о своем многолетнем опыте, количестве проектов, где они используют свою архитектуру, и о том, как жизнь улучшилась со всеми этими файлами и папками. Ну как можно не верить этим людям?

Каждая такая статья меня огорчает. Но не потому, что авторы ошибаются и папки у них неудобные, а потому, что это весьма субъективный, маловажный вопрос, вызывающий бурю гнева и споров.

Как вы используете свою IDE?

Пожалуй, это самый важный вопрос в теме «идеальная структура папок». Лично мне нравится использовать дерево файлов на боковой панели или ссылки в зависимостях. Но вы можете предпочесть быстрый поиск по имени файла, навигационным ссылкам, поиск по ключевым словам, именам функций/компонентов или просто оставить все файлы открытыми. Это разнообразие вариантов губит любую, даже самую удобную архитектуру — она никогда не будет подходить всем.

Например, я не люблю глубокую вложенность, потому что открывать четыре папки в сайдбаре, чтобы добраться до заветного index.js, — мучение. Однако, когда я использую ссылки зависимостей, все становится проще. Поиск по имени файла также не зависит от структуры папок, но я к этому так и не привык.

Это только кажется, что /components/forms/login/components/ лучшая вложенность для всех и каждого.

Поверьте, кому-то это будет неудобно.

А также единственную папку /components, которая у большинства разработчиков вызовет вопросы: а туда просто все положить? А если это целая страница? И даже если это небольшой компонент? Мысли «как улучшить эту слишком простую архитектуру» могут отнять довольно много времени, сил и мотивации.

Насколько вам нравится следовать правилам?

Скажем честно, я люблю, когда все по правилам и в порядке, но только если это мои правила.

Чем больше ограничений и регламентов, тем сложнее работать с проектом, ведь нужно все запоминать, не забывать, а главное — использовать.

Правила, записанные в тексте (или, что еще хуже, просто произнесенные) и контролируемые товарищами по команде во время код-ревью, неудобны и провоцируют конфликты. Поэтому я придумал следующую стратегию:

Все, что не имеет автоматического код-ревью — не имеет значения.

Конечно, это не относится к обзору алгоритмов, абстракций и потока данных, который следует выполнять. Это также не значит, что команда может превратить проект в свалку и писать каждый новый компонент по-новому. Но есть большая разница между автоматической проверкой стиля и ручным управлением любыми действиями разработчика.

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

Конечно, вы можете убедить свою команду переписать все «правильно», но сначала ответьте на эти вопросы:

  • Сколько времени вы потратите на это?
  • Насколько сложно будет вашей команде перейти на новую архитектуру и привыкнуть к ней?
  • Хватит ли у вас терпения следить за этим переходом и контролировать нарушения ваших правил?
  • Каковы преимущества ваших изменений?
  • Как долго ваша архитектура проживет без вас, если вы покинете проект?

Ответы помогут вам осознать важность вашего решения.

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

А как насчет вашего абстрактного мышления?

Когда мы смотрим на сложную структуру, наш мозг пытается разложить ее на части и выявить закономерности повторяющихся элементов. Так легче воспринимать информацию. Поэтому при программировании мы используем абстракции.

К сожалению, разработчики очень любят создавать абстракции, руководствуясь только принципом СУХОЙ. А это многое говорит об уровне абстрактного мышления современных специалистов.

Тот факт, что два компонента похожи, не означает, что они должны находиться в одной папке.

Например,
давайте создадим папку для страницы входа — login и поместим туда все компоненты.
А как насчет всплывающего диалога, который также имеет форму входа?
Должен ли мы поместили его в ту же папку?
Но всплывающее окно не на этой странице. На всех остальных страницах она в шапке.
Стоит ли класть ее в папку modals со всеми остальными попапами?
Но как тогда лучше переиспользовать общую форму?
Перенести форму на папка forms со всеми остальными формами?
Но тогда целостность папок страниц и компонентов разваливается…

Как видите, дырявая абстракция создает больше вопросов, чем пользы.

Абстракции сложны, а хорошие абстракции — почти недостижимая роскошь в современных, быстрорастущих и постоянно меняющихся проектах. Поэтому лучший совет — упрощайте, повторяйте, не группируйте все, что вам мешает. В большинстве случаев это ненужное излишество, усложняющее ваш проект.

Иначе вам, как и мне, будет стыдно за все эти папки forms и modals, utils и services, структуры типа components/common и прочие решения «на будущее», так как кто-то продолжает страдать из-за тех или надеюсь, не использует их.

Вместо заключения вспомните все «лучшие правила» структуры проекта, которыми вы пользовались на протяжении всей своей карьеры. Уверен, их будет несколько: отдельные HTML, CSS, JS по разным папкам; разделите компоненты и все, что с ними связано, по папкам; разделяйте «умные»/«глупые» компоненты, страницы, интерфейсы в разные папки. Это только часть моего списка. А что у тебя?

На мой взгляд, правила, которые постоянно меняются, не могут быть правилами. Так что не стоит бездумно следовать за ними, движимые ажиотажем. В то же время не стоит по привычке создавать стандартные папки utils, components и им подобные. Вместо этого сосредоточьтесь на том, что вы делаете и почему. Почему любое решение удобно для вашего проекта или наоборот не работает для вас.

Ответы на эти вопросы — основа хорошей архитектуры проекта.

Спасибо, что дочитали!
Увидимся в следующий раз!
🤹🏻‍♀️

Соловїною: