Раздел 16 · Архитектура и решения

Вертикальные и горизонтальные срезы: как резать фичу на проверяемые куски

middle-senior~35 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Вертикальные и горизонтальные срезы: как резать фичу на проверяемые куски

Сцена · панелька, которую невозможно отревьюить

Задача звучит просто: добавить на страницу панель, вывести в ней данные и чуть-чуть логики поверх. День работы, не больше.

Исполнитель отчитывается: готово. Прикладывает запись экрана, и по видео действительно всё работает: панель на месте, данные едут, кнопки нажимаются. А потом ты открываешь изменения и видишь дифф на 1500 с лишним строк одним куском. Ревьюить такое тяжело: глаз тонет, контекст не держится, а сказать «выглядит нормально» означает пропустить что угодно.

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

Карта урока · что заберёшь

  • Чем горизонтальный срез отличается от вертикального.
  • Почему горизонталь прячет интеграцию и обратную связь до самого конца.
  • Как резать вертикально: сквозной скелет, потом тонкие куски, каждый из которых живой.
  • Когда горизонталь всё-таки оправдана и как не обмануть себя.
  • Почему с приходом AI-агентов этот навык стал важнее, а не наоборот.

Два способа разрезать одну фичу

Любая ощутимая фича пронизывает несколько слоёв: разметка и компоненты сверху, прикладная логика в середине, хранилище и API снизу. Дифф большой потому, что он трогает всё это сразу.

Разрезать большой кусок на серию мелких изменений (как бы их ни называл твой инструмент: PR, MR, патч) можно вдоль или поперёк этой стопки слоёв. Вдоль получается горизонталь, поперёк вертикаль. Разница не в количестве кусков, а в том, что лежит внутри каждого.

Одна фича · два направления разрезакусок · 0 / 4

Горизонтально · по слоям

пока ничего не влито

✕ потрогать нечего

Вертикально · сквозными кусочками

пока ничего не влито

✕ потрогать нечего

Каждая клетка, кусочек кода в слое. Слева куски ложатся по слоям: серые клетки лежат мёртвым грузом, пока последний кусок их не свяжет. Справа каждый кусок проходит через все слои сразу, пунктир в первой колонке, заглушки сквозного скелета. Цветная клетка работает в проде, серая ждёт.

Повливай куски по одному и проследи за подписью под каждой сеткой: она отвечает на главный вопрос урока, что нового сможет потрогать живой человек после мерджа.

Горизонтальный разрез · по слоям

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

Выглядит аккуратно: каждый кусок однородный, в нём только компоненты или только бэкенд. Но проследи за подписью под левой сеткой: она не меняется до самого последнего куска. Первые три куска ничего не делают: компоненты никуда не подключены, ручки бэкенда никто не вызывает. Живой человек (тестировщик, заказчик, ты сам через неделю) не сможет проверить работу в реальной обстановке вплоть до самого последнего куска.

Это и есть приговор горизонтали. Ты разрезал работу, но не разрезал риск:

  • Интеграция откладывается на конец. Самое опасное место, стык слоёв, проверяется в последнюю очередь.
  • Ревьюер смотрит на компоненты, не зная, как их будут звать, и на ручки бэкенда, не зная, кто их дёрнет. Контекста нет, замечания получаются формальные.
  • Обратная связь от заказчика приходит только после последнего куска. Если идея вообще не та, ты узнаешь это, потратив все куски.
  • Откатить нельзя по-человечески: первые три куска по отдельности бессмысленны.

Вертикальный разрез · по сквозным кусочкам

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

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

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

Почему вертикаль выигрывает

Тот же объём работы, та же финальная фича. Разница только в порядке и в форме кусков, но она меняет всё:

  • Ранняя обратная связь. Заказчик трогает результат после первого же содержательного куска. Ошиблись в направлении, узнаём дёшево.
  • Интеграция вперёд, а не назад. Стык слоёв проверяется в каждом куске, а не копится к финалу. Самое страшное место перестаёт быть страшным.
  • Ревьюер видит вертикаль целиком: вот кнопка, вот логика за ней, вот ручка, которую она зовёт. Контекст есть, замечания становятся осмысленными.
  • Дифф маленький и связный. Не 1500 строк россыпью, а сто строк про одну понятную вещь.
  • В любой момент можно остановиться, и то, что уже влито, работает. Поставка не «всё или ничего».

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.