Раздел 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 с.
- Лаврищева Е.М. Программная инженерия. Учебник. — К.: Академпериодика. —
- — 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