Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011 / 2011 / UP_MODPR_.RTF
Скачиваний:
38
Добавлен:
12.03.2015
Размер:
541.34 Кб
Скачать

Предисловие

Программирование, в широком смысле, как наука о методах и средствах разработки, производства и эксплуатации компьютерных программ, составляет основное содержание современной информатики и является важной отраслью промышленности. Затраты на программное обеспечение значительно превышают затраты на разработку и производство аппаратуры ЭВМ, причем львиная доля затрат приходится на разработку программ, поскольку их производство сводится к копированию программ и документации и обходится сравнительно дешево.

Технология программирования в этих условиях становится одной из важнейших современных областей знаний и технологий, затрагивающей интересы миллионов людей. Круг ее проблем и методов стремительно расширяется.

Программирование – это, прежде всего, коллективный интеллектуальный труд, и его технология сильно отличается от других промышленных технологий. Появляются новые, все более сложные абстрактные модели функционирования программ и основанные на них языки и системы программирования. Важнейшую роль в технологии играют инструментальные средства программирования. Естественно, что отбрасываются устаревшие приемы и инструменты, и в то же время происходит накопление фундаментальных знаний, оправдавших себя технологий, методов и средств.

Важную часть такого фундамента составляет технология модульного программирования, методы которой в основном сложились в 60-х и 70-х годах двадцатого века [4, 14, 16 – 18, 20]. К этому же периоду относится появление первых идей объектно-ориентированного программирования, которое стало дальнейшим развитием этой технологии [19].

В пособии излагаются лежащие в основе всех направлений современной технологии методы индивидуальной разработки сравнительно небольших многомодульных программ. В создании крупных программных комплексов, кроме этих методов, большое значение приобретают вопросы организации коллектива разработчиков, разделения труда между ними и координации работ, использования инструментальных систем [3, 24].

1. Основные понятия

Технология программирования изучает методы и средства разработки программ как промышленных изделий.

Программное изделие - это размещенная на машинном носителе тщательно отлаженная, хорошо документированная программа с максимально общей формой входных и выходных данных, допускающая тиражирование, удовлетворяющая действующим стандартам и правилам определенной системы программного обеспечения и являющаяся продуктом промышленного производства.

Выбор конкретной технологии зависит от многих факторов, прежде всего - от объема и сложности разрабатываемой программы, ее характера, требований к программе, технологической среды разработки, количества разработчиков и т. п.

Методы разработки должны обеспечить предъявляемые к программе требования и необходимые показатели ее качества, совокупность которых призвана оценить, в конечном итоге, ее общую полезность, определяемую соотношением цена – качество между приносимой программой пользой и требуемыми для нее затратами. Эти главные показатели сложным образом зависят от десятков критериев качества программы, основными из которых являются следующие.

1. Затраты на разработку, производство, сопровождение и эксплуатацию программы - стоимость, трудоемкость, сроки.

2. Функциональная эффективность - обеспечиваемая программой экономия денег, труда, времени, энергии, материалов и другая польза, зависящая от функциональных возможностей программы.

3. Эффективность (по времени и памяти) - машинное время и объем памяти, необходимые для выполнения программы.

4. Удобство эксплуатации - простота понимания и использования.

5. Простота сопровождения и развития - простота внесения изменений в разработанную программу.

6. Документированность - качество и количество документации для изучения, эксплуатации, сопровождения и развития программы.

7. Открытость программной и/или аппаратной системы - создание системой за счет соблюдения международных стандартов такой среды для прикладных программ, которая обеспечивает мобильность прикладных программ, их данных и пользователей и интероперабельность прикладных программ.

8. Мобильность (программ и данных) - возможность переноса (переносимость) программ и обрабатываемых ими данных с минимальными изменениями для использования в другой программно-аппаратной среде.

9. Мобильность персонала - взаимодействие программы (системы) с пользователями в стиле, облегчающем пользователям переход для работы от одной системы к другой.

10. Интероперабельность - возможность совместной работы (совместимость) программы (системы) с другими программами, в том числе находящимися в других узлах вычислительной сети.

11. Надежность - вероятность безошибочной работы программы в течение определенного времени.

12. Корректность - правильность выполнения программой заданных функций при правильных входных данных.

Перечисленные и другие критерии оценки программ зависят друг от друга и часто противоречивы. Корректность программы, например, еще не гарантирует надежности, так как при ошибочных входных данных корректная программа может выдать бессмысленный результат, не сообщив об этом. В то же время некорректная программа может быть надежной, если она работает неправильно только при редко встречающихся комбинациях входных данных.

Хорошая документированность служит средством достижения удобства эксплуатации, сопровождения и развития, а также снижения затрат на эти цели, но повышает затраты на разработку. Ускорение работы программы, как правило, требует дополнительной памяти, и, наоборот, экономия памяти замедляет выполнение программы. При разработке приходится искать разумные компромиссы между противоречивыми требованиями.

Системы программного обеспечения являются самыми запутанными и сложными творениями человеческого разума, и их разработка продолжает оставаться в высшей степени творческим процессом, подобным проектированию других сложных систем. Суть программирования - борьба со сложностью, стремитесь к простоте!

Необходимо добиваться полной ясности каждого этапа разработки, прежде чем переходить к следующему этапу. Не надейтесь, что ЭВМ сама поймет то, что не до конца ясно разработчику! Допускается параллельное выполнение смежных этапов разработки. Избегайте перекрытия несмежных этапов разработки!

Жизненный цикл сравнительно небольшой программы, т. е. весь период ее разработки и использования, можно разделить на следующие этапы (в скобках указано примерное распределение затрат на разработку).

1. Проектирование (17%) - постановка задачи, разработка структуры данных и алгоритма программы.

2. Программирование (8%) - перевод алгоритма на язык программирования.

3. Отладка (25%) - обнаружение, поиск и устранение ошибок в программе.

4. Сопровождение (50%) - исправление недостатков и доработка программы в период ее эксплуатации.

Отсюда видно, что 75% затрат приходится на устранение ошибок в разработке программы.

Любая разработка - это итерационный процесс с неизбежными ошибками и переделками. Обнаружив ошибку, смело переделывайте программу, не бойтесь начать все с начала! Чем раньше сделана и позже обнаружена ошибка, тем труднее исправить ее. Старайтесь исключать ошибки с самого начала. Аккуратно документируйте и тщательно проверяйте каждый этап разработки!

Общим методом проверки правильности проектирования является правило "n плюс-минус один": результаты этапа n должны полностью и точно соответствовать его исходным данным, т. е. результатам предыдущего этапа n-1, и быть достаточно полными и понятными для выполнения следующего этапа n+1, для которого они служат исходными данными. Кроме того, используется статический просмотр результатов для контроля их непротиворечивости и отсутствия типичных ошибок и сквозной контроль (ручное тестирование) - динамическая прокрутка программы путем мысленного моделирования ее работы на бумаге.

Наиболее важные решения принимаются в начале разработки. Больше внимания уделяйте начальным этапам разработки!

В данном пособии, являющемся переработанным и дополненным вариантом книги [18], рассматриваются методы модульного программирования [4, 16], основанные на идее разбить разрабатываемую программу на сравнительно небольшие независимые части - (программные) модули, т. е. на основном принципе борьбы со сложностью - "разделяй и властвуй". Они составляют фундамент более сложных и современных направлений технологии программирования.

Технология модульного программирования в полном виде рассчитана на промышленный подход и программы большего объема и сложности, чем разрабатываемые в учебном процессе. В пособии она упрощена для учебных целей. Материал излагается в виде рекомендаций студентам по разработке программ в рамках курсового и дипломного проектирования. Примеры разработки программ по описываемой технологии приведены в приложении и книге [18].

Отдельные этапы технологии в данном пособии иллюстрируются на примере задачи: найти кратчайший цикл (замкнутый путь) заданного графа. При этом рассматриваются некоторые детали процесса разработки, которые отсутствуют в описании программы, решающей эту задачу (см. приложение). Приведенные примеры программ написаны на языке C [11, 22, 27, 29], но в целом рассматриваемая технология мало зависит от языка программирования. Имеются в виду процедурные языки высокого уровня, такие, как С, Pascal и т.п.

Приведенные этапы жизненного цикла программы можно рассматривать как техническую реализацию следующих этапов полного построения алгоритма [7].

1. Постановка (точная формулировка) задачи - уточнение терминологии, исходных данных и результатов, недостаточных и излишних данных, сделанных допущений, разрешимости задачи и др.

2. Построение математической модели - выбор математического аппарата для описания задачи на основе анализа аналогичных задач.

3. Разработка алгоритма.

4. Проверка (доказательство) правильности алгоритма.

5. Реализация алгоритма - перевод на язык программирования.

6. Анализ алгоритма - оценка сложности алгоритма по времени и памяти и ее экспериментальная проверка.

7. Тестирование и отладка программы.

8. Документирование программы.