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

Основные процессы разработки ПО: инженерия требований, проектирование, кодирование, тестирование и эволюция.

Лекции

6. Инженерия требований

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

7. Моделирование ПО

Лекция раскрывает тему моделирования программных систем. В некотором смысле, это переходный этап между инженерией требований к ПО и проектированием общей структуры системы и отдельных ее компонентов. Детальнее→

8. Архитектура ПО

Лекция посвящена важному уровню проектирования программных систем — созданию архитектуры. Архитектура ПО определяет, каким образом организована система и каким образом в ней выделяются отдельные компоненты. По сравнению с проектированием элементов системы, архитектура является более абстрактной и меньше связана с реализацией. Детальнее→

9. Шаблоны проектирования

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

10. Парадигмы программирования (часть 1)

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

11. Парадигмы программирования (часть 2)

Парадигма объектно-ориентированного программирования породила несколько парадигм, ее расширяющих: компонентно-ориентированное программирование; аспектное программирование; сервисное программирование. Эти парадигмы призваны решить проблемы, возникающие при разработке в чистом ООП-стиле. Детальнее→

12. Языки программирования. Метапрограммирование

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

13. Тестирование ПО

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

14. Верификация и валидация

Верификация и валидация — два связанных процесса разработки ПО. Верификация отвечает на вопрос «Правильно ли разрабатывается продукт?» (Are we building the product right?); валидация — на вопрос «Правильный ли продукт разрабатывается?» (Are we building the right product?). Верификация проверяет ПО на соответствие спецификациям, заданным при проектировании; валидация проверяет, соответствует ли продукт ожиданиям заказчика и потребителей. Исходя из определения, тестирование — частный случай валидации. Детальнее→

15. Эволюция ПО

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

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

  • Способы представления требований к программным системам.
  • Прикладные инструменты системного моделирования.
  • Прикладные инструменты создания MV* архитектур.
  • MV* архитектуры в веб-приложениях. MVC-фреймворки в языках программирования PHP, Python, Ruby. Фреймворк AngularJS.
  • Встроенные и пользовательские реализации шаблонов проектирования в различных средах программирования.
  • Функциональное программирование. Языки Haskell, Lisp.
  • Логическое программирование. Язык программирования Prolog.
  • История развития парадигмы императивного программирования. Модульное программирование.
  • Среда аспектного программирования AspectJ.
  • Парадигма агентного программирования.
  • Прикладные инструменты создания лексических / синтаксических анализаторов.
  • Средства рефлексии в языках программирования.
  • Освоение инструментов модульного тестирования в современных средах разработки.
  • Прикладные инструменты доказательства корректности программ.
  • Инструменты рефакторинга программ в современных средах разработки.

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

  • Роль инженерии требований в разработке ПО.
  • Классификация требований к ПО. Пользовательские и системные требования.
  • Функциональные и нефункциональные требования.
  • Способы представления требований к ПО. Спецификация требований.
  • Процесс инженерии требований.
  • Инженерия требований в гибкой методологии разработки.
  • Определение и цель моделирования программных систем.
  • Представление программных систем в абстрактной форме. Язык моделирования 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.
  • Обзор формальных методов верификации программ; область их применения.
  • Логика Хоара.
  • Формальная проверка моделей. Символьное выполнение и абстрактная интерпретация программ.
  • Связь между разработкой и эволюцией ПО. Внесение изменений в ПО.
  • Особенности эволюции ПО в гибкой методологии разработки.
  • Законы динамики эволюции ПО.
  • Сопровождение ПО как частный случай эволюции. Типы сопровождения.
  • Реинженерия программного обеспечения; цель и процессы реинженерии.
  • Рефакторинг программного кода. Отличия между реинженерией и рефакторингом.

Литература

  • Лаврищева Е.М., Петрухин В.А. Методы и средства программного обеспечения. — М:. Мин. образования РФ. — 2007. — 415 с.
  • Лаврищева Е.М. Программная инженерия. Учебник. — К.: Академпериодика. —
    1. — 319 с.
  • Sommerville I. Software engineering, 9th ed. — Boston, Massachusetts: Addison-Wesley. — 2011. — 790 p.
  • Wiegers K., Beatty J. Software requirements. — Upper Saddle River, New Jersey: Pearson Education. — 2013. — 672 p.
  • Fowler M. UML distilled. — Boston, Massachusetts: Addison-Wesley Professional. — 2007. — 175 p.
  • Object-oriented analysis and design with applications / Booch G., Maksimchuck R.A., Engle M.W. et al. — Upper Saddle River, New Jersey: Pearson Education. — 2007. — 720 p.
  • Gamma E., Helm R., Johnson R., Vlissides J. Design patterns. — Upper Saddle River, New Jersey: Pearson Education. — 1994. — 395 p.
  • Hohpe G., Woolf B. Enterprise Integration Patterns. — Boston, Massachusetts: Addison-Wesley. — 2012. — 735 p.
  • Fowler M. Patterns of enterprise application architecture. — Boston, Massachusetts: Addison-Wesley. — 2012. — 557 p.
  • Meyer B. Object-oriented software construction. — Upper Saddle River, New Jersey: Prentice Hall. — 1997. — 1254 p.
  • Jacobson I. Object-oriented software engineering: a use case driven approach. — Upper Saddle River, New Jersey: Pearson Education. — 1992. — 552 p.
  • Abelson H., Sussman G.J., Sussman J. Structure and interpretation of computer programs. — Cambridge, Massachusetts: MIT Press. — 1996. — 684 p.
  • Object-oriented analysis and design with applications / Booch G., Maksimchuck R.A., Engle M.W. et al. — Upper Saddle River, New Jersey: Pearson Education. — 2007. — 720 p.
  • Hansen M.R., Rischel H. Functional programming using F#. — Cambridge: Cambridge University Press. — 2013. — 361 p.
  • Clocksin W., Mellish C.S. Programming in Prolog, 5th ed. — Springer. — 2003. — 299 p.
  • Dahl O.-J., Dijkstra E.W., Hoare C. Structured programming. — Academic Press. — 1972. — 220 p.
  • Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ / Пер. с англ. под ред. А. Шеня. — М.: МЦНМО, 2002. — 960 с.
  • Ахо А.В., Хопкрофт Дж., Ульман Дж.Д. Структуры данных и алгоритмы. — Изд. дом «Вильямс». — 2000. — 384 с.
  • Heineman G.T., Councill W.T. Component-based software engineering. — Boston, Massachusetts: Addison-Wesley. — 2001. — 818 p.
  • Szyperski C. Component software: beyond object-oriented programming. — Upper Saddle River, New Jersey: Pearson Education. — 2002. — 589 p.
  • Jacobson I., Ng P.-W. Aspect-oriented software development with use cases. — Boston, Massachusetts: Addison-Wesley. — 2005. — 418 p.
  • Myers G.J., Sandler C., Badgett T. The art of software testing. — Hoboken, New Jersey: John Wiley & Sons. — 2011. — 256 p.
  • Fowler M., Beck K., Brant J., Opdyke W., Roberts D. Refactoring: improving the design of existing code. — Boston, Massachusetts: Addison-Wesley. — 2012. — 455 p.
  • Fowler M. Domain-specific languages. — Upper Saddle River, New Jersey: Pearson Education. — 2010. — 640 p.
  • Papyrus for Eclipse
  • Laravel
  • Symfony
  • Django
  • Ruby on Rails
  • AngularJS
  • AspectJ project
  • Java Pathfinder
  • Java ANTLR
  • jUnit