Сложность, красота, простота и разработка ПО

Простота это то, что труднее всего на свете; это крайний предел опытности и последнее усилие гения. Леонардо да Винчи

Cовершенство достигается не тогда, когда уже нечего прибавить, но когда уже ничего нельзя отнять. Сент-Экзюпери.

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

Сложность. Сложность является неотъемлемым свойством программного обеспечения. Управление сложностью — одна из важнейших задач при построении ПО. «Программные проекты редко терпят крах по техническим причинам. Чаще всего провал объясняется неадекватной выработкой требований, неудачным планированием или неэффективным управлением. Если же провал обусловлен всё-таки преимущественно технической причиной, очень часто ею оказывается неконтролируемая сложность. Иначе говоря, приложение стало таким сложным, что разработчики перестали по-настоящему понимать, что же оно делает.» [1].

Сложность — это мера структуры. Не стоит путать ее с трудностью — количество труда, меры усилий для реализации задачи. Задача может быть трудная, но не сложная. Объективной характеристикой сложности есть количество — количество объектов системы, количество связей, количество состояний и т. д. [2]. Сложность непосредственно связана с когнитивными способностями человека. Рассматривая сложность мы всегда говорим о ней в контексте субъекта, который имеет с ней дело. Если вы говорите: «Эта задача сложная», то она сложная в первую очередь для вас. Однако люди имеют различные умственные способности и обладают различным набором знаний. Для студента решение квадратного уравнения не представляет большой проблемы, для первоклассника — это сложная, скорее даже неразрешимая задача. Поэтому при решении практических задач мы всегда должны помнить о тех, кто эти задачи решает, и тех, кто пользуется результатами работы. В случае программных систем — это пользователи системы, для которых логика работы системы и пользовательский интерфейс должны быть максимально прозрачными, понятными (то есть, не сложными). Для разработчиков системы сложными могут быть алгоритмы обработки данных или модели предметной области. Чем подготовленней пользователь, тем сложнее может быть интерфейс. Чем опытней разработчик, тем с большей вероятностью он справится со сложной задачей. Однако в любом из этих случаев действует принцип:

БОЛЬШЕ → СЛОЖНЕЕ.

Как показывают многочисленные опыты, объем внимания, количество разнородных объектов, одновременно воспринимаемых человеком, ограничено и колеблется в пределах от 4 до 6 [15]. От этих чисел можно отталкиваться при определении, что есть сложным для восприятия. Например, если диаграмма содержит порядка 4-х элементов, ее легко воспринимать и понимать. Десяток элементов будет восприниматься с трудом. А на понимание объекта, содержащего более 15 элементов, нужно будет потратить намного больше времени.

Этот же подход можно применить и при создании объектов программы.

В контексте когнитивных способностей человека стоит вспомнить и про Колмогоровскую сложность [4]. Грубо говоря, размер текста, которым можно описать задачу. Чем он больше, тем сложнее задачу понять. Если говорить о программных системах, то данное понятие можно перенести на суммарный объем кода программной системы. Иными словами, сложность — это объем информации, который необходимо воспринять человеку для того, чтобы понять систему или объект.

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

Мозг обрабатывает и обобщает огромные массивы данных, поступающие от органов чувств. Упрощенно: кора головного мозга состоит из нескольких слоев. При передаче информации от слоя к слою происходит обобщение данных, и на самом верхнем уровне активируются нейроны, ответственные за хранение инвариантных данных, абстракций. Одной из главных функций коры есть прогностическая функция, основанная на памяти о предыдущих событиях [8].

Эстетические чувства — это реакция головного мозга на понимание зависимостей, структуры: возможность предугадать, прогнозировать. Если оправдываются ожидания человека, то мозг продуцирует гормоны и вызывает положительную эмоциональную реакцию [10].

Во все времена рука об руку с понятием красоты шли такие понятия как гармония, симметрия, пропорция частей [9]. Задачей научной деятельности и деятельности инженера при анализе предметной области для построения ПО является классификация сущностей, поиск зависимостей, выделение структурных компонентов, поиск порядка. Чем проще модель, позволяющая описать сложную предметную область, тем она «красивее», более эстетически значима. В статье «Красота науки» [5] предлагается формула красоты научного открытия. Думаю, что ее можно применить и для оценки технических решений — любое техническое решение является следствием анализа, проработки предметной области. 

Эстетическая значимость (красота) = Наблюдаемая сложность / Объем описания модели.

Или, если говорить другими словами, то красота — это УПОРЯДОЧЕННАЯ, ВИДИМАЯ сложность. 

Проводились психологические опыты, в которых людям предлагали выбрать из группы прямоугольников наиболее привлекательный. В большинстве случаев испытуемые выбирали так называемый «золотой прямоугольник», стороны которого находились в пропорции «золотого сечения», то есть были определенным образом упорядочены. [12]

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

Однако отсюда следует и субъективизм красоты. Взаимосвязи, структуру можно осознать только на основе определенных знаний и опыта. Увидеть красоту в решении проблемы, испытать эстетические чувства может только профессионал (а точнее человек, имеющий определенный уровень знаний). Для того, чтобы увидеть красоту в математической формуле, нужно быть математиком, иначе формула представляет из себя просто непонятный набор символов. Красота, эстетические чувства по отношению к решаемой проблеме есть интуитивная мера правильности решения.

Простота. В природе человека заложено мыслить абстракциями, именно это свойство мозга позволяет познавать окружающий мир. Абстракция существует в сознании человека в качестве образа. Речь позволяет передать информацию об абстракции другому человеку. Именно поэтому так важна терминология при общении с другими людьми. Например, в контексте объявления о продаже, слово «дом» будет означать «строение» определенной площади и стоимости, в контексте письма человека, живущего в другой стране, слово «дом» будет означать территорию, близких людей, эмоциональную привязанность. Понятие простоты невозможно отделить от абстракции, связанной с объектом. Для строителя абстракция «дом» будет содержать намного больше информации, чем для риелтора. Простота — антипод сложности: чем меньше функций и атрибутов у объекта, тем он проще.

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

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

Простота — это сложность, скрытая за абстракцией.

Практические следствия

Технические

Основой для создания программного обеспечения является построение модели предметной области.

Самым важным моментом построения модели предметной области является терминология. Использование четкой, непротиворечивой, понятной всем терминологии — это основа успешного проекта. Построение терминологии необходимо для выявления классов и объектов. «Cловарь данных — центральное хранилище относящихся к системе абстракций» [7], а именно на основе абстракций и создается ПО. Если вы не можете назвать что-то, либо суть термина расплывчата и неоднозначна, это означает, что вы не понимаете назначение данной сущности, компонента, класса, метода. Переработайте словарь, придумайте однозначное четкое название. Создание словаря предметной области, постоянная работа над ним является основой методологии Предметно-ориентированного проектирования (DDD), предложенной Эриком Эвансом [6]. Возвращаясь к теме статьи, правильный термин является хорошей абстракцией, упрощением. А это то, к чему мы должны стремиться при создании программной системы.

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

Социальные.

Красоту решения может увидеть только человек с достаточным уровнем знаний, квалификации, опыта. В повседневной жизни вы можете применять данное правило как относительную оценку знаний людей, с которыми вы общаетесь. Схожие чувства будет испытывать тот, кто обладает примерно тем же уровнем знаний и опыта, что и вы. Для человека уровнем выше параметр «наблюдаемая сложность» может быть слишком мал, профан же не будет в состоянии оценить само решение (описание модели).

Исполнители должны соответствовать сложности решаемой задачи, иначе решение будет дорогим в разработке и сопровождении, будут часто возникать ошибки, или задача вообще не будет решена [3].

Эстетические чувства являются интуитивным маркером правильности решения. Во время поиска наилучшего решения обращайте внимание на свои ощущения [11].

Заключение

«Проектирование не является детерминированным, главным аспектом проектирования качественного ПО становится умелое применение набора эффективных эвристических принципов.» [1]. В данной статье приведены некоторые принципы, которые должны помочь разработчику лучше понимать возложенную на него задачу. Основой для создания качественных программ в первую очередь является анализ: определение абстракций предметной области, классификация абстракций и связей. Определить абстракции помогает словарь предметной области и правильное его использование. Классифицировать абстракции и взаимодействовать помогает интуитивное чувство прекрасного, которое неразрывно связано с опытом и знаниями разработчика. Конечной целью разработчика ПО есть создание системы, состоящей из небольшого числа максимально простых компонентов (модулей с высокой связностью [14] ) и минимальным количеством связей между компонентами.

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

Вывод организационный: выбирая исполнителей для решения задачи учитывайте уровень их знаний и способностей.

Литература

1. Стив Макконел, Совершенный код.

2. George_M._WhitesidesToward a science of simplicity

3. Игорь Ткачев, Закон сохранения сложности.

4. https://en.wikipedia.org/wiki/Kolmogorov_complexity

5. М.В.Волькенштейн,  Красота науки.

6. Эрик Эванс, Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем.

7. Grady Booch, Object-Oriented Analysis and Design with Applications

8. Об интеллекте. Джефф Хокинс

9. Ред. Умберто Эко, История красоты

10. https://en.wikipedia.org/wiki/Emotion

11. Малкольм Гладуэлл. Сила мгновенных решений: Интуиция как навык

12. Роберт Пректер, Волновой принцип Эллиотта. Ключ к пониманию рынка

13. https://en.wikipedia.org/wiki/Fractal

14. https://en.wikipedia.org/wiki/Cohesion_(computer_science)

15. Объем внимания