Они не такие страшные, как кажутся

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

Если тестирование в промежуточной стадии пройдет успешно, вы можете двигаться вперед и развернуть его в рабочей среде, но готова ли эта функция к выпуску для пользователей? Может да может нет. Может быть, кому-то нужно сначала одобрить его, может быть, кому-то еще нужно сначала его протестировать. Теперь вы не можете развернуть свою основную ветку, пока не получите зеленый свет, и, возможно, другие разработчики не смогут развернуть свои изменения (надеюсь, не исправление!).

Это происходит, если тестирование в staging прошло хорошо… но если тестирование прошло не очень хорошо, вы не хотите развертывать этот код, поэтому вам нужно откатить его, создать новую ветку и начать заново…

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

Что такое флаги функций?

Флаги функций (или переключатели функций) — это метод, который позволяет поэтапно писать и развертывать незавершенный код и выпускать его для пользователей только тогда, когда функция полностью готова.

Думайте о флагах функций как о переменной, которая содержит значение «истина» или «ложь» и указывает, доступен ли фрагмент кода (функция) пользователям или нет. Флаги функций так просты по своей сути.

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

Как я могу начать их использовать?

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

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

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

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

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

Конечно, вы можете построить это, но уже есть альтернативы, которые решают эти (и многие другие) проблемы.

Какие услуги я могу использовать?

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

LaunchDarkly
LaunchDarkly — один из самых популярных инструментов, именно его я и выбрал. Он предоставляет очень простой пользовательский интерфейс для управления функциями в различных средах, обеспечивает высокую доступность, вы можете отслеживать изменения всех флагов функций, имеет интеграцию со многими инструментами, позволяет вносить изменения в подмножество пользователей и даже идет дальше. как предлагающие возможности A/B-тестирования.

GrowthBook
Это очень многообещающий проект с открытым исходным кодом. Он предлагает функции, очень похожие на LaunchDarkly, но, на мой взгляд, на данный момент он менее развит. Лично я считаю, что их пользовательский интерфейс для управления функциями намного чище, чем у LaunchDarkly.

Какие у них есть преимущества?

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

Я уже писал о преимуществах и почему вы должны использовать их более подробно в прошлом.



Заключение

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