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

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

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

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

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

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

Адаптируемые программы и программная инженерия

Как это ни может показаться странным, но, несмотря на всю свою «железность», с точки зрения приспособленности к окружающей среде «жесткий товар» прогрессирует быстрее, чем «мягкий». Адаптируемость «железа», особенно заметную в последнее время, можно проследить на примере развития сложных центров обработки данных, собираемых из сверхтонких серверов-лезвий. Монолитные архитектуры постепенно уступают место более гибким блочным. Программное же обеспечение, как и прежде, создается преимущественно в соответствии с централизованной монолитной моделью, которая была вполне адекватной, когда компьютеры пребывали изолированными, но плохо приспособлена к новой распределенной модели компьютерных систем.

Исключение, лишь подтверждающее правило, составляют архитектуры, ориентированные на сервис (service-oriented architecture, SOA). Всеобщее увлечение ими, в конечном счете, есть ни что иное, как не слишком хорошо осмысленная реакция на отмеченное отставание. Более содержательны взгляды тех специалистов, которые сосредоточили свое внимание на так называемом адаптируемом программном обеспечении (adaptable software). Подходы, связанные с этим направлением, можно разделить на три категории.

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

Алгоритмическая адаптация. Основывается на переключении с одного алгоритма на другой. В качестве примера такого подхода можно упомянуть проект создания объектно-ориентированных инструментальных средств многократного использования, предназначенных для унифицированной разработки систем CAD/CAM в различных прикладных областях. Этот проект выполняется в Институте системного программирования РАН (http://www.ispras.ru/~3D/koi/projects.htm). В его рамках планируется создание двух прототипов систем автоматизированного проектирования — параметрического геометрического моделирования и моделирования течений в трубопроводных сетях; обе системы базируются на объектно-ориентированных программных средствах.

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

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

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

Весьма серьезно и в более широком контексте, нежели программистский, проблемы адаптации программного обеспечения обсуждаются в недавно сложившемся сообществе Interdisciplinary Software Engineering Network (ISEN, www.service-oriented.com). Оно объединяет исследователей и практиков, озабоченных будущим программной инженерии. Особое внимание уделяется междисциплинарным исследованиям и подходам, а также возможным преимуществам для программных инженеров при использовании ими принципов, методов и решений, выработанных в «не-ИТ» дисциплинах задолго до появления компьютеров. «Сеть» ISEN собирает вместе специалистов из разных областей знаний, что позволяет лучше понять отношения между программными системами и средой, в которой они существуют. Раз в год ISEN проводит рабочее совещание, а точнее — «мастерскую» (workshop), посвященную программным технологиям и инженерной практике (Software Technology And Engineering Practice — STEP). Результаты этого собрания всякий раз обобщаются в отчете.

Итоговым документом STEP 2002 стал отчет с образным названием «Тринадцать рыцарей и семиглавый дракон: основные концепции междисциплинарных связей в программной инженерии» (www.service-oriented.com/isen/isen4/ISEN.4.STEP2002.pdf). В отчете отмечается, что существующий инкрементальный подход к совершенствованию программных продуктов, в значительной мере являющийся интуитивным, может обеспечивать эффект только в краткосрочной перспективе. Если же всерьез смотреть в будущее, следует развивать программную инженерию, а для этого нужно, прежде всего, обратиться к инженерному опыту других технологических областей. По результатам STEP 2003 был опубликован материал «Анализ сложных проблем междисциплинарного взаимодействия в программной инженерии» (www.service-oriented.com/publications/STEP2003a.pdf).

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

  1. Системы должны справляться с постоянно возрастающим объемом данных, с так называемым «информационным взрывом».
  2. Функциональность и качество систем должны соответствовать требованиям пользователей.
  3. Системы должны быть адаптируемыми.
  4. Стоимость систем должна быть оправданной.
  5. Процессы внедрения систем должны быть точнее определены.
  6. Следует точнее определять возможные риски.
  7. Необходима интеграция сложных систем.

Эти требования не специфичны для программного обеспечения; их можно распространить и на другие изделия, являющиеся плодом дисциплин с большим инженерным опытом. Полезно посмотреть, как они удовлетворяются в данных областях и поискать аналогии. Было определено тринадцать таких дисциплин (отсюда и «тринадцать рыцарей»): строительные конструкции; аппаратное обеспечение; системная инженерия; промышленное производство; управление проектами; менеджмент; экономика; финансы; право; разработка программного обеспечения; математика; компьютерные науки; когнитивная психология.

В результате организованного участниками STEP 2002 мозгового штурма была построена матрица 7х13, составленная из столбцов-дисциплин и строк-требований. В ячейки вписаны основные средства, которые позволяют достичь того или иного качества. В третьей строке, характеризующей адаптируемость, имеются пустые поля. Иными словами, адаптируемость обеспечивается не везде, не является всеобщим свойством. Ячейки заполнены только в следующих дисциплинах: строительные конструкции; аппаратное обеспечение; системная инженерия; промышленное производство; управление проектами; менеджмент.

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

Адаптивные программы глазами программиста

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

Один из ярких адептов программного подхода к созданию адаптивных программ — Питер Норвиг, работающий ныне в компании Google. Норвиг — известный специалист в области искусственного интеллекта, соавтор популярной книги «Искусственный интеллект: современный подход». У него богатая научная биография, он работал в исследовательском центре НАСА, занимал должность «старшего ученого» в ряде известных компаний, в том числе в Sun Microsystems. Представим его взгляды на адаптивность программного обеспечения, но сначала подчеркнем, что Норвиг называет технологии программирования адаптивными, не делая их четкого разграничения на адаптивные и адаптируемые. И еще: осуществленный Норвигом анализ проблем интереснее, чем предлагаемые им средства для решения оных.

Таблица. Усложнение картины мира в науке

Питер Норвиг выделяет три исторических этапа в области технологий программирования.

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

Появившееся в 80-е годы объектно-ориентированное программирование упростило реагирование на изменения в спецификациях, поскольку функциональность систем могла быть разделена на классы с ограниченным взаимодействием между ними. И все же в рамках соответствующих технологий каждое изменение в спецификации по-прежнему требует вмешательства программиста, следствием чего становится высокая стоимость «цикла четыре re» (redesign/reimplement/rebuild/retest).

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

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

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

Миф об обслуживании программного обеспечения. Использование термина «обслуживание» применительно к программам создает неверное представление о том, что программное обеспечение может деградировать в процессе работы и нуждается в восстановлении. Обслуживание требуется изнашиваемым «материальным» машинам и механизмам, а коды программ не изменяются. На самом деле, программы нуждаются в модернизации (upgrading) и эволюционном развитии (evolving), а необходимость в изменении однажды созданных кодов чревата опасностью внесения новых ошибок.

Миф о черном ящике. Интерпретация процессов реальной жизни в виде «черных ящиков», представленных исключительно в форме спецификации ввода/вывода, выхолащивает видение проблемы. Системы, составленные из «черных ящиков», оказываются слишком громоздкими и медленными. Адаптивные системы отличаются наличием интерфейса с окружающей средой и обратной связи.

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

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

По мнению Норвига, решение проблемы состоит в выборе средств создания адаптивного программного обеспечения. В первую очередь, это могут быть динамические языки программирования, которые позволяют создавать приложения с длительным жизненным циклом, способные изменяться в процессе эксплуатации. Это качество обеспечивается тем, что, в отличие от статических языков (например, Си), динамические языки допускают возможности переопределения структуры программ и данных, модернизации программ за счет изменения их компонентов. Популярность Java в значительной мере связана с пусть не полными, но определенно динамическими возможностями этого языка. Такие языки, как Dylan и Common Lisp Object System (CLOS), являются динамическими в полном смысле слова.

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

Программная кибернетика и адаптивные программы

Сегодня кибернетически подготовленных ИТ-специалистов на порядок меньше, чем программистов, но это еще не самое страшное. Гораздо хуже другое. Многие из тех, кто все же имеют такую подготовку, связали свои исследования с проблемами искусственного интеллекта — направления, поглотившего огромный объем сил и средств, но не давшего какого-либо практического результата. Более того, их деятельность способствовала дискредитации в глазах общества кибернетики как науки.

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

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

Подтверждение сказанному — программа Первого семинара по программной кибернетике, который состоялся в Гонконге в рамках 28-й ежегодной международной конференции по программному обеспечению, COMPSAC 2004 (http://rachel.utdallas.edu/compsac). Эта конференция — один из важнейших форумов, который собирает разных специалистов, так или иначе связанных с программным обеспечением, в том числе исследователей, практиков, разработчиков общей стратегии развития программных систем.

Впервые конференция COMPSAC состоялась в 1977 году в Чикаго. С тех пор она стала мероприятием, на котором собираются вместе представители академического сообщества, индустрии программного обеспечения и государственных органов, чтобы определить современное состояние дел, достижения и перспективы этой области. Одна из самых важных форм работы — «мастерские»; в рамках конференции этого года состоялись три мастерские: «Гарантия качества и тестирование Web-приложений», «Программная кибернетика», «Менеджмент географических и биологических данных».

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

Несмотря на колоссальные масштабы и численность занятых в этой области специалистов, до сих пор практически все программное обеспечение создается на основе частных (ad hoc) подходов, исходя из представлений разработчиков (зачастую интуитивных) и ресурсов компаний. (Напомним, в современном английском языке латинский термин ad hoc используют для обозначения экспромта или спонтанного решения; Большая советская энциклопедия квалифицирует его как термин, который употребляется в международном праве применительно к органам, создаваемым для выполнения определенных, чаще всего временных, функций.)

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

Принятие новой парадигмы приводит к весьма серьезным следствиям. Так, если согласиться с тем, что два центральных момента теорий автоматического регулирования и принятия решений должны быть распространены на программное обеспечение, возникает естественный вопрос: кто в состоянии развивать это направление? Пока таких специалистов практически нет, и их нигде не готовят. Широкое и глубокое проникновение компьютеров и встроенного программного обеспечения в системы управления ставит целый ряд новых задач перед теорией управления. Нужна новая теория, которая соответствует современному уровню развития технологий и может быть приложена к управлению системами, построенными на основе сетей, в частности, Internet.

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

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

«Self-*» — еще одна волна

Есть все основания утверждать, что адаптивность станет важнейшим признаком следующей технологической волны. Рискну сослаться на собственную статью [1], в которой пересказывается основное содержание доклада одного из отцов Internet Леонарда Клейнрока на конференции, посвященной проблемам образования (www.cra.org). Доклад, озаглавленный «Победа над сложностью и построение систем, состоящих из миллиардов компонентов», снабжен подзаголовком «Complexity/Self-*».

Клейнрок утверждает: «Компьютерные системы завтрашнего дня не могут быть построены с применением тех методов, которыми мы пользуемся сегодня». Основным свойством систем будущего названа сложность организации и поведения. В то же время они должны строиться из простых и не очень надежных компонентов, быть несложными для пользователя, администратора и проектировщика. А для этого они должны быть «self-*» — самоконфигурируемыми, саморегулируемыми, самоадаптируемыми...

Какими же профессиональными качествами необходимо обладать специалисту, чтобы удержаться на этой новой волне? Ответ можно найти в статье [2]. Не нуждающийся в представлении Дэннис Цикритзис рассказывает о пяти волнах и уровне готовности пяти поколений специалистов к продолжению профессиональной деятельности в условиях очередной волны. Он показывает, что приспособленность к переменам тем выше, чем выше уровень академической подготовки. Текущая, пятая по счету и, судя по всему, идущая на убыль Web-волна отличается от предыдущих технологических волн тем, что, в общем-то, не требует серьезной математической, кибернетической или философской подготовки. Но если шестая волна окажется действительно «self-*», она потребует весьма серьезных знаний в целом ряде дисциплин, и перспективно мыслящим специалистам следует обратить внимание на данное обстоятельство.

Литература
  1. Леонид Черняк, Чему учиться? «Открытые системы», № 2, 2003.
  2. Дэннис Цикритзис, Как удержаться на гребне технологических волн, нами же созданных. Jet Info, № 16, 1997.

Уточним терминологию

Глагол «адаптировать» происходит от латинского слова adaptare, являющегося суммой «ad + aptare». Здесь ad означает «добавление», а aptare — «соответствие» или «приспособление», что и дает в итоге «делать нечто приспособленным к новым условиям» (чаще всего — путем модификации). В английском языке можно встретить в приложении к системам два производных слова — adaptive и adaptable; то есть системы могут быть адаптивными и адаптируемыми. Когда систему называют адаптивной (adaptive), подразумевается, что она автоматически адаптируется к изменяющимся условиям. Другими словами, меняются алгоритмы функционирования, но ее состав и структура остаются неизменными. В свою очередь, адаптируемая (adaptable) система может быть изменена с помощью внешних воздействий.

К сожалению, в русском языке столь четкой дифференциации этих терминов нет. Вот, к примеру, статья из Экономико-математического словаря Л.И. Лопатникова (М.: Дело, 2003): «Адаптирующиеся, адаптивные системы [adaptive systems] — системы, способные к адаптации. Подразделяются на самонастраивающиеся и самоорганизующиеся системы. В первом случае в соответствии с изменениями внешней среды меняется способ функционирования системы (например, предприятие расширяет выпуск продукции вслед за увеличением спроса), во втором — меняется структура, организация системы (на заводе создали отдел стандартизации в связи с возросшими требованиями к качеству изделий)». Совершенно очевидно, что в первом случае автор имеет в виду адаптивную систему, а во втором — адаптируемую.

Деление систем на адаптируемые и адаптивные — не игра в слова. Это принципиально важно, если мы говорим о сложных программно-аппаратных комплексах, поскольку для придания им того или иного качества используются разные инструменты.


Оператор ComeFrom

Оператор ComeFrom впервые был предложен в 1971 году Алистером Кокбурном, автором ряда книг по современному программированию и, возможно, одним из самых оригинально мыслящих людей в этой сфере. Первые печатные упоминания о ComeFrom можно встретить в статьях Дональда Кнута, датированных 1974 годом, посвященных структурному программированию, а одну из его первых реализаций — в языке C-InterCal (www.muppetlabs.com/~breadbox/intercal/home.html). Данный язык программирования относится к категории «эзотерических» (http://c2.com/cgi/wiki?EsotericProgrammingLanguage). Такие языки создаются не для практического программирования, а как исследовательские инструменты. Распространено мнение, что большая часть этих языков является великолепным средством для развлечения, а попытки программировать на них можно рассматривать как отличные интеллектуальные упражнения.