Всем доброго времени суток.

В данной статье я решил поделиться опытом, накопленным за многие годы работы во front-end`е. Как и все вы, я был молод и мечтал создать что-то бессмертное. Ах, как я был молод, и как же я был глуп. Ничего вечного не существует и всё рано или поздно умирает. Однако, можно создать то, что протянет гораздо дольше обычного и даже будет адаптироваться к изменениям какое-то время. Поэтому сегодня предлагаю поговорить о паттернах проектирования для front-end приложений, выборе технологий и о том, чего делать не стоит. В этой статье буду проводить много аналогий со строительной тематикой и причиной тому небезызвестная история: «Если бы программисты строили дома».

Из чего строить? 

Тут как бы все просто, но не всегда явно. Как говорится, давайте разбираться. Суперновые технологии с прорывными идеями сразу мимо. Вы меня спросите почему?  Так давайте пофантазируем на тему того, что вы взяли их в проект: через года полтора сам проект не получил поддержки сообщества, а его создатель забил на него. Вы остались с нерелевантным стеком, отсутствием возможности найти разработчиков для создания кода и дальнейшей поддержки проекта.  Нет обновлений, читай через два года у вас на руках старая коричневая субстанция. 

Посмотрим и на обратную сторону медали: беря сверхнадежное решение, которому много лет, вы обрекаете проект на скорый апдейт или умирание. Знавал я одну крупную компанию, которая использовала java 8. Мотивация звучала так: она надежна как швейцарский нож.  На минуточку, на дворе 2021 год и она устарела не только морально, но и технически (на момент написания, актуальной версией является java 17). 

Исходя из рассказанного делаем вывод, что выбирать следует нечто среднее: не новинку и не проверенный олдскул. Оптимальным выбором станет инструмент, имеющий 3-5 релизов, в зависимости от их частоты. Это смоук-тест на то, что создатель не забросил свое творение, старается его развивать и совершенствовать.  Если стек хорош, то за время выпуска релизов он обзаведется нормальной документацией, а быть может и комьюнити.  Как следствие, вам смогут помочь с вопросами. 

Будучи front-end`ами мы располагаем значительным многообразием стандартов и синтаксического сахара. Предлагаю брать за основу актуальный на сегодня ES, добавляя поверх TS.  Стандарт TS поможет с типизацией, спасающей от глупых ошибок, и с сокращением времени поиска по коду, если возникнет потребность. А сейчас на минуту отвлечёмся и займёмся поимкой поклонников Dart, пока они не завели любимую песню: «будущее уже наступило». Эти речи слышу с 2015 года, а реальность до сих пор отличается, и будет отличаться пока один из основных средств разработки фронта не переедет на него.

С фундаментом определились, кирпич выбрали, очередь за раствором.  Ох, какая ж тут конкуренция: тот самый случай, когда чем меньше, тем лучше! Чем больше зависимостей, тем больше рисков деградации “инструмента”, а также конфликтов, которые будут порождены. Хотя если без этого обойтись невозможно, рекомендую использовать те же правила выбора зависимостей, что и для Фреймворка.

Вангую: сейчас спросите про всякие обертки, типа ionic и ему подобных. Сразу скажу, что считаю это решением: “херак-херак и в продакшен”. Они работают медленнее, чем нативные приложения, и на выходе дают гораздо больше косяков, связанных с особенностью окружения.  На длительной дистанции это почти 100% выстрел в собственную ногу, поэтому категорически против.

Как строить? 

История зафиксировала множество случаев, когда, используя лучшие материалы, инженерные просчеты пустили все труды по причинному месту. Front-end не исключение: мало брать лучшее, надо еще уметь этим пользоваться.  

Всегда начинайте с понимания концепции приложения:

·         что оно будет делать?

·         для чего оно создаётся?

·         кто будет им пользоваться?

·         в каких условиях его будут использовать?

Чем больше вы соберете вводной информации, тем лучше. Вижу немой вопрос в ваших глазах: “Зачем?!”. Это из ряда: «Я разработчик, у меня есть ТЗ, по которому и работаю». На деле не совсем так, достаточно сравнить две ситуации: вы делаете документооборот исключительно для внутренних нужд банка, и, вы разрабатываете коробочное решение для массового рынка. Если есть возражения, предлагаю обсудить в комментариях.

Когда разберётесь с тем, для кого вы это делаете, и с какой целью, предлагаю заняться сбором информации для таблицы критериев с весовыми коэффициентными значениями.  Рассказываю, что в себя включает: перечень функционала, который должен быть, технические требования к проекту и коэффициент (насколько они важны для проекта). Действия простые, а на выходе получаете черновой вариант дорожной карты.  На основании этого эскиза, Вы уже сможете делать итоговый чертеж своего будущего Зиккурата.

Хотите удивлю? Даже имея чертеж, вы не выстроите свою твердыню. Вам, как минимум, потребуются технологии и методики. В нашем случае это prettier, линтер, и прочие правила стандартизации работы бригады. Помните, состав команды меняется, а документация остаётся, и ей обязательно следовать так же, как и технике безопасности. Они обе написаны кровью. 

Имея документацию на руках, первым делом следует её изучить. Да-да, даже если вы сами её написали. Прочтите с точки зрения человека, который видит её впервые. Если вы хоть раз видели план любого дома, то наверняка обратили внимание на раздел со служебной информацией. В нём содержатся данные где должен находиться сан. узел, проводка и прочее. Тот же принцип работает во front-end: вы должны понимать, что где находится и как взаимодействует.

Все видели на просторах интернета фото с унитазом на кухне? Если Вы не преследуете схожих целей, стоит в самом начале всё логически разнести по отдельным модулям.  Сперва создайте слой абстракции для работы с API, выставлением кук и прочей служебной бизнес логики. Представьте себе, что это подсобное помещение в частном доме и вынесите туда все коммуникации: управление светом, котельной, водой и прочим. 

Раковину используют, чтобы мыть посуду, никто не предпримет попытки уснуть в ней целиком (ваш кот не в счёт). Вот и компоненты на фронте должны быть максимально “глупыми”: заточенными под что-то одно. Если это модалка, то она должна показывать, что в неё что-то передали, и всё. Никаких проверок и дополнительных условий. В вашем арсенале есть сервисы, вот их и используйте.

В строительстве используют термин проверка качества. Например, сперва отливается 5-10 кубиков размером 15*15 см из каждого миксера, который приехал на заливку фундамента. Если в каком-то кубике появится трещина, всегда остаётся возможность определить и проверить бетон, привезённый конкретной фурой. В нашей профессии действует тот же принцип: нам тоже нужны тесты, для поддержания качества кода. Как вы знаете тесты могут быть не только на работоспособность, но и на производительность. 

Чего делать не стоит?

Главное, не старайтесь сделать что-то универсальное. Это касается как приложения, так и компонентов.

Истина вполне себе прописная: совмещение кухни и гостиной допустимы, а вот кухни и уборной - уже дурной тон. Вам требуется вывести в компоненте два разных шаблона вывода текста? Это допустимо. Если же Вы засовываете в компонент проверки или что-то ещё, то такие действия начинают дурно пахнуть. Вы доведёте ситуацию до того, что компонент будет перегружен и, как итог, пропадёт возможность его использовать, так как потребуется целая петиция, которая заставить его работать.  Лучше создайте отдельный компонент, который будет реализовывать заданный сценарий, чем скрещивайте ежа с носорогом. При наличии документации большое количество компонентов некритично, а вот непонимание кода и взаимодействия с компонентом да.

Не пренебрегайте правилами и не делайте исключений. Единожды сказав: «И так сойдет», оглянуться не успеете как доведёте проект до смерти, повторением таких исключений. 

Прежде чем что-то делать, задайте как можно больше вопросов: зачем; что это нам даст; как это следует реализовать?  Существует забавная практика «5W», в своё время её придумала компания Toyota. Принцип прост: чтобы обнаружить проблему, следует пять раз задать вопрос «Почему?». Если пять раз получить ответ на вопрос «Почему?», то причина проблемы и метод ее решения станут очевидны. Решение (или «Как?») обозначается как 1H. Таким образом, пять «Почему?» равны одному «Как?» (5W = 1H).  Придерживаясь такого алгоритма, вы поймете проблему.

Итоги

Подводя итог, предлагаю придерживаться здравого скептицизма. Если к вам пришел бизнес со словами: «У нас ж*па!», не спешите её исправлять. Возможно, проблема не в коде, а в его восприятии. На эту тему есть забавный анекдот:

«Сидят два железнодорожника - молодой и бывалый. Идёт им команда передвинуть вагоны на такой-то путь. Молодой подрывается. Бывалый ему:

- Сиди!

Дальше сидят, снова идёт им команда, передвинуть вагоны на другой путь. Молодой опять подрывается. Бывалый ему:

- Сиди!

Так сидели, было ещё несколько команд и последняя поставить вагоны туда же, где они стоят.

Бывалый говорит молодому:

- Вот видишь, что значит опыт!»

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

P.S. 

Мой опыт может отличаться от вашего. Не устану повторять: сначала думаем, потом делаем.  Помните: фронт должен быть ленив, он должен делать только то, что приводит к положительному результату. Цель этой статьи не заниматься вашим поучением, а лишь поделиться тем опытом, который у меня накопился.

Комментарии (11)


  1. MAXH0
    31.10.2021 17:30
    +1

    Программиста спросили >>"как построить Зиккурат?"

    Он << "Нужно больше золота!!!"


  1. nikweter
    31.10.2021 18:02
    +1

    Вот только это не анекдот, а «Фитиль». Все остальное в статье, похоже, также намешано и перепутано.


    1. Evil_Evis Автор
      31.10.2021 18:32
      +1

      Ну раз, фитиль то это все меняет. На самом деле фитиль всего лишь визуализация, анекдотов того времени. Насчет мешанина, то прошу от вас план как бы вы сделали. Или что вам не понятно, могу разъяснить.


  1. MFilonen2
    31.10.2021 18:53
    +2

    Видел немало систем, которые создавались «на века». А что в итоге? В лучшем случае – рабочее приложение с недружелюбным по современным меркам интерфейсом и багами, которые не чинят годами.
    Наглядный пример этого – старая часть винды, которая, как по мне, и стала причиной массового оттока на смартфоны. Даже в 11 версии они не закончили перенос настроек в новый интерфейс, в реестре нет поиска, слышал и про проблему корявых шрифтов на высоких разрешениях в старых приложениях.
    Особняком стоят программы вроде командных утилит юникса. Но и они постоянно дописываются, не знаю, сколько от первоначального кода осталось в том же виме.
    А ведь есть еще и программы, которые были хороши, но протухли из-за платформы, под которую создавались, всякий WP, WM, мейнфрейм-софт. Тут вообще у разработчиков не было и шанса…


    1. Evil_Evis Автор
      31.10.2021 19:09

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


    1. little-brother
      31.10.2021 23:03

      стала причиной массового оттока

      Скорее причиной оттока стало то, что потребление контента удобнее с телефона, который всегда под рукой, нежели промахи интерфейса. Даже планшеты проиграли телефонам.


      1. MFilonen2
        31.10.2021 23:54

        «Потребление контента» именно в том виде, как сейчас это происходит – это феномен как раз эры смартфонов. Вспоминаем нулевые – форумы, ранние соцсети, всё это были «клубы по интересам», а интересы пользователя концентрировались внутри этих клубов.
        Для участия в таком вот клубе недостаточно было листать ленту. А культ съемки на телефон – вообще вещь недавняя, ещё в 2014-2015 инстаграм был соцсетью для фоток еды. В дальнейшем производители (Apple в первую очередь) провели огромные вложения в раскрутку такого способа развлечения.
        Устройство определяет способ работы, а не способ работы устройство. Планшеты же всегда пытались имитировать смартфонную парадигму использования, да и доступны стали на несколько лет позже, они не могли победить.


      1. MFilonen2
        01.11.2021 00:15

        Кстати говоря, промахи интерфейса – это очень, очень малая часть проблемы. Приложения стоили в разы дороже, пиратство процветало, крякнутый (а иногда и нет) софт нёс в себе всякие тулбары и модификаторы браузеров, вредоносы в пару раз понижали производительность и скорость интернета. Проблемы с драйверами, невозможность обновится без удаления всех данных (и необходимость переустановки винды со стиранием данных, чтобы быстрее работало или какую-то проблему решить), банальные задачи выполняются дорогими сторонними программами, всякие ключи безопасности на 1 ПК, перечислять можно бесконечно.
        Я не говорю даже про Internet Explorer, который тогда у большинства стоял.
        Конечно, всего этого можно было избежать, но даже глючные и медленные первые смартфоны были в РАЗЫ дружелюбнее тогдашних (а во многом и современных) ПК.


      1. DaneSoul
        01.11.2021 04:00

        Даже планшеты проиграли телефонам.
        Тут скорей логичней говорить о слиянии этих двух сущностей в современные 6,5" «лопатофоны» с экраном на всю лицевую площадь, то есть устройства промежуточного формата между старыми смартфонами с экранами в 4-5" и старыми 7-8" планшетами.


  1. flancer
    01.11.2021 08:21

    Главное, не старайтесь сделать что-то универсальное. Это касается как приложения, так и компонентов.

    и рекомендаций "как правильно делать фронтенд"? ;) В целом - здраво, позеленил.


    1. Evil_Evis Автор
      01.11.2021 10:18

      Опыт у всех разный. я поделился как я вижу магию. Но это не означает что других путей нету.