Переключатели функций и ветви функций

Что такое «переключатели функций» и «ветви функций» и в чем разница между ними?

Каковы плюсы и минусы? Почему одно лучше другого?

Я нашел несколько статей в Google по этому поводу, и я склонен быть сторонником «переключателей функций», но я не уверен, что «переключатели функций» - лучший выбор во всех случаях.


person Sergiu    schedule 17.10.2013    source источник
comment
Две вещи в дополнение к ответам ниже: у вас не может быть одновременно функциональных веток и непрерывной интеграции (если вы не настроили автоматические сборки для каждой функциональной ветки), и если вы решите перейти на функциональные ветки, вооружитесь GIT (или аналогичным), который имеет мощные возможности слияния. Я также рекомендовал бы прочитать книгу Джеза Хамбла «Непрерывная доставка».   -  person spacedoom    schedule 20.10.2013
comment
@spacedoom: у вас не может быть одновременно функциональных веток и непрерывной интеграции - я не согласен. Многие решения CI имеют явную поддержку создания ветвей функций. Jenkins, например, может даже автоматически создавать задания сборки для любых ветвей функций, которые он обнаруживает в SCM.   -  person sleske    schedule 15.07.2015
comment
Дополнительная информация stackoverflow.com/a/7707394/56145   -  person Matt Kocaj    schedule 20.01.2016


Ответы (3)


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

Ветви функций могут быть частью методологии выпуска и интегрироваться в цепочку непрерывной интеграции. Вы можете разработать в функциональной ветви, развернуть ветвь в DEV / QA, получить сертификацию, объединить функциональную ветвь с транком, а затем отправить транк в среды SIT / UAT / PROD.

У этого подхода есть свои плюсы и минусы. Переключение функций требует очень строгой дисциплины, так как сломанный / темный код готовится к производству. Это отлично подходит для стартапов и магазинов, где руководство знает, как это сделать, и имеет инструменты системной автоматизации (Chef / Puppet / cfengine и т. Д.). Google, Facebook, LinkedIn, WordPress - все они развертываются в производственных средах с использованием переключения функций и автоматизации системы. .

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

person Electrawn    schedule 17.10.2013
comment
Я думаю, что последний абзац перевернут: Вот необходимые технологии для правильного переключения функций: непрерывная доставка / развертывание, непрерывная интеграция, автоматическое модульное тестирование, автоматическое интеграционное тестирование, автоматическое стресс-тестирование / тестирование производительности, автоматизация системы , переключение функций является предварительным условием для выполнения CI / CD, а не наоборот. По крайней мере, это мой вывод из чтения статьи Мартина Фаулера по этой теме. - person pgpb.padilla; 25.09.2015
comment
Немного не согласен с последним абзацем. Предположение, что вам нужно запустить все эти структуры, прежде чем вы сможете включить переключение функций (и получить все потрясающие вещи, которые теперь можно использовать), не только неверно, но и напугает людей. Все, что вам нужно, это хороший конвейер CI / build и готовая среда prod, чтобы вы могли нажимать на нее, когда вам нужно (не обязательно компакт-диск). Я понимаю, о чем вы говорите, хотя, если у вас есть CI / CD, вы уже должны проводить автоматическое тестирование различных вариантов (модуль / интеграция / полный стек и т. Д.), Но это не твердое требование. - person Matt Kocaj; 22.01.2016
comment
FWIW, вот простой пакет для веб-приложений .NET, который упрощает переключение различными способами, позволяя вам продолжить доставку материалов в prod и не беспокоиться об инфраструктуре: github.com/cottsak/DevCookie - person Matt Kocaj; 22.01.2016
comment
Автоматическое тестирование с максимально возможным количеством вариантов рекомендуется и необходимо также для ветвления функций (и любых других возможностей разработки). - person Uwe Allner; 14.03.2016
comment
Отличный ответ. Просто добавлю: многие компании объединяют запуск продукта с выпуском программного обеспечения - с переключателями функций это не так; вы начнете развертывание раньше и просто включите его, когда придет день. Это оставляет у вас много времени, чтобы решить проблемы с развертыванием / выпуском. - person Kevin D.; 10.03.2020

Я подробно обсуждаю это в своем блоге: http://geekswithblogs.net/Optikal/archive/2013/02/10/152069.aspx

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

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

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

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

person Dylan Smith    schedule 17.10.2013
comment
Очень хороший пост в блоге. Спасибо, что поделился - person Hamid Shahid; 08.05.2014
comment
Кажется, что большинство людей считает, что интеграция всегда должна происходить в одном направлении feature branch -> main. Я видел много успехов, когда делали это наоборот, непрерывно интегрируя, вытягивая последние из main в feature branch, так что в то время, когда вам нужно интегрироваться обратно в main, ваше слияние происходит быстро, а значит, безболезненно. - person pgpb.padilla; 25.09.2015
comment
Я создал простой пакет, который позволяет легко скрыть функциональность за переключателем различными способами github.com/cottsak/ DevCookie - person Matt Kocaj; 22.01.2016

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

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

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

http://martinfowler.com/bliki/FeatureToggle.html

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

Примечание. Следуя принципам SCM, если кто-нибудь откроет и отредактирует файл, это может стать некорректным кодом.

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

Что ж, это очень полемический вопрос.

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

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

person Eduardo Fabricio    schedule 17.10.2013
comment
Я могу написать модульный тест, чтобы проверить, правильно ли работает переключатель, тогда как ветки функций просто означают, что я откладываю слияние до последней минуты, а затем трачу часы с моими коллегами на устранение конфликтов. Я считаю, что переключение функций более предсказуемо. - person Kevin D.; 10.03.2020
comment
В настоящее время мы также применяем стратегию toogle @Kevin D :), но очень важно продолжать обновлять toogles. Кроме того, мы используем GIT FLOW, и toogle - это совместимая стратегия для сохранения статуса кода Ready to Production. - person Eduardo Fabricio; 11.03.2020