Многослойная архитектура – основная стратегия построения системы с гарантией устойчивости и функциональности организованных систем, как биологических, так и искусственно созданных. Это простая, необходимая, мощная и в высшей степени выгодная структура. Так, и технические системы вроде «Боинга-777», и биологические вроде нашего мозга организованы настолько грамотно, что пользователи даже не догадываются о том, какие мудреные свойства в них скрыты[13]. Мы просто садимся в самолет, застегиваем ремни и открываем книгу или заказываем напиток. Мы не думаем ни о 150 000 модулей подсистем самолета, ни о том, что в них происходит. Да и пилоты о них не вспоминают. Мы вообще не знаем о существовании этих 150 000 модулей подсистем. А если вы пропустили предыдущую главу, то, возможно, ничего не знаете и про сами модули. Вот и о мозге мало кто вспоминает, пока он работает исправно. Сложность его многослойной структуры так хорошо замаскирована, что даже по прошествии двух с половиной тысяч лет мы все еще пытаемся ее разглядеть. Сложность устройства нашего мозга, как и «Боинга-777», спрятана в архитектуре системы. Так что же это за архитектура такая – многослойная?
Задача инженера – спроектировать и построить некий объект, работающий рационально, эффективно и надежно. Даже перголу
[10] над площадкой в своем саду не так-то просто соорудить – что уж говорить о Сиднейском оперном театре. Чтобы все части постройки функционировали рационально, эффективно и надежно, надо не только увязать друг с другом детали проекта, но и добиться слаженной работы инженеров. Один человек не в силах разработать все этапы. Но вместе с тем, если для организации проектных работ выбрана неверная стратегия, «бригадный метод» может привести к весьма плачевным результатам.
Фактически команда проектировщиков сложных систем и сама является сложной системой, организованной по тому же принципу. Давайте рассмотрим разные стратегии проектирования авиалайнера и системы управления им. По одной из них каждый инженер, занятый своей частью проекта, должен понимать, что делают все остальные его коллеги. Затем, когда будут готовы проекты отдельных блоков, надо установить взаимосвязи между всеми компонентами, чтобы они работали правильно, – то есть все должно быть интегрировано последовательно. Иными словами, проектировщику кресла надо знать все о двигателях, подъемной силе и тяге, стеклах иллюминаторов, герметизации и так далее, и учитывать все это при разработке функций кресла. Помимо того, что на создание проекта уйдет больше времени и денег при участии большого штата специалистов, обладающих квалификацией в разных областях, еще и возрастает риск ошибок: ведь не отклоняющееся назад кресло не просто неудобное – из-за него самолет может спикировать носом вниз.
Независимое конструирование компонентов (слоев или модулей) с независимыми функциями – более выгодная стратегия. Разработчики используют только «минимально необходимую» информацию. Все остальное проходит мимо них. В технике такой подход известен как абстрагирование – отсечение ненужных подробностей (чем выше уровень абстрагирования, тем меньше мелких подробностей). Понятие «слоев абстрагирования» связано с той информацией, которая вам известна или не известна. Слои абстрагирования не всегда связаны с иерархической структурой и даже с принципиально отличающимися компонентами. Атлас мира содержит множество слоев абстрагирования, хотя каждый из них выражен в одном и том же виде. На первой странице показана карта мира. Вы видите океаны, континенты и, возможно, названия крупнейших рек и горных массивов. Но на ней отсутствует львиная доля сведений – не показаны страны, города, дороги, малые реки и горы. Перелистнув страницу, вы попадете в следующий слой абстрагирования: на континентах будут уже страны, их столицы, реки и горы. Листайте дальше, и вы найдете более подробную карту одной страны с ее основными магистралями и менее важными городами. В каждом слое абстрагирования вам открывается все больше и больше деталей и все меньше информации остается неизвестной. Впрочем, знать множество подробностей не всегда полезно: если вы просто хотите сравнить океаны по величине, для вас не важно, что между провинцией Руссильон и коммуной Фонтан-де-Воклюз есть пешеходная тропа.
Однако в сложной системе информация не просто скрыта. У каждого слоя своя специфика. Чтобы перейти из одного слоя в другой, надо виртуализировать необходимую информацию, то есть вывести некие отвлеченные сведения на определенный уровень. В примере с «Боингом» разработчик кресел знает только то, что ему требуется – стандартные параметры, позволяющие предусмотреть подвижность кресла, но ограничивающие процесс проектирования так, чтобы все кресла аккуратно умещались в салоне. Ничего, что касается аэродинамики, топлива, даже количества пассажирских мест, инженер не знает. По своему опыту могу сказать, что конструкторы самолетных кресел явно не подозревают о существовании людей ростом выше 180 см.
В нашем примере кресла – взаимозаменяемые модули. Функционирование кресел не влияет на способность самолета летать. Поэтому конструктор кресел знает о самолете больше, чем вы, но меньше, чем специалист, отвечающий за корпус авиалайнера. Вместе с тем инженерам по турбинам не нужна информация о конструкции кресла, а нужно многое другое.
Природе это известно с незапамятных времен, и в процессе эволюции организмов она задействует ту же стратегию. Различные системы в вашем мозге эволюционировали с расчетом на независимую работу. Например, функции слуховой системы не зависят от обоняния. Слуховая система не получает информации о запахах, да и для обработки слуховой информации она не нужна. Вы можете потерять обоняние и прекрасно слышать жужжание пчелы.
В многослойной структуре каждый слой системы работает автономно, потому что в каждом слое приняты свои специфические протоколы – комплекс правил и условий, которые накладывают ограничения на допустимые пограничные слои, или взаимодействия, как внутри данного слоя, так и между слоями. Вернемся к самолетному креслу. Инженер может сколько угодно играть с дизайном кресла, оставаясь в рамках нормативных параметров – протокола для уровня кресла. Протокол для слоя накладывает свои ограничения, но в их пределах оставляет достаточно гибкости.
Каждый слой в «этажерке» обрабатывает сигнал, полученный с предыдущей «полки», по своему протоколу, а результат передает на полку выше и/или возвращает на полку ниже. В следующем слое процесс повторяется уже по его собственному протоколу, который может быть таким же, как в нижнем слое, или совершенно иным, и новый результат поступает дальше, в более высокие слои. Ни одному слою неизвестно, какую информацию получил предыдущий слой и как она была обработана. В этом нет нужды, поэтому информация остается скрытой (абстрагированной). Протоколы позволяют каждому слою обрабатывать только ту информацию, что получена с соседних слоев. Информация, сформированная в результате обработки, может быть передана вверх и вниз. Тут кроется ловушка – в многослойной структуре информация не может перескочить через ступеньки. То есть шестой слой не может заниматься интерпретацией сигнала, выпущенного с четвертого слоя, поскольку в нем нет протокола для расшифровки такого сигнала; следовательно, нужен промежуточный пятый слой. Задача каждого слоя – обслужить те, что расположены выше, не раскрывая процессов, происходящих ниже[14].