Осознанность
September 29

Структурное мышление

«Микросервисы» и «так мы делали в прошлом проекте»

В работе Тимлида, команды целиком и каждого участника возникают различного рода задачи (задания), которые мы называем сложными, непонятными. Со сложностью мы уже начали разбираться и даже кратко коснулись способы работы со сложностью. Сложные и непонятные задачи вызывают дискомфорт из-за того, что не понятно, как их решать. Но непонятные и сложные задачи решать приходится, так как есть определённое ожидание со стороны других участников процесса. На практике встречаю следующие популярные походы к принятию решений по возникающим задачам:

  • отсутствие осознанности в принятии решения - быстрый ответ, связанный с модными технологиями и методологиями. Предлагается использовать технологии и подходы, которые модны и на слуху на данный момент: микросервисы, scrum, agile, язык go, функциональное программирование, язык rust и т.д.
  • интуитивное принятие решения - быстрый ответ, основанный на предыдущим опытом. Предлагается использовать технологии и подходы, которые использовались ранее. Сами же технологии могут быть как современные на данный момент (agile, микросервисы, облака, функциональное программирование) , так и «не модные» (waterfall, 2х звенная архитектура, asp, jsf).
  • прокрастинация - делаем всё, что угодно, но не то, что нужно. Рефакторинг, коллективное изучение нового подхода и инструмента и увиливание от вопроса «зачем все это нужно?»

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

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

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

  • Эффект Даннинга-Крюгера. Данный эффект оказывает негативное воздействие не только у новичка, но и у профессионала. Профессионал может интуитивно получить решение и дальше не применив осознанность начать его реализовывать, остальные же склоняться перед авторитетом.
  • Система 1 и Система 2 Дениэла Канемана. Так уж вышло, что мозгу проще выдавать ответ на основе интуиции , а там масса когнитивных искажений, которые ведут нас к неверным решениям.
  • Ширина и глубина знания Нила Форда . Увеличение знания о чем-то, ведёт к увеличению времени на актуализацию этого знания. Узкая специализация скрывает важные требования, что ведёт к неверным решениям.

Цена неосознанности

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

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

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

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

А, что же осознанные решения не имеют негативных и нежелательных последствий? Абсолютно все решения будь-то они осознанные или нет могут иметь негативные или нежелательные последствия. Разница в том, готовы ли мы к этим последствиям или нет. Если возможные негативные или нежелательные последствия ожидаемы, то появляется выбор, что с этим делать. В осознанном принятии решения негативные и нежелательные последствия - это риски, а с рисками уже можно заранее работать . Для работы с рисками есть отдельные методики и подходы.

«Сито» реальности

Осознанность строиться на использовании структур. Тут стоит сделать шаг у сторону и договориться про структуру. Под структурой понимается полный набор необходимых элементов , которых объединяют связи.

Но как же модель!? Модель и структура, и там и там элементы, и там и там связи , какая разница !?

Структуру будем понимать , как полный набор всех элементов и связей. Модель же - это акцент на определенных элементах и/или связей.

А может быть модель структуры ? Конечно. Для получения модели из имеющейся структуры опускается часть элементов их свойств, связей . Для одной структуры можно построить множество различных моделей , которые рассматривают разные аспекты данной структуры. Любая модель - это модель структуры , даже когда нам эта структура неизвестна. Через моделирование и проверку моделей , можно прийти к понимаю структуры.

А может быть структура модели !?))) И так тоже может быть и часто бывает. Можно сказать, что структура модели - это способ моделирования , язык моделирования, мета модель. Например, «квадратика и стрелочки», где квадратики - это всегда приложения , а стрелочки - это всегда вызовы . В примере определена структура модели , дальше с помощью такой структуру можно описать бесконечное число архитектурных решений.

Структура модели позволяет, что бы модель была нужной «ширины» (выделение правильных абстракций) и нужной «глубины» (детализация). Такую структуру можно сравнить с ситом ( например, старателя) , задерживаются только те камушки которые больше, чем ячейка сита. В нашем случаем структура модели просеивает реальность, оставляя только нужные нам элементы и связи . Построение структуры моделей - это проявление структурного мышления.

Зачем все это надо? Структуру или модель позволяют сконцентрировать усилия, а потом или вовремя оценить влияние этих усилий на результат и цель.

Проявления осознанности

Я выделяю следующие проявления осознанности:

  • ведомый интуицией. Участник команды движимый в своих решения полностью интуицией. Навыки были сформированы «под давлением» ( школа, университет, курсы «войти в IT», тесная работа с ментором , синдром «выжившего»)
  • ведомый моделированием. Рисует «квадратики и стрелочки» пытается понять , а почему надо делать так , а не иначе. Регулярно такой порыв возникает после прочтения различной спец литературы ( про микросервисы, DDD, TDD, BDD, DRY, SOLID, чистая архитектура и т.д.). Также модели могут быть основаны на интуиции, когда хочется обобщить опыт.
  • ведомый структурой. Использует готовые или свои структуры решения конкретных задач с пониманием , какого качества будет конечный результат. В случае неудовлетворительного результата , понятно , что стало причиной. Структуру может быть самим решением или структура позволит построить модель решения.

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

Примеры

Рассмотрим примеры различных структур моделей .

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

C4 model . Набор элементов, связей , уровней ( контексты , контейнеры, компоненты, код). Как и uml позволяет описывать архитектуру .

Технология производства. Позволяет строить модель решения в форме IT продукта в конкретной команде/компании.

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

SMART (Specific (конкретный), Measurable (измеримый), Attainable (достижимый), Realistic (реалистичный), Tangible (осязаемый)) . Подход к постановке задачи, который можно использовать в делегировании.

Пирамида Минто ( включая MECE - Mutually Exclusive Collectively Exhaustive) . Подход к формированию гипотез.

и многое другое…

Вместо заключения

Создание собственных структур моделей задача сложная и не всегда это требуется. Регулярное моделирование со временем ( в зависимости от сложности объекта - это может быть и бесконечное время )) ) позволяет понять структуру объекта и или структуру модели.

Тимлид не стесняйся использовать чужие структуры и чужие модели.