Уже неоднократно сталкивался с тем, как тяжело дается управление процессом создания сложных систем, на которыми работает множество команд.
Сначала все вроде идет хорошо и разумно. На старте проекта умные люди разбивают систему на части, собирают команды для разработки отдельных частей, а потом все идёт не то, чтобы плохо... но вот как-то не так, как задумывалось.
Команды отдельных подсистем смотрят больше внутрь, чем наружу, концентрируются на своем кусочке и его взаимодействии с другими подсистемами. Внутри команд возникает вполне себе дружба, синергия, развитие и эволюционная архитектура. Но прочерченные между подсистемами границы оказываются неожиданно очень жёсткими. На уровне всей системы командная работа сама по себе не возникает. И неважно, в одной организации эти команды, или в разных.
Если просто сложить в тазик печень, сердце, лёгкие и т.п., то человечек не сложится. Система - это не только компоненты, из которых она состоит, а ещё и связи между ними. И связи эти порой оказываются сложнее, чем сами компоненты.
После разделения ответственностей получается, что каждая команда отвечает за свою подсистему, а связи между системами неожиданно оказываются без хозяина, что приводит к неприятным побочным эффектам. И тут, как всегда есть две крайности - либо системы достаточно автономны и изолированы, тогда эти связи изменяются редко, либо подсистемы связаны сильно, связи живые, динамичные, активно развивающиеся.
В первом случае в архитектуре отдельных подсистем, которые во власти своих команд, поначалу все хорошо. Но если связи меняются редко, то, как правило, нет простых и доступных организационных механизмов изменения отношений между подсистемами. Чтобы что-то добавить или изменить нужно пройти 7 кругов ада и 18 раундов согласований. Итог - изнутри (каждой!) команды остальное окружение воспринимается уже как что-то далекое, чужое и неподвластное. Как следствие, проблемы, которые можно было бы решить уточнением и точечными изменениями контрактов или ответственностей на границах подсистем, решаются сложными компенсациями внутри каждой подсистемы. Сложность растет на ровном месте.
Во втором случае - напротив, динамичность связей необходима для развития и функционирования системы, поэтому сразу закладываются механики и организационные механизмы для их создания и изменения. Связи создаются и модифицируются, но практически бесконтрольно, так как создать их легко, но ответственного нет, документации по уже имеющимся отношениям нет, критериев допустимости нет и т.п. Поэтому связи и отношения растут как саксаул или как одуванчики на некошеном газоне. И неожиданно строгая и аккуратная архитектура на старте постепенно и незаметно превращается в перепутанный комок взаимодействий, хотя каждая подсистема по отдельности вроде как и ничего.
Интересно, с чем связаны эти эффекты? Это чьи-то недоработки или закон природы? Есть ли рецепты борьбы с ними или нужно признать, что это следствие особенностей человеческой психологии и смириться?
#накипело #мысливслух
Post #41
279