Чем меньше изменений в пулреквесте, тем лучше. Такой пулреквест легче ревьюить: прочитать, вникнуть и прокомментировать пулреквест на 500 строк гораздо сложнее и затратнее, чем пулреквест на 50 строк. Больше того, чем больше пулреквест, тем меньше шансов, что хоть кто‑то посмотрит его внимательно: увидел +700 −60 в Гитхабе, приуныл и отложил до завтра.
Чем меньше изменений в пулреквесте, тем раньше его получится смёржить и показать результат коллегам. Маленькие пулреквесты помогают параллелить задачу: собрал письмо‑заглушку, смёржил и показал дизайнерам, а пока они смотрят — делаешь отправку письма в следующем пулреквесте.
Чем меньше изменений в пулреквесте, тем легче его выкатить в продакшен. Если что‑то пойдёт не так, будет легче найти ошибку и откатить изменения.
В больших и важных фичах
Кажется, что маленькие пулреквесты подходят только для маленьких фич, а большую и очень важную фичу так не сделать. На этот случай программисты придумали фича‑флаги (feature flag, feature toggle) — переключатели, которые позволяют менять поведение приложения на лету. Типа, если этот пользователь — бюрошник, показываем ему новую версию советов, если нет — старую табличную. Или если приложение запущено на стейджинге, складывай загруженные картинки в S3, если в продакшене — на диск.
Алгоритм разработки очень важной фичи с флагом простой: первый пулреквест должен подготовить переключатель, за которым будут спрятаны изменения, вносимые в следующих мелких пулреквестах. При этом в качестве переключателя можно использовать даже урлы: например, новую страницу лекций мы собирали по секретному адресу.
Без переключателей
Если очень важную фичу нельзя спрятать за переключателем из‑за технических ограничений, например, при апгрейде фреймворка, на котором работает приложение, то и здесь лучше обойтись маленькими пулреквестами:
Создаём бранч с апгрейдом Рельс.
Апгрейдим в нём рельсы: обновляем конфигурацию и зависимости, чиним тесты, обновляем код для работы с новой версией. Апгрейдить можно как напрямую в бранче, так и через пулреквесты к нему.
Бэкпортим изменения: вытаскиваем из апгрейда те изменения, что можно прямо сейчас использовать в продакшене. Например, в случае с апгрейдом Рельс — это deprecations (
update_attributes
→update
) и обновления зависимостей.Когда всё готово, мёржим основной пулреквест с апгрейдом. В идеале в нём будет только апгрейд Рельс и изменения в конфигурации и инишиалайзерах.