В чем принципиальная разница между каскадной (Waterfall) и гибкой (Agile) методологиями разработки?

«В чем принципиальная разница между каскадной (Waterfall) и гибкой (Agile) методологиями разработки?» — вопрос из категории Методологии разработки, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Различие лежит в подходе к планированию, выполнению работ и реакции на изменения.

Аспект Каскадная модель (Waterfall) Гибкие методологии (Agile: Scrum, Kanban)
Процесс Линейный, последовательный. Фазы идут одна за другой. Итеративный и инкрементальный. Работа ведется короткими циклами (спринтами).
Изменения Сложно и дорого вносить после старта фазы. Требования фиксированы в начале. Изменения приветствуются даже на поздних стадиях. Гибкость к новым требованиям.
Документация Обширная, детальная документация создается на каждом этапе. Рабочий продукт важнее документации. Документируется по мере необходимости.
Тестирование Отдельная фаза в конце цикла, после завершения разработки. Непрерывное тестирование. Тестировщики работают в каждой итерации.
Релиз Один итоговый релиз в конце большого цикла (месяцы/годы). Частые, небольшие релизы (в конце каждого спринта — потенциально готовый к выпуску инкремент).
Коммуникация Формальная, через документацию и отчеты. Непосредственное ежедневное общение в команде (daily stand-up).

Практическое сравнение в контексте тестирования:

# Waterfall подход: тестирование как отдельный длительный этап
def waterfall_testing():
    # 1. Сбор и фиксация всех требований (месяц 1)
    requirements_spec = create_monolithic_spec()
    # 2. Разработка всей системы (месяцы 2-6)
    full_system = develop(requirements_spec)
    # 3. Фаза тестирования всей системы (месяц 7) — высокий риск срыва сроков
    test_report = execute_comprehensive_test_suite(full_system)
    # 4. Исправление дефектов, найденных на поздней стадии (месяц 8)
    fix_critical_bugs(full_system)
    # 5. Релиз (месяц 9)
    release(full_system)

# Agile/Scrum подход: тестирование в каждом спринте
def agile_testing():
    product_backlog = create_backlog() # Приоритизированный список задач
    for sprint in range(1, 10): # 10 двухнедельных спринтов
        # Планирование спринта: выбираем задачи из бэклога
        sprint_backlog = plan_sprint(product_backlog)
        # Разработка и тестирование идут параллельно в течение спринта
        for task in sprint_backlog:
            feature = develop(task)
            test_feature(feature) # Тестирование сразу после/во время разработки
        # В конце спринта — готовый инкремент функциональности
        demo_increment()
        # Сбор обратной связи и адаптация планов
        update_backlog_based_on_feedback(product_backlog)
    # Постоянная готовность к релизу после любого спринта

Ключевой вывод: Waterfall стремится предсказать весь проект, Agile нацелен на адаптацию к изменениям по ходу работы.