Программа курса

Сдавать зачет по программной инженерии можно разными способами:

Меня устраивает любой из способов, хотя первые два нравятся больше третьего.

Приложение

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

  • контроль версий при помощи git;
  • автоматическое построение проекта при помощи make;
  • основы разработки веб-приложений за счет использования генератора сайтов Jekyll, например, использование DSL Liquid для рендеринга HTML-страниц.

Темы для самостоятельной работы

Для сдачи зачета достаточно подготовить одну из тем ниже в виде доклада на ~10 минут.

  1. История разработки ПО в СССР и на Западе.
  2. Исторический обзор моделей жизненного цикла ПО.
  3. Парадигма Rapid Application Development.
  4. Сравнение моделей разработки, соответствующих гибкой методологии.
  5. Способы представления требований к программным системам.
  6. Прикладные инструменты системного моделирования.
  7. Прикладные инструменты создания MV* архитектур.
  8. MV* архитектуры в веб-приложениях. MVC-фреймворки в языках программирования PHP, Python, Ruby. Фреймворк AngularJS.
  9. Встроенные и пользовательские реализации шаблонов проектирования в различных средах программирования.
  10. Функциональное программирование. Языки Haskell, Lisp.
  11. Логическое программирование. Язык программирования Prolog.
  12. История развития парадигмы императивного программирования. Модульное программирование.
  13. Среда аспектного программирования AspectJ.
  14. Парадигма агентного программирования.
  15. Прикладные инструменты создания лексических / синтаксических анализаторов.
  16. Средства рефлексии в языках программирования.
  17. Освоение инструментов модульного тестирования в современных средах разработки.
  18. Прикладные инструменты доказательства корректности программ.
  19. Инструменты рефакторинга программ в современных средах разработки.
  20. Сравнение систем управления версиями ПО.
  21. Системы автоматического построения для современных сред разработки (Maven, Grunt, Gradle и др.).
  22. Системы зависимостей в современных средах разработки (Python setuptools, npm, Bower и др.).
  23. Системы генерации документации в языках программирования и создание плагинов для этих систем.
  24. Прикладные инструменты автоматизации процессов инженерии качества.
  25. Особенности планирования программного проекта в гибкой методологии разработки.
  26. Автоматизация усовершенствования процессов разработки ПО.
  27. Инверсия управления в современных платформах разработки.
  28. Интерфейсы внешних функций в средах программирования.
  29. Агрегационные типы данных в языках программирования.
  30. Функции первого класса.
  31. Смеси (traits, mixins) как промежуточное звено между интерфейсами и наследованием.
  32. Ковариантность и контравариантность типов данных в языках программирования.
  33. Средства межпроцессного взаимодействия в операционных системах.
  34. Особенности повторного использования ПО с открытым исходным кодом.
  35. Средства инженерии КПИ в современных средах разработки.
  36. Системы типа ActiveRecord и DataMapper в современных платформах разработки ПО.
  37. Децентрализованные сети. Internet of Things. Блокчейн.
  38. Платформы для разработки SOAP- и REST-сервисов.
  39. Асинхронный обмен данными с веб-сервисами. Веб-сокеты. Фреймворк Node.js.
  40. Анализ современных платформ IaaS, PaaS, SaaS.
  41. Знакомство с каркасами для распределенных вычислений (Hadoop, Spark).
  42. Базы данных NoSQL.

Контрольные вопросы

Можно подготовить по одному контрольному вопросу по каждой из 4 тем.

1. Введение

  1. Место и задачи программной инженерии.
  2. Место ПИ среди компьютерных наук.
  3. История развития программной инженерии в СССР и на Западе. Эволюция подхода к разработке компьютерных программ.
  4. Дисциплины программной инженерии.
  5. ПИ как наука. Связь программной инженерии с дисциплинами дискретной математики.
  6. Роль стандартов и повторного использования в разработке программного обеспечения.
  7. Сущность дисциплины управления ПИ.
  8. Стандарт жизненного цикла ISO 12207.
  9. Категории процессов жизненного цикла.
  10. Определение и цели моделей жизненного цикла ПО.
  11. Каскадная модель жизненного цикла, ее преимущества и недостатки и области применения.
  12. Эволюционная модель жизненного цикла, ее преимущества и недостатки и области применения.
  13. Инкрементная модель жизненного цикла, ее преимущества и недостатки и области применения.
  14. Основные положения гибкого подхода к разработке ПО.
  15. Методы гибкой методологии разработки: непрерывная интеграция, парное программирование, разработка через тестирование.
  16. Виды гибкой методологии.
  17. Экстремальное программирование.

2. Основные процессы разработки ПО

  1. Роль инженерии требований в разработке ПО.
  2. Классификация требований к ПО. Пользовательские и системные требования.
  3. Функциональные и нефункциональные требования.
  4. Способы представления требований к ПО. Спецификация требований.
  5. Процесс инженерии требований.
  6. Инженерия требований в гибкой методологии разработки.
  7. Определение и цель моделирования программных систем.
  8. Представление программных систем в абстрактной форме. Язык моделирования UML.
  9. Контекстные диаграммы UML. Диаграммы деятельности.
  10. Модели взаимодействия UML. Диаграммы вариантов использования. Диаграммы последовательностей.
  11. Диаграммы классов UML. Отношения в диаграммах классов.
  12. Поведенческие модели UML. Диаграммы состояний.
  13. Роль архитектуры в разработке ПО.
  14. Связь между архитектурой и требованиями к ПО.
  15. Модель представлений архитектуры 4+1.
  16. Архитектура «модель — отображение — контроллер».
  17. Роль архитектур MV* в разработке веб-приложений и приложений с графическим интерфейсом.
  18. Многослойная архитектура программного обеспечения.
  19. Клиент-серверная архитектура.
  20. Конвейерная архитектура. Потоки UNIX как пример использования конвейерной архитектуры.
  21. Сущность объектно-ориентированного проектирования. Роль ООП в разработке современного программного обеспечения.
  22. Основные концепции ООП.
  23. Процесс проектирования в соответствии с ООП.
  24. Базовые составляющие шаблонов проектирования. Классификация шаблонов.
  25. Порождающие шаблоны проектирования. Шаблоны Singleton, Builder, Factory.
  26. Структурные шаблоны проектирования. Шаблоны Bridge, Decorator.
  27. Поведенческие шаблоны проектирования. Шаблоны Interator, Observer.
  28. Определение парадигмы программирования. Место парадигмы в разработке ПО.
  29. Классификация парадигм программирования.
  30. Историческое развитие парадигм программирования.
  31. Особенности декларативного программирования. Выполнение декларативных программ.
  32. Функциональное программирование. Чистые функции.
  33. Замыкания и функции высоких порядков как базовые компоненты функционального программирования.
  34. Шаблоны функционального программирования. Трансформация функций, шаблон MapReduce.
  35. Основные особенности логического программирования. Процедурная интерпретация.
  36. Элементы функционального программирования в современных ЯП (Python, JavaScript).
  37. Императивное программирование. Выполнение императивных программ.
  38. Структурное программирование, его базовые элементы.
  39. Модульное программирование как развитие структурного.
  40. Основные концепции объектно-ориентированного программирования. Полиморфизм, наследование и инкапсуляция.
  41. Особенности ООП на основе классов и прототипов.
  42. Компоненты повторного использования. Отличия компонентов от объектов.
  43. Особенности парадигмы компонентно-ориентированного программирования. Разработка компонентов и разработка с компонентами.
  44. Базовые понятия аспектно-ориентированного программирования.
  45. Сервис-ориентированная архитектура в рамках Web 2.0.
  46. Основы разработки и использования веб-сервисов.
  47. Основные понятия тестирования ПО.
  48. Виды тестирования. Тестирования по принципу белого, серого и черного ящика.
  49. Место тестирования в разных моделях жизненного цикла ПО.
  50. Уровни тестирования. Модульное, интеграционное и системное тестирование. Автоматизация тестирования.
  51. Разработка через тестирование (TDD). TDD как часть гибкой методологии.
  52. Тестирование после разработки.
  53. Процессы верификации и валидации ПО.
  54. Обзоры и инспекции кода. Области инспекции.
  55. Автоматизация статического анализа кода. Инструменты типа lint.
  56. Обзор формальных методов верификации программ; область их применения.
  57. Логика Хоара.
  58. Формальная проверка моделей. Символьное выполнение и абстрактная интерпретация программ.
  59. Связь между разработкой и эволюцией ПО. Внесение изменений в ПО.
  60. Особенности эволюции ПО в гибкой методологии разработки.
  61. Законы динамики эволюции ПО.
  62. Сопровождение ПО как частный случай эволюции. Типы сопровождения.
  63. Реинженерия программного обеспечения; цель и процессы реинженерии.
  64. Рефакторинг программного кода. Отличия между реинженерией и рефакторингом.

3. Дополнительные процессы разработки ПО

  1. Обзор процессов управления конфигурацией программного обеспечения.
  2. Идентификация элементов конфигурации.
  3. Процессы управления изменениями в разработке ПО. Запросы на изменение.
  4. Основные понятия управления версиями.
  5. Централизованные и распределенные системы управления версиями.
  6. Основы распределенного управления версиями на примере системы Git.
  7. Проблематика процессов построения программной системы. Виды инструментов построения.
  8. Основные понятия построения ПО. Цели и зависимости.
  9. Программа make.
  10. Программа Apache Ant.
  11. Основные принципы непрерывной интеграции.
  12. Жизненный цикл выпусков программного обеспечения.
  13. Версии ПО; их связь с системами управления версиями. Семантическая нумерация.
  14. Цели и проблематика управления программным проектом.
  15. Понятие рисков при разработке ПО. Категории и примеры рисков.
  16. Процессы управления рисками.
  17. Планирование проекта. Проектный план и другие планы в традиционной разработке ПО.
  18. Роль планирования в гибкой методологии разработки.
  19. Экспертные и алгоритмические методы оценки затрат на разработку.

4. Разработка современных программных систем

  1. Использование интерфейсов в программировании. Аппаратные и программные (в широком понимании) интерфейсы.
  2. Отличия и общие черты бинарных и программных интерфейсов (ABI и API).
  3. Бинарные программные интерфейсы: характеристика и области применения.
  4. Инверсия управления.
  5. Виртуализация как способ взаимодействия разноязычных программ.
  6. Интерфейс внешних функций.
  7. Взаимосвязь между интерфейсами и типами данных.
  8. Интерфейсы типов в парадигме ООП.
  9. Стандарт ISO 11404. Классификация типов данных.
  10. Генерируемые та агрегигрованные типы данных.
  11. Иерархии типов данных в языках программирования.
  12. Функции как тип данных.
  13. Безопасность типов и безопасность памяти.
  14. Сильная и слабая типизация.
  15. Статическая и динамическая типизация.
  16. Совместимость типов. Виды типизации по совместимости: структурная, номинальная, утиная.
  17. Приведения типов данных.
  18. Виды полиморфизма.
  19. Полиморфизм подтипов. Принцип подстановки Барбары Лисков.
  20. Полиморфизм и наследование в ООП.
  21. Ковариантность, контравариантность и инвариантность типов данных.
  22. Понятие интероперабельности. Проблемы, решаемые за счет интероперабельности.
  23. Межпроцессное взаимодействие в POSIX / System V.
  24. Общая характеристика и классификация промежуточного ПО (middleware).
  25. Удаленный вызов процедур (RPC) и его реализации.
  26. Общая структура системы CORBA.
  27. Язык описания интерфейсов OMG IDL.
  28. Очереди сообщений.
  29. Сервис-ориентированная архитектура, ее преимущества и недостатки.
  30. Понятие веб-сервисов. Разработка с веб-сервисами. Интеграция сервисов.
  31. SOAP-сервисы. Язык спецификации WSDL.
  32. Основные принципы архитектури REST.
  33. Особенности реализации REST-сервисов.
  34. Интерфейсы SOAP- та REST-сервисов в средах программирования. Синхронный и асинхронный вызов методов сервисов.
  35. Основные положения облачной архитектуры.
  36. Технологии, от которых зависит облачная архитектура.
  37. Уровни облачной архитектуры.
  38. Модели развертывания облачной архитектуры. Примеры открытых облачных сервисов.
  39. Обзор понятия BigData.
  40. Шаблон распределенной обработки данных MapReduce.
  41. Облачные файловые системы.
  42. Введение в облачные базы данных. Понятие NoSQL.
  43. Применение NoSQL-баз данных в облачных вычислениях.
  44. Каркасы облачных приложений. Apache Hadoop.