Часто «сложные» патчи / списки изменений - это те, которые делают много разных вещей одновременно. Есть новый код, удаленный код, переработанный код, перемещенный код, расширенные тесты; это мешает видеть общую картину.
Распространенная подсказка в том, что патч огромный, но его описание крошечное: «Реализуйте $ FOO».
Разумный способ справиться с таким патчем - попросить разбить его на ряд более мелких, автономных частей. Точно так же, как принцип единственной ответственности гласит, что функция должна выполнять только одну вещь, патч должен фокусироваться только на одной вещи.
Например, первые патчи могут содержать чисто механические рефакторинги, которые не вносят никаких функциональных изменений, а затем финальные патчи могут сфокусироваться на фактической реализации и тестировании $ FOO с меньшим количеством отвлекающих факторов и красных селедок.
Для функциональности, которая требует большого количества нового кода, новый код часто может быть представлен в тестируемых блоках, которые не изменяют поведение продукта до тех пор, пока последний патч в серии не вызовет новый код (изменение флага).
Что касается тактичного выполнения, я обычно называю это своей проблемой, а затем обращаюсь за помощью к автору: «У меня проблемы с отслеживанием всего происходящего здесь. Не могли бы вы разбить этот патч на более мелкие шаги, чтобы помочь мне понять, как все это подходит все вместе?" Иногда необходимо сделать конкретные предложения для небольших шагов.
Такой большой патч, как "Implement $ FOO", превращается в серию патчей вроде:
- Представьте новую версию Frobnicate, которая использует пару итераторов, потому что мне нужно будет вызывать ее с последовательностями, отличными от vector, для реализации $ FOO.
- Переключите все существующие абоненты Frobnicate, чтобы использовать новую версию.
- Удалить старый Frobnicate.
- Frobnicate делал слишком много. Внесите шаг повторения в свой метод и добавьте тесты для этого.
- Представьте Zerzify, с тестами. Пока не используется, но мне нужно за $ FOO.
- Реализуйте $ FOO в терминах Zerzify и нового Frobnicate.
Обратите внимание, что шаги 1-5 не вносят никаких функциональных изменений в продукт. Их тривиально проверить, в том числе убедиться, что у вас есть все нужные тесты. Даже если шаг 6 все еще «сложен», по крайней мере, он сосредоточен на $ FOO. И журнал, естественно, дает вам гораздо лучшее представление о том, как был реализован $ FOO (и почему был изменен Frobnicate).