Совместимо ли использование «функциональных веток» с рефакторингом?

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

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

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

Если какой-либо рефакторинг был произведен, объединение «функциональных веток» станет намного сложнее, если вообще возможно.

Неужели мы просто должны отказаться от возможности провести рефакторинг?

См. Также Как вы справляетесь с противоречием между рефакторингом и необходимостью слияния?


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


person Ian Ringrose    schedule 28.10.2010    source источник


Ответы (4)


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

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

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

person Stuart Lange    schedule 29.10.2010
comment
Панджандрумы XP непреклонны в том, чтобы иметь только одну строку кода. Я не уверен, насколько возможно реализовать это на практике (я думаю, вам может понадобиться магистраль плюс обслуживающая ветка для каждого поддерживаемого выпуска, что означает, по крайней мере, две строки кода), но я уверен, что они согласны с вами. - person Tom Anderson; 30.10.2010
comment
Я определенно сторонник техобслуживания (я называю их выпускными ветками). И я также думаю, что есть некоторые сценарии, в которых ветвь функций может быть оправдана. Я в основном против того, чтобы всегда создавать функциональные ветки, чтобы менеджеры могли решить, какие функции входят в конкретный подход к выпуску, потому что он слишком фрагментирует базу кода. Поверьте, я не фанат XP, но я считаю, что принципы, лежащие в основе стремления к единой строчке кода, разумны. - person Stuart Lange; 30.10.2010
comment
Я думаю, это также зависит от инструментария, дороговизны ветвей и реинтеграции. subversion несколько раздражает, тогда как git решает это очень хорошо (ветвление / слияние - основная концепция, очень быстро). Ключевой вопрос для разветвления: нужна ли мне изоляция, сколько будет стоить реинтеграция? Я думаю, что обе крайности (никогда не переходить, всегда переходить при каждом незначительном изменении) неверны. Это действительно зависит ... - person manuel aldana; 30.10.2010
comment
Я полностью не согласен с вашим смелым заявлением. Я предполагаю, что вы каким-то образом ограничены своим набором инструментов. Попробуйте Git, Mercurial или Plastic SCM, и вы увидите, что рефакторинг уже не так сложен codicesoftware.blogspot.com/2010/08/ - person pablo; 30.10.2010
comment
Вы, ребята, определенно правы в том, что слияние в некоторых инструментах (git, mercurial, accurev) несколько проще, чем в других (svn). Однако даже если слияние было тривиально простым (чего никогда не будет), вы все равно сохраняете параллельные строки кода отдельными до тех пор, пока не произойдет большое слияние. С этим связаны затраты - ваша команда не делится и не интегрируется так быстро, как если бы они работали в одной строке кода. Ветви функций в корне нарушают принцип непрерывной интеграции, который имеет множество преимуществ. - person Stuart Lange; 31.10.2010

Мне нравится этот провокационный тезис (отказ от рефакторинга), потому что он обогащает дискуссию :)

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

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

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

В заключение я бы планировал свои рефакторинги в зависимости от кодовой строки:

  • feature-branch: только более мелкие (если они "помогают" моей функции)
  • refactoring-branch: для более крупных, где цель рефакторинга не совсем ясна (я часто называю их «каракулями рефакторинга»)
  • trunk / mainline: Хорошо, но мне нужно общаться с разработчиками по функциональным веткам, чтобы не создавать кошмар интеграции.
  • релиз-ветка: никогда
person manuel aldana    schedule 29.10.2010

Рефакторинг и слияние - это две комбинированные темы, на которые фокусируется внимание Plastic SCM. Фактически, есть две важные области, на которых нужно сосредоточиться: первая - это работа (во время слияния) с файлами, которые были перемещен или переименован в ветке. Хорошая новость заключается в том, что все SCM «нового века» позволяют делать это правильно (Plastic, Git, Hg), в то время как старые просто терпят неудачу (SVN, Perforce и даже более старые).

Другая часть имеет дело с отредактированным кодом внутри того же файла: вы знаете, вы перемещаете свой код, а другой разработчик модифицирует его параллельно. Это более сложная проблема, но мы тоже уделяем ей внимание с помощью нового набора инструментов слияния / сравнения. Найдите информацию о xdiff здесь и xmerge (cross- объединение) здесь. Хорошее обсуждение того, как найти здесь перемещенный код (по сравнению с "за пределами сравнивать").

В то время как проблема «слияния каталогов» или структуры является ключевой (независимо от того, делает ли это система или нет), вторая проблема больше связана с инструментарием (насколько хороши ваши инструменты трехстороннего слияния и сравнения). Вы можете получить Git и Hg бесплатно для решения первой проблемы (и даже Plastic SCM теперь тоже бесплатен).

person pablo    schedule 30.10.2010
comment
Работают ли инструменты слияния пластика с деревом синтаксического анализа, а не с обычным текстом? Если да, то какие языки поддерживаются? - person Ian Ringrose; 31.10.2010
comment
Текущие xmerge / xdiff основаны на поиске похожих шаблонов в тексте, поэтому они не зависят от языка. В качестве побочного примечания я могу сказать, что довольно скоро появится синтаксический анализ (C #, Java, а затем C и более поздний C ++). - person pablo; 02.11.2010

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

Теперь есть несколько более совершенных инструментов слияния (например, SemanticMerge), которые основаны на синтаксическом анализе языка и предназначены для работы с кодом. который был перемещен и изменен. JetBrains (создание ReShaper) только что опубликовал person Ian Ringrose    schedule 16.07.2014