Решение задач
Что это такое
Решение задач здесь означает разбивать неясную проблему на части, пока следующее действие не станет очевидным. Результат — не ответ, а структура: части проблемы, что известно, что предполагается и самый маленький следующий шаг, который разрешил бы самое крупное неизвестное.
Почему это важно
Большая часть времени, потерянного на трудной проблеме, уходит на не ту её часть. Человек начинает отлаживать там, где проявляется симптом, или проектирует решение для требования, которого никто не подтвердил, — и работа технически грамотна, но нацелена не туда. Структурирование проблемы сначала превращает пугающую мешанину в короткий список и вскрывает допущение, которое сделало бы весь подход бессмысленным, — обычно это самое дешёвое, что можно проверить.
Ключевые идеи
Запишите проблему одним предложением, затем разделите
Одно предложение вынуждает дать определение. Затем разделите на части, которые можно проверить независимо, каждую — с тем, что вы знаете, и тем, что предполагаете.
Проблема: ночной экспорт падает по тайм-ауту только по вторникам.
Части: (a) объём данных по вторникам
(b) время запуска задания и что ещё идёт тогда
(c) сама настройка тайм-аута
Известно: (c) не менялось год
Предполагается: (a) объём растёт к концу недели <- дешевле всего проверить
Далее: логировать число строк в начале каждого запуска две недели
Допущение, помеченное как «дешевле всего проверить», и есть то, что нужно проверить первым, а не то, что кажется самым вероятным.
Отделяйте симптом от причины и от цели
Симптом — это наблюдаемое, причина — то, что его создаёт, цель — то, что нужно пользователю. Исправить симптом иногда правильно, и это должно быть решением, а не случайностью.
Работайте с двух концов
Найдите самый маленький случай, который воспроизводит проблему, и посмотрите на самую широкую картину того, когда она случается. Закономерность между случаями часто указывает на причину быстрее, чем чтение кода.
Ограничивайте поиск по времени и записывайте, что исключили
Ограниченное исследование с письменным списком устранённых причин не даёт дважды пройти один и тот же путь и превращает застрявший день в доказательства.
Назовите следующее действие или скажите, что заблокированы
Структура без следующего шага — это описание, а не план.
Практика
Разложите одну застрявшую проблему
Возьмите проблему, на которой сейчас застряли. Напишите её одним предложением, затем разделите на части с известным, допущениями и следующей проверкой для каждой.
Готово, когда: у каждой части есть следующее действие, и вы начали самую дешёвую проверку, а не самую вероятную.
Ведите журнал исключений один день
Потратьте ограниченный блок на баг и записывайте каждую гипотезу и доказательство, которое её исключило.
Готово, когда: в журнале названо то, что осталось, и кто-то другой может продолжить по нему, не повторяя вашу работу.
Частые ошибки
- Начинать с самой вероятной причины — самая дешёвая проверка пропущена, и часы уходят не туда; исправить: ранжируйте неизвестные по стоимости проверки.
- Решение симптома — причина возвращается через неделю; исправить: помечайте исправление как обходной путь или починку осознанно.
- Нет письменной формулировки проблемы — два человека решают разные проблемы в одном разговоре; исправить: напишите одно предложение и согласуйте его.
- Исследование без границ — день исчезает, ничего не исключив; исправить: ограничьте его временем и записывайте, что исключили.
- Структура без следующего действия — аккуратное описание и никакого прогресса; исправить: заканчивайте каждую часть следующей проверкой.
Что читать дальше
- Отладка (01-cs-fundamentals/11-debugging) — та же дисциплина, применённая к падающей программе.
- Управление временем (08-soft-skills/05-time-management) — защита блока, который нужен этой работе.
- Коммуникация (08-soft-skills/01-communication) — объяснение структуры тому, кто должен по ней действовать.
- Продуктовое исследование (04-product-process/04-product-discovery) — версия на уровне продукта: поиск проблемы, которую стоит решать.