Автор оригинала: Bill Sourour.
Инструменты, библиотеки и рамки, которые мы используем для создания наших веб-приложений, сегодня резко отличаются от тех, которые мы использовали всего несколько лет назад.
Через несколько лет больше, большинство этих технологий значительно изменится. Тем не менее, многие из нас делают эти центральные, неразрывные части наших приложений.
Мы импортируем, используем и наследую от ароматизатора в месячных рамки, как если бы они все будут вокруг и без изменений навсегда. Ну … они нет. И это проблема.
После 20 лет разработки, проектирования и архитектуры веб-приложений я пришел, чтобы оценить две важные истины:
- Внешние зависимости представляют большую угрозу для долгосрочной стабильности и жизнеспособности любого применения.
- Все более сложно – если не невозможно – построить любое нетривиальное приложение без использования внешних зависимостей.
Эта статья о том, чтобы отказаться от этих двух истин, чтобы наши приложения имеют наибольшую возможность долгосрочной выживания.
Кролик дыра очень глубокая.
Если мы начнем думать обо всех вещах, которые наши веб-приложения зависят от того, что легко думать о дюжине или больше, прежде чем мы даже добраться до кода:
- Власть
- Соединение
- Межсетевой экран
- Днс
- Серверное оборудование (CPU, диск, RAM, …)
- Охлаждение
- Платформа виртуализации
- Контейнерная платформа
- Операционная система
- Платформа веб-сервера
- Платформа приложений сервера
- Веб-браузер
Как разработчики, хорошо, чтобы быть в курсе этих вещей, но часто не так много, мы можем сделать с ними. Итак, давайте игнорируем их сейчас и поговорим только о коде.
В коде есть три вида зависимостей:
1. Зависимости, которые мы контролируем
Это код, написанный и принадлежащий нами или нашей организацией.
2. Зависимости мы не контролируем
Это код, написанный сторонним поставщиком или программным сообществом с открытым исходным кодом.
3. Зависимости после удаления
Это кодовые зависимости наши сторонние кодовые зависимости зависят от. (Скажи, что три раза быстрее!)
Мы собираемся говорить в основном о зависимости Мы не контролируем Отказ
Зависимости, которые мы контролируем и зависимости после удаления Может еще может вызвать головные боли, но в случае зависимостей мы контролируем, мы должны иметь возможность напрямую вмешаться и смягчить любые проблемы.
В случае зависимости после удаления мы можем обычно полагаться на сторонне, чтобы позаботиться об этом для нас, так как они также зависят от них.
Почему сторонние кодовые зависимости являются хорошими
Большая часть вашего веб-приложения существует для решения распространенных проблем: аутентификация, авторизация, доступ к данным, обработке ошибок, навигация, ведение журнала, шифрование, отображение списка элементов, подтверждающих входов формы и т. Д.
Независимо от того, какой технологический стек вы используете, есть хороший шанс, что общие решения этих проблем существуют, и доступны в качестве библиотек, которые вы можете легко приобретать и подключаться к вашей кодовой базе. Писать любой из этих вещей полностью с нуля, как правило, пустая трата времени.
Вы хотите сосредоточиться на коде, который либо решает необычную проблему, либо решает общую проблему неоческовым образом. Это то, что делает ваше приложение ценно: код, который реализует бизнес-правила, которые уникальны только для вашего приложения – «секретный соус».
Алгоритм поиска Google и Algorithm, Фейсбука Facebook Фильтрация, Netflix «Рекомендуется для вас» раздел и алгоритмы сжатия данных – код за всеми этими функциями – «секретный соус».
Сторонний код – в виде библиотек – позволяет быстро реализовать эти коммодитированные функции вашего приложения, чтобы вы могли оставаться сосредоточенными на вашем «секретном соусе».
Почему сторонние кодовые зависимости плохие
Взгляните на любое нетривиальное веб-приложение, построенное за последние пару лет, и вы будете абсолютно поражены суммой кода, который фактически приходит из сторонней библиотеки. Что если один или несколько из этих сторонних библиотек Изменения резко или исчезает или разрывы ?
Если это открытый источник, возможно, вы можете исправить это самостоятельно. Но насколько хорошо вы понимаете весь код в этой библиотеке, у вас нет? Большая причина, по которой вы используете библиотеку в первую очередь, состоит в том, чтобы получить преимущества кода без необходимости беспокоиться обо всех деталях. Но теперь ты застрял. Вы полностью завязали свои условия этих зависимостей, которые у вас нет и не контролируют.
Возможно, вы думаете, что я преувеличиваю, или говорю с чисто академической точки зрения. Позвольте мне уверять вас – у меня есть десятки примеров клиентов, которые полностью схватили себя, путем встраивания стороннего кода слишком плотно в их приложение. Вот только один недавний пример …
Бывший клиент моего построил свое приложение, используя поставщик BackeND-AS-A-A-A-Service, принадлежащий Facebook, называемый Разбор Отказ Они использовали клиентскую библиотеку JavaScript, предоставленную разбом, чтобы потреблять службу разбора. В процессе они тесно связаны весь их код, включая код «секретный соус» – к этой библиотеке.
Через три месяца после начального запуска продукта моего клиента – так же, как они начали получать хорошее сцепление с реальными, уплатив клиентов – Parse объявил, что он закрыл.
Теперь вместо того, чтобы сосредоточиться на итерации на их продукт и выращивая их клиентскую базу, мой клиент должен был выяснить, как либо мигрировать на самоуверенную, версию разбора с открытым исходным кодом или полностью заменить аналог.
Срывание этого, вызванное молодому, удалению приложения, было настолько огромным, что мой клиент в конечном итоге полностью утилизировал приложение.
Балансировка хорошего и плохого
Несколько лет назад мой Go-to Solution для преодоления рисков при сохранении преимуществ сторонних библиотек было обернуть их с использованием Шаблон адаптера Отказ
По сути, вы завершаете третий код в классе адаптера или модуль, который вы написали. Затем это работает, чтобы разоблачить функции библиотек сторонников таким образом, чтобы вы контролируете.
Используя этот шаблон, если сторонняя библиотека или структура изменяется или уходит, вам нужно только исправить немного адаптера. Остальная часть вашего приложения остается неповрежденным.
Это звучит хорошо на бумаге. Когда у вас есть самостоятельные зависимости, которые обеспечивают только несколько функций, это сделает трюк. Но все могут быть уродливы быстро.
Можете ли вы представить, чтобы обернуть всю библиотеку RACT (включая JSX) перед использованием любого из него? Как насчет обертывания jQuery или угловых, или весенних рамок в Java? Это быстро становится кошмаром.
В эти дни я рекомендую более нюшенный подход …
Для каждой зависимости вы хотите добавить в свою кодовую базу, оцените уровень риска, который он введет путем умножения двух факторов:
- Вероятность того, что зависимость отменится материально.
- Количество повреждений. Изменение материала к зависимости сделает с вашим применением.
Сторонняя библиотека или рамки – это менее вероятно Чтобы изменить, когда некоторые или все следующие вещи верны:
- Это было около нескольких лет и имело несколько крупных релизов.
- Он широко используется многими коммерческими приложениями.
- Он обладает активной поддержкой большой организации – предпочтительно домашнего названия компании или учреждения.
Сторонняя библиотека или рамки сделают меньше ущерба к вашей заявке, когда некоторые или все следующие вещи верны:
- Он используется только небольшим порцией вашего приложения, а не используется во всем.
- Кодекс, который зависит от этого не является частью этого «секретного соуса», о котором я говорил ранее.
- Удаление требует минимальных изменений в вашей кодовой базе.
- Все ваше приложение очень мало и может быть переписано быстро. (Будьте осторожны с этим – это редко верно в течение очень длительного.)
Рискуестрее что-то есть, тем более вероятно, что вы должны быть обернуть его или избежать его вообще.
Когда дело доходит до кода, который действительно является центральным в целесообразном предложении вашего приложения – Ваша «Секретный соус» – вам нужно чрезвычайно защищать его. Сделайте этот код как можно более независимым. Если вам абсолютно необходимо использовать зависимость, рассмотрите возможность вводить его, а не напрямую ссылаться на него. Даже тогда будь осторожен.
Иногда это означает, что «нет» сторонней библиотеке, которую вы считаете действительно крутой, или что вы действительно хотите использовать по одной причине или иной. Быть сильным. Поверьте мне, это окупится. Просто спросите всех этих людей, которые сильно инвестировали в самый первый выпуск угловой, или мой бывший клиент, который использовал разбор повсюду. Это не весело. Поверьте мне.
Говоря о веселье, посмотрите на это …
Изображение выше является графиком зависимости для приложения, называемого Tinytag Explorer.
Генерация графика зависимости для ваших существующих приложений является отличным способом понять уровень риска, внедряемый вашими зависимостями. Я собрал список бесплатных инструментов для генерации графов, аналогичных вышеупомянутым в различных языках, включая JavaScript, C #, Java, PHP и Python. Вы можете получить это здесь Отказ
Помоги мне помочь другим
Я хочу помочь столь же разработчикам, как я могу поделиться своими знаниями и опытом с ними. Пожалуйста, помогите мне, нажав кнопку ❤ Рекомендовать (зеленое сердце) ниже.
Наконец, не забудьте схватить свой список генераторов графика свободных зависимостей здесь Отказ
Оригинал: “https://www.freecodecamp.org/news/code-dependencies-are-the-devil-35ed28b556d/”