Что такое Kanban и как вы его применяли в разработке?

«Что такое Kanban и как вы его применяли в разработке?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Kanban — это agile-методология управления workflow, основанная на визуализации потока задач и ограничении work in progress (WIP).

Основные принципы Kanban:

  1. Визуализация workflow — доска с колонками (To Do, In Progress, Code Review, Testing, Done)
  2. Ограничение WIP — максимальное количество задач в каждой колонке
  3. Управление потоком — мониторинг и оптимизация движения задач
  4. Явные правила процесса — четкие критерии для перехода между колонками
  5. Постоянное улучшение — регулярный анализ метрик и адаптация процесса

Пример реализации в iOS-команде:

// Структура задачи (модель данных)
struct KanbanTask: Identifiable {
    let id: UUID
    let title: String
    let description: String
    let type: TaskType // feature, bug, chore
    let priority: Priority // high, medium, low
    var status: Status = .backlog
    var assignee: String?
    var cycleTime: TimeInterval? // Время от начала до завершения
}

enum Status: String, CaseIterable {
    case backlog    = "Backlog"
    case ready      = "Ready for Dev"
    case inProgress = "In Progress"
    case codeReview = "Code Review"
    case testing    = "Testing"
    case done       = "Done"
}

// Конфигурация доски
class KanbanBoard {
    private var tasks: [KanbanTask] = []
    private let wipLimits: [Status: Int] = [
        .inProgress: 3,    // Не более 3 задач в разработке
        .codeReview: 2,    // Не более 2 задач на ревью
        .testing: 2        // Не более 2 задач в тестировании
    ]

    func moveTask(_ taskId: UUID, to newStatus: Status) -> Bool {
        guard let index = tasks.firstIndex(where: { $0.id == taskId }) else {
            return false
        }

        // Проверяем WIP limit
        if let limit = wipLimits[newStatus] {
            let currentCount = tasks.filter { $0.status == newStatus }.count
            if currentCount >= limit {
                print("⚠️ WIP limit reached for (newStatus.rawValue): (limit) tasks maximum")
                return false
            }
        }

        // Обновляем статус задачи
        tasks[index].status = newStatus

        // Если задача завершена, фиксируем cycle time
        if newStatus == .done {
            // Логика расчета времени выполнения
        }

        return true
    }
}

Метрики Kanban, которые я отслеживал:

  • Cycle Time — время от начала работы до завершения задачи
  • Throughput — количество завершенных задач за период
  • Cumulative Flow Diagram — визуализация распределения задач по статусам
  • Lead Time — общее время от создания до завершения задачи

Практический опыт применения:

  1. В стартапе — использовали физическую доску с стикерами, ежедневные стендапы у доски
  2. В распределенной команде — Jira + Confluence, автоматизированные отчеты
  3. Для поддержки legacy-проекта — фокус на баг-трекинге и ограничении WIP

Преимущества Kanban:

  • Гибкость — можно добавлять задачи в любое время
  • Прозрачность — вся команда видит статус работ
  • Фокус на завершении — WIP limits предотвращают распыление
  • Минимум бюрократии — нет спринтов и планирования

Ограничения:

  • Меньше предсказуемости, чем в Scrum
  • Требует высокой дисциплины команды
  • Сложнее оценивать сроки релизов

Когда выбираю Kanban:

  • Для команд поддержки и оперативных задач
  • В проектах с постоянно меняющимися приоритетами
  • Для небольших инкрементальных улучшений
  • Когда нужно снизить время cycle time