В чем ключевые различия между Agile (Scrum/Kanban) и Waterfall методологиями разработки?

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

Ответ

Основное различие лежит в подходе к изменению требований, структуре процесса и роли тестирования.

Критерий Waterfall («Водопад») Agile (Scrum, Kanban)
Подход к требованиям Фиксированные на этапе анализа. Изменения сложны и дороги. Итеративный и адаптивный. Требования уточняются и могут меняться в процессе работы (Product Backlog).
Структура процесса Линейная последовательность фаз: Анализ → Дизайн → Разработка → Тестирование → Внедрение. Циклическая (итерации/спринты). Каждый цикл включает планирование, разработку, тестирование и ревью готового инкремента.
Роль тестирования Отдельная фаза после разработки. Тестировщики вовлекаются поздно. Непрерывная и интегрированная. Тестирование происходит в каждой итерации. Тестировщик — полноправный член команды с первого дня спринта.
Документация Объемная, формальная, создается на ранних этапах. Рабочий продукт важнее документации. Документация легковесная (User Stories, задачи в трекере).
Поставка ценности В конце проекта, после полного цикла. Частая, инкрементальная (в конце каждого спринта/итерации).
Гибкость Низкая. Плохо подходит для проектов с неясными или меняющимися требованиями. Высокая. Позволяет быстро реагировать на обратную связь от заказчика и рынка.

Практическое влияние на разработчика/тестировщика в Agile (Scrum):

  • Работа ведется по User Stories, которые оцениваются в story points.
  • Каждый день — стендап для синхронизации.
  • Тестирование начинается сразу, как только готова первая функциональность в спринте.
  • Пример задачи в спринте и связанного с ней теста:

    # User Story: Как пользователь, я хочу применять скидку к корзине.
    # Код реализации (упрощенно):
    def apply_discount(subtotal: float, discount_percent: float) -> float:
        if discount_percent < 0 or discount_percent > 100:
            raise ValueError("Discount must be between 0 and 100")
        return subtotal * (1 - discount_percent / 100)
    
    # Модульный тест, написанный в том же спринте:
    def test_apply_discount():
        assert apply_discount(100, 10) == 90.0
        assert apply_discount(200, 25) == 150.0
    
    def test_apply_discount_invalid_input():
        with pytest.raises(ValueError):
            apply_discount(100, -5)
        with pytest.raises(ValueError):
            apply_discount(100, 110)

DevOps является эволюцией Agile, фокусируясь на автоматизации (CI/CD) и стирании границ между разработкой и эксплуатацией для максимально быстрой и надежной поставки.