Следует ли вам использовать библиотеку, когда вы можете выполнить задачу без нее? [закрыто]

33

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

Стоит ли в любом случае выбрать библиотеку в этой ситуации (например, ради лучшего качества кода?)

Биллаль Бегерадж
источник
3
Как вы измеряете «качество». По количеству строк кода? Классы? Сложность? Ремонтопригодность? Упругость?
Laiv
3
Ответ НЕТ, независимо от того, что вы считаете качеством или нет. Но если вы предоставите нам свое представление о качестве, в ответах будет рассмотрено их обоснование, чтобы объяснить, почему количество библиотек не улучшает то, что вы считаете качеством. Это просто вопрос прецессии. Как сейчас, просто НЕТ ответит на вопрос без необходимости объяснения.
Laiv
4
Не прямой ответ на ваш вопрос, но идея о том, что «это число» неизбежно гарантирует «лучшее качество», бросает вызов признанию трудностей, связанных с повышением качества кода. Там нет быстрого решения для обеспечения качества. Если бы было, проблема не существовала бы. Любой, кто заявляет, что некий простой подход является универсальным решением, либо (в лучшем случае) чрезмерно обобщает, либо (в худшем случае) выдвигает свою ошибочную идею как правду.
Флейтер
3
Что заставляет вас думать, что использование библиотеки повысит качество кода?
Прекратить причинять вред Монике
1
Голосовали за закрытие, потому что вопрос, кажется, был значительно переформулирован, а верхние ответы отвечают на старую версию ... лучше повторно опубликовать вопрос, поскольку он теперь стоит сам по себе (плюс добавьте детали, чтобы избежать "слишком досок" "голоса) ...
AnoE

Ответы:

54

Как инженер, возможно, уместно думать об этом как о проблеме оптимизации. Естественно, у нас должна быть цель оптимизации . Распространенным в такой ситуации будет минимизация совокупной стоимости владения .

Если вы считаете, что добавление стороннего компонента в долгосрочной перспективе сэкономит средства, его следует использовать. Если вы этого не сделаете, вы не должны. Убедитесь, что вы учитываете стоимость текущего обслуживания (например, когда выпускается новая версия O / S, или обнаруживается уязвимость системы безопасности, или выпускается какая-то новая спецификация W3C).

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

Есть и другие цели, которые следует учитывать (например, риск), но TCO является большой.

Джон Ву
источник
1
Я думаю, что этот ответ нуждается в большем количестве голосов. - Долгосрочная надежность с библиотеками может быть огромной проблемой. И даже если библиотека существует, кто знает, изменится ли API? Библиотеки просты в краткосрочной перспективе, но могут вызвать проблемы в долгосрочной перспективе. (Примечание: библиотеки как исходный код смягчают некоторые проблемы.)
DetlevCM
6
@DetlevCM В ответе также говорится, что он может очень легко пойти наоборот. К нетривиальным библиотекам будут прилагаться затраты на обслуживание, которые вы, как пользователь библиотеки, не должны платить, и, возможно, не сможете заплатить, если придется (т.е. если вы являетесь владельцем библиотеки).
Cubic
Я согласен, но не забывайте также учитывать стоимость библиотеки - ошибки, изменения дизайна вне вашего контроля и кучу кода, который вы не используете просто для того, чтобы добавить одну функцию. Кроме того, библиотека часто не так выразительна, как ваше решение для данной проблемы. ТАКЖЕ вы не можете отладить внешнюю библиотеку так же легко, и если вы это сделаете, вам придется иметь дело с другими проблемами слияния позже. Не просто предполагайте, что решение для библиотеки является более легким, учитывайте все факторы и не бойтесь кодировать собственное решение, если библиотека не совсем подходит!
Билл К
36

Билл Гейтс однажды сказал:

«Измерение прогресса в программировании с помощью строк кода похоже на измерение прогресса в самолетостроении по весу».

Эта цитата приходит на ум, потому что то же самое можно сказать и о количестве библиотек. Как правило, я не использую библиотеки, если:

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

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

Удачи!

Нил
источник
4
@BillalBegueradj Значительная цитата, да. Адекватного нет. Мы не говорим о прогрессе, мы говорим о качестве программного обеспечения, и строки кода имеют очень сильную корреляцию с количеством найденных дефектов. См. Статью «Смешивающее влияние размера класса на достоверность объектно-ориентированных метрик», в которой показано, что все остальные метрики не имеют прогнозирующей силы при обнаружении дефектов после корректировки с помощью LOC, что означает, что LOC является лучшим предиктором для дефектов (или был в то время: 2001). И, кстати, научная статья бьет известную цитату.
Theraot
5
@Theraot Вы предлагаете, так как количество строк определяет количество дефектов, что большие программы имеют худшее качество кода, чем меньшие программы? Я не согласен с вашей метрикой, извините. Кроме того, если цитата действительно беспокоит вас, не стесняйтесь игнорировать.
Нил
3
@ Не ясно, количество строк не определяет количество дефектов, оно имеет сильную корреляцию с количеством найденных дефектов. Это легко понять: чем больше код, тем больше возможностей для появления дефектов. Конечно, количество дефектов уменьшится после того, как они будут найдены и исправлены. Это всего лишь корреляция в конце концов. Приложение: LOC превосходит многие распространенные метрики, подробности см. В документе.
Theraot
5
@Theraot Мой аргумент не был с соотношением дефектов к количеству строк. Мой аргумент был с большим количеством дефектов, приравнивающих к плохому качеству кода. Chrome имел свою долю дефектов на протяжении многих лет, но я бы поспорил законность любого утверждения, которое предполагает, что оно написано хуже, чем плохо написанный 10-строчный плагин jQuery на github.
Нил
3
@Theraot "научная статья бьет знаменитую цитату." - Похоже, ваша газета на самом деле поддерживает цитату, а не бьет ее ...
npostavs
14

(Примечание. Первоначальный вопрос был следующим: улучшает ли количество библиотек качество кода?)

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

Что люди имеют в виду, когда они рекомендуют повторное использование поверх roll-your-own, так это то, что код в известной библиотеке, вероятно, является более правильным, эффективным и / или пригодным для использования, чем тот, который вы сами придумали, просто потому, что авторы потратили гораздо больше времени на одну конкретную область функциональности, которую вы можете себе позволить (с вашим крайним сроком для всего проекта).

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

Килиан Фот
источник
4

Хотя использование правильных библиотек может сэкономить вам много работы, существует также много скрытых затрат:

  • Библиотеки должны быть в курсе. Вам необходимо регулярно проверять наличие обновлений (которые могут иметь отношение к безопасности!) И применять их. Каждое обновление библиотеки может потенциально что-то сломать в вашем приложении. Это означает, что после этого вам необходимо выполнить полный интеграционный тест. Таким образом, каждая библиотека, от которой зависит ваш проект, увеличивает затраты на длительное обслуживание.
  • Некоторые библиотеки Javascript настолько мощны и используют такие уникальные шаблоны, что люди начинают воспринимать их как отдельные технические области знаний. Таким образом, каждая добавленная вами дополнительная библиотека может отпугнуть разработчиков, которые не чувствуют уверенного редактирования кода, опирающегося на среду, с которой они не знакомы. Поиск новых программистов, знакомых со всеми используемыми вами библиотеками, может стать сложной задачей.
  • Добавление библиотеки на ваш сайт увеличивает время загрузки, потому что пользователь должен загрузить всю библиотеку, даже если вы используете только небольшую ее часть. Некоторые популярные библиотеки позволяют загружать пользовательские сборки только с функциональностью вам нужно, но даже тогда вы, как правило , по- прежнему включают в себя много кода , который никогда не будет работать (или даже хуже: код , который делает работать, но ничего полезного не делают, потому что он просто подготавливает структуры данных для функций, которые вы не используете).

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

Philipp
источник
И повторите этот анализ, когда у вас действительно есть реальные данные. Возможно, вы недооценили стоимость / переоценили выгоду, или ситуация могла измениться.
Дедупликатор
1

Это не должно быть двоичным решением: либо используйте только библиотеку OSS, либо запрограммируйте новое решение с нуля. Другим вариантом может быть повторное использование частей библиотеки, если лицензия позволяет это.

Например, в моей области (числовое программное обеспечение) библиотека может иметь прекрасные основные модули и некоторые специализированные модули, которые меня устраивают только на 80%. Поэтому я бы использовал основные модули и написал обертку для специализированных модулей. Или я могу разработать свои собственные специализированные модули, используя дизайн и код модулей OSS. Самые сложные, алгоритмические биты обычно используются повторно, только с измененным кодом скаффолдинга. Я также могу убрать часть исходного кода. Это оказалось хорошим опытом обучения и экономит время по сравнению с разработкой с нуля.

Tupolev._
источник
0

Если кто-то уже сделал работу за вас, конечно, вы должны использовать ее.

Исключением из правил является JavaScript. Там, где они импортировали дюжину других библиотек (конечно, устаревшие версии), чтобы добавить языковые функции, которые они хотят использовать, а затем сделали всю работу за вас.

Выберите свою структуру и оставайтесь в ней. Если библиотека работает с вашим фреймворком или просто js, хорошо. Но если для этого нужна другая структура, ищите другой вариант.

Ewan
источник
4
Здесь много поклонников javascript
FCin
0

Библиотеки и когда их использовать - сложное решение.

С одной стороны, вы хорошо протестировали, почти стандартные вещи (в моей области, например, FFTW попадает в эту категорию, или что-то вроде libsndfile), которые, как правило, признаны просто работающими, и были стандартными вещами в течение последних 20 лет, которые все используют.

С другой стороны, у вас есть случайные вещи из github, без набора тестов и только с одним сопровождающим, обычно зачем?

Кислотный тест для меня - это, во-первых, вписывается ли библиотека в мою архитектуру (иногда, если вы знаете, что хотите использовать определенную библиотеку, вы в конечном итоге разрабатываете ее), и я думаю, что я собираюсь завершить отладку чьего-либо другого кода библиотеки ? Хороший прокси для второго вопроса: «Есть ли автоматизированный набор тестов и какова документация?».

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

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

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

Решения, Решения ....

Дэн Миллс
источник