Императивы и декларативы

Введение

Simplicity is hard work. But, there’s a huge payoff. — Rich Hickey

Эта статья вдохновлена IT. В ней стили написания кода приведены как метафора для постановки задач.

Существует два вида программирования: императивный и декларативный. В сущности, первый указывает на то, как выполнить задачу, а второй — что ожидается в конечном результате.

С первого взгляда может показаться, что разница незначительная. Я объясню, что использование того или иного подхода играет важную роль.

Зачем

Почему

Я часто слышу от окружающих или замечаю за собой фразы: «мне надо сделать то-то», «надо было так сделать», «если я не сделаю, то будет плохо». Хочу объяснить и себе, и окружающим почему лучше когда дела это увлекательные игры, а не болючие долги перед надзирателям.

В попытках помочь коллегам и близким я сталкиваюсь с непониманием и даже с противоположными убеждениями.

Вот утрированный пример с планированием задач на спринт:

*— Давайте опишем задачу через конечный результат и пока избежим подробностей реализации? Что мы хотим получить?

— Но подробности важны и нужно начать с глагола как призыва к действию. Так будет понятно, что нужно сделать.*

Кто прав? Совершенно верной точки зрения тут нет, однако далее я объясню, что такое декларативный подход и почему стоит использовать его по-умолчанию.

Примеры

Императивно

**Р***: Мама, возьми муку, замеси тесто, заготовь начинку, раскатай тесто в круг, выложи начинку слоями: сначала сыр...*
**М**
*
: Так, а как заготовить начинку?*
**Р**
*
: Нарежь овощи и грибы, отвари куриное мясо, нарежь...

...скрытый от ребёнка процесс...*

**М***: Сложно, на тебе кашу*

Декларативно

**Р***: Мама, хочу пиццу!

...скрытый от ребёнка процесс...*

**М***: На тебе пиццу

...спустя время...*

**Р***: Мама, хочу пиццу, но побольше колбасы и сыра!

...скрытый от ребёнка процесс...*

**М***:* На тебе пиццу

В чём разница

Императивное описание происходит «снизу вверх», то есть о результате думают в конце. На низком уровне абстракции находятся точные действия. Такой подход в чистом виде сложен, а результат непредсказуем.

Декларативное подход, напротив, призван идти «сверху вниз». Он начинается с абстракции, а движется к деталям. Как правило на верхнем уровне абстракции лежат представления о конечном результате.

Что проще

Императивность сложнее потому что обязывает удерживать в голове больше деталей на начальном этапе, а это только мешает, ведь мозг имеет ограниченное внимание. Подробности перекрывают друг друга и забываются. Это ограничение мозга называют «Кошельком Миллера».

По сути, разница между описанными подходами лежит во фразе:

«Что» проще чем «Как»

Императивные глаголы

Я считаю, что ставя задачи, стоит избегать императивных глаголов (сделать, исправить, изучить). Да, это контринтуитивное убеждение. Его смысл в том, чтобы ограничить привязку к императивному стилю и вместо этого задуматься о результате.

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

Ещё можно всё попутать. Императивы легко использовать «сверху вниз», то есть абстрактно. Тогда задача ещё усложняется, а риски увеличиваются, ведь приказ что делать непонятен, а результат слабо описан.

— Скажите, пожалуйста, куда мне отсюда идти?
— А куда ты хочешь попасть? — ответил Кот.
— Мне все равно — сказала Алиса.
— Тогда все равно, куда и идти, — заметил Кот.

В чём польза

Однако, не стоит считать, что императивы — чистое зло, а декларативы — всегда добро. Дело в том, что императивы формируют профессионализм, который достигается за годы обучения и практики.

Императивность связана с процедурной памятью, которая подобна мышечной. Чтобы её выработать стоит повторять действия в различных вариациях и сверять результаты.

Таким образом, императивы становятся неосознанным багажом тех, кто много практиковался в своём деле. И им не нужны инструкции извне, они сами понимают, а точнее чувствуют, что делать если описан конечный результат.

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

Сюхари

С другой стороны, новички не имеют почти ничего в области своей профессиональной интуиции и они нуждаются в подробных указаниях. Без императивов они ощущают ступор. И даже если императивы приводят к худшему результату, то для новичка что-то лучше чем ничего. А на основе ошибок происходит дальнешая каллибровка интуции.

Описанная разница укладывается в концепцию из боевых искусств Сюхари. Есть три стадии мастерства:

Первая ступень заключается в строгом повторении упражнений без отступлений в сторону. Последняя — в свободном использовании практик с нарушением правил ради результата.

Ещё пример и объяснения

«Нормально построить дом» против «Дом…». В первом случае возникает закономерный вопрос: «А как?», во втором: «А какой? А зачем? А когда?».

Тяжело ≠ Сложно

Декларативную задачу поставить тяжелее так как это требует мыслей о результате. Мозг может испытать напряжениие от попытки «заглянуть в будущее», это буквально перегрузит его деталями и возможными сценариями.

Реальность, это сложнейшая система и её будущее состояние зависит от многих факторов. Чем больше факторов, тем неприятнее: кошелёк Миллера переполняется, ресурсы тратятся, фокус теряется и усилия могут уйти впустую. А мозг ненавидит напряжения без награды.

Поэтому хорошие декларативные задачи получаются из подзадач, которые получены после разбиения. Пример: задачу «дом для мамы» тяжелее продумать в деталях, чем задачу «архитектура дома для мамы». В первой задаче сотни или даже тысячи промежуточных шагов, а во второй на порядок меньше. Это как сравнивать просчёт шахматной партии на 10 шагов и на 3 шага вперёд.

Легко ≠ Просто

Архитектура, это лишь этап на пути к дому. В ней относительно меньше сложности, однако на этом не стоит останавливаться. В идеале стоит достичь максимальной редукции задачи, отдавая внимание подготовительным действиям. Не «вышел утром 10 числа на пробежку», а «подготовил форму и кроссовки с утра, да поместил их на выходе».

Задачи со свободой выбора решения — более понятные и гибкие. Людям тяжело доверять практикам, которые они не понимают. К примеру, легко испытать избегание в ответ на фразу «просто сделай факторизацию, премортемы и разбор внутреннего конфликта». Как доверять этим практикам если неизвестно как они работают и чем помогут?

Детальная и структурная сложности

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

С помощью инструментов и абстракций детальная сложность превращается в структурную (сложное становится тяжёлым). Например, вместо 100 сотрудников в компании мы имеем 4 департамента по 5 команд по 5 человек. Такая иерархия сужает область внимания на каждый её элемент.

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

Эффект велосипедного сарая

Закон тривиальности является следствием сложных и тяжёлых задач. Согласно ему, во время коллективных обсуждений в разы больше внимания уделяется лёгким задачам.

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

Большую часть времени участники потратят на обсуждение мелких и простых для понимания вопросов, вроде материалов для строительства сарая, оставляя без внимания конструкцию самой электростанции, — что является гораздо более важным, но одновременно и гораздо более сложным и комплексным вопросом.

Выводы

Задачи и их постановка фундаментально важная проблема. Ведь каждый раз при формулировке планируемого дела происходит описание реальности через модель.

Это похоже на научный метод. Стоит пользоваться критерием опровержимости и отсеивать лишние сущности. Иначе процветает мракобесие и магическое мышление, что может быть и хорошо для интересности процесса, но вредно для достижения результата.

Где применять императивы

Они полезны для новичков в профессиях с интеллектуальной нагрузкой. И они эффективны в профессиях требующих физических нагрузок и с повторяющимися операциями, другой вопрос: полезны ли они? Второй тип профессий постепенно заменят роботы, а дизайном и программированием займутся люди.

Где применять декларативы

По умолчанию, везде. При описании, уточнении и разбиении задач я придерживаюсь следующей модели:

Я не использую такие слова как «надо», «сделай», «должен» так как они абстрактны и как минимум бесполезны. Ещё, лично у меня, да и у многих людей с детства к ним «аллергия».