Приложение 2 содержит пример выполнения учебного технического задания. Данный пример раскрывает принципы составления технического задания, но также не заменяет стандарт.
Приложение 3 дает представление о фонде эвристических приемов проектирования программ.
Приложение 4 содержит описание элементов языка программирования Object Pascal, оно необходимо для лучшего понимания гл. 8 и 9.
Приложение 5 раскрывает основные термины и определения, используемые в книге.
Глава 1
МЕТОДОЛОГИЧЕСКИЕ ОСНОВЫ ПРОЕКТИРОВАНИЯ ПРОГРАММ
1.1. ОБЩИЕ ПОЛОЖЕНИЯ ТЕОРИИ ПРОЕКТИРОВАНИЯ
Как без оформленного проекта вполне можно построить скворечник, но невозможно строительство высотного здания или комплекса космодрома со строительной индустрией, жилыми, стартовыми и производственными комплексами, так и без проекта можно реализовать лишь небольшую программу, но не автоматизированное рабочее место специалиста, а тем более автоматизированную систему управления большого предприятия.
Что же производят программисты? Программисты производят программный продукт. В терминах автоматизированных систем программисты создают программное обеспечение.
Программный продукт — программа, которую можно запускать, тестировать, исправлять и развивать. Такая программа должна быть написана в едином стиле, тщательно оттестирована до требуемого уровня надежности, сопровождена подробной документацией и подготовлена для тиражирования.
Программное изделие — программа на носителе данных, являющаяся продуктом промышленного производства. Термин утвержден Государственным стандартом.
Программное обеспечение автоматизированных систем — совокупность программ на носителях данных и программных документов, предназначенная для отладки, функционирования и проверки работоспособности автоматизированных систем.
Автоматизированная система (АС) — организационно-техническая система, обеспечивающая выработку решений на основе автоматизации информационных процессов в различных сферах деятельности (управление, проектирование, производство и т. д.) или их сочетаниях, система, состоящая из персонала и комплекса средств автоматизации его деятельности, реализующая информационную технологию выполнения установленных функций.
Необходимость в проекте вызвана сложностью задачи.
Следующий пример показывает нелинейную зависимость роста сложности задачи от ее размера. Необходимо в уме сложить числа 4 и 3. Ответ, разумеется, — 7. Необходимо в уме перемножить числа 7 и 9. Ответ, конечно, — 63. Но если не знаете таблицу умножения, то надо выполнить нестандартное преобразование в виде многократного сложения. Трудно ли оно для вас? Необходимо в уме перемножить числа 289 и 347. Если вы не феноменальный счетчик, то хватит ли в вашей голове оперативной памяти? А сможете ли вы перемножить в уме шестизначные числа? Но если декомпозировать данную задачу на вычисление ряда произведений одного из сомножителей на отдельные цифры другого сомножителя и затем найденные произведения сложить (при этом записывать на бумаге все промежуточные результаты), то с этой задачей вполне может справиться заурядный человек.
Еще пример, показывающий один из путей снижения сложности задачи за счет ее декомпозиции на обозримые части. Обычный нормальный человек со средними способностями может одновременно в своей голове удержать не более семи мыслей. В школе задачи с шестью действиями считаются задачами повышенной сложности и помечаются символом «*». В армиях разных стран, времен и народов производилось деление на десятки, сотни, тысячи. У командиров в подчинении находилось либо десять воинов, либо десять младших командиров.
Программа — очень сложный объект, содержащий до сотен тысяч и даже нескольких миллионов мыслей. Сложность программного продукта — отнюдь не случайное свойство, скорее необходимое. Его сложность определяется четырьмя основными причинами: сложностью задачи, сложностью управления процессом разработки, сложностью описания поведения отдельных подсистем, сложностью обеспечения гибкости конечного программного продукта.
В табл. 1.1 приведены пять признаков сложной системы вместе с примерами. Эти признаки инвариантны как для осязаемой системы из реального мира «музыкальный центр», так и для программной системы — текстового редактора.
Таблица 1.1.
Примеры музыкального центра и текстового редактора как сложных систем
Признаки | Музыкальный центр | Текстовый редактор |
1. Сложность часто представляется в виде иерархии. Сложная система обычно состоит из взаимозависимых подсистем, которые в свою очередь также могут быть разделены на подсистемы и т. д., вплоть до самых низких уровней абстракции | Состоит из 6 подсистем: усилителя, блока цифрового управления системой, проигрывателя компакт-дисков, кассетной деки, радиоприемника, динамиков. Каждая из подсистем может быть в свою очередь разделена на подсистемы. Усилитель разделяется на фильтры, предварительные каскады усиления и усилитель мощности. Блок цифрового управления системой разделяется на процессор, панель кнопок, панель индикации и на цифроаналоговые, аналого-цифровые преобразователи. Проигрыватель компакт-дисков — на лазер, устройство управления лазером, цифроаналоговый преобразователь и т. д. | Состоит из файлов: описания глобальных констант и переменных, библиотеки модулей поддержки дисплея, библиотеки модулей поддержки клавиатуры, библиотеки модулей поддержки главного «меню», набора модулей самого редактора. Библиотека модулей поддержки клавиатуры в свою очередь включает модуль строчного редактора, который использует такие модули файла библиотеки поддержки дисплея, как отображения строки на экране и перемещения курсора в заданную позицию, а также еще целый ряд внутренних модулей |
2. Выбор низшего уровня абстракции является в значительной мере произвольным и в большей степени определяется наблюдателем | В качестве низшего уровня абстракции можно выбрать узлы, выполняющие законченные функции обработки электронных или звуковых сигналов: усилительные каскады — усиливают сигналы, фильтры — обеспечивают исключение помех соответствующих частот и т. д. При необходимости улучшить функцию какого-либо узла необходимо рассмотреть более низкий уровень абстракции, т. е. операционные усилители, транзисторы, диоды и др. | Системные аналитики в качестве низшего уровня абстракции в программах используют модули. Кодировщики, реализующие модули, в качестве низшего уровня абстракции используют алгоритмические структуры (операторы) языка высокого уровня и структуры данных |
3. Внутриэлементные связи обычно прочнее межэлементных связей. Поэтому взаимодействия частей внутри элементов системы оказываются естественным образом отделенными от взаимодействия между самими элементами. (Различие между внутри- и межэлементными взаимодействиями обусловливает разделение системы на абстрактные автономные части, которые можно изучать по отдельности.) | Каждый узел, как правило, имеет или один (управляющий), или два входа (управляющий и сигнальный) и только один выход (обработанный сигнал). Связи между узлами обеспечиваются соединением входов и выходов различных узлов. Узел работает как «черный ящик», внутриэлементные связи которого «не видны» извне. Количество внутриэлементных связей существенно больше, чем межэлементных | Связи между модулями реализованы с помощью аргументов (в количестве от 0 до 10) функций и небольшого количества глобальных переменных. Внутримодульные связи реализованы с помощью общих для модуля переменных (обычно от 10 до нескольких десятков). Поскольку переменные доступны из любой точки модуля, то такая связь является связью типа «все со всеми» |
4. Иерархические системы обычно состоят из нескольких подсистем разного типа, реализованных в различном порядке и в разнообразных комбинациях | Каждый из электронных узлов устройства выполнен, в конечном итоге, из одних и тех же типовых элементов: полупроводниковых приборов (транзисторов и диодов), сопротивлений, конденсаторов различных номиналов и способов изготовления. Различаются порядок и комбинации использования этих элементов в разных узлах | Каждый модуль представляет собой набор одних и тех же вычислительных структур (операторов) и стандартных функций, по-разному взаимодействующих друг с другом через общие данные в каждом из модулей |
5. Работающая сложная система неизбежно оказывается результатом развития работающей простой системы. Сложная система, разработанная от начала до конца на бумаге, никогда не работает и нельзя заставить ее заработать. Обычно первоначально создают простую работающую систему, которую развивают в последующих версиях на основе новых идей, полученных при эксплуатации | Прототипы музыкального центра: радиоприемник, кассетный магнитофон, проигрыватель компакт-дисков. Музыкальный центр является комбинацией и дальнейшим развитием этих систем: улучшены подсистемы усиления и фильтрации звука, улучшены динамики, добавлен цифровой процессор для обработки звука | Сначала появились простейшие текстовые редакторы как строчные, так и экранные для набора и корректировки текстов в режиме пишущей машинки. Затем появились текстовые процессоры, форматирующие текст и осуществляющие проверку орфографии. Далее появились интегрированные системы, включающие процессоры: текстовые, графические, электронных таблиц, баз данных и деловой графики |