Метамоделирование
Журнал Потенциал
Аннотация
правитьЭто небольшая статья, следует признать, носит несколько рекламный характер. Рекламируется «метамоделирование», которое, с одной стороны, есть деятельность человека по созданию глубоких формальных описаний предметных областей, а с другой стороны, представляет собой новый принцип организации (хранения) данных в компьютерных приложениях.
Метамоделирование, в отличие от многих раскрученных технологий, действительно имеет обоснование (логическое, математическое, общефилософское) быть принятой на вооружение, и поэтому авторам не так стыдно за этот рекламный текст.
История термина
правитьЭто слово не совсем обычное. Оно активно используется в англоязычных текстах в целой серии значений со множеством смысловых оттенков.
И все эти значения любопытны, так как включают в себя элемент мистической, но бесспорной возможности получить необходимое решение в общем виде, добраться до сути, воплотить идеальные представления об организации данных в нечто материальное и работающее.
15 лет назад смысл этого термина был более прозрачным. Его использовал узкий круг людей, работающих в самых разных областях — самолётостроении, химической промышленности, программировании, управлении и автоматизации бизнеса. Эти люди вдруг осознали, что занимаются одним и тем же видом деятельности — созданием точного формального описания некоторой предметной области. Необходимо было решать насущные проблемы, связанные с преодолением сложности — сложности конструирования и моделирования самолётов, сложности организации данных, сложности управления многоуровневой и активно растущей организацией, сложности классификации и структуризации огромного архива взаимосвязанных фактов.
Описания строились с целью автоматизировать или упростить тот или иной аспект деятельности; навести порядок, структурировать, но сохранить определённый уровень гибкости и расширяемости.
Общее накопившееся желание было сделать это раз и навсегда, чтобы никогда больше не возвращаться к вопросу реорганизации и переделки.
Метамоделирование долгое время имело ряд других имён — семантическое моделирование, описание на основе расширенной схемы, просто описание или формализация предметной области.
Метамоделирование в примерах
правитьДля начала приведём короткие определения.
Метамоделирование — это процесс создание метамоделей.
Метамодели — это средства построения моделей (например, формальные языки или графические нотации для описания структуры классов, свойств и связей).
Модели — это описание структуры данных (например, информация о том какие есть свойства и связи между объектами).
Данные — это множество простейших единиц информации, которые касаются не абстрактных, а конкретных сущностей (например, значение определённого свойства определённого элемента).
Основная цель метамоделирования — описать данные настолько глубоко, чтобы они были самодостаточными и допускали расширение и модификацию своей структуры. Аналогичным свойством хотелось бы наделить и софт, работающий с данными. При метамоделировании это происходит автоматически. Софт, основанный на метамоделировании, гибок, так как он написан не для конкретного случая данных, с конкретной структурой и с фиксированными зависимостями, а работает в общем случае. Информацию о структуре данных он читает из модели и метамодели, и автоматически подстраивается под них.
Приведём пример.
Шаг 1: описываем данные
правитьПусть мы описываем генеалогическое дерево. Для этого достаточно завести список людей и указать для каждого родителей и годы жизни.
Естественно для этого использовать таблицу:
Человек | Годы жизни | Мать | Отец | Пол |
---|---|---|---|---|
Шаг 2: описываем модель
правитьНо для увеличения глубины и подробности описания, удобно указать, что у людей есть «пол», равный М или Ж, ввести выводимые отношения «родитель», «дочь», «сын», «бабушка», «племянник»… и указать ограничения на эти отношения. Это удобно потому, что оказывается необходимым при работе с данными, выполнении запросов к данным и поддержки их корректности (консистентности).
Отношение «родитель», направленное от узла к узлу подразумевает, что узел связан с либо отношением «дочь», либо отношением «сын», причём это непосредственно зависит от значения атрибута «пол» узла . Другим очевидным условием является требование, чтобы один узел был связан не более, чем с двумя другими узлами отношением «родитель», причём атрибут «пол» у этих узлов должен различаться. Ясно также, что один и тот же человек не может быть одновременно для кого-то матерью, а для кого-то отцом.
Таким образом, кроме самих данных о родстве людей можно описать, какие бывают отношения между людьми и какие на них накладываются ограничения. Нужно определиться, какие отношения непосредственно задаются пользователем, а какие выводятся из них.
Ограничения на данные (условия консистентности данных) включают в себя указание того, какие значения могут принимать атрибуты узлов, какие отношения могут устанавливаться между узлами, каково минимальное и максимальное число отношений определённого типа, в котором может участвовать один узел, а также другие типы условий.
Эту дополнительную информацию в данном случае следует называть моделью данных. Имея эту информацию и записав её в формальном виде, мы можем осуществить автоматическую проверку наших данных — обнаружить места, где информация не полна (например, отсутствует информация о матери) или некорректна (указано больше двух родителей).
Примечание. Термин метаданные иногда используют как синоним модели данных. Но правильнее считать, что это разные вещи.
Метаданные — это просто дополнительная информация, например, некоторый заголовок, прикрепляемый к документу, с информацией об источнике данных, авторе, категории документа, времени создания и тому подобном. Метаданные не содержат информации о структуре данных и ограничениях, накладываемых на данные. Это просто атрибуты, позволяющие идентифицировать и классифицировать блоки данных.
Действительно, проверку условий консистентности данных можно было бы поручить программисту, который бы «захардкодил» все эти условия в программный код приложений. Правда, если условия консистентности изменятся, то программиста придётся снова привлекать к работе. Это неприятно. Но от этой неприятности несложно избавится.
Достаточно разработать язык (нотацию, формат) описания модели данных и разработать такой софт, который бы зачитывал эту модель и брал из неё описание структуры данных и условия консистентности данных. В следующий раз вы сами сможете менять модель данных и софт автоматически «подстроится» под изменившуюся модель.
Автоматизация проверки и поддержки консистентности — это уже кое-что.
Итак, при хранении данных полезно также в некотором формальном виде хранить и описание их модели. Это очевидно и обсуждению не подлежит.
Но оказывается, можно сделать ещё один шаг.
Шаг 3: описываем метамодель
правитьПолучившаяся модель данных для описания родства людей довольно сложна. Одной табличкой здесь не отделаешься.
Вот попытка описать некоторые куски модели:
- Есть класс людей.
- Между людьми есть отношение «родитель».
- У людей есть свойства «пол», «дата рождения» и «дата смерти».
- ( есть родитель ) ( имеет пол «Ж») есть мать .
- ( есть родитель ) ( имеет пол «М») есть сын .
- Число родителей .
Часть данных модели является просто объявлением наличия класса, связи или свойства. Часть данных модели удобно выражается в виде правил.
Обратите внимание на то, что здесь мы использовали словосочетание «данные модели». Модель хоть и является моделью, но после формальной записи превращается в множество данных, и для этих данных также естественно задать модель. Эта модель и называется метамоделью. Итак
Метамодель — это модель данных для описания данных модели данных.
Примечание. Масло масляное, но тут уж ничего не поделаешь. При описании таких тонких материй как метамоделирование, приходится активно работать с языком. Русский язык позволяет делать чудеса — сам он является замечательной метамоделью, которая объединяет множество предметных областей и позволяет записать самые разные знания, накопленные человечеством. Вот бы найти что-нибудь подобное по мощи, но более формальное и интерпретируемое компьютером!
Приставка мета- практически всегда имеет относительный характер и зависит от угла рассмотрения.
Итак, описание модели состоит из разнородной информации, которую неплохо было бы формализовать.
Надо придумать подходящий формальный язык. Например, можно ввести несколько таблиц: таблицу со списком всех классов, присутствующих в нашей модели, таблицу со списком всех отношений, таблицу с описанием правил. Ещё нужно что-то придумать для описания свойств типа «Число родителей ».
Возможно, имеет смысл разработать какой-нибудь формальный язык, где всю информацию о модели записать в виде набора инструкций? Например,
new_class "man";
"man" has_relation "parent" # stands for "is parent of"
"man" has_relation "mother" # stands for "is mother of"
…
"man" has_property "sex"
…
(X parent Y) && (X sex "female") => X mother Y
(X parent Y) && (Y sex "male" ) => Y son X
(Z parent X) && (Z parent Y) && (X sex "female") => X sister Y
Здесь сущности man
, parent
, mother
, father
, son
описываются с помощью специальных слов (служебных термов) new_class
, has_relation
, has_property
. А эти три слова уже никак не описываются. Они и есть составляющие метаметамодели. В использованной нами метаметамодели предполагается, что модель состоит из классов и определённых на них свойствах и отношениях. Метаметамодель задаёт, как устроены данные в самом общем случае. Наличие метамодели позволяет нам оперативно (не переписывая программы и не перестраивая хранилище данных) расширять модель.
Например,
"man" has_relation "friend"
new_class "company"
new_link "works_in" from "man" to "company"
Но можно пойти далее и поднять уровень мета-описания (подняв на соответствующий уровень и софт, работающий с данными), а именно, дать описание служебных термов:
new_class "class"
new_class "relation"
new_class "property"
new_link "has_relation" from "class" to "relation"
new_link "has_property" from "class" to "property"
Смысл конструкций
new_class X
new_link X from Y to Z
можно зафиксировать и написать софт общего назначения, который изначально умеет интерпретировать эти конструкции. При этом, чтобы заставить софт общего назначения делать конкретные вещи, потребуется его настроить — дать описание модели его действий, указать, какие данные и как он должен интерпретировать.
Это сложный момент.
Надежды, возлагаемые на метамоделирование
править«Лучше день потерять, а потом за пять минут долететь» [1] — так коротко можно выразить основную надежду, возлагаемую на метамоделирование.
Надежда заключается в том, что метамоделирование позволит нам летать — быстро и в общем случае решать возникающие проблемы и легко расширять систему. Также есть вполне обоснованная надежда, что моделирование позволит
- сделать данные более семантически насыщенными,
- явно выразить (формально описать) скрытую семантику структуры данных.
Эти свойства необходимы для расширения возможностей интерпретации данных компьютерными программами.
Семантика — это волшебное слово, непосредственно связанное с метамоделированием. Оно означает скрытое (в обычных базах данных) смысловое значение данных.
Введя отношения «friend», «sister», «parent»… мы ничего не написали про их смысл. И хоть компьютер стал «понимать», что такие отношения есть, и они устанавливаются между экземплярами класса «man», он всё же знает про них не всё. Возможно, есть ещё кое-что, во что мы хотели бы посвятить компьютер?
Нет, мы не хотим, чтобы компьютер был как человек и разбирался во всех тонкостях человеческих отношений. И нам не нужен искусственный интеллект с мощью естественного интеллекта.
Но кое-чему научить компьютер хочется.
На практике возникают хитрые задачи, где семантика играет ключевую роль: анализ кредитной истории, анализ неисправностей в машине, анализ и классификация текстов на естественном языке, принятие решений по управлению бизнесом — при автоматизации решений этих задач естественным образом всплывает необходимость описывать очень сложные и тонкие вещи. Более того, описав их, нужно суметь построить автоматическую систему, использующую эти данные.
И здесь пригодится гибкость, расширяемость и глубина описания данных, достигаемая при метамоделировании.
Почему метамоделирование такое популярное?
правитьВо-первых, просто пришло его время.
Особенно хорошо это чувствуют программисты и аналитики. Решая по десять раз одну и ту же проблему, возникающую то в одной, то в другой ситуации, невольно задумаешься — а нельзя ли системно подойти к её решению, чтобы она уже никогда не возникала и не принимала новые но всё же легко узнаваемые формы.
Метамоделирование — это способ обобщения решений и возможностей.
Решая проблему, лучше решить её не в частном, а в общем случае. Трудозатрат будет несколько больше, но в перспективе это окупится с лихвой.
Добавляя в систему какую-то возможность, лучше постараться её обобщить и добавить в систему не специальную единичную фичу, а принципиально расширить класс возможностей. Будьте уверены — они понадобятся в будущем.
Безусловно, увлекаться поиском универсальных и общих решений не нужно. Как и везде, здесь достигается разумный баланс между универсальными сложными и простыми частными решениями.
Раньше, когда задавали вопрос «А нужна ли настолько многоуровневая модель данных?», ответ был неоднозначен. Модель, безусловно, нужна. Но программ, работающих на надлежащем уровне — на уровне метамодели — не было. Софт, теория и технологии метамоделирования не были развиты. Но сегодня ситуация изменилась, и ответ на вопрос однозначен:
«Метамоделируйте на здоровье! Вот вам софт, а вот тщательно продуманная парадигма.»
Во-вторых, метамоделирование — это фундаментальный, давно известный принцип, описанный и используемый в философии, математике, естествознании, который просто получил новое имя и обрёл новую жизнь.
Метамоделирование всегда являлось основой всякого рода интеграции и обобщения (даже если этот термин явно не использовался).
Сегодня метамоделирование стало важным шагом при решении задач интеграции бизнеса и данных, создании долгоживущих, сложных, расширяемых систем.
Рассмотрим два важных свойства, относящихся к математике и философии, на которых базируется метамоделирование.
- Замкнутость. Замкнутость означает, что осуществляя действия в выбранной формальной модели, мы не выйдем за её пределы и нам не встретятся неформализуемые (неописываемые) объекты.
- Полнота. Полнота выбранной формальной системы означает, что в её рамках можно описать (задать, смоделировать) все объекты из рассматриваемого множества.
В переложении на область компьютерных технологий эти свойства следует читать так: софт имеет тщательно проработанную архитектуру и метамодель организации данных и в результате:
- все возникающие задачи решаются в рамках этого софта,
- созданные вами в рамках этого софта данные и модели прозрачны (являются родными) для софта и могут интерпретироваться.
Перспективы
правитьВыражения «metamodel-driven software» сейчас уже воспринимается как единственный путь достижения нужного уровня
- расширяемости (адаптивности),
- универсальности (общности).
Термин метамоделирование встречается в сочетании с программами автоматизации бизнеса, компьютерными технологиями и в индустрии. И приятно, что метамоделирование обещает не только функциональные, но и дешёвые решения.
Дорогие и сомнительные удовольствия уже не прельщают современных бизнесменов.
Путь внедрения технологий метамоделирования в бизнесе не только обозначен, но и в значительной степени пройден. Остаётся только ждать, когда плод дозреет и будет готов к употреблению.