Интервью с пользователем
Обзор
Самый дешёвый баг — тот, что не написан, потому что нужный вопрос задали до реализации, а не после
код-ревью. Этот skill заменяет накопление предположений структурированным интервью: задавай
целевые вопросы малыми пачками, скармливай каждый ответ следующему раунду и останавливайся только
тогда, когда acceptance criteria можно написать не выдумывая. Он выносит разговор, который иначе
случится как rework после ревью, в начало — до того как задача уйдёт профильному агенту.
Когда использовать
- Запрос на одну-две фразы описывает то, что явно больше одной-двух фраз ("добавь оффлайн-режим").
- Требования противоречат друг другу или текущему поведению приложения/бэкенда.
- Возможны несколько трактовок, и ошибиться в выборе дорого (миграция схемы, публичный контракт,
необратимое решение — см. также
doubt-driven-development, если он у вас появится, либо сразу
documentation-and-adrs-практику для фиксации решения).
- Перед тем как отдать задачу
business-analyst на проверку acceptance criteria, или профильному
инженерному агенту на реализацию.
- Пользователь говорит в духе "ты понимаешь, о чём я" — не понимаешь.
Не используй, если: задача маленькая и однозначная (rename, точечный багфикс с понятной
причиной), или acceptance criteria уже заданы явно пользователем/issue/спекой — тогда сразу
делегируй по rules/workflow.md. Интервью не должно быть предлогом не начинать работу.
Процесс
Шаг 1. Зафиксируй, что уже понятно
Прежде чем задавать вопросы, письменно зафиксируй текущее понимание и уровень уверенности:
## Понимание: оффлайн-очередь мутаций задач
- Пользователь видит закэшированные задачи офлайн — уверенно (сказано явно)
- Пользователь может СОЗДАВАТЬ задачи офлайн — предположение, не сказано
- Стратегия разрешения конфликтов — неизвестно
- Триггер синка (при открытии приложения? WorkManager?) — неизвестно
Уверенность: ~40%
Строки "предположение" и "неизвестно" становятся списком вопросов. Если таких строк не возникло —
интервью не требовалось.
Шаг 2. Задавай вопросы малыми целевыми пачками
3–5 вопросов за раунд, самое дорогое решение — первым. Один вопрос — одно решение, конкретные
варианты вместо открытых формулировок:
1. Если задачу отредактировали офлайн на двух устройствах, что побеждает при синке — последняя
запись или конфликт показывается пользователю?
2. Создание задач должно работать офлайн, или в v1 офлайн — только чтение?
3. Синк по открытию приложения или фоновый через WorkManager (с учётом Doze/App Standby)?
4. Что происходит с несинканными офлайн-изменениями при логауте?
Правила вопросов:
- Спрашивай про поведение, которое видит пользователь, а не про реализацию ("что побеждает?", а не
"OT или CRDT?").
- Предлагай дефолт: "Предлагаю last-write-wins для v1 — годится?" — легко подтвердить, легко
поправить.
- Поднимай платформенные реалии, которые заказчик может не знать: фоновые ограничения (Doze,
WorkManager retry/backoff), KMP-паритет поведения между Android и iOS (если фича общая для
shared/), реконнект realtime-канала (SignalR) после разрыва сети, требования Google
Play/App Store review.
- Никогда не переспрашивай то, что уже закрыл предыдущий ответ.
Шаг 3. Скорми ответы обратно и итерируй
После каждого раунда обнови документ понимания — перескажи ответы своими словами, отметь закрытые
пункты, дай новым вопросам возникнуть из ответов:
Закрыто: офлайн-чтение и создание в v1; last-write-wins; синк по открытию приложения.
Новый вопрос из "last-write-wins": тихая потеря данных при конфликте — ок, или логировать для
саппорта?
Уверенность: ~80%
Шаг 4. Останавливайся на ~95% и передавай дальше
Выходи из интервью, когда каждый acceptance criterion можно написать не выдумывая. Идеальная
уверенность — не цель; оставшиеся ~5% фиксируются как явные предположения:
Предположения (продолжаем, пока не поправят):
- Конфликты достаточно редки, чтобы тихий last-write-wins был приемлем для v1.
Передай результат дальше по rules/workflow.md: если решение архитектурное или необратимое —
сначала business-analyst на проверку с продуктовой стороны и/или ADR по
documentation-and-adrs-практике; реализацию отдай профильному агенту (kotlin-engineer,
compose-builder, swift-engineer, swiftui-builder) вместе с документом понимания как частью
постановки задачи — не как отдельное сообщение, которое потеряется в чате. Для оффлайн-очереди
из примера выше следующий шаг обычно — create-offline-outbox.
Типичные отговорки
| Отговорка |
Почему не работает |
| "Сделаю разумные предположения и отмечу их" |
Десять сложенных "разумных" предположений дают неразумный результат. Предположения — для последних 5%, а не для первых 50%. |
| "Задавать вопросы — выглядит неуверенно" |
Реализация не того выглядит хуже. Хорошие вопросы демонстрируют понимание задачи. |
| "Пользователь занят, не буду дёргать" |
Пять минут его времени сейчас дешевле недели переделки и более тяжёлого разговора потом. |
| "Разберусь по ходу реализации" |
Структурные решения (модель офлайна, стратегия конфликтов) дёшево менять в разговоре и дорого — в коде. |
| "Один большой список вопросов эффективнее" |
Двадцать вопросов разом просто пролистают. Маленькие пачки получают настоящие ответы, а ответы меняют следующие вопросы. |
| "Передам неопределённость профильному агенту, он разберётся по контексту" |
Профильный агент реализует, а не уточняет продуктовые решения — по rules/workflow.md он получает уже поставленную задачу. Нерешённая неоднозначность в постановке становится неверной реализацией, а не вопросом. |
Красные флаги
- Реализация начата, а документ понимания всё ещё содержит "неизвестно" по ключевому поведению.
- Вопросы про детали реализации, а не про видимое пользователю поведение.
- Задача делегирована профильному агенту с нерешённой неоднозначностью вместо того, чтобы закрыть
её в main-сессии до делегирования.
- Один и тот же вопрос задан дважды, потому что ответ не зафиксировали.
- Ноль зафиксированных предположений в задаче, где неоднозначность точно была (значит, их сделали
молча).
- Стена из двадцати вопросов одним сообщением.
- "Интервью" продолжается после того, как acceptance criteria уже можно написать — это уже
затягивание, а не уточнение.
Чек-лист
1---2name: interview-me3description: Use when требования расплывчаты, противоречат друг другу или короче, чем заслуживает задача — перед тем как ставить acceptance criteria и делегировать реализацию. Триггерные фразы: "добавь оффлайн", "сделай синхронизацию", "разберись сам", одна-две фразы на фичу, которая явно больше одной фразы, противоречие между тем, что просит пользователь, и тем, что уже делает код. Структурированный опрос малыми пачками вопросов вместо накопления предположений: поднимает уверенность в требованиях до ~95%, прежде чем main-сессия сформулирует задачу профильному агенту (`kotlin-engineer`, `compose-builder`, `swift-engineer`, `swiftui-builder`, `guide-android-builder` и т.д.) или бизнес-аналитику `business-analyst`. Не используй, если задача маленькая и однозначная (переименование, точечный багфикс с понятной причиной) или acceptance criteria уже явно заданы пользователем/issue — в этом случае сразу делегируй по `rules/workflow.md`.4---56# Интервью с пользователем78## Обзор910Самый дешёвый баг — тот, что не написан, потому что нужный вопрос задали до реализации, а не после11код-ревью. Этот skill заменяет накопление предположений структурированным интервью: задавай12целевые вопросы малыми пачками, скармливай каждый ответ следующему раунду и останавливайся только13тогда, когда acceptance criteria можно написать не выдумывая. Он выносит разговор, который иначе14случится как rework после ревью, в начало — до того как задача уйдёт профильному агенту.1516## Когда использовать1718- Запрос на одну-две фразы описывает то, что явно больше одной-двух фраз ("добавь оффлайн-режим").19- Требования противоречат друг другу или текущему поведению приложения/бэкенда.20- Возможны несколько трактовок, и ошибиться в выборе дорого (миграция схемы, публичный контракт,21 необратимое решение — см. также `doubt-driven-development`, если он у вас появится, либо сразу22 `documentation-and-adrs`-практику для фиксации решения).23- Перед тем как отдать задачу `business-analyst` на проверку acceptance criteria, или профильному24 инженерному агенту на реализацию.25- Пользователь говорит в духе "ты понимаешь, о чём я" — не понимаешь.2627**Не используй, если:** задача маленькая и однозначная (rename, точечный багфикс с понятной28причиной), или acceptance criteria уже заданы явно пользователем/issue/спекой — тогда сразу29делегируй по `rules/workflow.md`. Интервью не должно быть предлогом не начинать работу.3031## Процесс3233### Шаг 1. Зафиксируй, что уже понятно3435Прежде чем задавать вопросы, письменно зафиксируй текущее понимание и уровень уверенности:3637```markdown38## Понимание: оффлайн-очередь мутаций задач39- Пользователь видит закэшированные задачи офлайн — уверенно (сказано явно)40- Пользователь может СОЗДАВАТЬ задачи офлайн — предположение, не сказано41- Стратегия разрешения конфликтов — неизвестно42- Триггер синка (при открытии приложения? WorkManager?) — неизвестно43Уверенность: ~40%44```4546Строки "предположение" и "неизвестно" становятся списком вопросов. Если таких строк не возникло —47интервью не требовалось.4849### Шаг 2. Задавай вопросы малыми целевыми пачками50513–5 вопросов за раунд, самое дорогое решение — первым. Один вопрос — одно решение, конкретные52варианты вместо открытых формулировок:5354```markdown551. Если задачу отредактировали офлайн на двух устройствах, что побеждает при синке — последняя56 запись или конфликт показывается пользователю?572. Создание задач должно работать офлайн, или в v1 офлайн — только чтение?583. Синк по открытию приложения или фоновый через WorkManager (с учётом Doze/App Standby)?594. Что происходит с несинканными офлайн-изменениями при логауте?60```6162Правила вопросов:63- Спрашивай про поведение, которое видит пользователь, а не про реализацию ("что побеждает?", а не64 "OT или CRDT?").65- Предлагай дефолт: "Предлагаю last-write-wins для v1 — годится?" — легко подтвердить, легко66 поправить.67- Поднимай платформенные реалии, которые заказчик может не знать: фоновые ограничения (Doze,68 WorkManager retry/backoff), KMP-паритет поведения между Android и iOS (если фича общая для69 `shared/`), реконнект realtime-канала (SignalR) после разрыва сети, требования Google70 Play/App Store review.71- Никогда не переспрашивай то, что уже закрыл предыдущий ответ.7273### Шаг 3. Скорми ответы обратно и итерируй7475После каждого раунда обнови документ понимания — перескажи ответы своими словами, отметь закрытые76пункты, дай новым вопросам возникнуть из ответов:7778```markdown79Закрыто: офлайн-чтение и создание в v1; last-write-wins; синк по открытию приложения.80Новый вопрос из "last-write-wins": тихая потеря данных при конфликте — ок, или логировать для81саппорта?82Уверенность: ~80%83```8485### Шаг 4. Останавливайся на ~95% и передавай дальше8687Выходи из интервью, когда каждый acceptance criterion можно написать не выдумывая. Идеальная88уверенность — не цель; оставшиеся ~5% фиксируются как явные предположения:8990```markdown91Предположения (продолжаем, пока не поправят):92- Конфликты достаточно редки, чтобы тихий last-write-wins был приемлем для v1.93```9495Передай результат дальше по `rules/workflow.md`: если решение архитектурное или необратимое —96сначала `business-analyst` на проверку с продуктовой стороны и/или ADR по97`documentation-and-adrs`-практике; реализацию отдай профильному агенту (`kotlin-engineer`,98`compose-builder`, `swift-engineer`, `swiftui-builder`) вместе с документом понимания как частью99постановки задачи — не как отдельное сообщение, которое потеряется в чате. Для оффлайн-очереди100из примера выше следующий шаг обычно — `create-offline-outbox`.101102## Типичные отговорки103104| Отговорка | Почему не работает |105|---|---|106| "Сделаю разумные предположения и отмечу их" | Десять сложенных "разумных" предположений дают неразумный результат. Предположения — для последних 5%, а не для первых 50%. |107| "Задавать вопросы — выглядит неуверенно" | Реализация не того выглядит хуже. Хорошие вопросы демонстрируют понимание задачи. |108| "Пользователь занят, не буду дёргать" | Пять минут его времени сейчас дешевле недели переделки и более тяжёлого разговора потом. |109| "Разберусь по ходу реализации" | Структурные решения (модель офлайна, стратегия конфликтов) дёшево менять в разговоре и дорого — в коде. |110| "Один большой список вопросов эффективнее" | Двадцать вопросов разом просто пролистают. Маленькие пачки получают настоящие ответы, а ответы меняют следующие вопросы. |111| "Передам неопределённость профильному агенту, он разберётся по контексту" | Профильный агент реализует, а не уточняет продуктовые решения — по `rules/workflow.md` он получает уже поставленную задачу. Нерешённая неоднозначность в постановке становится неверной реализацией, а не вопросом. |112113## Красные флаги114115- Реализация начата, а документ понимания всё ещё содержит "неизвестно" по ключевому поведению.116- Вопросы про детали реализации, а не про видимое пользователю поведение.117- Задача делегирована профильному агенту с нерешённой неоднозначностью вместо того, чтобы закрыть118 её в main-сессии до делегирования.119- Один и тот же вопрос задан дважды, потому что ответ не зафиксировали.120- Ноль зафиксированных предположений в задаче, где неоднозначность точно была (значит, их сделали121 молча).122- Стена из двадцати вопросов одним сообщением.123- "Интервью" продолжается после того, как acceptance criteria уже можно написать — это уже124 затягивание, а не уточнение.125126## Чек-лист127128- [ ] Документ понимания существует и явно делит пункты на подтверждённые / предположенные /129 неизвестные.130- [ ] Каждое видимое пользователю поведение закрыто ответом или явным предположением — без тихих131 пробелов.132- [ ] Оставшиеся предположения записаны и показаны пользователю, а не оставлены только в голове133 агента.134- [ ] Acceptance criteria можно сформулировать, ничего не выдумывая.135- [ ] Платформенные ограничения стека (Doze/WorkManager, KMP-паритет Android/iOS, реконнект136 realtime, Play/App Store review) подняты там, где релевантны.137- [ ] Результат передан дальше как часть постановки задачи для `business-analyst` и/или138 профильного агента — по `rules/workflow.md`, а не потерян в чате.