Взаимодействие программных систем
В этой статье я поговорю об связях между программами. Связи между программами или, выражаясь иначе, взаимодействие программ друг с другом в подавляющем большинстве случаев заключается в получении данных одной программой от другой. Например, программа электронных торгов может запрашивать у какой-то другой программы курс валют. Или текстовому редактору может передавать введенный пользователем текст операционная система, используя драйвер клавиатуры. Программы могут предоставлять набор функций для взаимодействия — API. Или даже иметь целые механизмы взаимодействия, называемые протоколами, когда используется множество последовательных вызовов функций, например, для сложного согласования каких-либо параметров. Большим шагом вперед является создание универсальных структур — XML и Json. Программы могут взаимодействовать с другими программами и «невежливым» способом — без протоколов и открытых API: парся данные страницы в случае грабберов, внедряясь в исполняемые файлы как вирусы или, наоборот, убивая их в случае антивирусов.
В информационных технологиях, подобно экосистемам живой природы, наблюдается очень сильное взаимное влияние программных систем друг на друга и, вообще говоря, оно может быть двух видов:
- Во-первых, система может использовать нижележащий слой по уровню иерархии (при этом, как правило, слои, расположенные выше не влияют на нижележащие).
- Во-вторых, система может взаимодействовать с другой системой на том же уровне иерархии, используя различные интерфейсы.
Про иерархию можно говорить отдельно, но упрощая, здесь имеются в виду слои наподобие следующих: ОС (в свою очередь со своими слоями), платформа, программа, надстройки (плагины) и т.д.
Кроме этого, по характеру взаимодействующих программ взаимодействие может быть двух видов: взаимодействуют разные части или одинаковые. Наблюдения показывают, что в первом случае, их количество может быть относительно небольшим — например, с десяток органов в организме или несколько составляющих компьютера, а если слагаемые одинаковые, то обычно их очень много: клеток в органе, транзисторов в процессоре, людей в цивилизации, программы тоже состоят из миллионов машинных команд нескольких десятков видов. При этом каждая машинная команда, клетка, каждый транзистор или каждый нейрон в нейронной сети выполняет очень простую функцию. Можно предположить, что в основе любой вещи, любой системы в самом основании лежат именно такие простые базовые составляющие.
Отличие от живой природы в том, что системы на разных уровнях достаточно независимы и могут продолжать работать при смене нижележащего слоя на другой: так, веб-сайт будет продолжать открываться если Вы смените витую пару Ethernet на Wifi.
В общем случае, взаимодействие программных систем может быть нескольких видов:
- Построена на «инфрастурктуре» (например, на операционной системе или на какой-либо платформе — например, IBM Notes, или внутри социальной сети).
- Использует другие программные системы (например, веб-сайт может использовать реляционную СУБД, такую как MySQL, MS SQL Server или Oracle).
- Состоит из (могут использоваться различные библиотеки и отдельные продукты, например, сайты используют tinyMCE или компоненты для отображения календаря).
- Интегрируется с (например, наша СРМ-система интегрирована с 1С, системами IP-телефонии, системами эквайринга. Сайты могут быть интегрированы с системами оплаты, с соц. сетями и т.д.).
Как и любая другая система, программа состоит из компонент. В программировании любят переиспользовать компоненты, если уже есть компоненты, реализующую похожую функциональность. Это быстрее, чем писать свой компонент, отлаживать и впоследствии сопровождать его. Отправка письма — один компонент, запись в лог — другой компонент, построение графиков — третий, текстовый редактор на сайте — tineyMCE, поиск — lucene. Поэтому многие программы используют одни и те же компоненты.
Часто программы позволяют расширять свою функциональность: текстовые редакторы и электронные таблицы позволяют создавать макросы, браузеры — добавлять расширения, все CMS — дополнять их сторонними компонентами и плагинами. Некоторые программы идут дальше по этому пути и по сути являются платформами для запуска других приложений: например, браузеры или ibm lotus notes.
Сама операционная система — это программа, единственное назначение которой — существование других программ. Она упрощает их существование, изолирует от железа, предоставляет возможность использования графического интерфейса и даёт доступ к сети, её цель — обеспечить работу другим программам.
При этом и операционные системы, и платформы, и даже CMS, которые ставят из-за единственного компонента, во многих случаях гораздо сложнее той программы, ради которой их используют, они могут включать множество самых различных обеспечивающих работу функций: разделять ресурсы, предоставлять механизм авторизации, упрощать обращение к базе данных. Это происходит и за счёт своей универсальности (например, операционная система Windows содержит несколько подсистем Win32, OS/2) для обеспечения работы для всех возможных программ.
Универсальность всегда приводит к дополнительной сложности. Это касается и тех компонент, которые программисты используют при написании программы, они гораздо сложнее и обладают гораздо большим набором функций, многие из которых не требуются и не используются. Программы часто вынуждены обеспечивать обратную совместимость — так, в Windows можно было запускать DOS-приложения. При взаимодействии систем, возможно возникновение нескольких интересных эффектов.
Первый из них называется синергия и его идея в том, что слагаемое больше, чем просто сумма слагаемых. То есть если Вы к одной технологии добавите какую-то другую, то при синергии получившаяся технология будет превосходить как первую, так и вторую. И это может быть качественно другой продукт. То есть, если Вы к компьютеру с программой добавите железный скелет, то получите робота, который больше и чем железка, и чем компьютер. Взаимодействие большого количества простых вещей может приводить к каким-то сложным взаимодействиям. Сумма простых вещей даёт сложную — набор транзисторов создаёт компьютер, набор атомов создаёт предмет, клетки в организме создают органы. Сумма людей — цивилизация — это не просто семь млрд. человек, это что-то большее.
Вторую мысль озвучил Питер Норвиг в докладе Everything is Miscellaneous. Она показалась мне удивительной: если Вы посмотрите на отдельно взятого шимпанзе и отдельно взятого человека, то увидите, что между ними много общего. Ну, то есть понятно, что шимпанзе немного сильнее, человек немного умнее, но в целом, их внешний вид немного похож, их физические и даже пусть с большой натяжкой интеллектуальные возможности сопоставимы. Но теперь если Вы взглянете на культуру шимпанзе и культуру человечества, то увидите колоссальную разницу. Цивилизацию людей даже нельзя сопоставить с цивилизацией шимпанзе. Почему-то это напомнило мне о том, что 0.99 и 1.01 вроде бы не сильно отличаются, но при возведении в какую-нибудь большую степень одно число будет стремиться к нулю, а другое — к бесконечности.
Для тех, кто просто пролистал до конца: взаимодействие программ может быть различных типов и его результат может приводить к принципиально новому уровню программной системы. Целое не всегда отражает то, что происходит в составных частях. Спасибо за внимание!