Сталкивались ли вы когда-нибудь с проблемой выбора: использовать существующую библиотеку или написать код самому? Я никогда не понимал этого вопроса и всегда отдавал предпочтение уже готовому решению. Однако недавно на работе опять возникла эта дилемма, мы как всегда немного поспорили, но на этот раз при принятии решения у меня все таки закрались сомнения. О плюсах и минусах каждого подхода читайте под катом.
Нет никаких сомнений, что взяв уже существующую библиотеку, разработка основного функционала будет закончена намного быстрее. Разработчик будет концентрироваться на именно функционале, а не инфраструктуре и т.д.
Библиотеки обычно пишутся довольно универсально с прицелом на решение множества различных задач. Поэтому их код довольно громоздок для понимания и вряд ли является самым оптимальным для решения вашей конкретной задачи. В случае же вашего собственного решения, вы напишите его самым оптимальным способом и будете его затачивать именно под ваш конкретный use case.
В случае с библиотекой вы имеете решение оттестированное множеством пользователей. Если же вы все таки найдете ошибку, то достаточно ввести текст сообщения в Google, и вы сразу поймете, что именно делаете неправильно. С другой стороны, если с этой ошибкой никто не сталкивался, или она просто на столько очевидна, что о ней никто не пишет, то тут вы можете потратить уйму времени, чтобы разобраться почему что-то не работает. Ведь код библиотеки может быть довольно громоздким и запутанным. Вот прекрасный пример, чем может обернуться такая библиотека. Тем более его писали не вы, так что придется долго разбираться в чужом коде, а для этого нужен особый навык. Хорошо если библиотека с открытым кодом, иначе общение с поддержкой может еще удлинить поиск ошибки. Если же вы писали весь код сами, то вы знаете его вдоль и поперек, и найти там ошибку будет проще простого. Вот только ошибок, там скорее всего будет значительно больше, так как тестировали этот код только вы. Еще если вы пишете код с нуля, то есть вероятность, что вы упустите из вида какой-нибудь редкий случай, который в библиотеке со временем уже выявили и закодили.
Тут есть два аспекта. Во-первых, когда к вам в команду приходит новый человек, то есть вероятность, что он уже работал с технологией, которую вы используете как библиотеку (либо вы сразу нанимаете человека с условием, что он имеет релевантный опыт). Если же вы используете своё собственное решение, то новому сотруднику придется разбираться в деталях, как оно работает. Во-вторых, написать самому код, который обычно пишется в библиотеках, весьма не простая задача. Тут нужен высококвалифицированный специалист, или все остальные преимущества собственного решение сведутся на нет, если код будет написан пионером.
Подведем итог плюсов и минусов каждого подхода:
Библиотека
Собственная разработка
Ваши комментарии — очень welcome. Было бы интересно услышать, на что еще нужно обратить внимание при принятии решения.
Скорость и качество разработки
Нет никаких сомнений, что взяв уже существующую библиотеку, разработка основного функционала будет закончена намного быстрее. Разработчик будет концентрироваться на именно функционале, а не инфраструктуре и т.д.
Оптимальность решения
Библиотеки обычно пишутся довольно универсально с прицелом на решение множества различных задач. Поэтому их код довольно громоздок для понимания и вряд ли является самым оптимальным для решения вашей конкретной задачи. В случае же вашего собственного решения, вы напишите его самым оптимальным способом и будете его затачивать именно под ваш конкретный use case.
Баги
В случае с библиотекой вы имеете решение оттестированное множеством пользователей. Если же вы все таки найдете ошибку, то достаточно ввести текст сообщения в Google, и вы сразу поймете, что именно делаете неправильно. С другой стороны, если с этой ошибкой никто не сталкивался, или она просто на столько очевидна, что о ней никто не пишет, то тут вы можете потратить уйму времени, чтобы разобраться почему что-то не работает. Ведь код библиотеки может быть довольно громоздким и запутанным. Вот прекрасный пример, чем может обернуться такая библиотека. Тем более его писали не вы, так что придется долго разбираться в чужом коде, а для этого нужен особый навык. Хорошо если библиотека с открытым кодом, иначе общение с поддержкой может еще удлинить поиск ошибки. Если же вы писали весь код сами, то вы знаете его вдоль и поперек, и найти там ошибку будет проще простого. Вот только ошибок, там скорее всего будет значительно больше, так как тестировали этот код только вы. Еще если вы пишете код с нуля, то есть вероятность, что вы упустите из вида какой-нибудь редкий случай, который в библиотеке со временем уже выявили и закодили.
Команда
Тут есть два аспекта. Во-первых, когда к вам в команду приходит новый человек, то есть вероятность, что он уже работал с технологией, которую вы используете как библиотеку (либо вы сразу нанимаете человека с условием, что он имеет релевантный опыт). Если же вы используете своё собственное решение, то новому сотруднику придется разбираться в деталях, как оно работает. Во-вторых, написать самому код, который обычно пишется в библиотеках, весьма не простая задача. Тут нужен высококвалифицированный специалист, или все остальные преимущества собственного решение сведутся на нет, если код будет написан пионером.
Подведем итог плюсов и минусов каждого подхода:
Библиотека
- + Быстрая разработка
- + Код оттестированный огромным количеством пользователей
- + Люди приходящие в команду знают как он работает
- + Решает проблемы, которые вы возможно не предвидели бы, реализую библиотеку самостоятельно
- + Программист концентрируется на функционале, а не на вспомогательной библиотеке
- — Очень много классов, довольно сложная общая архитектура, поэтому тяжело разбираться в возникающих ошибках
- — Возможно не делает какую-то очень специфичную штуку, которая была бы вам очень полезна для вашей конкретной задачи, поэтому вы используете немного другую штуку
- — Не может решить вашу конкретную задачу самым оптимальным способом, так как внутри содержит кучу оберток и флагов для других задач
- — При самостоятельно патчинге библиотеки могут возникнуть проблемы с будущим обновлением версии
Собственная разработка
- + Члены команды знают как все работает в деталях (пока не уйдут из команды)
- + Легко определятся причина ошибки, так как написанный код минимален
- + Максимально производительное решение
- + Возможность развития библиотеки в нужном вам направлении
- — Требуется высококвалифицированный разработчик для написания хорошей библиотеки
- — Длительная разработка
- — Содержит достаточное количество ошибок, особенно на стадии внедрения
- — Новые люди в команде не знают как оно работает
Ваши комментарии — очень welcome. Было бы интересно услышать, на что еще нужно обратить внимание при принятии решения.