Программа курса
Сдавать зачет по программной инженерии можно разными способами:
- презентовать приложение, использующее наработки ПИ и рассказать, в чем эти наработки заключаются;
- сделать отчет по одной из тем для самостоятельной работы;
- подготовить один контрольный вопрос по каждому из 4 разделов.
Меня устраивает любой из способов, хотя первые два нравятся больше третьего.
Приложение
Один из привлекательных способов сдачи зачета — демонстрация самостоятельно разработанного приложения, при разработке которого использовались наработки программной инженерии. Пример подобного приложения — этот сайт, созданный на основе репозитория GitHub. Он демонстрирует:
- контроль версий при помощи git;
- автоматическое построение проекта при помощи make;
- основы разработки веб-приложений за счет использования генератора сайтов Jekyll, например, использование DSL Liquid для рендеринга HTML-страниц.
Темы для самостоятельной работы
Для сдачи зачета достаточно подготовить одну из тем ниже в виде доклада на ~10 минут.
- История разработки ПО в СССР и на Западе.
- Исторический обзор моделей жизненного цикла ПО.
- Парадигма Rapid Application Development.
- Сравнение моделей разработки, соответствующих гибкой методологии.
- Способы представления требований к программным системам.
- Прикладные инструменты системного моделирования.
- Прикладные инструменты создания MV* архитектур.
- MV* архитектуры в веб-приложениях. MVC-фреймворки в языках программирования PHP, Python, Ruby. Фреймворк AngularJS.
- Встроенные и пользовательские реализации шаблонов проектирования в различных средах программирования.
- Функциональное программирование. Языки Haskell, Lisp.
- Логическое программирование. Язык программирования Prolog.
- История развития парадигмы императивного программирования. Модульное программирование.
- Среда аспектного программирования AspectJ.
- Парадигма агентного программирования.
- Прикладные инструменты создания лексических / синтаксических анализаторов.
- Средства рефлексии в языках программирования.
- Освоение инструментов модульного тестирования в современных средах разработки.
- Прикладные инструменты доказательства корректности программ.
- Инструменты рефакторинга программ в современных средах разработки.
- Сравнение систем управления версиями ПО.
- Системы автоматического построения для современных сред разработки (Maven, Grunt, Gradle и др.).
- Системы зависимостей в современных средах разработки (Python setuptools, npm, Bower и др.).
- Системы генерации документации в языках программирования и создание плагинов для этих систем.
- Прикладные инструменты автоматизации процессов инженерии качества.
- Особенности планирования программного проекта в гибкой методологии разработки.
- Автоматизация усовершенствования процессов разработки ПО.
- Инверсия управления в современных платформах разработки.
- Интерфейсы внешних функций в средах программирования.
- Агрегационные типы данных в языках программирования.
- Функции первого класса.
- Смеси (traits, mixins) как промежуточное звено между интерфейсами и наследованием.
- Ковариантность и контравариантность типов данных в языках программирования.
- Средства межпроцессного взаимодействия в операционных системах.
- Особенности повторного использования ПО с открытым исходным кодом.
- Средства инженерии КПИ в современных средах разработки.
- Системы типа ActiveRecord и DataMapper в современных платформах разработки ПО.
- Децентрализованные сети. Internet of Things. Блокчейн.
- Платформы для разработки SOAP- и REST-сервисов.
- Асинхронный обмен данными с веб-сервисами. Веб-сокеты. Фреймворк Node.js.
- Анализ современных платформ IaaS, PaaS, SaaS.
- Знакомство с каркасами для распределенных вычислений (Hadoop, Spark).
- Базы данных NoSQL.
Контрольные вопросы
Можно подготовить по одному контрольному вопросу по каждой из 4 тем.
1. Введение
- Место и задачи программной инженерии.
- Место ПИ среди компьютерных наук.
- История развития программной инженерии в СССР и на Западе. Эволюция подхода к разработке компьютерных программ.
- Дисциплины программной инженерии.
- ПИ как наука. Связь программной инженерии с дисциплинами дискретной математики.
- Роль стандартов и повторного использования в разработке программного обеспечения.
- Сущность дисциплины управления ПИ.
- Стандарт жизненного цикла ISO 12207.
- Категории процессов жизненного цикла.
- Определение и цели моделей жизненного цикла ПО.
- Каскадная модель жизненного цикла, ее преимущества и недостатки и области применения.
- Эволюционная модель жизненного цикла, ее преимущества и недостатки и области применения.
- Инкрементная модель жизненного цикла, ее преимущества и недостатки и области применения.
- Основные положения гибкого подхода к разработке ПО.
- Методы гибкой методологии разработки: непрерывная интеграция, парное программирование, разработка через тестирование.
- Виды гибкой методологии.
- Экстремальное программирование.
2. Основные процессы разработки ПО
- Роль инженерии требований в разработке ПО.
- Классификация требований к ПО. Пользовательские и системные требования.
- Функциональные и нефункциональные требования.
- Способы представления требований к ПО. Спецификация требований.
- Процесс инженерии требований.
- Инженерия требований в гибкой методологии разработки.
- Определение и цель моделирования программных систем.
- Представление программных систем в абстрактной форме. Язык моделирования UML.
- Контекстные диаграммы UML. Диаграммы деятельности.
- Модели взаимодействия UML. Диаграммы вариантов использования. Диаграммы последовательностей.
- Диаграммы классов UML. Отношения в диаграммах классов.
- Поведенческие модели UML. Диаграммы состояний.
- Роль архитектуры в разработке ПО.
- Связь между архитектурой и требованиями к ПО.
- Модель представлений архитектуры 4+1.
- Архитектура «модель — отображение — контроллер».
- Роль архитектур MV* в разработке веб-приложений и приложений с графическим интерфейсом.
- Многослойная архитектура программного обеспечения.
- Клиент-серверная архитектура.
- Конвейерная архитектура. Потоки UNIX как пример использования конвейерной архитектуры.
- Сущность объектно-ориентированного проектирования. Роль ООП в разработке современного программного обеспечения.
- Основные концепции ООП.
- Процесс проектирования в соответствии с ООП.
- Базовые составляющие шаблонов проектирования. Классификация шаблонов.
- Порождающие шаблоны проектирования. Шаблоны Singleton, Builder, Factory.
- Структурные шаблоны проектирования. Шаблоны Bridge, Decorator.
- Поведенческие шаблоны проектирования. Шаблоны Interator, Observer.
- Определение парадигмы программирования. Место парадигмы в разработке ПО.
- Классификация парадигм программирования.
- Историческое развитие парадигм программирования.
- Особенности декларативного программирования. Выполнение декларативных программ.
- Функциональное программирование. Чистые функции.
- Замыкания и функции высоких порядков как базовые компоненты функционального программирования.
- Шаблоны функционального программирования. Трансформация функций, шаблон MapReduce.
- Основные особенности логического программирования. Процедурная интерпретация.
- Элементы функционального программирования в современных ЯП (Python, JavaScript).
- Императивное программирование. Выполнение императивных программ.
- Структурное программирование, его базовые элементы.
- Модульное программирование как развитие структурного.
- Основные концепции объектно-ориентированного программирования. Полиморфизм, наследование и инкапсуляция.
- Особенности ООП на основе классов и прототипов.
- Компоненты повторного использования. Отличия компонентов от объектов.
- Особенности парадигмы компонентно-ориентированного программирования. Разработка компонентов и разработка с компонентами.
- Базовые понятия аспектно-ориентированного программирования.
- Сервис-ориентированная архитектура в рамках Web 2.0.
- Основы разработки и использования веб-сервисов.
- Основные понятия тестирования ПО.
- Виды тестирования. Тестирования по принципу белого, серого и черного ящика.
- Место тестирования в разных моделях жизненного цикла ПО.
- Уровни тестирования. Модульное, интеграционное и системное тестирование. Автоматизация тестирования.
- Разработка через тестирование (TDD). TDD как часть гибкой методологии.
- Тестирование после разработки.
- Процессы верификации и валидации ПО.
- Обзоры и инспекции кода. Области инспекции.
- Автоматизация статического анализа кода. Инструменты типа lint.
- Обзор формальных методов верификации программ; область их применения.
- Логика Хоара.
- Формальная проверка моделей. Символьное выполнение и абстрактная интерпретация программ.
- Связь между разработкой и эволюцией ПО. Внесение изменений в ПО.
- Особенности эволюции ПО в гибкой методологии разработки.
- Законы динамики эволюции ПО.
- Сопровождение ПО как частный случай эволюции. Типы сопровождения.
- Реинженерия программного обеспечения; цель и процессы реинженерии.
- Рефакторинг программного кода. Отличия между реинженерией и рефакторингом.
3. Дополнительные процессы разработки ПО
- Обзор процессов управления конфигурацией программного обеспечения.
- Идентификация элементов конфигурации.
- Процессы управления изменениями в разработке ПО. Запросы на изменение.
- Основные понятия управления версиями.
- Централизованные и распределенные системы управления версиями.
- Основы распределенного управления версиями на примере системы Git.
- Проблематика процессов построения программной системы. Виды инструментов построения.
- Основные понятия построения ПО. Цели и зависимости.
- Программа make.
- Программа Apache Ant.
- Основные принципы непрерывной интеграции.
- Жизненный цикл выпусков программного обеспечения.
- Версии ПО; их связь с системами управления версиями. Семантическая нумерация.
- Цели и проблематика управления программным проектом.
- Понятие рисков при разработке ПО. Категории и примеры рисков.
- Процессы управления рисками.
- Планирование проекта. Проектный план и другие планы в традиционной разработке ПО.
- Роль планирования в гибкой методологии разработки.
- Экспертные и алгоритмические методы оценки затрат на разработку.
4. Разработка современных программных систем
- Использование интерфейсов в программировании. Аппаратные и программные (в широком понимании) интерфейсы.
- Отличия и общие черты бинарных и программных интерфейсов (ABI и API).
- Бинарные программные интерфейсы: характеристика и области применения.
- Инверсия управления.
- Виртуализация как способ взаимодействия разноязычных программ.
- Интерфейс внешних функций.
- Взаимосвязь между интерфейсами и типами данных.
- Интерфейсы типов в парадигме ООП.
- Стандарт ISO 11404. Классификация типов данных.
- Генерируемые та агрегигрованные типы данных.
- Иерархии типов данных в языках программирования.
- Функции как тип данных.
- Безопасность типов и безопасность памяти.
- Сильная и слабая типизация.
- Статическая и динамическая типизация.
- Совместимость типов. Виды типизации по совместимости: структурная, номинальная, утиная.
- Приведения типов данных.
- Виды полиморфизма.
- Полиморфизм подтипов. Принцип подстановки Барбары Лисков.
- Полиморфизм и наследование в ООП.
- Ковариантность, контравариантность и инвариантность типов данных.
- Понятие интероперабельности. Проблемы, решаемые за счет интероперабельности.
- Межпроцессное взаимодействие в POSIX / System V.
- Общая характеристика и классификация промежуточного ПО (middleware).
- Удаленный вызов процедур (RPC) и его реализации.
- Общая структура системы CORBA.
- Язык описания интерфейсов OMG IDL.
- Очереди сообщений.
- Сервис-ориентированная архитектура, ее преимущества и недостатки.
- Понятие веб-сервисов. Разработка с веб-сервисами. Интеграция сервисов.
- SOAP-сервисы. Язык спецификации WSDL.
- Основные принципы архитектури REST.
- Особенности реализации REST-сервисов.
- Интерфейсы SOAP- та REST-сервисов в средах программирования. Синхронный и асинхронный вызов методов сервисов.
- Основные положения облачной архитектуры.
- Технологии, от которых зависит облачная архитектура.
- Уровни облачной архитектуры.
- Модели развертывания облачной архитектуры. Примеры открытых облачных сервисов.
- Обзор понятия BigData.
- Шаблон распределенной обработки данных MapReduce.
- Облачные файловые системы.
- Введение в облачные базы данных. Понятие NoSQL.
- Применение NoSQL-баз данных в облачных вычислениях.
- Каркасы облачных приложений. Apache Hadoop.