Правильный workflow при разработке ПО
Общая задача:Существует ПО, которое находится на определенной стадии разработки.При разработке используется VCS, неважно какой.Следующим шагом, который надо осуществить - добавить какую-то новую функциональность.Конечно, объем изменений выбирается таким, чтобы commit следующего revision в VCS получился атомарным.Программер начинает писать код. На определенной стадии становится ясно, что нужен какой-то рефакторинг уже существующего кода. Конечно, рефакторинг уже существующего кода и добавление новой функциональности желательно вносить в VCS отдельно, чтобы они были в разных revisions. В этом случае делается откат, делается нужный рефакторинг с учетом возникших необходимых требований, делается commit кода. Этот revision содержит только рефакторинг. Потом новая функциональность добавляется в существующий код и опять делается commit.Легко заметить, что в данном сценарии работа по добавлению новой функциональности в некоторой степени дублируется.Было бы идеально сразу делать рефакторинг уже существующего кода, а уже потом добавлять новую функциональность. Но нередко необходимость рефакторинга становится явным как раз уже в процессе добавления новой функциональности.Какие технические приемы существуют для минимизации дублирования действий в данном случае и какие используете именно Вы? Интересуют конкретные алгоритмы, а не общие советы наподобие "сначала надо думать, а уже потом садиться писать код".