Конвейер конвейеров

Обычно, когда мы говорим про делание неких задач, мы представляем себе минимум 1 последовательность из нескольких этапов. Например, нужно заказать пиццу.

Взять телефон → Открыть приложение → Выбрать пиццу → Заказать пиццу

У неопытного исполнителя именно такое видение процесса. Но такая последовательность — поверхностное и искаженное ощущение близости результата.

Этап «Взять телефон» может оказаться сложнее, чем предполагалось. Возможно, его еще нужно будет найти. Вдруг телефон вы оставили в туалете или поставили на зарядку в спальне и напрочь об этом забыли. Теперь, наш конвейер выглядит так:

Определить места, где телефон был в последний раз → Последовательно проверить каждое место → Взять телефон

Добавились еще два шага. Если вы опытный, то вы можете схлопнуть их одного, если решите позвонить на потерянный телефон (если это позволяет сделать ситуация, например, у вас есть второй телефон).

Окей, добрались наконец-то до телефона. А приложение установлено? Если нет, то:

Открыть каталог приложений → Найти приложение → Установить приложение

И это при условии, что не потребуется искать как подключиться к интернету и все такое. Как видите, даже такая простая операция заказа пиццы может усложниться буквально на каждом этапе.

Теперь главное. Выбор пиццы. Допустим, вы не одни. Вас трое. Бюджет ограничен.

Собрать предпочтения → Отфильтровать пиццы по предпочтениям → Проверить акционные позиции → Согласовать выбор → Сделать окончательный выбор

Каждый, кто хотя бы раз заказывал пиццу с друзьями, знает, как долго можно ее выбирать. На тонком или пышном тесте, с сырным бортом или без. Острая или не очень. А мне вот без грибов. А мне без помидоров. И так далее. Процесс может затянуться и уйти в глубокий цикл согласования. Упростить этап можно, если заранее знать кто какие пиццы любит и договориться о том, что заказ будет выполнен из предопределенного списка.

Как вы уже поняли, любая задача — это конвейер конвейеров. Каждый со своим алгоритмом. Скорость работы конвейера определяется наличием или отсутствием описания стандартных операций (ОСО). Если есть ОСО, то мы просто идем по нему, не вникая в подробности. Если нет — нужно остановиться, чтобы декомпозировать задачу на части. Любая задача может быть декомпозирована и должна быть декомпозирована, если она заранее не имеет ОСО.