• Водопадный подход. При таком подходе разработка состоит из цепочки этапов. На каждом этапе создаются документы, используемые на последующем этапе. В исходном документе фиксируются требования к ПС. В конце этой цепочки создаются программы, включаемые в ПС.
• Исследовательское программирование. При этом подходе предполагается быстрая (насколько это возможно) реализация рабочих версий программ ПС, выполняющих лишь в первом приближении требуемые функции. После экспериментального применения реализованных программ производится их модификация с целью сделать их более полезными для пользователей. Этот процесс повторяется до тех пор, пока ПС не будет достаточно приемлемо для пользователей. Такой подход применялся на ранних этапах развития программирования, когда технологии программирования не придавали большого значения (использовалась интуитивная технология). В настоящее время этот подход применяется для разработки таких ПС, для которых пользователи не могут точно сформулировать требования (например, для разработки систем искусственного интеллекта).
• Прототипирование (разработка прототипа). Этот подход моделирует начальную фазу исследовательского программирования (вплоть до создания рабочих версий программ, предназначенных для проведения экспериментов) с целью установить требования к ПС. В дальнейшем должна последовать разработка ПС по установленным требованиям в рамках какого-либо другого подхода (например, водопадного).
• Формальные преобразования. Этот подход включает разработку формальных спецификаций ПС и превращение их в программы путем корректных преобразований. На этом подходе базируется компьютерная технология (CASE-технология) разработки ПС.
• Сборочное программирование. При этом подходе предполагается, что ПС конструируется, главным образом, из программных компонент, которые уже существуют. Должно быть некоторое хранилище (библиотека) таких компонент, каждая из которых может многократно использоваться в разных ПС. Такие компоненты называются
повторно используемыми {reusable). Процесс разработки ПС при данном подходе состоит скорее из сборки программ из компонент, чем из их программирования [32].
В дальнейшем мы в основном будем рассматривать водопадный подход с некоторыми модификациями. Во-первых, потому, что в этом подходе приходиться иметь дело с большинством процессов программной инженерии, а во-вторых, потому, что в рамках этого подхода создается большинство больших программных систем. Именно этот подход рассматривается в качестве индустриального подхода разработки программного обеспечения. Исследовательское программирование исходит из взгляда на программирование как на искусство. Оно применяется, когда не удается точно сформулировать требования к ПС (когда водопадный подход не применим). В нашей книге мы этот подход рассматривать не будем. Прототипирование рассматривается как вспомогательный подход, используемый в рамках других подходов, в основном, для прояснения требований к ПС. Компьютерной технологии (включая обсуждение жизненного цикла ПС, созданного по этой технологии) будет посвящена отдельная глава. Сборочное программирование мы также рассматривать не будем, хотя о повторно используемых программных модулях мы говорить будем, обсуждая свойства программных модулей.
В рамках водопадного подхода различают следующие стадии жизненного цикла ПС (см. рис. 3.1): разработку ПС, производство программных изделий (ПИ) и эксплуатацию ПС.
Стадия разработки ПС {softwaredevelopment) состоит из этапов его внешнего описания, конструирования ПС, кодирования (программирование в узком смысле) ПС и аттестации ПС. Всем этим этапам сопутствуют процессы документирования и управления ПС {softwaremanagement). Этапы конструирования и кодирования часто перекрываются, иногда довольно сильно. Это означает, что кодирование некоторых частей программного средства может быть начато до завершения этапа конструирования.
Этап внешнего описания ПС включает процессы, приводящие к созданию документа, который мы будем называть внешним описанием ПС {softwarerequirementsdocument). Этот документ является описанием поведения ПС с точки зрения внешнего по отношению к нему наблюдателя с фиксацией требований относительно его качества. Внешнее описание ПС начинается с анализа и определения требований к ПС со сто-
роны пользователей (заказчика), а также включает процессы спецификации этих требований.
Рис. 3.1. Структура жизненного цикла ПС
Конструирование ПС {softwaredesign) охватывает процессы: разработку архитектуры ПС, разработку структур программ ПС и их детальную спецификацию.
Кодирование ПС {softwarecoding) включает процессы создания текстов программ на языках программирование, их отладку с тестированием ПС.
На этапе аттестации ПС {softwarecertfication) производится оценка качества ПС. Если эта оценка оказывается приемлемой для практического использования ПС, то разработка ПС считается законченной. Это обычно оформляется в виде документа, фиксирующего решение комиссии, проводящей аттестацию ПС.
Программное изделие (ПИ) - экземпляр или копия разработанного ПС. Изготовление ПИ - это процесс генерации и/или воспроизведения (снятия копии) программ и программных документов ПС с целью их поставки пользователю для применения по назначению. Производство ПИ - это совокупность работ по обеспечению изготовления требуемого количества ПИ в установленные сроки [22]. Стадия производства ПИ в жизненном цикле ПС является, по существу, вырожденной (не сущест-
венной), так как представляет собой рутинную работу, которая может быть выполнена автоматически и без ошибок. Этим она принципиально отличается от стадии производства различной техники, поэтому в литературе эту стадию, как правило, не включают в жизненный цикл ПС.
Стадия эксплуатации ПС охватывает процессы хранения, внедрения и сопровождения ПС, а также транспортировки и применения ПИ по своему назначению. Она состоит из двух параллельно проходящих фаз: фазы применения ПС и фазы сопровождения ПС [44, 65].
Применение ПС (softwareoperation) - это использование ПС для решения практических задач на компьютере путём выполнения его программ.
Сопровождение ПС (softwaremaintenance) - это процесс сбора информации о качестве ПС в эксплуатации, устранения обнаруженных в нём ошибок, его доработки и модификации, а также извещения пользователей о внесённых в него изменениях [22, 44, 65].
3.3. Понятие качества программного средства
Каждое ПС должно выполнять определённые функции, т. е. делать то, что задумано. Хорошее ПС должно обладать еще целым рядом свойств, позволяющим успешно его использовать в течение длительного периода, т. е. обладать определённым качеством. Качество (quality) ПС - это совокупность его черт и характеристик, которые влияют на его способность удовлетворять заданным потребностям пользователей [59]. Из этого определения не следует, что разные ПС должны обладать одной и той же совокупностью таких свойств с их наилучшими показателями, поскольку улучшение одного из таких свойств ПС часто может быть достигнуто лишь ценой изменения стоимости, сроков завершения разработки и ухудшения других свойств этого ПС. Качество ПС является удовлетворительным, когда оно обладает указанными свойствами в такой степени, в какой гарантируется успешное его использование.
Совокупность свойств, которая образует удовлетворительное для пользователя качество ПС, зависит от условий и характера эксплуатации этого ПС, т. е. от позиции, с которой должно рассматриваться качество этого ПС. Поэтому при описании качества ПС должны быть фиксированы критерии отбора требуемых свойств ПС. В настоящее время критериями качества ПС (criteriaofsoftwarequality) принято считать [7, 30,49,59,63]:
• лёгкость применения,
• надёжность,
• функциональность,
• эффективность,
• сопровождаемость,
• мобильность.
Функциональность (functionality) ПС - это способность ПС выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователей. Этот набор определяется во внешнем описании ПС.
Надёжность ПС подробно обсуждалась в первой главе.
Лёгкость применения (easyofuse) ПС - это характеристики ПС, позволяющие минимизировать усилия пользователя по подготовке исходных данных, применению ПС и оценке полученных результатов, а также вызывающие положительные эмоции определённого или подразумеваемого пользователя.
Эффективность (efficiency) ПС - это отношение уровня услуг, предоставляемых ПС пользователю при заданных условиях, к объёму используемых ресурсов.
Сопровождаемость (maintainability) ПС - это характеристики ПС, которые позволяют минимизировать усилия по внесению изменений для устранения в нём ошибок и по его модификации в соответствии с изменяющимися потребностями пользователей.
Мобильность (portability) ПС - это способность ПС быть перенесённым из одной среды применения в другую, в частности, с одного компьютера на другой.
Функциональность и надёжность являются обязательными критериями качества ПС, причем обеспечение надёжности будет красной нитью проходить по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС. Обеспечение этих критериев будет обсуждаться в подходящих частях книги.
3.4. Обеспечение надёжности - основной мотив разработки программных средств
Рассмотрим теперь общие принципы обеспечения надёжности ПС, что является основным мотивом разработки ПС, задающим специфиче-