Specification-Driven Development

Сначала договоримся. Потом напишем код.

SDD — подход, в котором понятная и проверяемая спецификация становится главным ориентиром для разработчика, команды и AI-помощника.

ИдеяСпецификация КодПроверка

Что такое SDD

Specification-Driven Development — это разработка, управляемая спецификацией. До реализации команда письменно фиксирует, что должна делать функция, для кого она создаётся, какие у неё ограничения и как проверить результат.

Спецификация здесь — не огромный документ на сотни страниц. Для небольшой задачи достаточно одного Markdown-файла с требованиями, сценариями и критериями приёмки.

Однозначность

Разработчик понимает ожидаемое поведение без догадок.

Проверяемость

Каждое требование можно подтвердить тестом или сценарием.

Актуальность

При изменении поведения обновляются и спецификация, и код.

Главная мысль: код отвечает на вопрос «как это работает», а спецификация — «что должно происходить и почему».

Как устроен процесс

  1. Опишите проблему.
    Кто пользователь и какую задачу он хочет решить?
  2. Зафиксируйте поведение.
    Опишите основной сценарий, ошибки и граничные случаи.
  3. Добавьте критерии приёмки.
    Сформулируйте наблюдаемые условия готовности.
  4. Согласуйте решение.
    Команда проверяет полноту, риски и противоречия до написания кода.
  5. Реализуйте небольшими шагами.
    Код и тесты создаются по пунктам спецификации.
  6. Сверьте результат.
    Если реализация изменила поведение, обновите спецификацию.

Простой пример: создание задачи

Допустим, в Java-приложение нужно добавить API для создания задачи. Фраза «сделать добавление задачи» слишком расплывчата. Превратим её в небольшую спецификацию.

specs/create-task.md
# Создание задачи

Пользователь отправляет POST /api/tasks.

Вход:
- title — обязательная строка от 3 до 100 символов
- description — необязательная строка до 1000 символов

Поведение:
- новая задача получает статус TODO
- автором становится текущий пользователь

Результат:
- 201 и созданная задача — при успехе
- 400 — если title не прошёл проверку
- 401 — если пользователь не авторизован

Критерий готовности:
Given авторизованный пользователь
When он отправляет title "Изучить SDD"
Then API возвращает 201, статус задачи TODO

Реализация следует контракту

TaskController.java
@PostMapping("/api/tasks")
public ResponseEntity<TaskResponse> create(
        @Valid @RequestBody CreateTaskRequest request,
        Principal principal) {
    TaskResponse task = taskService.create(request, principal.getName());
    return ResponseEntity.status(HttpStatus.CREATED).body(task);
}

Из спецификации сразу видно, какие проверки, статусы ответа и тесты нужны. Если позже появится ограничение «не больше 20 активных задач», сначала меняется спецификация, затем тесты и реализация.

SDD и разработка с AI

AI пишет код увереннее, когда получает точный контракт. Вместо запроса «добавь задачи» передайте ему спецификацию и ограничьте область изменений.

Пример запроса AI-помощнику
Реализуй specs/create-task.md.

Условия:
- используй существующие Controller, Service и Repository;
- не меняй схему авторизации;
- добавь unit-тесты для валидации;
- после реализации перечисли критерии приёмки
  и покажи, каким тестом проверен каждый из них.
AI ускоряет реализацию, но не заменяет проверку. Разработчик по-прежнему отвечает за архитектуру, безопасность, тесты и соответствие спецификации.

Как внедрить SDD в существующий проект

  1. Создайте каталог specs/.
    Храните спецификации рядом с кодом и версионируйте их в Git.
  2. Начните с одной новой функции.
    Не пытайтесь сразу описать всю существующую систему.
  3. Подготовьте короткий шаблон.
    Используйте разделы: цель, сценарии, требования, ограничения, критерии приёмки и «не входит в задачу».
  4. Обсуждайте спецификацию в Pull Request.
    Для сложных задач полезно согласовать её до начала реализации.
  5. Свяжите требования с тестами.
    Каждый критерий приёмки должен иметь автоматическую или понятную ручную проверку.
  6. Считайте спецификацию частью продукта.
    Изменилось поведение — в том же PR обновляется документ.

Минимальная структура

Проект
my-project/
├── specs/
│   ├── template.md
│   └── create-task.md
├── src/
└── README.md

Чек-лист хорошей спецификации

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