Архив метки: программная инженерия

Лекция 27. Введение в облачные вычисления

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

Основа для облачных вычислений — технологии, разработанные к началу XXI века:

  • аппаратная виртуализация, сделавшая возможной быстрое масштабирование вычислительных ресурсов;
  • распространение и стандартизация веб-сервисов;
  • наработки в области распределенных вычислений, в частности, grid- и утилитарные вычисления.

Архитектура облачных систем состоит из трех уровней:

  • инфраструктура как сервис (IaaS) — базовый уровень, предоставляющий доступ к вычислительным серверам, системам хранения данных и технологиям вроде балансировки нагрузки;
  • платформа как сервис (PaaS) — промежуточный уровень, на котором находятся API для доступа к данным и проведения вычислений;
  • программное обеспечение как сервис (SaaS) — наиболее высокий уровень, обеспечивающий доступ к пользовательским приложениям (например, редактирование документов в веб-браузере).

Типичный сценарий применения облачной архитектуры — использование PaaS, предоставляемой одним из крупных игроков рынка (например, Google), для создания приложений, которые взаимодействуют с клиентами (SaaS), а также средств анализа и обработки данных (например, с помощью методов машинного обучения).

Презентация: Лекция 27.

Continue reading

Лекция 26. Сервисная архитектура приложений. Веб-сервисы

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

Выделяют два основных типа веб-сервисов в зависимости от используемых технологий:

  • SOAP-сервисы, основанные на стандартах для веб-сервисов, разработанных международным консорциумом W3C. Этот вид сервисов более сложен в разработке и использовании, поэтому применяется в тех случаях, когда важно соблюдение стандартов и высокая степень формализации. Одна из основных областей применения SOAP-сервисов — коммерческие (enterprise) системы.
  • REST-сервисы, использующие для передачи данных методы протокола HTTP (GET, PUT, POST и DELETE). В отличие от SOAP-сервисов, интерфейс REST-сервисов чаще всего определяется неформально; при передаче данных используются стандарты (де)сериализации XML, JSON, YAML и другие. Характерный вариант применения REST-сервисов — доступ к API в веб-приложениях; простота сервисов упрощает их интеграцию (web mashup).

Презентация: Лекция 26.

Continue reading

Лекция 25. Хранение данных

В самых разнообразных приложениях часто возникает задача хранения данных вне оперативной памяти (data persistence), чтобы информация оставалась доступной после завершения работы программы, ее породившей. Также требуется, чтобы из сохраненных данных можно было восстановить объект, эквивалентный сохраненному. Можно выделить по крайней мере два способа решения этой задачи:

  • Сериализация данных в виде потока байтов. В зависимости от выбранного формата, сериализованные данные могут храниться в двоичном или текстовом виде. В первом случае, как правило, оптимизируется объем данных, во втором — уделяется внимание тому, чтобы информация могла восприниматься программистом.
  • Сохранение данных в реляционную базу данных при помощи объектно-реляционного отображения (object-relational mapping, ORM).

У каждого способа хранения данных есть свои преимущества и недостатки. ORM подразумевает определенные затраты на сопровождение базы данных; с другой стороны, структуризация данных в БД позволяет более эффективно их анализировать. Сериализация данных может использоваться не только для хранения данных, но и для их передачи, например, по сети; два формата сериализации (XML и JSON) де-факто являются стандартами передачи данных в веб-приложениях.

Презентация: Лекция 25.

Continue reading

Лекция 24. Управление программным проектом

Управление программным проектом — один из ключевых аспектов разработки программного обеспечения. В классических моделях жизненного цикла ПО управление проектом составляет основу для всего процесса разработки. В более новых подходах (гибкой методологии, экстремальном программировании, Scrum и так далее) управление ориентировано на решение задач меньшего масштаба, но по-прежнему играет важную роль в разработке.

Управление программным проектом состоит из нескольких видов деятельности:

Презентация: Лекция 24.

Continue reading

Лекция 23. Управление качеством ПО

Качество — одна из основных характеристик, требуемых от программного обеспечения. Несмотря на это, понятие качества достаточно сложно формализовать. Обычно под качеством подразумевают две связанных между собой свойства программной системы:

  • мера, в которой ПО соответствует функциональным требованиям, заданным планом разработки и прочими документами спецификации (функциональное качество);
  • уровень поддержки нефункциональных требований: надежности, производительности и так далее (структурное качество).

Функциональное качество, как правило, оценивается при помощи тестирования, поэтому основная часть управления качеством фокусируется на обеспечении структурного качества ПО. Управление состоит из трех частей:

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

Презентация: Лекция 23.

Continue reading

Лекция 22. Управление конфигурацией ПО (часть 2)

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

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

  • специальные утилиты, такие как make и Apache Ant, конфигурация которых осуществляется с помощью специальных файлов сценариев;
  • интегрированные среды разработки (IDE).

Презентация: Лекция 22.

Continue reading

Лекция 21. Управление конфигурацией ПО (часть 1)

Создание более-менее сложного программного обеспечения невозможно без управления процессом разработки, включающего четыре аспекта:

  • управление изменениями — организация запросов на изменение, которые поступают от пользователей программной системы, заказчиков или разработчиков;
  • управление версиями — хранение истории изменения документов, связанных с программным проектом (исходных файлов, документации и так далее);
  • построение системы из исходных файлов;
  • управление выпусками — подготовка компонентов системы для использования вне отдела разработки.

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

Презентация: Лекция 21.

Continue reading

Лекция 20. Интероперабельность

Важный аспект спецификации интерфейсов — это возможность объединять в единое целое компоненты программной системы, разработанные на разных языках программирования и выполняющиеся в различных средах. Технологии для объединения разнородных модулей программы называют в программной инженерии интероперабельностью или межпроцессным взаимодействием (inter-process communication, IPC).

В крупных программных проектах интероперабельность зачастую необходима:

  • Различные модули программы могут разрабатываться (или повторно использоваться) в нескольких средах, например, из соображений производительности или стоимости.
  • Компоненты программы могут быть разделены в физическом смысле (то есть они располагаются на разных компьютерах). В этом случае использование готовых сетевых протоколов обмена данными позволяет значительно сократить затраты на разработку и интеграцию.

Презентация: Лекция 20.

Демонстрация интероперабельности через CORBA на примере целочисленных последовательностей здесь.

Continue reading

Лекция 19. Интерфейсы и типы данных (часть 2)

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

  • Языки со слабой типизацией, такие как C и C++, позволяют интерпретировать данные предельно широко. С одной стороны, это может повысить эффективность работы приложения, с другой — приводит к трудно находимым дефектам.
  • Языки с сильной типизацией накладывают ограничения на потенциально опасные операции, например, неявные преобразования типов. Например, в Python, в отличие от большинства языков программирования, не выполняется автоматического приведения чисел к строкам.

К сожалению, обеспечение абсолютного отсутствия ошибок типов — чрезвычайно трудоемкая задача (фактически, частный случай верификации исходного кода программы), поэтому в современных языках программирования роль системы типов состоит в устранении наиболее тривиальных ошибок; их дальнейший поиск — задача, решаемая в процессе тестирования. В этом плане видна тенденция к увеличению роли человеческого фактора: большинство современных языков программирования (Python, Ruby, JavaScript) обладают динамической типизацией, то есть проверка ошибок типов происходит во время выполнения программы.

Презентация: Лекция 19.

Continue reading

Лекция 18. Интерфейсы и типы данных (часть 1)

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

  • В функциональных языках программирования типы определяют допустимые аргументы функций и возвращаемые функциями результаты.
  • В процедурных ЯП типы используются не только для спецификации функций, но и для задания глобального состояния программы.
  • В объектно-ориентированном программировании типы (классы) задают методы для работы с данными, которые, как правило, скрыты от пользователя. В зависимости от модели данных языка программирования, обычные методы могут дополняться свойствами, событиями, операторами и так далее.

Презентация: Лекция 18.

Continue reading