| 14. Карлики и гиганты | |
| Я думаю, что вы не раз были свидетелями споров, переходящих в религиозную войну, между поклонниками современных компьютеров и компьютеров, популярных десяток-другой лет назад, таких как, например, Amiga или ZX Spectrum. Предметом споров обычно являются такие вещи как рациональность и оптимальность использования ресурсов, скорость выполнения, частота возникновения ошибок и качество программного обеспечения в целом. «У нас было 48 килобайт оперативной памяти и мы творили шедевры, а вы со своей гонкой за гигагерцами и терабайтами не в состоянии уже „Hello World“ без глюков написать». | |
| Попробуем разобраться, как же обстоит дело в действительности. В действительности, во время проектировании любых систем, да и не только во время проектирования, а вообще, во время почти любой умственной деятельности, человеческий мозг способен оперировать ограниченным числом понятий — такова его природа. Мы разбиваем книги на главы, разделы и подразделы, иcторию — на эпохи, периоды и даты, страны — на регионы, города и отдельные кварталы; одним словом — на каждом уровне абстракции мы стараемся оперировать ограниченным набором схожих понятий, при необходимости детализируя каждый элемент набора в такое же ограниченное количество схожих понятий. | |
| Если в течение всей жизни в распоряжении отдельно взятого человека находится 48 килобайт оперативной памяти и 4 мегагерца 8-ми битного процессора, то его мозг в итоге находит наиболее оптимальный уровень абстрагирования для разработки программного обеспечения для такой системы. После того, как наиболее оптимальный уровень абстрагирования найден, дальнейший поиск подходящего образа мышления прекращается и далее мозг занимается тем, что совершенствуется в работе с выбранным уровнем абстрагирования. |  ZX Spectrum 48k |
| Представьте себе человека, у которого в распоряжении есть сто строительных кубиков. Всю свою жизнь он строит из них различные фигурки. Через определенное время он владеет сотней строительных кубиков в совершенстве. Любую фигуру он способен собрать за несколько минут, и при этом каждый кубик будет занимать свое место — ничего лишнего, все идеально. И вдруг, в одно прекрасное утро, ему привозят десять железнодорожных составов строительных кубиков и говорят: «Построй-ка нам пятиэтажный дворец». И, конечно же, с заданием он не справится. Ведь раньше он мог держать в голове информацию о каждом отдельном кубике. Ведь их было всего сто. Теперь же, ситуация совсем другая. Чтобы справиться с заданием, ему необходимо собрать из кубиков типовые блоки конструкции, и, во время строительства, мыслить уже не кубиками, а типовыми блоками, иначе он просто физически не сможет держать всю информацию в голове. Для того, чтобы справиться с поставленной задачей, данному человеку, очевидно, нужно сменить образ мышления. | |
| Ситуация с разработкой программного обеспечения точно такая же. Не страшно, если человека в чем-то ограничивают ресурсы. Может быть это покажется странным, но гораздо страшнее, если ресурсы человека как раз ни в чем не ограничивают. Любой неопытный разработчик просто захлебнется в неожиданно нахлынувшей свободе, и, попросту утонет. | |
| Проектирование больших систем это иерархия понятий и сущностей (в данном контексте ничего общего между иерархией и наследованием нет). Маленькие сущности собираются в типовые макеты. Макеты собираются в еще большие типовые конструкции, и так далее (кстати, именно поэтому агрегация является более естественной внешней парадигмой для проектирования, нежели наследование). Кроме того, необходимо чтобы на каждом этаже было ограниченное количество понятий, чтобы человеческий мозг был в состоянии ими оперировать. Как только нарушается любое из этих правил, вся конструкция начинает рассыпаться. Конечно, ее пытаются ремонтировать, латать дыры, но это только оттягивает ее окончательное разрушение. В итоге, система приходит в такое состояние, в котором любое единственное изменение влечет множество проблем, решение которых, кстати говоря, также является внесением изменений. Поэтому крах системы представляет собой нечто вроде цепной реакции. | |
| В условиях видимого отсутствия каких-либо ограничений в проектировании систем очень важно уметь строить этажи абстрагирования, собирая на каждом из них ограниченное число схожих понятий. Также важно как уметь детализировать отдельно взятые элементы в такой же ограниченный набор абстрактных понятий, так и наоборот, объединять схожие элементы и понятия в ограниченный набор, представляющий собой ярко выраженное, но в то же время абстрактное единичное понятие. | |
| Что же касается «спектрумистов» и «писишников», то я призываю читателя не ввязываться в споры, о которых я говорил в начале этой статьи — «спектрумисты» и «писишники» решают совершенно разные задачи, и сравнивать их работу просто нельзя. Да, «писишники» справляются со своими задачами гораздо хуже, но и задачи эти у них совершенно иные. Повторюсь, их сравнивать просто нельзя. | |