На протяжении многих лет я работал во многих компаниях. Во многих различных типах проектов от приложений Windows до популярных веб-сайтов на основе сервисов. У каждой компании был свой процесс обновления нового кода и добавления функций в производственную среду. Некоторым процессам было легче запустить код, чем другим. Общим для всех процессов было наличие механизма отката. Позволяет «отменить» любые изменения, которые могли вызвать проблемы в производственной среде. Подобно обычному процессу отката, переключение функций добавляет еще один уровень в процессы развертывания кода.

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

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

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

Что такое переключение функций

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

«Что вы имеете в виду?» - спросите вы. Я постараюсь объяснить это на примере. У меня есть веб-сайт, на который я вхожу. После входа в систему я вижу главную страницу, на которой показаны 4 графика. На этих графиках подробно представлена ​​ключевая информация, касающаяся моего бизнеса. Загрузка каждого графика занимает несколько секунд, чтобы отобразить информацию. Стили графиков похожи на что-то из 1980-х годов.

Легко, как щелкнуть выключателем

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

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

if (featureSwitch.IsEnabled("GraphOne")) then displayTheNewGraphOne() else displayTheOldGraphOne() end if

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

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

Преимущества переключения функций

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

Безопасное развертывание кода только один раз

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

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

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

Больше никаких простоев и необходимости откатывать назад. Удивительный

Удаляет подход "все или ничего"

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

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

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

Облегчает тестирование и поиск неисправностей

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

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

Поиск ошибок

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

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

Раньше я встречался с выпусками, в которых проблема возникала только в производственной среде. Все тесты и проверки в наших промежуточных средах не вызвали никаких проблем. Если бы мы откатили код, мы бы не смогли собраться и исследовать проблему. Осталось бы «мы думаем, что именно поэтому он сломался», а не «Ага, вот почему он не работает». (У меня есть поговорка, которую я использую при работе с командами разработчиков: «Предположение - мать всех еблиц»).

Упрощает программирование новых функций

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

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

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

Удалить переключение функций и старый код

Я могу быть собой и моим ОКР. Но я люблю удалять старый неиспользуемый код. Я получаю от этого удовольствие. Это касается и переключателей функций. Я люблю удалять старые. Если задуматься, это хорошо.

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

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

Реализация переключения функций

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

Использование переключения функций добавляет дополнительный уровень безопасности к процессу выпуска. А также предоставляет вам более детализированный процесс «отката», который находится поверх существующего механизма отката. Это также требует давления со стороны вашей команды разработчиков, поскольку они уверены, что что-то пойдет не так. Код, связанный с проблемой, при необходимости можно отключить очень быстро.

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

Первоначально опубликовано на https://www.philliphughes.co.uk 9 мая 2019 г.