
- •Оглавление
- •6 Тестирование 88
- •8.3 Организация разработки программного изделия 215
- •8.4 Организация обслуживания разработки программного изделия 230
- •8.5 Организация выпуска документации 239
- •8.6 Организация испытаний программных изделий 248
- •1 Введение. Проблемы современного программирования
- •2 Этапы разработки программного обеспечения
- •2.1 Анализ требований, предъявляемых к системе
- •2.2 Определение спецификаций
- •2.3 Проектирование
- •2.4 Кодирование
- •2.5 Тестирование
- •2.6 Эксплуатация и сопровождение
- •2) Определение спецификаций;
- •3) Проектирование;
- •4) Кодирование;
- •Контрольные вопросы
- •1. Этапы разработки программного обеспечения.
- •2. Анализ требований, предъявляемых к системе.
- •3 Методы разработки программного обеспечения как научная дисциплина
- •3.1 Методы управления разработкой
- •3.1.1 Выполнение проекта
- •3.1.2 Методика оценки затрат
- •3.1.2.1 Методика инженерно-технической оценки затрат
- •3.1.2.2 Оценка на основе распределения Рэлея
- •3.1.3 Контрольные точки
- •3.1.4 Средства разработки
- •3.1.5 Надежность
- •3.2 Методы проведения разработки программного обеспечения
- •3.3 Развитие методов разработки программного обеспечения
- •3.3.1 Язык определения задач и анализатор задач
- •3.3.2 Система структурного анализа и проектирования sadt
- •3.3.3 Система srem
- •3.3.4 Методика Джексона
- •3.4 Выводы
- •Контрольные вопросы
- •1. Методы разработки программного обеспечения как научная дисциплина.
- •4 Методы разработки программного обеспечения
- •4.1 Язык проектирования программ
- •4.2 Стратегия проектирования
- •4.2.1 Нисходящее проектирование и нисходящая разработка
- •4.2.2 Структурное проектирование
- •4.3 Данные
- •4.3.1 Обзор структур данных
- •4.3.1.1 Массивы
- •4.3.1.2 Структуры
- •4.3.1.3 Списки
- •4.3.1.4 Очереди
- •4.3.1.5 Стеки
- •4.3.1.6 Множества
- •4.3.1.7 Графы
- •4.3.1.8 Деревья
- •4.3.2 Абстрактные конструкции
- •4.3.2.1 Фиксированные типы данных абстрактного типа
- •4.3.2.2 Размещение указателей
- •4.3.2.3 Защита данных от несанкционированного доступа
- •Контрольные вопросы
- •2. Нисходящее проектирование и нисходящая разработка.
- •9. Абстрактные конструкции.
- •5 Правильность программ
- •5.1 Аксиомы
- •5.2 Правила преобразования данных
- •5.3 Доказательства правильности программ
- •Контрольные вопросы
- •1. Правильность программ.
- •6 Тестирование
- •6.1 Психология и экономика тестирования программ
- •6.2 Экономика тестирования
- •6.2.1 Тестирование программы как черного ящика
- •6.2.2 Тестирование программы как белого ящика
- •6.2.3 Принципы тестирования
- •6.3 Ручное тестирование
- •6.3.1 Инспекции и сквозные просмотры
- •6.3.2 Инспекции исходного текста
- •6.3.3 Список вопросов для выявления ошибок при инспекции
- •6.3.3.1 Ошибки обращения к данным
- •6.3.3.2 Ошибки описания данных
- •6.3.3.3 Ошибки вычислений
- •6.3.3.4 Ошибки при сравнениях
- •6.3.3.5 Ошибки в передачах управления
- •6.3.3.6 Ошибки интерфейса
- •6.3.3.7 Ошибки ввода-вывода
- •6.3.3.8 Другие виды контроля
- •6.3.4 Сквозные просмотры
- •6.3.5 Оценка посредством просмотра
- •6.4 Проектирование теста
- •6.4.1 Тестирование путем покрытия логики программы
- •6.4.1.1 Покрытие операторов
- •6.4.1.2 Покрытие решений
- •6.4.1.3 Покрытие условий
- •6.4.1.4 Покрытие решений/условий
- •6.4.1.5 Комбинаторное покрытие условий
- •6.4.2 Эквивалентное разбиение
- •6.4.2.1 Выделение классов эквивалентности
- •6.4.2.2 Построение тестов
- •6.4.3 Анализ граничных значений
- •6.4.4 Применение функциональных диаграмм
- •6.4.5 Предположение об ошибке
- •6.4.6 Стратегия
- •Контрольные вопросы
- •3. Принципы тестирования.
- •9. Анализ граничных значений.
- •11. Предположение об ошибке.
- •7 Технология разработки программ
- •7.1 Разбиение задачи на независимые подзадачи
- •7.2 Разбиение задачи на одинаковые по сложности части
- •7.3 Рекурсия и динамическое программирование
- •7.3.1 Рекурсия
- •7.3.2 Динамическое программирование
- •7.3.3 Моделирование
- •7.4 Поиск
- •7.4.1 Поиск в списках
- •7.4.2 Деревья поиска
- •7.4.3 Стратегия распределения памяти
- •7.5 Сортировка
- •7.6 Алгоритм выбора из конечного состояния
- •7.7 Сопрограммы
- •Контрольные вопросы
- •8 Методы управления проектированием программных изделий
- •8.1 Организация управления проектированием программного изделия
- •8.1.1 Понятие изделия как средства общения
- •8.1.2 Нисходящий анализ процесса управления проектированием программного изделия
- •8.1.3 Организация взаимодействия
- •8.1.4 Установление целей, средства их достижения
- •8.1.5 Подбор и обучение кадров
- •8.2 Организация планирования разработок программного изделия
- •8.2.1 Виды планов
- •8.2.2 Декомпозиция планов
- •8.2.3 Организационная структура группы планирования
- •8.2.4 Планы, связанные с созданием программных изделий
- •8.2.5 Опытный образец изделия
- •8.2.6 Организация планирования в фазе исследования
- •8.2.7 Организация планирования в стадии анализа осуществимости
- •8.2.8 Организация планирования в фазах конструирования и кодирования
- •8.2.9 Организация планирования в фазах оценки и использования
- •8.2.10 Обязанности группы планирования при рассмотрении и утверждении планов разработки программного изделия
- •8.3 Организация разработки программного изделия
- •8.3.1 Организация разработки программного изделия в фазе исследований
- •8.3.2 Организация разработки программного изделия в фазе анализа осуществимости
- •8.3.3 Организация разработки программного изделия в фазе конструирования (проектирования)
- •8.3.4 Организация разработки программного изделия в фазе программирования
- •8.3.5 Организация разработки программного изделия в фазе оценки
- •8.3.6 Окончание проекта
- •8.3.7 Участие группы разработки в фазовых обзорах
- •8.4 Организация обслуживания разработки программного изделия
- •8.4.1 Организационная структура группы обслуживания
- •8.4.2 Организация обслуживания программного изделия в фазе исследования
- •8.4.3 Организация обслуживания в фазах анализа осуществимости и конструирования
- •8.4.4 Организация обслуживания в фазе программирования и оценки
- •8.4.5 Организация обслуживания в фазе использования
- •8.4.6 Участие группы обслуживания в фазовых обзорах
- •8.5 Организация выпуска документации
- •8.5.1 Организационная структура группы выпуска документации
- •8.5.2 Стандарты и практические руководства
- •8.5.3 Организация выпуска документации в фазах исследований и анализа осуществимости
- •8.5.4 Организация выпуска документации в фазах конструирования и программирования
- •8.5.5 Организация выпуска документации в фазах оценки и использования
- •8.5.6 Участие группы выпуска документации в фазовых обзорах
- •8.6 Организация испытаний программных изделий
- •8.6.1 Современное состояние методов обеспечения качества программного изделия
- •8.6.1.1 Виды испытаний программного изделия. Стадии испытаний
- •8.6.1.2 Режимы испытаний программ
- •8.6.1.3 Категории испытания программного изделия
- •8.6.2 Организационная структура группы испытаний
- •8.6.3 Организация испытаний в фазах исследований и анализа осуществимости
- •8.6.4 Организация испытаний в фазах конструирования и программирования
- •8.6.5 Организация испытаний в фазе оценки
- •8.6.6 Организация испытаний в фазе использования
- •8.6.7 Участие группы испытаний в фазовых обзорах
- •Контрольные вопросы
- •1. Понятие изделия как средства общения.
- •4. Подбор и обучение кадров.
- •6. Организационная структура группы планирования.
- •Список литературы
3.1.4 Средства разработки
Компиляторы и отладочные средства известны уже достаточно давно. В настоящее время создано (и создается) ряд новых программных средств, помогающих разработке.
Среди таких средств следует особо выделить системы управления базами данных (СУБД), которые помогают управлять организацией разрабатываемого программного обеспечения. Весьма удобны для контроля таблицы перекрестных ссылок, атрибутивные листинги, таблицы распределения памяти.
Одной из первых систем управления базой данных с возможностью ведения библиотеки модулей в исходном коде является разработанная в Мичиганском университете система ISDOS, включающая в себя язык определения задач и анализатор определения задач (PSL/PSA). В эту систему входит язык для описания интерфейса при проектировании программ, позволяющий осуществлять автоматическую проверку взаимосвязи программ. Схожа с указанной система RSL (язык определения требований), предназначенная для определения требований и интерфейсов посредством системы управления данными. Ниже эти системы будут рассмотрены подробнее.
3.1.5 Надежность
Одним из основных параметров надежности разрабатываемой программной системы является концептуальная целостность, т.е. единообразие стиля и простота структуры. Обычно она достигается за счет минимизации числа разработчиков. Организация бригады главного программиста также способствует концептуальной целостности системы, т.к. основная работа по проектированию в этом случае выполняется главным программистом.
Среди проектировщиков этот метод называется интеллектуальным программированием. Техническим документом, отражающим этот подход, является логическая структура программы (структурная схема).
Аттестация системы должна осуществляться на всех стадиях разработки. Для каждого уровня проектирования, кодирования или тестирования необходимо показать, что правильность системы сохраняется при добавлении в нее любых новых частей. Это должно быть отражено в структурной схеме. Для контроля правильности используется так называемый контрольный анализ. Проведение контрольного анализа периодически планируется для всех исполнителей. Для просмотра выбирается какая-то часть системы. Каждому участнику анализа выдается необходимая информация (например, ТЗ). В случае необходимости разработчик дает пояснение. Эксперт(ы) должен сделать заключение по правильности этапа разработки. Цель контрольного анализа — обнаружение ошибок, а не их исправление. Объясняя проект другим, исполнитель может выявить нечетко сформулированную спецификацию либо незаданное условие.
Существенным является то обстоятельство, что такой анализ не ставит целью оценку работы исполнителя.
3.2 Методы проведения разработки программного обеспечения
Эти методы наиболее развиты, т.к. они относятся к области профессиональной деятельности программистов: кодирование, тестирование, отладка и др. Средства их проведения (решения) известны давно и динамически развиваются. Довольно хорошо формализованы методы определения спецификаций. Здесь уже имеется эффективная методология, хотя не все технические проблемы преодолены.
Верификация и испытания. Верификация и испытания занимают почти половину времени, отведенного на создание системы. Для уменьшения затрат, связанных с этими процессами, были разработаны средства отладки, представляющие собой специальные программы для проверки тех или иных характеристик системы. Самыми старыми и примитивными являются дамп и трассировка.
Дамп — это распечатка содержимого памяти. Однако поиск по дампу неэффективен, т.к. он выдается лишь по истечении некоторого времени после возникновения ошибки, так что причину последней установить достаточно трудно.
Трассировка — это анализ значения данных переменных после каждого выполнения оператора. В общем случае трассировка дает очень большой объем информации при минимальных пояснениях.
Анализаторы графов программы способны выявить ситуацию, когда либо происходит обращение к неинициированной переменной, либо после присвоения значения переменной к ней не обращаются.
Для тестирования программ используются генераторы тестовых данных. Проверка определенных условий в заданных точках осуществляется с помощью согласующих компиляторов. Для относительно простых языков разработаны системы автоматической верификации. В качестве примера средства, предназначенного для отработки этапов определения спецификаций и проектирования, можно назвать систему PSL/PSA.
Применительно к процессу разработки программного обеспечения термин «правильная» программа может иметь различную интерпретацию. Мы будем пользоваться восемью основными положениями. Правильная программа:
1) не содержит синтаксических ошибок;
2) не имеет ошибок, допущенных в процессе компилирования, либо сбоев в процессе выполнения;
3) для некоторых наборов тестовых данных обеспечивает получение правильного результата;
4) для типичных наборов тестовых данных обеспечивает получение правильного результата;
5) для усложненных наборов тестовых данных обеспечивает получение правильного результата;
6) для всех возможных наборов данных, удовлетворяющих спецификации задачи, обеспечивает получение правильного результата;
7) для всех возможных наборов данных и всех вероятных условий ошибочного входа обеспечивает получение правильного результата;
8) для всех возможных наборов данных обеспечивает получение правильного результата.
Естественно, что уровень правильности 8 не всегда достижим и, более того, не всегда необходим. Обычно для программных комплексов достаточно уровня правильности 6.
Достижение каждого уровня правильности требует затрат, и при проектировании комплекса разработчик сам должен обосновывать необходимый уровень правильности. Одним из путей, повышающих уровень «правильности» программ, является верификация. На настоящем уровне развития методов разработки полная автоматизация верификации невозможна.
Общим для различных систем верификации является представление программы в виде графа, с каждой дугой которого соотносится некоторый предикат (утверждение) (рис. 3.5).
Рис. 3.5 — Связь каждого оператора программы
с утверждениями Аi и Aj
Если Ai – входное утверждение, связанное с входной дугой оператора S, а Aj — утверждение, связанное с исходящей дугой того же оператора, тогда доказывается правильность оператора «если Ai истинно и оператор S выполнен, то утверждение Aj истинно». Подобный процесс может быть повторен для каждого оператора программы. Если A1 есть утверждение, предшествующее входному узлу графа (начальное утверждение), а An — утверждение на выходном узле, то «если A1 истинно и программа выполнена, то An истинно» (рис. 3.6).
Рис. 3.6 — Определение входа и выхода программы с помощью предикатов А1 и Аn
Подобный подход был формализован Хоором, который сформулировал ряд аксиом, определяющих влияние каждого типа операторов в языке на утверждение. Таким образом, доказательство правильности программ сводится к доказательству теорем исчисления предикатов.
Естественно, при таком математическом подходе результаты работы программы необходимо сравнивать с ее спецификациями. Каждая программа правильна лишь по отношению к некоторому набору спецификаций. Поэтому возникают вопросы:
Эквивалентна ли спецификация предъявляемым к программе требованиям?
Является ли программа правильной по отношению к этим спецификациям?
Это наиболее важные вопросы, которые мы будем решать при анализе правильности программ.