Лекция №15Эволюция ПО
Разработка программной системы не заканчивается ее доставкой заказчику или конечным пользователям. Для того чтобы программа оставалась конкурентноспособной, ее необходимо непрерывно модифицировать. Разработка, связанная с поддержкой ПО в актуальном состоянии, составляет процесс эволюции программной системы.
Под сопровождением в программной инженерии подразумевается либо эволюция ПО в целом, либо часть этого процесса, осуществляемая независимой от разработчиков командой. Разделение разработки и сопровождения характерно для классической плановой модели жизненного цикла программного обеспечения. В гибкой методологии разработки и других новых моделях эволюцию ПО осуществляют сами разработчики в рамках того же итеративного процесса.
Существует несколько причин, по которым эволюция ПО объективно необходима:
- Несмотря на тестирование и верификацию, всякая программная система содержит определенные дефекты, которые необходимо исправлять для корректной работы.
- Систему нужно адаптировать к меняющейся среде выполнения (новому оборудованию, вспомогательному программному обеспечению и так далее).
- Для сохранения заинтересованности пользователей в ПО его функциональность необходимо постоянно расширять.
Эмпирические законы эволюции программного обеспечения были впервые сформулированы Lehman, Belady в 1985 году. Достаточно интересным результатом исследования динамики развития ПО является эргодичность эволюции:
- Эволюция ПО — саморегулирующийся процесс. Характеристики изменений (число ошибок, размер системы, периодичность выпусков) приблизительно одинаковы для всех выпусков.
- Темп разработки программной системы стабилен в течение всего ЖЦ и слабо зависит от затраченных на разработку ресурсов.
- Объем вносимых с каждым выпуском изменений остается стабильным в течение всего периода разработки. (Причина: необходимость сохранения высокого уровня знаний разработчиков о системе.)
Пожалуй, наиболее важный вывод, который можно сделать из законов эволюции ПО — необходимость упрощения программной системы в процессе разработки. Для этого используется реинженерия (reengineering) исходного кода программы и используемых данных. Пример реинженерии — автоматизированная трансляция кода программы на более новую версию языка программирования; например, утилита 2to3 осуществляет трансляцию из Python 2.x в Python 3.x.
В то время как реинженерия предназначена для «обновления» устаревшей программы, существует аналогичный упреждающий процесс — рефакторинг. Рефакторинг позволяет упростить структуру программы непосредственно во время разработки, например, дать переменной / методу более содержательное имя или перенести метод выше по дереву наследования. Современные среды разработки, такие как Eclipse, автоматизируют базовые методы рефакторинга исходного кода.