Современный подход к проектированию программ основан на декомпозиции задачи. Целью декомпозиции является создание модулей, которые представляют собой небольшие, относительно самостоятельные программы, взаимодействующие друг с другом по хорошо определенным и простым правилам.
Разработка любой программы или прикладной системы начинается с определения требований к ней для конкретного набора пользователей и заканчивается эксплуатацией системы этими пользователями.
По современным взглядам проектирование и разработку программ целесообразно разбить на ряд последовательных этапов:
1) постановка задачи;
2) проектирование программы;
3) построение модели;
4) разработка алгоритма;
5) реализация алгоритма;
6) анализ алгоритма и его сложности;
7) тестирование программы;
8) документирование.
При постановке задачи для крупных компьютерных программ необходимо провести следующие работы:
· выработать требования (свойства, качества и возможности), необходимые для решения проблемы или достижения цели (как правило, эта деятельность носит экспертный характер);
· разработать спецификации, включающие:
- цель программы;
- граничные условия;
- описание функций системы;
- спецификации входных и выходных данных;
- верификационные требования (установление тестовых случаев);
- тип и количество документов.
Проектирование программы осуществляется следующим образом. Сначала производится проектирование архитектуры программной системы. Это предполагает первичную (общую) стадию проектирования и заканчивается декомпозицией спецификаций в структуру системы. Обычно на модульном уровне разрабатывается спецификация каждого модуля:
· имя/цель — дается имя модулю и предложение о его функции с формальными параметрами;
· неформальное описание — обзор действий модуля;
· ссылки — какие модули ссылаются на него и на какие модули ссылается данный модуль;
· вход/выход — формальные и фактические параметры, глобальные, локальные и связанные (общие для ряда модулей) переменные;
· примечания — полезные комментарии общего характера по модулю.
Следующим шагом является детальное проектирование. На этом этапе происходит процедурное описание программы, выбор и оценка алгоритма для реализации каждого модуля. Входной информацией для проектирования являются требования и спецификации системы.
Построение модели в большинстве случаев является непростой задачей. При построении моделей, как правило, используют два принципа: дедуктивный (от общего к частному) и индуктивный (от частного к общему). При дедуктивном подходе рассматривается частный случай общеизвестной фундаментальной модели. При заданных предположениях известная модель приспосабливается к условиям моделируемого объекта.
Индуктивный способ предполагает выдвижение гипотез, декомпозицию сложного объекта, анализ, затем синтез. Здесь широко используется подобие, аналогичное моделирование, умозаключение с целью формирования каких-либо закономерностей в виде предположений о поведении системы.
Технология построения модели при индуктивном способе:
1) эмпирический этап (умозаключение, интуиция, предположение, гипотеза);
2) постановка задачи для моделирования;
3) оценка, количественное и качественное описание;
4) построение модели.
Разработка алгоритма — самый сложный и трудоемкий процесс, но и самый интересный в творческом отношении. Выбор метода разработки зависит от постановки задачи, ее модели. На этом этапе необходимо провести анализ правильности алгоритма, что очень непросто и трудоемко.
Наиболее распространенная процедура доказательства правильности алгоритма — это прогон его на множестве различных тестов. Однако это не гарантирует того, что не может существовать случая, в котором программа «не сработает».
На этапе реализации алгоритмапроисходят конструирование и реализация алгоритма, включающие кодирование, интеграцию, тестирование (сертификацию).
По сути, проводится перевод проекта в форму программы для конкретного компьютера, сборка системы и ее прогон при тестовых и нормальных условиях для подтверждения ее работы в соответствии со спецификациями системы.
Анализ алгоритма и его сложности необходим для оценки ресурсов компьютеров, на которых он будет работать, времени обработки конкретных данных, приспособления в работе в локальных сетях и телекоммуникациях. Хотелось бы также иметь для данной задачи количественный критерий для сравнения нескольких алгоритмов с целью выбора более простого и эффективного среди них.
Перед началом эксплуатации программы необходим этап ее отладки и тестирования.
Тестирование — это процесс исполнения программ с целью выявления (обнаружения) ошибок. Тестирование — процесс деструктивный, поэтому считается, что тест удачный, если обнаружена ошибка.
Существуют различные способы тестирования программ:
· тестирование программы как «черного ящика» — стратегия «черного ящика» определяет тестирование с анализом входных данных и результатов работы программы.
· тестирование программы как «белого ящика» заключается в стратегии управления логикой программы, позволяет использовать ее внутреннюю структуру.
Различают альфа- и бета-тестирование, производимое соответственно специалистами разработчика и заказчика программного изделия.
Основные типы ошибок, встречающихся при программировании:
· обращения к переменным, значения которым не присвоены или не инициализированы;
· выход индексов за границы массивов;
· несоответствие типов или атрибутов переменных величин;
· явные или неявные проблемы адресации памяти;
· ошибочные передачи управления;
· логические ошибки.
Есть золотое правило программистов — оформляй свои программы в том виде, в каком бы ты хотел видеть программы, написанные другими. К каждому конечному программному продукту необходимо документированное сопровождение в виде помощи (help), файлового текста (readme.txt).