Обзор архитектуры современных программных систем
1.5. Современные платформы для разработки программ
Java (Sun Microsystems, 1995; ныне - Oracle) – платформа для разработки программ на объектно-ориентированном языке Java, программы на котором компилируются в Java байт-код. Спецификации Java до сих пор имеют статус ведомственного стандарта Oracle, хотя и обсуждаются до их принятия международным сообществом Java Community Process (JCP): http://www.jcp.org .
.NET (2000) – многоязыковая объектно-ориентированная платформа для разработки программ с общим промежуточным языком (CIL), общей инфраструктурой языков (CLI) и единым представлением данных на основе XML (стандарты ISO/ ECMA). Язык C# - наиболее удобный язык программирования для .NET, но не единственный и не обязательный для использования. .NET – открытая платформа, стандартизированная совокупностью стандартов ISO. Microsoft.NET – это лишь одна из реализаций стандартов .NET; из других наиболее известны Mono и DotGNU.
Обе платформы – и Java, и .NET - уделяют особое внимание надежности и безопасности на основе исполнения управляемого кода и динамического контроля типов/
Обе платформы поддерживают разработку Web-сервисов и содержат базовые средства для реализации cloud computing.
Другие современные широко используемые платформы и языки: Ruby, Python, Scala.
1.6. Характеристики, свойства и качества программных продуктов
Если идет речь о характеристиках, свойствах и качествах ПО, всегда необходимо уточнять, какого рода и с какой точки зрения рассматриваются характеристики программ. Пользовательская и "девелоперская" точки зрения на наиболее важные характеристики программ различаются.
С точки зрения пользователя наиболее важны следующие качества программ:
- Работоспособность, полезность: программа должна прежде всего работать и выполнять то, что от нее требуется;
- Дружественный к пользователю интерфейс (преимущественно – Web-интерфейс): программой должно быть удобно пользоваться, причем, наиболее желательно, - с минимальной нагрузкой на пользовательскую компьютерную систему и минимальными требованиями к пользователю по ресурсам; с данной последней точки зрения как раз и удобны облачные вычисления;
- Надежность, безопасность, защита конфиденциальных данных (соблюдение принципов Trustworthy Computing - TWC): программа должна надежно и стабильно работать и обеспечивать защиту от возможных внешних угроз и атак, как на саму программу, так и на используемые, создаваемые и обрабатываемые ею данные.
С точки зрения разработчика наиболее важными признаются следующие качества программы:
- Повторная используемость модулей (reusability); компонентно-ориентированное программирование (component-oriented programming): не следует программировать однотипный код (например, поиск по списку) повторно, вместо этого следует использовать на каждом этапе разработки уже готовый и проверенный код. в виде программных компонент (модулей), предпочтительнее – из стандартных (встроенных в платформу) библиотек. Кстати, это один из принципов trustworthy computing: используйте проверенный готовый код, так как дублирование похожего кода может ухудшить надежность и безопасность программы;
- Модульность (modularity) – разработка программы в виде взаимосвязанной совокупности относительно независимых программных компонент – модулей, каждый из которых решает свою четко определенную задачу и которые могут быть представлены в виде классов и их методов, процедур и функций, макросов, аспектов, сопрограмм и др.
- Эффективность (efficiency) – оптимальность программы, согласно тому или иному критерию (например, минимальность времени выполнения; минимальность объема используемой памяти). При оценке эффективности программы необходимо четко сформулировать критерий; всем критериям одновременно удовлетворить невозможно. Говорить об абстрактно понимаемой "эффективности вообще" не имеет смысла. Природа и поведение программ диалектичны. Например, если программа оптимальна по времени, то для этого оказывается необходимым использование дополнительной памяти (например, индексной таблицы для ускорения поиска) и т.д.
- Переносимость (portability) – возможность переноса программы без изменения ее кода на другую платформу и ее последующего использования на другой платформе без каких-либо ее изменений. Переносимости программ могут помешать неявно используемых в них предположения о свойствах целевой платформы, например, различная разрядность чисел на различных процессорах. С этой точки зрения, наиболее предпочтительна Java-технология, предоставляющая единый высокоуровневый язык Java и единую виртуальную среду выполнения и реализованная на всех наиболее распространенных платформах (Windows / x86 / x64; Linux; MacOS и др.).
- Познаваемость (читаемость - readability); легкость сопровождения (maintainability; sustainability) – ясность, понятность, самодокументируемость кода программы, использование единых стандартов его оформления, которые способствуют последующему изучению и изменению кода (как правило, другими программистами), с целью исправления ошибок в программе или расширения ее функциональности. К сожалению, не всегда программисты или даже фирмы-разработчики следуют этому принципу, в результате чего затраты на сопровождение оказываются недопустимо высокими.
- Применение принципов TWC (trustworthy computing)и SDLC (Security Development Life Cycle) при проектировании и реализации. Об этом уже говорилось. Необходимо учитывать требования безопасности и надежности, начиная с самых ранних этапов цикла разработки программы и на всех этапах ее разработки, иначе серьезные проблемы безопасности возникнут при эксплуатации и сопровождении программы, что в конечном счете может вообще привести к невозможности дальнейшего использования программы.
1.6. Классические элементы технологий программирования
Любая технология программирования состоит из нескольких необходимых элементов, при отсутствии которых говорить о существовании какой-либо технологии бессмысленно. Как показывает многолетний опыт разработки программ, это следующие основные элементы:
- Концепции (например, trustworthy computing) – совокупность понятий, поддерживающих данную технологию
- Инструменты (например, FxCop, Spec#)
- Схемы организации процесса разработки программ (например, CMM, CMMI, SDLC)
1.7. Некоторые современные основные понятия из области архитектуры ПО
Начнем знакомство с платформой Azure с определений основных понятий из области архитектуры программ.
Клиент (client) – это пользователь и (или) компьютер, использующий какие-либо программные сервисы.
Сервер (server) – это компьютер или центр обработки данных, предоставляющий программные сервисы.
Тонкий клиент (thin client) – это клиент Web-сервиса с минимальным пользовательским интерфейсом, не имеющий состояния, сеанса, полнофункционального GUI и общающийся с Web-сервисом только через браузер и протокол HTTP посредством отправки HTTP-запросов и получения HTML-страниц.
Rich client (полнофункциональный клиент) – это клиент Web-сервиса, имеющий полнофункциональный GUI и общающийся с Web-сервисом через слой промежуточного программного интерфейса (middleware), обеспечивающий его функциональность; примеры ПО для поддержки rich clients: Microsoft Silverlight, Oracle JavaFX и т.д.
Слой (layer) – это крупная независимая компонента архитектуры ПО. Различают горизонтальные слои (или уровни абстракции), вертикальные слои (срезы) и др.
Уровень абстракции (abstraction layer), или "горизонтальный слой" (номер N) – это совокупность модулей, реализация которых использует только модули уровня N-1 (N > 0). Нулевой уровень абстракции образует аппаратура или базовые библиотеки (API). Концепция принадлежит Э. Дейкстре и сформулирована в конце 1960-х гг. в ходе разработки операционной системы THE (Технического университета Эйндховена).
Вертикальный слой, срез (в некоторых технологиях - аспект) – это совокупность рассредоточенных фрагментов кода, реализующих (сквозную) функциональность, например, проверку безопасности. Авторы концепции: проф. А.Л. Фуксман (Ростовский университет, 1979 – технология вертикального слоения; G. Kiczales (Xerox PARC, аспектно-ориентированное программирование и система AspectJ).
Промежуточное программное обеспечение (middleware) – совокупность слоев ПО, лежащих между клиентом и сервером и обеспечивающих их взаимодействие, например, поддержку сетевых коммуникационных протоколов
Ярус (tier) – слой программного обеспечения, реализующий какую-либо независимую часть его архитектуры; например: business tier – реализация бизнес-логики; Web tier – реализация взаимодействия с Web. Если используется понятие tier, следовательно, архитектура ПО настолько сложна, что двумерная модель (горизонтальный слой / вертикальный слой) ее полностью не описывает. Tier может находиться и использоваться в любой компоненте архитектуры ПО.
Многоярусная архитектура (multi-tier architecture) – архитектура ПО, при которой презентация результатов, обработка и управление данными реализованы как отдельные процессы. Пример: Использование middleware для взаимодействия с сервером и СУБД для взаимодействия с данными.
Многоклиентская архитектура (multi-tenant architecture) – это архитектура клиент-серверного ПО, при которой один экземпляр серверного ПО, исполняемый на сервере, обслуживает несколько клиентов (tenants – букв. клиенты, арендаторы). Пример: Web-сервис.
С точки зрения рассмотренных концепций, облачные вычисления соответствуют принципам multi-tiered и multi-tenant architecture.
Что касается abstraction layers, для современной сложной архитектуры ПО данный термин несколько устарел, так как все модули ПО повторно используемы, и в различных системах различные ярусы (слои) могут иметь разные условные номера. Двумерная модель не в состоянии адекватно описать современное ПО
Пример многоярусной архитектуры ПО представлен на рис. 1.1.