Книга: Технологии программирования

1.1. ОБЩИЕ ПОЛОЖЕНИЯ ТЕОРИИ ПРОЕКТИРОВАНИЯ

1.1. ОБЩИЕ ПОЛОЖЕНИЯ ТЕОРИИ ПРОЕКТИРОВАНИЯ

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

Что же производят программисты? Программисты производят программный продукт. В терминах автоматизированных систем программисты создают программное обеспечение.

Программный продукт — программа, которую можно запускать, тестировать, исправлять и развивать. Такая программа должна быть написана в едином стиле, тщательно оттестирована до требуемого уровня надежности, сопровождена подробной документацией и подготовлена для тиражирования.

Программное изделие — программа на носителе данных, являющаяся продуктом промышленного производства. Термин утвержден Государственным стандартом.

Программное обеспечение автоматизированных систем — совокупность программ на носителях данных и программных документов, предназначенная для отладки, функционирования и проверки работоспособности автоматизированных систем.

Автоматизированная система (АС) — организационно-техническая система, обеспечивающая выработку решений на основе автоматизации информационных процессов в различных сферах деятельности (управление, проектирование, производство и т. д.) или их сочетаниях, система, состоящая из персонала и комплекса средств автоматизации его деятельности, реализующая информационную технологию выполнения установленных функций.

Необходимость в проекте вызвана сложностью задачи.

Следующий пример показывает нелинейную зависимость роста сложности задачи от ее размера. Необходимо в уме сложить числа 4 и 3. Ответ, разумеется, — 7. Необходимо в уме перемножить числа 7 и 9. Ответ, конечно, — 63. Но если не знаете таблицу умножения, то надо выполнить нестандартное преобразование в виде многократного сложения. Трудно ли оно для вас? Необходимо в уме перемножить числа 289 и 347. Если вы не феноменальный счетчик, то хватит ли в вашей голове оперативной памяти? А сможете ли вы перемножить в уме шестизначные числа? Но если декомпозировать данную задачу на вычисление ряда произведений одного из сомножителей на отдельные цифры другого сомножителя и затем найденные произведения сложить (при этом записывать на бумаге все промежуточные результаты), то с этой задачей вполне может справиться заурядный человек.

Еще пример, показывающий один из путей снижения сложности задачи за счет ее декомпозиции на обозримые части. Обычный нормальный человек со средними способностями может одновременно в своей голове удержать не более семи мыслей. В школе задачи с шестью действиями считаются задачами повышенной сложности и помечаются символом «*». В армиях разных стран, времен и народов производилось деление на десятки, сотни, тысячи. У командиров в подчинении находилось либо десять воинов, либо десять младших командиров.

Программа — очень сложный объект, содержащий до сотен тысяч и даже нескольких миллионов мыслей. Сложность программного продукта — отнюдь не случайное свойство, скорее необходимое. Его сложность определяется четырьмя основными причинами: сложностью задачи, сложностью управления процессом разработки, сложностью описания поведения отдельных подсистем, сложностью обеспечения гибкости конечного программного продукта.

В табл. 1.1 приведены пять признаков сложной системы вместе с примерами. Эти признаки инвариантны как для осязаемой системы из реального мира «музыкальный центр», так и для программной системы — текстового редактора.

Таблица 1.1.

Примеры музыкального центра и текстового редактора как сложных систем

Признаки Музыкальный центр Текстовый редактор
1. Сложность часто представляется в виде иерархии. Сложная система обычно состоит из взаимозависимых подсистем, которые в свою очередь также могут быть разделены на подсистемы и т. д., вплоть до самых низких уровней абстракции Состоит из 6 подсистем: усилителя, блока цифрового управления системой, проигрывателя компакт-дисков, кассетной деки, радиоприемника, динамиков. Каждая из подсистем может быть в свою очередь разделена на подсистемы. Усилитель разделяется на фильтры, предварительные каскады усиления и усилитель мощности. Блок цифрового управления системой разделяется на процессор, панель кнопок, панель индикации и на цифроаналоговые, аналого-цифровые преобразователи. Проигрыватель компакт-дисков — на лазер, устройство управления лазером, цифроаналоговый преобразователь и т. д. Состоит из файлов: описания глобальных констант и переменных, библиотеки модулей поддержки дисплея, библиотеки модулей поддержки клавиатуры, библиотеки модулей поддержки главного «меню», набора модулей самого редактора. Библиотека модулей поддержки клавиатуры в свою очередь включает модуль строчного редактора, который использует такие модули файла библиотеки поддержки дисплея, как отображения строки на экране и перемещения курсора в заданную позицию, а также еще целый ряд внутренних модулей
2. Выбор низшего уровня абстракции является в значительной мере произвольным и в большей степени определяется наблюдателем В качестве низшего уровня абстракции можно выбрать узлы, выполняющие законченные функции обработки электронных или звуковых сигналов: усилительные каскады — усиливают сигналы, фильтры — обеспечивают исключение помех соответствующих частот и т. д. При необходимости улучшить функцию какого-либо узла необходимо рассмотреть более низкий уровень абстракции, т. е. операционные усилители, транзисторы, диоды и др. Системные аналитики в качестве низшего уровня абстракции в программах используют модули. Кодировщики, реализующие модули, в качестве низшего уровня абстракции используют алгоритмические структуры (операторы) языка высокого уровня и структуры данных
3. Внутриэлементные связи обычно прочнее межэлементных связей. Поэтому взаимодействия частей внутри элементов системы оказываются естественным образом отделенными от взаимодействия между самими элементами. (Различие между внутри- и межэлементными взаимодействиями обусловливает разделение системы на абстрактные автономные части, которые можно изучать по отдельности.) Каждый узел, как правило, имеет или один (управляющий), или два входа (управляющий и сигнальный) и только один выход (обработанный сигнал). Связи между узлами обеспечиваются соединением входов и выходов различных узлов. Узел работает как «черный ящик», внутриэлементные связи которого «не видны» извне. Количество внутриэлементных связей существенно больше, чем межэлементных Связи между модулями реализованы с помощью аргументов (в количестве от 0 до 10) функций и небольшого количества глобальных переменных. Внутримодульные связи реализованы с помощью общих для модуля переменных (обычно от 10 до нескольких десятков). Поскольку переменные доступны из любой точки модуля, то такая связь является связью типа «все со всеми»
4. Иерархические системы обычно состоят из нескольких подсистем разного типа, реализованных в различном порядке и в разнообразных комбинациях Каждый из электронных узлов устройства выполнен, в конечном итоге, из одних и тех же типовых элементов: полупроводниковых приборов (транзисторов и диодов), сопротивлений, конденсаторов различных номиналов и способов изготовления. Различаются порядок и комбинации использования этих элементов в разных узлах Каждый модуль представляет собой набор одних и тех же вычислительных структур (операторов) и стандартных функций, по-разному взаимодействующих друг с другом через общие данные в каждом из модулей
5. Работающая сложная система неизбежно оказывается результатом развития работающей простой системы. Сложная система, разработанная от начала до конца на бумаге, никогда не работает и нельзя заставить ее заработать. Обычно первоначально создают простую работающую систему, которую развивают в последующих версиях на основе новых идей, полученных при эксплуатации Прототипы музыкального центра: радиоприемник, кассетный магнитофон, проигрыватель компакт-дисков. Музыкальный центр является комбинацией и дальнейшим развитием этих систем: улучшены подсистемы усиления и фильтрации звука, улучшены динамики, добавлен цифровой процессор для обработки звука Сначала появились простейшие текстовые редакторы как строчные, так и экранные для набора и корректировки текстов в режиме пишущей машинки. Затем появились текстовые процессоры, форматирующие текст и осуществляющие проверку орфографии. Далее появились интегрированные системы, включающие процессоры: текстовые, графические, электронных таблиц, баз данных и деловой графики

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

Спецификация в сфере проектной деятельности — это какое-либо описание в точных терминах.

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

Проект (от лат. projectus — брошенный вперед) — совокупность проектных документов в соответствии с установленным перечнем, которая представляет результат проектирования.

Проектной ситуацией называют реальность (ситуацию), в которой ведется проектирование. Паровоз и электровоз проектировались в разных проектных ситуациях, определенных уровнем знаний человечества. Именно поэтому XIX в. стал веком паровоза.

Любая задача характеризуется необходимостью преобразования некоторой исходной ситуации в ситуацию, называемую решением. Говоря о любой задаче, всегда имеем ее информационные элементы:

— информация об условии (условие задачи) — что задано;

— информация о решении (признаки исходной ситуации) — что требуется получить;

— информация о технологии преобразования условия в решение — как решить.

Проектная задача (англ. Engineering Task) характеризуется неопределенностью априори информации: что требуется получить, что задано. Более того, способ решения задачи является объектом проектирования. И наконец, решение проектной задачи должно быть найдено в рамках ограничений внешней среды проектирования: доступных денежных средств, заранее заданных сроков, возможностями технических средств и инструментария программирования, научных знаний, программных заделов и т. д.

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

Источником, первопричиной всякой проектной деятельности является субъект — человек или группа людей, испытывающие дискомфорт в существующей ситуации.

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

Дискомфорт субъекта может быть конкретизирован в виде потребности, удовлетворение которой снимает его.

Для удовлетворения потребности нужен некоторый объект проектирования (в нашем случае программный продукт), наличие которого, его свойства и состояние удовлетворяют потребностям субъекта.

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

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

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

Методика (от греч. methodike) — упорядоченная совокупность методов практического выполнения чего-нибудь.

Методики проектирования излагаются в виде описаний проектных процедур и проектных операций.

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

Действие или формализованную совокупность действий, составляющих часть проектной процедуры, алгоритм которых остается неизменным для ряда проектных процедур, называют проектной операцией. Например, вычерчивание схемы, дифференцирование функции.

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

Алгоритм — строго однозначно определенная для исполнителя последовательность действий, приводящих к решению задач.

Современное значение слова «алгоритм» во многом аналогично таким понятиям, как рецепт, процесс, методика, способ. Согласно Д. Кнуту [17], алгоритм имеет пять важных свойств.

Конечность. Алгоритм всегда должен заканчиваться после выполнения конечного числа шагов.

Определенность. Каждый шаг алгоритма должен быть точно определен.

Наличие входных данных. Алгоритм имеет некоторое число входных данных, задающихся до начала его работы или определяющихся динамически во время его выполнения.

Наличие выходных данных. Алгоритм имеет одно или несколько выходных данных, имеющих определенную связь с входными данными.

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

Термин «эвроритм» науки эвристика образован от легендарного возгласа Архимеда «Эврика!», что в переводе с греческого означает «нашел, открыл». Алгоритм в процессе выполнения не изменяется бездумным исполнителем (процессором). В отличие от алгоритма эвроритм выполняется мыслящим человеком, который может усовершенствовать порядок своей работы в процессе ее выполнения. Эвроритм может включать алгоритмы. Например, инструкция пользования программой — это эвроритм, особенно если одни и те же действия можно выполнить разными способами (через пункт меню или нажатием кнопки).

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

Инженерия программирования (англ. software engineering, в терминах автоматизированных систем — разработка программного обеспечения) — инженерное дело, творческая техническая деятельность. Инженерия опирается на специфические методы и методики, в том числе эвристические. Инженерия [20] изучает различные методы и инструментальные средства с точки зрения определенных целей, т. е. имеет очевидную практическую направленность. Основная идея инженерии программирования в том, что разработка программного обеспечения является формальным процессом, который можно изучать, выражать в методиках и совершенствовать.

Инженерия программирования имеет четкую определенную дату рождения — 1968 г. Причина ее появления — реакция на так называемый «кризис программного обеспечения», вызванный достижением непреодолимого уровня сложности. Характерные вопросы и задачи инженерии программирования, изложенные Фредериком Бруксом, актуальны и по сегодняшний день.

Как проектировать и строить программы, образующие системы?

Как проектировать и строить программы и системы, являющиеся надежным, отлаженным, документированным и сопровождаемым продуктом?

Как осуществлять интеллектуальный контроль в условиях большой сложности?

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

Важными при разработке процессов проектирования являются такие понятия, как стратегия и тактика.

Стратегия (от греч. stratos — войско и ago — веду) — наука, искусство генерации наиболее существенных общих долгосрочных целей и наиболее общего плана достижения преимущества, курса действий и распределения ресурсов еще до выполнения реальных действий.

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

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

Стратегия выполнения конкретного проекта описывается в программном документе — техническом задании.

Методология (от греч. methodos и logos — слово, учение о методах) — система принципов и способов организации и построения теоретической и практической деятельности, а также учение об этой системе.

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

Технология (от греч. techne — искусство, мастерство, умение и logos — слово, учение) — совокупность производственных процессов в определенной отрасли производства, а также научное описание способов производства, совокупность приемов, применяемых в каком-либо деле, мастерстве, искусстве.

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

Технология программирования как наука изучает технологические процессы и порядок их прохождения (с использованием знаний, методов и средств). Технологический процесс — последовательность направленных на создание заданного объекта действий (технологических процедур и операций), каждое из которых основано на каких-либо естественных процессах и человеческой деятельности. Знания, методы и средства могут использоваться в разных процессах и, следовательно, в технологиях.

Технология программирования — для инженера это научная и практически апробированная стратегия создания программ, содержащая описание совокупности методов и средств разработки программ, а также порядок применения этих методов и средств.

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

Инженерное дело (деятельность по созданию и использованию технологий) охватывает не только проектирование и производство, но и структуры организаций с взаимодействием людей. В терминах инженерного дела технология — инструментарий инженера, интеллектуальный либо отчужденный в виде искусственных систем.

Главное различие между технологией программирования и программной инженерией заключается в способе рассмотрения и систематизации материала. В технологии программирования акцент делается на изучении процессов разработки программ (технологических процессов) в порядке их прохождения — методы и инструментальные средства разработки программ используются в этих процессах (их применение и образуют технологические процессы). В программной инженерии изучаются прежде всего методы и инструментальные средства разработки программ с точки зрения достижения определенных целей — они могут использоваться в разных технологических процессах (и в разных технологиях программирования). Как эти методы и средства образуют технологические процессы — вопрос второстепенный.

Не следует также путать технологию программирования с методологией программирования, хотя в обоих случаях изучаются методы. В технологии программирования методы рассматриваются «сверху» — с точки зрения организации технологических процессов, в методологии — «снизу» — с точки зрения основ их построения.

Перед нами стоит вопрос, ранее уже упоминавшийся: «Как определить, достигнута ли цель, привела ли деятельность к желаемому результату: тот ли объект создан, который нам нужен, обладает ли нужными свойствами?» Для этого используются показатели качества (иногда их называют критериями) — величины, свойства, понятия, характеризующие систему с точки зрения субъекта, позволяющие оценить степень удовлетворения его потребностей. На начальном этапе проектирования анализ потребностей позволяет определить вид объекта; его функции (что объект делает при функционировании), свойства и состояние, при которых удовлетворяются потребности, а также уровень качества объекта.

При исследовании систем решаются задачи анализа и синтеза.

Анализ (от греч. analysis — разложение, расчленение) — прием умственной деятельности, связанный с мысленным (или реальным) расчленением на части предмета, явления или процесса.

Синтез (от греч. synthesis — соединение, сочетание, составление) — метод научного исследования явлений действительности в их единстве и целостности, во взаимодействии их частей, обобщение, сведение в единое целое.

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

В теории проектирования используются следующие понятия анализа и синтеза.

Анализ — процесс определения функционирования по заданному описанию системы.

Синтез — процесс построения описания системы по заданному функционированию.

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

По своей природе программа (т. е. набор инструкций) гораздо ближе к технологии (точнее, к описанию технологического процесса преобразования входной информации в выходную информацию), чем к изделию. Это означает, что для оценки производительности труда программиста не нужно искать способ оценки количества продукции, выпускаемой им, поскольку никакая физическая продукция не производится и, следовательно, нет ее объема. При использовании стандартного термина «программное изделие» возникают методологические, правовые и чисто технические сложности. Так, например, программисту не составит никакого труда вставить в программу любое количество модулей с любым объемом незадействованных операторов. Товарные свойства программного продукта — не товарные свойства этого изделия, а товарные свойства технологии. Причем технологии это тоже объекты, традиционно проектируемые инженерами.

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

Оглавление книги


Генерация: 1.169. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз