Императивы и декларативы
Введение
Simplicity is hard work. But, there’s a huge payoff. — Rich Hickey
Эта статья вдохновлена IT. В ней стили написания кода приведены как метафора для постановки задач.
Существует два вида программирования: императивный и декларативный. В сущности, первый указывает на то, как выполнить задачу, а второй — что ожидается в конечном результате.
С первого взгляда может показаться, что разница незначительная. Я объясню, что использование того или иного подхода играет важную роль.
Зачем
- Ты поймёшь почему тяжело выполнять задачи, которые сформулированы как приказы
- Ты сможешь ставить задачи так, чтобы их хотелось выполнять
- Ты сможешь объяснять как ставить задачи и цели так, чтобы прокрастинация и избегания происходили реже
Почему
Я часто слышу от окружающих или замечаю за собой фразы: «мне надо сделать то-то», «надо было так сделать», «если я не сделаю, то будет плохо». Хочу объяснить и себе, и окружающим почему лучше когда дела это увлекательные игры, а не болючие долги перед надзирателям.
В попытках помочь коллегам и близким я сталкиваюсь с непониманием и даже с противоположными убеждениями.
Вот утрированный пример с планированием задач на спринт:
*— Давайте опишем задачу через конечный результат и пока избежим подробностей реализации? Что мы хотим получить?
— Но подробности важны и нужно начать с глагола как призыва к действию. Так будет понятно, что нужно сделать.*
Кто прав? Совершенно верной точки зрения тут нет, однако далее я объясню, что такое декларативный подход и почему стоит использовать его по-умолчанию.
Примеры
Императивно
**Р***: Мама, возьми муку, замеси тесто, заготовь начинку, раскатай тесто в круг, выложи начинку слоями: сначала сыр...*
**М***: Так, а как заготовить начинку?*
**Р***: Нарежь овощи и грибы, отвари куриное мясо, нарежь...
...скрытый от ребёнка процесс...*
**М***: Сложно, на тебе кашу*
Декларативно
**Р***: Мама, хочу пиццу!
...скрытый от ребёнка процесс...*
**М***: На тебе пиццу
...спустя время...*
**Р***: Мама, хочу пиццу, но побольше колбасы и сыра!
...скрытый от ребёнка процесс...*
**М***:* На тебе пиццу
В чём разница
- Императи́в (лат. imperativus — повелительный, от лат. impero — повелеваю) — форма наклонения, выражающая волеизъявления (приказ, просьбу или совет). Например: «иди туда», «пойдём скорее», «сделать статью».
Императивное описание происходит «снизу вверх», то есть о результате думают в конце. На низком уровне абстракции находятся точные действия. Такой подход в чистом виде сложен, а результат непредсказуем.
- Декларатив (лат. dēclārō — чтобы прояснить, от dē- + clārus — “чисто, ясно, чётко”) — форма наклонения, близкая к изъявительному и представляющая процесс как действительный факт. Например: «ты говоришь», «мы идём», «он сделал», «это статья про задачи»
Декларативное подход, напротив, призван идти «сверху вниз». Он начинается с абстракции, а движется к деталям. Как правило на верхнем уровне абстракции лежат представления о конечном результате.
Что проще
Императивность сложнее потому что обязывает удерживать в голове больше деталей на начальном этапе, а это только мешает, ведь мозг имеет ограниченное внимание. Подробности перекрывают друг друга и забываются. Это ограничение мозга называют «Кошельком Миллера».
По сути, разница между описанными подходами лежит во фразе:
«Что» проще чем «Как»
Императивные глаголы
Я считаю, что ставя задачи, стоит избегать императивных глаголов (сделать, исправить, изучить). Да, это контринтуитивное убеждение. Его смысл в том, чтобы ограничить привязку к императивному стилю и вместо этого задуматься о результате.
Конечно, можно в одной формулировке использовать и императивный глагол, и декларативное описание. Но во-первых, это избыточно, а во-вторых повышается шанс, что после вводного глагола пойдут детали реализации и конечный результат будет описан поверхностно.
Ещё можно всё попутать. Императивы легко использовать «сверху вниз», то есть абстрактно. Тогда задача ещё усложняется, а риски увеличиваются, ведь приказ что делать непонятен, а результат слабо описан.
— Скажите, пожалуйста, куда мне отсюда идти?
— А куда ты хочешь попасть? — ответил Кот.
— Мне все равно — сказала Алиса.
— Тогда все равно, куда и идти, — заметил Кот.
В чём польза
Однако, не стоит считать, что императивы — чистое зло, а декларативы — всегда добро. Дело в том, что императивы формируют профессионализм, который достигается за годы обучения и практики.
Императивность связана с процедурной памятью, которая подобна мышечной. Чтобы её выработать стоит повторять действия в различных вариациях и сверять результаты.
Таким образом, императивы становятся неосознанным багажом тех, кто много практиковался в своём деле. И им не нужны инструкции извне, они сами понимают, а точнее чувствуют, что делать если описан конечный результат.
Выше я сказал, что императивный подход непредсказуем, но если цепочка действий уже множество раз проверена, то результат известен заранее. Этого и достигают мастера своего дела.
Сюхари
С другой стороны, новички не имеют почти ничего в области своей профессиональной интуиции и они нуждаются в подробных указаниях. Без императивов они ощущают ступор. И даже если императивы приводят к худшему результату, то для новичка что-то лучше чем ничего. А на основе ошибок происходит дальнешая каллибровка интуции.
Описанная разница укладывается в концепцию из боевых искусств Сюхари. Есть три стадии мастерства:
- Сю (от яп. 守 — «соблюдать»)
- Ха (от яп. 破 — «прорываться»)
- Ри (от яп. 離 — «отделяться»).
Первая ступень заключается в строгом повторении упражнений без отступлений в сторону. Последняя — в свободном использовании практик с нарушением правил ради результата.
Ещё пример и объяснения
«Нормально построить дом» против «Дом…». В первом случае возникает закономерный вопрос: «А как?», во втором: «А какой? А зачем? А когда?».
Тяжело ≠ Сложно
Декларативную задачу поставить тяжелее так как это требует мыслей о результате. Мозг может испытать напряжениие от попытки «заглянуть в будущее», это буквально перегрузит его деталями и возможными сценариями.
Реальность, это сложнейшая система и её будущее состояние зависит от многих факторов. Чем больше факторов, тем неприятнее: кошелёк Миллера переполняется, ресурсы тратятся, фокус теряется и усилия могут уйти впустую. А мозг ненавидит напряжения без награды.
Поэтому хорошие декларативные задачи получаются из подзадач, которые получены после разбиения. Пример: задачу «дом для мамы» тяжелее продумать в деталях, чем задачу «архитектура дома для мамы». В первой задаче сотни или даже тысячи промежуточных шагов, а во второй на порядок меньше. Это как сравнивать просчёт шахматной партии на 10 шагов и на 3 шага вперёд.
Легко ≠ Просто
Архитектура, это лишь этап на пути к дому. В ней относительно меньше сложности, однако на этом не стоит останавливаться. В идеале стоит достичь максимальной редукции задачи, отдавая внимание подготовительным действиям. Не «вышел утром 10 числа на пробежку», а «подготовил форму и кроссовки с утра, да поместил их на выходе».
Задачи со свободой выбора решения — более понятные и гибкие. Людям тяжело доверять практикам, которые они не понимают. К примеру, легко испытать избегание в ответ на фразу «просто сделай факторизацию, премортемы и разбор внутреннего конфликта». Как доверять этим практикам если неизвестно как они работают и чем помогут?
Детальная и структурная сложности
С декларативной постановкой задач появляется потребность в высокой детализации ожиданий. В профессиональной среде это выражается в аналитике, спецификациях, макетах, чертежах и прочих вспомогательных инструментах. Оно того стоит, ведь положительно влияет на результат, потому что позволяет снизить детальную сложность.
С помощью инструментов и абстракций детальная сложность превращается в структурную (сложное становится тяжёлым). Например, вместо 100 сотрудников в компании мы имеем 4 департамента по 5 команд по 5 человек. Такая иерархия сужает область внимания на каждый её элемент.
В контексте задач мне помогают: приоритизация, разбиение на этапы, области ответственности и так далее. Все эти инструменты могут отталкивать и грузить при знакомстве с ними. Однако, их постепенное изучение упрощает процесс и разгружает мозг.
Эффект велосипедного сарая
Закон тривиальности является следствием сложных и тяжёлых задач. Согласно ему, во время коллективных обсуждений в разы больше внимания уделяется лёгким задачам.
К примеру, у комитета стоят задачи «построить атомную электростанцию» и «построить сарай для велосипедов». Вероятнее всего наиболее жаркий и продолжительный спор о реализации вызовет вторая задача.
Большую часть времени участники потратят на обсуждение мелких и простых для понимания вопросов, вроде материалов для строительства сарая, оставляя без внимания конструкцию самой электростанции, — что является гораздо более важным, но одновременно и гораздо более сложным и комплексным вопросом.
Выводы
Задачи и их постановка фундаментально важная проблема. Ведь каждый раз при формулировке планируемого дела происходит описание реальности через модель.
Это похоже на научный метод. Стоит пользоваться критерием опровержимости и отсеивать лишние сущности. Иначе процветает мракобесие и магическое мышление, что может быть и хорошо для интересности процесса, но вредно для достижения результата.
Где применять императивы
Они полезны для новичков в профессиях с интеллектуальной нагрузкой. И они эффективны в профессиях требующих физических нагрузок и с повторяющимися операциями, другой вопрос: полезны ли они? Второй тип профессий постепенно заменят роботы, а дизайном и программированием займутся люди.
Где применять декларативы
По умолчанию, везде. При описании, уточнении и разбиении задач я придерживаюсь следующей модели:
- Необязательный пункт. Тут находятся области объединяющие под собой проекты. Это не всегда и не для всех важный шаг. Они позволяют точнее определять соотношения и направления за счёт накопления проектов в них.
- На этом уровне у меня есть проекты как цепочки желаемых результатов. Например, эта статья. То есть проекту не обязательно быть масштабным и долгосрочным.
- Далее, в каждом проекте описаны результаты (Objectives). Они содержат в себе обоснования, последствия и записи об изучении. Результаты я описываю как реальную сущность вообще без глаголов. О реализации пока не идёт речи.
- Каждый ожидаемый результат содержит в себе шаги достижения, возможно примерные и с акцентом на первые действия. Спустя время каждый шаг может уточняться, разбиваться или вовсе помечаются тупиковыми. Они описываются как совершённые действия: «сходил на базар», «купил молоко».
Я не использую такие слова как «надо», «сделай», «должен» так как они абстрактны и как минимум бесполезны. Ещё, лично у меня, да и у многих людей с детства к ним «аллергия».