Водопад против Agile

Разбираемся, откуда взялся Agile: что такое водопад, где именно он ломается, что на самом деле написано в манифесте 2001 года — и что там не написано, хотя многие уверены в обратном.

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

Обратите внимание на последние слова: в момент наименьшего знания. В этом весь сюжет. Любой план проекта пишется тогда, когда о проекте известно меньше всего — до первой строчки кода, до первого показа пользователю, до первого «ой, а мы не подумали про возвраты». И дальше начинается вопрос: что мы делаем с новым знанием, которое приходит по ходу дела? Водопад отвечает «стараемся не сойти с плана». Agile отвечает «переписываем план».

Как работал классический водопад

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

Требования (2 мес.)
   ↓  подписан документ требований
Проектирование (2 мес.)
   ↓  подписана архитектура и ТЗ
Разработка (6 мес.)
   ↓  код передан в тестирование
Тестирование (2 мес.)
   ↓  подписан акт приёмки
Внедрение и поддержка

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

И всё же водопад — не глупость. Он вырос из инженерной практики, где он работает: мост, здание, партия микросхем. Там переделка после «релиза» стоит катастрофически дорого, требования редко меняются посреди стройки, а разделение труда по фазам даёт экономию. Водопад отлично решает управленческую задачу: он делает проект предсказуемым на бумаге. Заказчик получает срок и смету, подрядчик — защищённый скоуп, обе стороны — документ, на который можно сослаться в суде. За это его любили и любят.

Где он ломается на софте

Проблема не в том, что фазы идут по очереди. Проблема в трёх допущениях, которые для софта почти никогда не выполняются.

1. Требования известны заранее

Заказчик редко знает, чего хочет, — он знает, что ему больно. Формулировка «нужен личный кабинет с историей заказов» может означать пять разных продуктов. Понимание приходит, когда человек впервые видит рабочий экран. В водопаде первый рабочий экран он видит через десять месяцев.

2. Ошибку можно поймать проверкой документа

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

3. Цена изменения постоянна

Она не постоянна — она растёт. Правка требования на этапе анализа стоит часа обсуждения. Та же правка после того, как под старое требование написаны схема базы, API, три экрана и сорок тестов, стоит недель. Классические оценки Барри Бёма (рост цены исправления от анализа к эксплуатации в десятки раз) сегодня справедливо критикуют: данные старые, из проектов, непохожих на современные, и в командах с хорошими тестами и CI кривая гораздо более пологая. Но знак производной верен: чем позже нашли — тем дороже. Именно на этом стоит вся аргументация в пользу коротких циклов, и честнее опираться на знак, чем размахивать красивыми цифрами «×100».

Итог: водопад не «плохой». Он оптимизирован под мир, где знание почти полное, а изменения дороги. В разработке софта знание неполное, а изменения дёшевы — если мы сами не сделали их дорогими.

Что реально говорит манифест

В феврале 2001 года семнадцать человек — авторы Scrum, XP, DSDM, Crystal и других подходов — собрались на лыжном курорте в Юте и вместо драки за то, чей метод правильнее, записали на одну страницу то, с чем все согласны. Получилось четыре ценности, каждая в форме «А важнее Б», и приписка: то, что справа, тоже ценно, просто левое мы ценим выше.

ВажнееЧемЧто это значит на практике
Люди и взаимодействиепроцессы и инструментыПроблема «команда не разговаривает» не решается покупкой Jira
Работающий продуктисчерпывающая документацияКритерий готовности — работает у пользователя, а не «спека сдана»
Сотрудничество с заказчикомсогласование условий контрактаКогда всплывает новое, обсуждаем, а не ищем, кто виноват по пункту 4.2
Готовность к изменениямследование первоначальному плануИзменение требования — это новая информация, а не чей-то провал

За ценностями идут двенадцать принципов — они конкретнее и, честно говоря, читаются реже, чем следовало бы. Если сжать их до сути:

  • Про ценность: главное — рано и регулярно поставлять работающий софт, которым доволен заказчик; частота поставок — от пары недель до пары месяцев, и чем короче, тем лучше.
  • Про изменения: изменения требований приветствуются даже на поздних этапах — гибкость превращается в конкурентное преимущество заказчика.
  • Про людей: проекты строят вокруг мотивированных людей; им дают среду и поддержку и доверяют работу; лучший способ передачи информации — разговор лицом к лицу; лучшие решения рождаются в самоорганизующихся командах.
  • Про темп: заказчики и разработчики работают вместе ежедневно; темп должен быть таким, чтобы его можно было выдерживать бесконечно — без авралов и выгорания.
  • Про качество: постоянное внимание к техническому совершенству и хорошему дизайну повышает гибкость; простота (искусство не делать лишней работы) необходима.
  • Про обучение: работающий продукт — главный показатель прогресса; команда регулярно ищет способы стать эффективнее и меняет своё поведение.

Заметьте, чего здесь нет. Нет слов «спринт», «стендап», «story points», «velocity», «Scrum-мастер», «Jira». Ни одного. Всё это — инструменты конкретных фреймворков, придуманные до и после манифеста. Манифест — про приоритеты, а не про расписание встреч.

Чего манифест НЕ говорит

  • Не говорит, что документация не нужна. Он говорит, что «спека сдана» — не то же самое, что «работает».
  • Не говорит, что не нужно планировать. В принципах прямо сказано про регулярную поставку и устойчивый темп — это невозможно без планирования.
  • Не говорит, что заказчик может менять всё бесплатно. Приветствовать изменения — значит уметь их обсуждать и переприоритизировать, а не соглашаться на всё, не двигая сроки.
  • Не говорит, что Agile быстрее или дешевле. Ни слова про скорость команды. Он про то, чтобы не потратить год на ненужное.
  • Не говорит, что архитектура и качество вторичны. Наоборот: там прямым текстом про техническое совершенство.

Как это работает: итерации как страховка от ошибки

Ключевой механизм Agile — не встречи, а цикл обратной связи. Посчитаем на пальцах. Пусть команда делает проект на 10 месяцев, и в требованиях есть ошибка — фича, которая пользователю не нужна, но на ней завязана треть логики.

ВОДОПАД
  месяц 0   ошибка попала в ТЗ
  месяц 10  первый показ пользователю → ошибка обнаружена
  потеряно: до 10 месяцев работы, часть которой построена поверх ошибки

ИТЕРАЦИИ ПО 2 НЕДЕЛИ
  неделя 0  ошибка попала в план итерации
  неделя 2  демо пользователю → ошибка обнаружена
  потеряно: до 2 недель работы
  бонус: следующие 9,5 месяцев строятся уже на верной посылке

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

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

Частые ошибки

  • «Мы по Agile» = «мы без плана». Самая частая и самая дорогая подмена. Отсутствие плана — это не гибкость, это хаос; гибкость — способность быстро перестроить план.
  • Мини-водопад под видом спринтов. Неделя аналитики, неделя разработки, потом «спринт тестирования», потом «спринт багфикса». Ритуалы Scrum на месте, цикл обратной связи не замкнут: рабочего продукта в конце итерации нет.
  • Демо без пользователей. Показывать инкремент своему же менеджеру — не обратная связь. Нужен тот, кто будет этим пользоваться или платить.
  • Считать водопад глупостью. Он рационален там, где итерация физически дорога. Пренебрежение к нему — верный признак того, что человек читал не манифест, а посты про манифест.
  • Цитировать «×100» как доказательство. Аргумент за короткие циклы работает и без сомнительных цифр; ссылаясь на них, вы подставляетесь перед первым же скептиком в комнате.

Итоги

  • Водопад предполагает, что требования известны заранее, ошибки ловятся ревью документов, а цена изменения постоянна. В разработке софта не выполняется ни одно из трёх.
  • Ройс, которого считают отцом водопада, описывал линейную схему как антипример и предлагал итерации. Индустрия прочитала картинку.
  • Манифест — это четыре пары «важнее/чем» и двенадцать принципов. Ни спринтов, ни стендапов, ни story points там нет.
  • Правая часть каждой пары (документация, контракт, план) не отменяется — она просто проигрывает при конфликте приоритетов.
  • Работающий механизм Agile — короткий цикл обратной связи. Он не ускоряет команду, он ограничивает размер ошибки, которую можно совершить незаметно.
Проверьте себя
1. Что означает формулировка манифеста «работающий продукт важнее исчерпывающей документации»?
AДокументацию писать не нужно — код должен говорить сам за себя
BДокументация нужна, но если приходится выбирать, что важнее, побеждает работающий продукт
CДокументацию пишет отдельный технический писатель, а не команда
DДокументацию пишут только после релиза
2. Почему итеративность снижает цену ошибки?
AПотому что в итерациях программисты работают быстрее
BПотому что ошибка обнаруживается через недели, а не через месяцы, и переделывать приходится меньший объём работы
CПотому что при итеративной разработке ошибок в принципе меньше
DПотому что заказчик не успевает заметить ошибку до релиза