Основной компонент ПО – программа – упорядоченная в соответствии с некоторым алгоритмом последовательность команд (инструкций) компьютера для решения задачи пользователя. Чаще всего образ программы хранится в виде исполняемого модуля (отдельного файла или группы файлов).
Пользователь – лицо, заинтересованное в решении некоторой задачи средствами вычислительной техники. По отношению к программному обеспечению компьютерные пользователи делятся на следующие группы [3]:
Задача (problem, task) – проблема, подлежащая решению в интересах пользователя.
Термин "задача" в программировании означает единицу работы вычислительной системы, требующую выделения вычислительных ресурсов (процессорного времени, оперативной и внешней памяти, файлов и т.п.).
Приложение (application) – программная реализация решения задачи на компьютере. Приложение может состоять из одной или нескольких взаимосвязанных и взаимодействующих программ.
Принято (весьма условно) делить программы на небольшие (простые),
Программа считается небольшой как по размерам, так и по другим признакам, если она удовлетворяет следующим признакам:
Сложные, или большие, программы, называемые также программными системами, программными комплексами, программными продуктами, отличаются от небольших не столько по размерам (хотя обычно они значительно больше), сколько наличием дополнительных факторов. Эти факторы связаны с их востребованностью и готовностью пользователей платить деньги, как за приобретение самой программы, так и за ее сопровождение и даже за специальное обучение работе с ней.
Обычно сложная программа обладает следующими свойствами [10]:
Примером большой программы может служить стандартная библиотека классов Java или C#, соответствующих систем программирования.
Строго говоря, ни одно из указанных свойств не является обязательным для того, чтобы программу можно было считать большой, но при наличии двух-трех из них достаточно уверенно можно утверждать, что она большая. На основании некоторых из перечисленных свойств можно сделать вывод, что большая программа или программная система чаще всего представляет собой не просто код или исполняемый файл, а включает еще и набор проектной и пользовательской документации.
Процесс создания программ можно представить как последовательность следующих действий:
Постановка задачи (
Алгоритм – точный набор инструкций, описывающих порядок действий исполнителя (компьютера), от допустимых исходных данных для достижения результата решения задачи за конечное время. В старой трактовке вместо слова "порядок" использовалось слово "последовательность", но по мере развития параллельности в работе компьютеров слово "последовательность" стали заменять более общим словом "порядок". Это связано с тем, что работа каких-то инструкций алгоритма может быть зависима от других инструкций или результатов их работы. Таким образом, некоторые инструкции должны выполняться строго после завершения работы инструкций, от которых они зависят. Независимые инструкции или инструкции, ставшими независимыми из-за завершения работы инструкций, от которых они зависят, могут выполняться в произвольном порядке, параллельно или одновременно, если это позволяют используемые процессор и операционная система.
Программирование (programming) – теоретическая и практическая деятельность, связанная с созданием программ.
Разработка программных систем (ПС), т.е. программирование, имеет ряд специфических особенностей. Прежде всего, следует отметить некоторое противостояние: неформальный характер требований к ПС (постановки задачи) и понятия ошибки в нем, но формализованный основной объект разработки – программы ПС. Тем самым разработка ПС содержит определенные этапы формализации, а переход от неформального к формальному существенно неформален.
Разработка ПС носит творческий характер (на каждом шаге приходится делать какой-либо выбор, принимать какое-либо решение), а не сводится к выполнению некоей последовательности регламентированных действий. Тем самым эта разработка ближе к процессу проектирования сложных устройств, но никак не к их массовому производству. Этот творческий характер разработки ПС сохраняется до самого ее конца.
Следует отметить также особенность продукта разработки. Он представляет собой некоторую совокупность текстов (т.е.
В процессе разработки программных систем используются различные технологии программирования [1, 3, 9, 11]. В соответствии с обычным значением слова "технология" под технологией программирования (programming technology) понимается совокупность производственных процессов, приводящая к созданию требуемой ПС, а также описание этой совокупности процессов. Другими словами, технология программирования понимается здесь в широком смысле как технология разработки программных средств, включая в нее все процессы, начиная с момента зарождения идеи этого средства до создания необходимой программной документации. Каждый процесс этой совокупности базируется на использовании каких-либо методов и средств, например, компьютера (в этом случае речь идет о компьютерной технологии программирования).
В литературе имеются и другие, несколько отличающиеся, определения технологии программирования. Используется в литературе и близкое к технологии программирования понятие программной инженерии, определяемой как систематический подход к разработке, эксплуатации, сопровождению и изъятию из обращения программных средств. Главное различие между технологией программирования и программной инженерией как дисциплинами для изучения заключается в способе рассмотрения и систематизации материала [9].
В технологии программирования акцент делается на изучении процессов разработки ПС (технологических процессов) и порядке их прохождения: методы и инструментальные средства разработки ПС задействуются в этих процессах, их применение и образует технологические процессы. В программной инженерии изучаются различные методы и инструментальные средства разработки ПС с точки зрения достижения определенных целей – эти методы и средства могут использоваться в разных технологических процессах (и в разных технологиях программирования).
Не следует также путать технологию программирования с методологией программирования. В технологии программирования методы рассматриваются "сверху" – с точки зрения организации технологических процессов, а в методологии программирования методы рассматриваются "снизу" – с точки зрения основ их построения. Например, в работе [24] методология программирования определяется как совокупность механизмов, применяемых в процессе разработки программного обеспечения и объединенных одним общим философским подходом.
В историческом аспекте в развитии технологии программирования можно выделить несколько этапов [3].
1. Первый этап: "стихийное" программирование – отсутствие сформулированной технологии, когда программирование было, по сути, искусством. Этап охватывает период от появления первых ЭВМ до середины 60-х годов 20-го века. Развитие программирования шло по пути замены машинных языков ассемблерами, а затем алгоритмическими языками (Fortran, Algol) и повторного использования подпрограмм, что повысило производительность труда программиста.
Стихийно использовалась разработка "снизу вверх" – подход, при котором вначале проектировали и реализовали сравнительно простые подпрограммы, из которых потом пытались построить сложную программу [6]. В начале 60-х годов 20-го века разразился кризис программирования [1, 3]. Он выражался в том, что фирмы превышали все сроки завершения программных проектов и их стоимость. В результате многие проекты так и не были завершены.
2. Второй этап – структурный подход к программированию. Этот подход сложился в 60-70-е годы 20-го века и представлял собой совокупность рекомендуемых технологических приемов, охватывающих все этапы разработки программного обеспечения. В основе структурного подхода лежит декомпозиция сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. В отличие от используемого ранее процедурного подхода к декомпозиции, структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры.
Проектирование осуществлялось "сверху вниз" и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм [3, 18]. Вводились ограничения на конструкции алгоритмов, рекомендовались формальные модели их описания, а также специальный метод проектирования алгоритмов – метод пошаговой детализации. Поддержка принципов структурного программирования была заложена в основу процедурных языков программирования (PL/1, Algol-68, Pascal, C).
Появилась и начала развиваться технология модульного программирования, которая предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули. Практика показала, что структурный подход в сочетании с модульным программированием позволяет получить достаточно надежные программы, размер которых не превышает 100000 операторов [3]. Узким местом модульного программирования стали межмодульные интерфейсы, ошибки в которых трудно обнаружить по причине раздельной компиляции модулей (ошибки выявляются только при выполнении программы).
3. Третий этап – объектный подход к программированию. Сложился с середины 80-х до конца 90-х годов 20-го века. Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов осуществляется путем передачи сообщений.
Основное достоинство объектно-ориентированного программирования по сравнению с модульным программированием – более естественная декомпозиция программного обеспечения, которая существенно облегчает его разработку. Кроме того, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции. Это позволяет существенно увеличить показатель повторного использования кодов и создавать библиотеки классов для различных применений.
Развитие объектного подхода в технологии программирования привело к созданию сред визуального программирования. Появились языки визуального объектно-ориентированного программирования, такие как Delphi, C++ Builder, Visual C++, C# и т. д. Однако технология ООП имеет и недостатки. Главный из них – зависимость модулей программного обеспечения от адресов экспортируемых полей и методов, структур и форматов данных. Эта зависимость объективна, так как модули должны взаимодействовать между собой, обращаясь к ресурсам друг друга.
4. Четвертый этап – компонентный подход и
Основы компонентного подхода были разработаны компанией Microsoft, начиная с технологии OLE (Object Linking and Embedding – связывание и внедрение объектов), которая применялась в ранних версиях Windows для создания составных документов. Ее развитием стало появление COM-технологии (Component Object Model – компонентная модель объектов), а затем ее распределенной версии – DCOM, на основе которых были разработаны
Среди них следуют отметить OLE-automation – технологию создания программируемых приложений, обеспечивающую доступ к внутренним службам этих приложений. На основе OLE-automation создана технология ActiveX, предназначенная для создания программного обеспечения, как сосредоточенного на одном компьютере, так и распределенного. Безопасность и стабильная работа распределенных приложений обеспечивается еще двумя технологиями, заложенными в COM. Это MDS (
Компонентный подход лежит также в основе технологии CORBA (Common Object Request Bracer Architecture – общая архитектура с посредником обработки запросов объектов). Эта технология, которая реализует подход, аналогичный COM, разработана группой компаний
Важнейшая особенность современного этапа технологии программирования – широкое использование компьютерных технологий создания и сопровождения программных систем на всех этапах их жизненного цикла. Эти технологии получили название CASE-технологий (ComputerAided Software/
Зная, какие программные технологии оказали самое сильное влияние за последние 25 лет, можно оценить их по количеству опубликованных научных статей или выяснить, например, сколько времени продолжался поднятый вокруг них ажиотаж. С другой стороны, с точки зрения пользователя, можно судить о них, оценивая, чего удалось добиться по сравнению с тем, что предварительно было обещано. Так в чем же уникальность последних 25 лет [25]?
Во-первых, программное обеспечение перестало быть прерогативой нескольких компаний и стало частью повседневной жизни практически каждого жителя нашей планеты: ПК, Internet и мобильные телефоны – свидетельства этой грандиозной эволюции. На рис.1.1 показаны программные технологии и периоды, когда они достигли важнейших этапов своего развития. Эта таблица построена исходя из структуры, предложенной Сэмом Редвайном и Вильямом Риддлом [25]. Для простоты показаны только три этапа развития: основы – когда проведены базовые исследования и созданы краеугольные концепции, ограниченное использование – когда эти концепции были взяты на вооружение некоторыми компаниями и пользователями, широкое использование – когда технология стала применяться примерно третьей частью целевого рынка.
(рис 1.1) Этапы развития информационных технологий (часть 1)
(рис 1.1) Этапы развития информационных технологий (часть 2)
Журналы и интернет-ресурсы за последние 25 лет кардинально изменились. До 1980 года для практиков основным источником сведений о программных технологиях был Datamation, сейчас существует несколько таких источников, например, IEEE Software, а также онлайновые ресурсы вроде Slashdot, которые тоже дают представление о последних шагах в эволюции технологий. В [25] собран материал из множества отдельных источников данных, которые найдены в различных обзорах и wiki в программном мире. Для объективности К. Эберт обратился к своим коллегам из советов IEEE Software и поинтересовался их представлением о технологиях, появившихся за последние 25 лет. На самом деле, точно определить время перехода на новый этап просто невозможно. Это относится, например, к объектноориентированной разработке, которая активно используется с 1990-х годов, но до сих пор не нашла своего применения в некоторых отраслях.
На рис.1.1 показаны три основные группы программных технологий. Базовые технологии по мере своего развития влияют на массовые тенденции и дисциплины, и они применяются во всех областях и направлениях программной разработки. Большинство из известных сейчас таких технологий существуют последние 25 лет. Технологические концепции и методологии объединяют базовые методики, которые используются во многих различных отраслях и продуктах. Консолидированные технологии опираются на концепции и предоставляют готовые технические решения. В тех случаях, когда технологии принадлежат к двум таким группам, они отнесены к более общей группе.
Что имеют в виду, когда говорят, что программная технология "оказывает влияние"? Задавая этот вопрос разным людям, можно получить множество ответов, отражающих точку зрения конкретного собеседника. Профессор будет оценивать репутацию и исследовательские гранты и то, как технология поможет добиться этих целей. Ученый сформулирует свой ответ, учитывая инновационный потенциал. Менеджеров производства в первую очередь интересуют рентабельность, воплощение и инновационные продукты. Программный инженер будет иметь в виду полезность и эффективность при решении той проблемы, которой он занимается.
Типичный потребитель, скорее всего, будет судить о технологии по тому, насколько ее можно использовать в повседневной жизни и как она помогает выполнять работу; а дети беспокоятся, как бы не отстать от ровесников. Эти две последние потребительские группы – повседневные пользователи программного обеспечения – не только численно превосходят другие, но они также совсем иначе судят о программных технологиях и продуктах. Они обращают внимание на то, насколько незаметным, удобным в использовании и встроенным является программное обеспечение. Другими словами, насколько незаметно, но эффективно оно помогает решить значимую для них задачу.
На рис.1.1 можно заметить ряд тенденций, характерных для эволюции программного обеспечения за последние годы:
Каждая из этих тенденций оказывает серьезное влияние на инженерные продукты и на формирование программной отрасли. Microsoft с Windows или Sun с Java – пример того, как отдельная компания определяет развитие технологии, но технологии от этих производителей добились успеха благодаря тому, что они создавались и широко распространялись в отраслях. Невозможно даже представить себе Windows без Intel и всей экосистемы поставщиков и провайдеров сервисов. Точно так же банки создали банкоматы и разработали множество связанных с ними программных технологий, таких как распределенная и защищенная обработка транзакций. Компании розничной торговли стимулировали разработку кассовых аппаратов и необходимого программного обеспечения для поддержки цепочки поставки, в том числе штрих-коды и средства радиочастотной идентификации (
Некоторые технологии прошли очень долгий период развития либо никогда не были полностью разработаны. График их перехода к широкому использованию напоминает синусоиду, что свойственно инновациям, которые переходят от этапа начальных исследований и опытных эксплуатаций к широкому отраслевому применению, а затем все повторяется снова [25]. Это объясняет, почему успешные компании практически в одночасье могут потерпеть крах – просто потому, что они своевременно не предложили определенную технологию. Программные менеджеры также часто склонны к стабилизации, а не к росту, – их интересует эффективность, и они недооценивают экспериментирование и инновации.
Программные технологии полезны, если они широко используются. Однако любая конкретная технология в одних отраслях начинает завоевывать популярность быстрее, чем в других. Хороший тому пример – долгая и трудная дорога к пользователям, которую прошли полезные пакеты инструментов для генерации кода и инженерии программного обеспечения. Когда эти пакеты появились вместе с технологией, они еще не были готовы для повсеместного применения, а позже не был готов рынок. Такой же оказалась и судьба экспертных систем и систем искусственного интеллекта. Сейчас они применяются почти везде, поскольку в отрасли осознали, что экспертная система не является автономной технологией, а должна быть интегрирована в другие продукты. На рис.1.2 показан этот эффект на примере обеспечения безопасности информации.
(рис 1.2) Этапы обеспечения информационной безопасности
Безопасность впервые была признана ключевой технологией в ИТинфраструктурах в конце 1980-х годов, когда вирус Jerusalem и червь Morris, по существу, парализовали Internet-трафик [22]. Инциденты продолжались в 1990-х годах, поскольку технология применялась только как особая мера и без тщательного архитектурного анализа. Сейчас, по прошествии двадцати лет, вместе с новыми ИТ-продуктами наконец стали реализовать базовые принципы обеспечения безопасности. То же самое повторяется в отрасли телекоммуникаций – как показывают атаки в сфере IP-телефонии, здесь опять пока лишь создаются заплатки на особый случай, но без реального контроля. Промышленная автоматизация и другие предметные области еще больше отстают с внедрением инженерии обеспечения безопасности, как это продемонстрировал червь Slammer.
Ориентированность на конкретную предметную область заменила универсальность 1990-х годов. Первые CASEи распределенные компонентные модели увязли в попытках решить сразу слишком большое количество проблем. Когда в отрасли осознали, что различные предметные области имеют свои специфические потребности и скорости внедрения, то оказалось, что достаточно лишь оптимизировать технологию, предложив ее конкретному рынку. Инструменты моделирования сразу же стали пользоваться популярностью после того, как были адаптированы к потребностям конкретных предметных областей, таких как встроенные контроллеры или телекоммуникационные протоколы.
Программные процессы, как для инженерии, так и для управления, стимулировали эволюцию технологий с 1980-х годов. Сложность программных систем растет быстрее, чем люди в состоянии к ней адаптироваться. Эти трудности были уже в 1960-х годах, но тогда ситуация начала терять свою остроту после того, как ведущие отрасли перенесли свое внимание на процесс инженерии программного обеспечения. Как следствие, разработка программного обеспечения за последние 25 лет кардинально изменилась, превратившись из индивидуального творчества в дисциплину программной инженерии.
Сейчас трудно поверить, что 25 лет назад большая часть программного обеспечения и его разработчики и пользователи действовали изолированно. Программная интеграция лучше всего стала видна с появлением Интернета и его огромными темпами роста, благодаря развитию средств взаимодействия. Компонентные платформы и открытые стандарты еще больше усиливают эту тенденцию. Успешное внедрение и интеграция отнюдь не тривиальны – чтобы предложить что-то полезное инженерам, новые технологии, процессы и средства инженерии нуждаются в аппарате глубокого управления изменениями.
Рассматривая, оценивая и анализируя программные системы и отдельные программы, останавливаются на показателях качества программ и их основных характеристиках. Качество ПО – это совокупность свойств, определяющих полезность изделия (программы) для пользователей в соответствии с функциональным назначением и предъявленными требованиями. Характеристика качества программы – понятие, которое отражает отдельные факторы, влияющие на качество программ и поддающиеся измерению [23].
Критерий качества – численный показатель, характеризующий степень, в которой программе присуще оцениваемое свойство. Критерии качества могут включать множество различных характеристик: экономичность, документированность, гибкость, модульность, надежность, обоснованность, тестируемость, ясность, точность, модифицируемость, эффективность, легкость сопровождения и т.д.
Для измерения характеристик и критериев качества используют метрики. Метрика качества программ – это система измерений качества программ. Эти измерения могут проводиться на уровне критериев качества программ или на уровне отдельных характеристик качества. В первом случае система измерений позволяет непосредственно сравнивать программы по качеству, при этом сами измерения не могут быть проведены без субъективных оценок
Каждая ПС должна выполнять определенные функции, т.е. делать то, что задумано. Хорошая ПС должно обладать еще целым рядом свойств, позволяющим успешно ее использовать в течение длительного периода, т.е. обладать определенным качеством. Качество (quality) ПС – это совокупность его характеристик, которые влияют на его способность удовлетворять заданные потребности пользователей [23]. Это не означает, что разные ПС должны обладать одной и той же совокупностью таких свойств в их наивысшей степени. Повышение качества ПС по одному из таких свойств часто может быть достигнуто лишь ценой изменения стоимости, сроков завершения разработки и снижения качества этой ПС по другим его свойствам. Качество ПС является удовлетворительным, когда она обладает указанными свойствами в такой степени, чтобы гарантировать успешное ее применение.
Совокупность свойств ПС, которая образует удовлетворительное для пользователя качество ПС, зависит от условий и характера эксплуатации этой ПС, т.е. от позиции, с которой должно рассматриваться качество этой ПС. Поэтому при описании качества ПС, прежде всего, должны быть фиксированы критерии отбора требуемых свойств ПС. В настоящее время критериями качества ПС (criteria of
Во многих случаях функциональность и надежность являются обязательными критериями качества ПС, причем обеспечение надежности красной нитью проходит по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС.
К основным характеристикам программ и программных систем относится сложность программной системы. При оценке сложности программ, как правило, выделяют три основные группы метрик [23]:
Оценки первой группы наиболее просты и, очевидно, поэтому получили широкое распространение. Традиционной характеристикой размера программ является количество строк исходного текста. Под строкой понимается любой оператор программы, поскольку именно оператор, а не отдельно взятая строка является тем интеллектуальным "квантом" программы, опираясь на который можно строить метрики сложности ее создания.
Непосредственное измерение размера программы, несмотря на свою простоту, дает хорошие результаты. Конечно, оценка размера программы недостаточна для принятия решения о ее сложности, но вполне применима для классификации программ, существенно различающихся объемами. При уменьшении различий в объеме программ на первый план выдвигаются оценки других факторов, оказывающих влияние на сложность. Таким образом, оценка размера программы есть оценка по номинальной шкале, на основе которой определяются только категории программ без уточнения оценки для каждой категории.
К группе оценок размера программ можно отнести также и метрику Холстеда. Основу метрики Холстеда составляют четыре измеряемых характеристики программы:
$$n1$$ – число уникальных операторов программы, включая символыразделители, имена процедур и знаки операций (словарь операторов);
$$n2$$ – число уникальных операндов программы (словарь операндов); N1 – общее число операторов в программе;
$$N2$$ – общее число операндов в программе.
Опираясь на эти характеристики, получаемые непосредственно при анализе исходных текстов программ, М. Холстед вводит следующие оценки:
словарь программы $$n=n1+n2$$,
длину программы $$N=N1+N2,$$
объем программы $$V=N*log2(n) (бит).$$
Под битом подразумевается логическая единица информации – символ, оператор, операнд.
Далее М. Холстед вводит $$n*$$ – теоретический словарь программы, т.е. словарный запас, необходимый для написания программы, с учетом того, что необходимая функция уже реализована в данном языке и, следовательно, программа сводится к вызову этой функции. Используя $$n*$$, Холстед вводит оценку $$V*$$:
$$V* = n* * log2 n*,$$
с помощью которой описывается потенциальный объем программы, который соответствует максимально компактному тексту программы, реализующей данный алгоритм.
Вторая наиболее представительная группа оценок сложности программ – метрики сложности потока управления программ. Как правило, с помощью этих оценок оперируют либо плотностью управляющих переходов внутри программ, либо взаимосвязями этих переходов. И в том, и в другом случае стало традиционным представление программ в виде управляющего ориентированного графа $$G = (V,E)$$, где $$V$$ – вершины, соответствующие операторам, а $$E$$ – дуги, соответствующие переходам.
Впервые графическое представление программ было предложено Маккейбом. Основной метрикой сложности он предлагает считать цикломатическую сложность графа программы, или, как ее еще называют, цикломатическое число Маккейба, характеризующее трудоемкость тестирования программы.
Для вычисления цикломатического числа Маккейба $$Z(G)$$ применяется формула
$$Z(G) = e – v + 2p,$$
где $$e$$ – число дуг ориентированного графа $$G$$;
$$v$$ – число вершин;
$$p$$ – число компонентов связности графа.
Число компонентов связности графа можно рассматривать как количество дуг, которые необходимо добавить для преобразования графа в сильно связный. Cильно связным называется граф, любые две вершины которого взаимно достижимы. Для графов корректных программ, т. е. графов, не имеющих недостижимых от точки входа участков и "висячих" точек входа и выхода, сильно связный граф, как правило, получается путем замыкания дугой вершины, обозначающей конец программы, на вершину, обозначающую точку входа в эту программу.
Одной из наиболее простых, но, как показывает практика, достаточно эффективных оценок сложности программ является метрика Т. Джилба, в которой логическая сложность программы определяется как насыщенность программы выражениями типа IF-THEN-ELSE. При этом вводятся две характеристики: $$CL$$ – абсолютная сложность программы, характеризующаяся количеством операторов условия; $$cl$$ – относительная сложность программы, характеризующаяся насыщенностью программы операторами условия, т. е. $$cl$$ определяется как отношение $$CL$$ к общему числу операторов.
Другая группа метрик сложности программ – метрики сложности потока данных, т. е. использования, конфигурации и размещения данных в программах. Рассмотрим метрику, связывающую сложность программ с обращениями к глобальным переменным.
Пара "модуль, глобальная переменная" обозначается как $$(p,r)$$, где $$p$$ – модуль, имеющий доступ к глобальной переменной $$r$$. В зависимости от наличия в программе реального обращения к переменной $$r$$ формируются два типа пар "модуль, глобальная переменная": фактические и возможные. Возможное обращение к $$r$$ с помощью p показывает, что область существования $$r$$ включает в себя $$p$$.
Характеристика $$Aup$$ говорит о том, сколько раз модули up действительно получали доступ к глобальным переменным, а число $$Pup$$ – сколько раз они могли бы получить доступ. Отношение числа фактических обращений к возможным определяется как $$Rup = Aup/Pup$$. Эта формула показывает приближенную вероятность ссылки произвольного модуля на произвольную глобальную переменную. Очевидно, чем выше эта вероятность, тем выше вероятность "несанкционированного" изменения какой-либо переменной, что может существенно осложнить работы, связанные с модификацией программы.
Кроме метрик сложности программ, используются метрики стилистики и понятности программ. Наиболее простой метрикой стилистики и понятности программ является оценка уровня комментированности программы $$F$$:
$$F = Nком / Nстр,$$
где$$ Nком$$ – количество комментариев в программе; $$Nстр$$ – количество строк или операторов исходного текста.
Таким образом, метрика $$F$$ отражает насыщенность программы комментариями. Исходя из практического опыта, принято считать, что $$F >=0.1$$, т. е. на каждые десять строк программы должен приходиться минимум один комментарий. Как показывают исследования, комментарии распределяются по тексту программы неравномерно: в начале программы их избыток, а в середине или в конце – недостаток. Причина в том, что в начале программы, как правило, расположены операторы описания идентификаторов, требующие более "плотного" комментирования. Кроме того, в начале программы также расположены "шапки", содержащие общие сведения об исполнителе, характере, функциональном назначении программы и т. п. Такая насыщенность компенсирует недостаток комментариев в теле программы, и поэтому формула (4) недостаточно точно отражает комментированность функциональной части текста программы.
К другим характеристикам программ следует отнести:
Все программы по характеру использования и категориям пользователей можно разделить на два класса – утилитарные программы и программные продукты. Первые предназначены для удовлетворения нужд их разработчиков (программы для себя), но не для широкого распространения. Вторые (программные продукты) используются для удовлетворения потребностей пользователей, широкого распространения и продажи.
Существует большое количество различных компаний, занимающиеся разработкой проприетарного программного обеспечения (proprietary software). Этим термином обозначают программное обеспечение, которое имеет собственника, осуществляющего контроль над этим программным обеспечением и определяющего собственные лицензионные соглашения по использованию программного продукта. Наиболее типичными ограничениями проприетарного ПО являются:
В настоящее время существуют и другие варианты легального распространения программных продуктов, которые появились с развитием Интернета:
Существуют и другие, можно сказать, экзотические варианты распространения программ. Например:
Ряд производителей использует OEM-программы (Original Equipment Manu-facturer), т.е. встроенные программы, устанавливаемые на компьютеры или поставляемые вместе с компьютером.
Программный продукт должен быть соответствующим образом подготовлен к эксплуатации (отлажен), иметь необходимую техническую документацию, предоставлять сервис и гарантию надежной работы программы, иметь товарный знак изготовителя, а также код государственной регистрации.
Основной компонент ПО – программа – упорядоченная в соответствии с некоторым алгоритмом последовательность команд (инструкций) компьютера для решения задачи пользователя. Чаще всего образ программы хранится в виде исполняемого модуля (отдельного файла или группы файлов).
Пользователь – лицо, заинтересованное в решении некоторой задачи средствами вычислительной техники. По отношению к программному обеспечению компьютерные пользователи делятся на следующие группы [3]:
Задача (problem, task) – проблема, подлежащая решению в интересах пользователя.
Термин "задача" в программировании означает единицу работы вычислительной системы, требующую выделения вычислительных ресурсов (процессорного времени, оперативной и внешней памяти, файлов и т.п.).
Приложение (application) – программная реализация решения задачи на компьютере. Приложение может состоять из одной или нескольких взаимосвязанных и взаимодействующих программ.
Принято (весьма условно) делить программы на небольшие (простые),
Программа считается небольшой как по размерам, так и по другим признакам, если она удовлетворяет следующим признакам:
Сложные, или большие, программы, называемые также программными системами, программными комплексами, программными продуктами, отличаются от небольших не столько по размерам (хотя обычно они значительно больше), сколько наличием дополнительных факторов. Эти факторы связаны с их востребованностью и готовностью пользователей платить деньги, как за приобретение самой программы, так и за ее сопровождение и даже за специальное обучение работе с ней.
Обычно сложная программа обладает следующими свойствами [10]:
Примером большой программы может служить стандартная библиотека классов Java или C#, соответствующих систем программирования.
Строго говоря, ни одно из указанных свойств не является обязательным для того, чтобы программу можно было считать большой, но при наличии двух-трех из них достаточно уверенно можно утверждать, что она большая. На основании некоторых из перечисленных свойств можно сделать вывод, что большая программа или программная система чаще всего представляет собой не просто код или исполняемый файл, а включает еще и набор проектной и пользовательской документации.
Процесс создания программ можно представить как последовательность следующих действий:
Постановка задачи (
Алгоритм – точный набор инструкций, описывающих порядок действий исполнителя (компьютера), от допустимых исходных данных для достижения результата решения задачи за конечное время. В старой трактовке вместо слова "порядок" использовалось слово "последовательность", но по мере развития параллельности в работе компьютеров слово "последовательность" стали заменять более общим словом "порядок". Это связано с тем, что работа каких-то инструкций алгоритма может быть зависима от других инструкций или результатов их работы. Таким образом, некоторые инструкции должны выполняться строго после завершения работы инструкций, от которых они зависят. Независимые инструкции или инструкции, ставшими независимыми из-за завершения работы инструкций, от которых они зависят, могут выполняться в произвольном порядке, параллельно или одновременно, если это позволяют используемые процессор и операционная система.
Программирование (programming) – теоретическая и практическая деятельность, связанная с созданием программ.
Разработка программных систем (ПС), т.е. программирование, имеет ряд специфических особенностей. Прежде всего, следует отметить некоторое противостояние: неформальный характер требований к ПС (постановки задачи) и понятия ошибки в нем, но формализованный основной объект разработки – программы ПС. Тем самым разработка ПС содержит определенные этапы формализации, а переход от неформального к формальному существенно неформален.
Разработка ПС носит творческий характер (на каждом шаге приходится делать какой-либо выбор, принимать какое-либо решение), а не сводится к выполнению некоей последовательности регламентированных действий. Тем самым эта разработка ближе к процессу проектирования сложных устройств, но никак не к их массовому производству. Этот творческий характер разработки ПС сохраняется до самого ее конца.
Следует отметить также особенность продукта разработки. Он представляет собой некоторую совокупность текстов (т.е.
В процессе разработки программных систем используются различные технологии программирования [1, 3, 9, 11]. В соответствии с обычным значением слова "технология" под технологией программирования (programming technology) понимается совокупность производственных процессов, приводящая к созданию требуемой ПС, а также описание этой совокупности процессов. Другими словами, технология программирования понимается здесь в широком смысле как технология разработки программных средств, включая в нее все процессы, начиная с момента зарождения идеи этого средства до создания необходимой программной документации. Каждый процесс этой совокупности базируется на использовании каких-либо методов и средств, например, компьютера (в этом случае речь идет о компьютерной технологии программирования).
В литературе имеются и другие, несколько отличающиеся, определения технологии программирования. Используется в литературе и близкое к технологии программирования понятие программной инженерии, определяемой как систематический подход к разработке, эксплуатации, сопровождению и изъятию из обращения программных средств. Главное различие между технологией программирования и программной инженерией как дисциплинами для изучения заключается в способе рассмотрения и систематизации материала [9].
В технологии программирования акцент делается на изучении процессов разработки ПС (технологических процессов) и порядке их прохождения: методы и инструментальные средства разработки ПС задействуются в этих процессах, их применение и образует технологические процессы. В программной инженерии изучаются различные методы и инструментальные средства разработки ПС с точки зрения достижения определенных целей – эти методы и средства могут использоваться в разных технологических процессах (и в разных технологиях программирования).
Не следует также путать технологию программирования с методологией программирования. В технологии программирования методы рассматриваются "сверху" – с точки зрения организации технологических процессов, а в методологии программирования методы рассматриваются "снизу" – с точки зрения основ их построения. Например, в работе [24] методология программирования определяется как совокупность механизмов, применяемых в процессе разработки программного обеспечения и объединенных одним общим философским подходом.
В историческом аспекте в развитии технологии программирования можно выделить несколько этапов [3].
1. Первый этап: "стихийное" программирование – отсутствие сформулированной технологии, когда программирование было, по сути, искусством. Этап охватывает период от появления первых ЭВМ до середины 60-х годов 20-го века. Развитие программирования шло по пути замены машинных языков ассемблерами, а затем алгоритмическими языками (Fortran, Algol) и повторного использования подпрограмм, что повысило производительность труда программиста.
Стихийно использовалась разработка "снизу вверх" – подход, при котором вначале проектировали и реализовали сравнительно простые подпрограммы, из которых потом пытались построить сложную программу [6]. В начале 60-х годов 20-го века разразился кризис программирования [1, 3]. Он выражался в том, что фирмы превышали все сроки завершения программных проектов и их стоимость. В результате многие проекты так и не были завершены.
2. Второй этап – структурный подход к программированию. Этот подход сложился в 60-70-е годы 20-го века и представлял собой совокупность рекомендуемых технологических приемов, охватывающих все этапы разработки программного обеспечения. В основе структурного подхода лежит декомпозиция сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. В отличие от используемого ранее процедурного подхода к декомпозиции, структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры.
Проектирование осуществлялось "сверху вниз" и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм [3, 18]. Вводились ограничения на конструкции алгоритмов, рекомендовались формальные модели их описания, а также специальный метод проектирования алгоритмов – метод пошаговой детализации. Поддержка принципов структурного программирования была заложена в основу процедурных языков программирования (PL/1, Algol-68, Pascal, C).
Появилась и начала развиваться технология модульного программирования, которая предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули. Практика показала, что структурный подход в сочетании с модульным программированием позволяет получить достаточно надежные программы, размер которых не превышает 100000 операторов [3]. Узким местом модульного программирования стали межмодульные интерфейсы, ошибки в которых трудно обнаружить по причине раздельной компиляции модулей (ошибки выявляются только при выполнении программы).
3. Третий этап – объектный подход к программированию. Сложился с середины 80-х до конца 90-х годов 20-го века. Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов осуществляется путем передачи сообщений.
Основное достоинство объектно-ориентированного программирования по сравнению с модульным программированием – более естественная декомпозиция программного обеспечения, которая существенно облегчает его разработку. Кроме того, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции. Это позволяет существенно увеличить показатель повторного использования кодов и создавать библиотеки классов для различных применений.
Развитие объектного подхода в технологии программирования привело к созданию сред визуального программирования. Появились языки визуального объектно-ориентированного программирования, такие как Delphi, C++ Builder, Visual C++, C# и т. д. Однако технология ООП имеет и недостатки. Главный из них – зависимость модулей программного обеспечения от адресов экспортируемых полей и методов, структур и форматов данных. Эта зависимость объективна, так как модули должны взаимодействовать между собой, обращаясь к ресурсам друг друга.
4. Четвертый этап – компонентный подход и
Основы компонентного подхода были разработаны компанией Microsoft, начиная с технологии OLE (Object Linking and Embedding – связывание и внедрение объектов), которая применялась в ранних версиях Windows для создания составных документов. Ее развитием стало появление COM-технологии (Component Object Model – компонентная модель объектов), а затем ее распределенной версии – DCOM, на основе которых были разработаны
Среди них следуют отметить OLE-automation – технологию создания программируемых приложений, обеспечивающую доступ к внутренним службам этих приложений. На основе OLE-automation создана технология ActiveX, предназначенная для создания программного обеспечения, как сосредоточенного на одном компьютере, так и распределенного. Безопасность и стабильная работа распределенных приложений обеспечивается еще двумя технологиями, заложенными в COM. Это MDS (
Компонентный подход лежит также в основе технологии CORBA (Common Object Request Bracer Architecture – общая архитектура с посредником обработки запросов объектов). Эта технология, которая реализует подход, аналогичный COM, разработана группой компаний
Важнейшая особенность современного этапа технологии программирования – широкое использование компьютерных технологий создания и сопровождения программных систем на всех этапах их жизненного цикла. Эти технологии получили название CASE-технологий (ComputerAided Software/
Зная, какие программные технологии оказали самое сильное влияние за последние 25 лет, можно оценить их по количеству опубликованных научных статей или выяснить, например, сколько времени продолжался поднятый вокруг них ажиотаж. С другой стороны, с точки зрения пользователя, можно судить о них, оценивая, чего удалось добиться по сравнению с тем, что предварительно было обещано. Так в чем же уникальность последних 25 лет [25]?
Во-первых, программное обеспечение перестало быть прерогативой нескольких компаний и стало частью повседневной жизни практически каждого жителя нашей планеты: ПК, Internet и мобильные телефоны – свидетельства этой грандиозной эволюции. На рис.1.1 показаны программные технологии и периоды, когда они достигли важнейших этапов своего развития. Эта таблица построена исходя из структуры, предложенной Сэмом Редвайном и Вильямом Риддлом [25]. Для простоты показаны только три этапа развития: основы – когда проведены базовые исследования и созданы краеугольные концепции, ограниченное использование – когда эти концепции были взяты на вооружение некоторыми компаниями и пользователями, широкое использование – когда технология стала применяться примерно третьей частью целевого рынка.
(рис 1.1) Этапы развития информационных технологий (часть 1)
(рис 1.1) Этапы развития информационных технологий (часть 2)
Журналы и интернет-ресурсы за последние 25 лет кардинально изменились. До 1980 года для практиков основным источником сведений о программных технологиях был Datamation, сейчас существует несколько таких источников, например, IEEE Software, а также онлайновые ресурсы вроде Slashdot, которые тоже дают представление о последних шагах в эволюции технологий. В [25] собран материал из множества отдельных источников данных, которые найдены в различных обзорах и wiki в программном мире. Для объективности К. Эберт обратился к своим коллегам из советов IEEE Software и поинтересовался их представлением о технологиях, появившихся за последние 25 лет. На самом деле, точно определить время перехода на новый этап просто невозможно. Это относится, например, к объектноориентированной разработке, которая активно используется с 1990-х годов, но до сих пор не нашла своего применения в некоторых отраслях.
На рис.1.1 показаны три основные группы программных технологий. Базовые технологии по мере своего развития влияют на массовые тенденции и дисциплины, и они применяются во всех областях и направлениях программной разработки. Большинство из известных сейчас таких технологий существуют последние 25 лет. Технологические концепции и методологии объединяют базовые методики, которые используются во многих различных отраслях и продуктах. Консолидированные технологии опираются на концепции и предоставляют готовые технические решения. В тех случаях, когда технологии принадлежат к двум таким группам, они отнесены к более общей группе.
Что имеют в виду, когда говорят, что программная технология "оказывает влияние"? Задавая этот вопрос разным людям, можно получить множество ответов, отражающих точку зрения конкретного собеседника. Профессор будет оценивать репутацию и исследовательские гранты и то, как технология поможет добиться этих целей. Ученый сформулирует свой ответ, учитывая инновационный потенциал. Менеджеров производства в первую очередь интересуют рентабельность, воплощение и инновационные продукты. Программный инженер будет иметь в виду полезность и эффективность при решении той проблемы, которой он занимается.
Типичный потребитель, скорее всего, будет судить о технологии по тому, насколько ее можно использовать в повседневной жизни и как она помогает выполнять работу; а дети беспокоятся, как бы не отстать от ровесников. Эти две последние потребительские группы – повседневные пользователи программного обеспечения – не только численно превосходят другие, но они также совсем иначе судят о программных технологиях и продуктах. Они обращают внимание на то, насколько незаметным, удобным в использовании и встроенным является программное обеспечение. Другими словами, насколько незаметно, но эффективно оно помогает решить значимую для них задачу.
На рис.1.1 можно заметить ряд тенденций, характерных для эволюции программного обеспечения за последние годы:
Каждая из этих тенденций оказывает серьезное влияние на инженерные продукты и на формирование программной отрасли. Microsoft с Windows или Sun с Java – пример того, как отдельная компания определяет развитие технологии, но технологии от этих производителей добились успеха благодаря тому, что они создавались и широко распространялись в отраслях. Невозможно даже представить себе Windows без Intel и всей экосистемы поставщиков и провайдеров сервисов. Точно так же банки создали банкоматы и разработали множество связанных с ними программных технологий, таких как распределенная и защищенная обработка транзакций. Компании розничной торговли стимулировали разработку кассовых аппаратов и необходимого программного обеспечения для поддержки цепочки поставки, в том числе штрих-коды и средства радиочастотной идентификации (
Некоторые технологии прошли очень долгий период развития либо никогда не были полностью разработаны. График их перехода к широкому использованию напоминает синусоиду, что свойственно инновациям, которые переходят от этапа начальных исследований и опытных эксплуатаций к широкому отраслевому применению, а затем все повторяется снова [25]. Это объясняет, почему успешные компании практически в одночасье могут потерпеть крах – просто потому, что они своевременно не предложили определенную технологию. Программные менеджеры также часто склонны к стабилизации, а не к росту, – их интересует эффективность, и они недооценивают экспериментирование и инновации.
Программные технологии полезны, если они широко используются. Однако любая конкретная технология в одних отраслях начинает завоевывать популярность быстрее, чем в других. Хороший тому пример – долгая и трудная дорога к пользователям, которую прошли полезные пакеты инструментов для генерации кода и инженерии программного обеспечения. Когда эти пакеты появились вместе с технологией, они еще не были готовы для повсеместного применения, а позже не был готов рынок. Такой же оказалась и судьба экспертных систем и систем искусственного интеллекта. Сейчас они применяются почти везде, поскольку в отрасли осознали, что экспертная система не является автономной технологией, а должна быть интегрирована в другие продукты. На рис.1.2 показан этот эффект на примере обеспечения безопасности информации.
(рис 1.2) Этапы обеспечения информационной безопасности
Безопасность впервые была признана ключевой технологией в ИТинфраструктурах в конце 1980-х годов, когда вирус Jerusalem и червь Morris, по существу, парализовали Internet-трафик [22]. Инциденты продолжались в 1990-х годах, поскольку технология применялась только как особая мера и без тщательного архитектурного анализа. Сейчас, по прошествии двадцати лет, вместе с новыми ИТ-продуктами наконец стали реализовать базовые принципы обеспечения безопасности. То же самое повторяется в отрасли телекоммуникаций – как показывают атаки в сфере IP-телефонии, здесь опять пока лишь создаются заплатки на особый случай, но без реального контроля. Промышленная автоматизация и другие предметные области еще больше отстают с внедрением инженерии обеспечения безопасности, как это продемонстрировал червь Slammer.
Ориентированность на конкретную предметную область заменила универсальность 1990-х годов. Первые CASEи распределенные компонентные модели увязли в попытках решить сразу слишком большое количество проблем. Когда в отрасли осознали, что различные предметные области имеют свои специфические потребности и скорости внедрения, то оказалось, что достаточно лишь оптимизировать технологию, предложив ее конкретному рынку. Инструменты моделирования сразу же стали пользоваться популярностью после того, как были адаптированы к потребностям конкретных предметных областей, таких как встроенные контроллеры или телекоммуникационные протоколы.
Программные процессы, как для инженерии, так и для управления, стимулировали эволюцию технологий с 1980-х годов. Сложность программных систем растет быстрее, чем люди в состоянии к ней адаптироваться. Эти трудности были уже в 1960-х годах, но тогда ситуация начала терять свою остроту после того, как ведущие отрасли перенесли свое внимание на процесс инженерии программного обеспечения. Как следствие, разработка программного обеспечения за последние 25 лет кардинально изменилась, превратившись из индивидуального творчества в дисциплину программной инженерии.
Сейчас трудно поверить, что 25 лет назад большая часть программного обеспечения и его разработчики и пользователи действовали изолированно. Программная интеграция лучше всего стала видна с появлением Интернета и его огромными темпами роста, благодаря развитию средств взаимодействия. Компонентные платформы и открытые стандарты еще больше усиливают эту тенденцию. Успешное внедрение и интеграция отнюдь не тривиальны – чтобы предложить что-то полезное инженерам, новые технологии, процессы и средства инженерии нуждаются в аппарате глубокого управления изменениями.
Рассматривая, оценивая и анализируя программные системы и отдельные программы, останавливаются на показателях качества программ и их основных характеристиках. Качество ПО – это совокупность свойств, определяющих полезность изделия (программы) для пользователей в соответствии с функциональным назначением и предъявленными требованиями. Характеристика качества программы – понятие, которое отражает отдельные факторы, влияющие на качество программ и поддающиеся измерению [23].
Критерий качества – численный показатель, характеризующий степень, в которой программе присуще оцениваемое свойство. Критерии качества могут включать множество различных характеристик: экономичность, документированность, гибкость, модульность, надежность, обоснованность, тестируемость, ясность, точность, модифицируемость, эффективность, легкость сопровождения и т.д.
Для измерения характеристик и критериев качества используют метрики. Метрика качества программ – это система измерений качества программ. Эти измерения могут проводиться на уровне критериев качества программ или на уровне отдельных характеристик качества. В первом случае система измерений позволяет непосредственно сравнивать программы по качеству, при этом сами измерения не могут быть проведены без субъективных оценок
Каждая ПС должна выполнять определенные функции, т.е. делать то, что задумано. Хорошая ПС должно обладать еще целым рядом свойств, позволяющим успешно ее использовать в течение длительного периода, т.е. обладать определенным качеством. Качество (quality) ПС – это совокупность его характеристик, которые влияют на его способность удовлетворять заданные потребности пользователей [23]. Это не означает, что разные ПС должны обладать одной и той же совокупностью таких свойств в их наивысшей степени. Повышение качества ПС по одному из таких свойств часто может быть достигнуто лишь ценой изменения стоимости, сроков завершения разработки и снижения качества этой ПС по другим его свойствам. Качество ПС является удовлетворительным, когда она обладает указанными свойствами в такой степени, чтобы гарантировать успешное ее применение.
Совокупность свойств ПС, которая образует удовлетворительное для пользователя качество ПС, зависит от условий и характера эксплуатации этой ПС, т.е. от позиции, с которой должно рассматриваться качество этой ПС. Поэтому при описании качества ПС, прежде всего, должны быть фиксированы критерии отбора требуемых свойств ПС. В настоящее время критериями качества ПС (criteria of
Во многих случаях функциональность и надежность являются обязательными критериями качества ПС, причем обеспечение надежности красной нитью проходит по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС.
К основным характеристикам программ и программных систем относится сложность программной системы. При оценке сложности программ, как правило, выделяют три основные группы метрик [23]:
Оценки первой группы наиболее просты и, очевидно, поэтому получили широкое распространение. Традиционной характеристикой размера программ является количество строк исходного текста. Под строкой понимается любой оператор программы, поскольку именно оператор, а не отдельно взятая строка является тем интеллектуальным "квантом" программы, опираясь на который можно строить метрики сложности ее создания.
Непосредственное измерение размера программы, несмотря на свою простоту, дает хорошие результаты. Конечно, оценка размера программы недостаточна для принятия решения о ее сложности, но вполне применима для классификации программ, существенно различающихся объемами. При уменьшении различий в объеме программ на первый план выдвигаются оценки других факторов, оказывающих влияние на сложность. Таким образом, оценка размера программы есть оценка по номинальной шкале, на основе которой определяются только категории программ без уточнения оценки для каждой категории.
К группе оценок размера программ можно отнести также и метрику Холстеда. Основу метрики Холстеда составляют четыре измеряемых характеристики программы:
$$n1$$ – число уникальных операторов программы, включая символыразделители, имена процедур и знаки операций (словарь операторов);
$$n2$$ – число уникальных операндов программы (словарь операндов); N1 – общее число операторов в программе;
$$N2$$ – общее число операндов в программе.
Опираясь на эти характеристики, получаемые непосредственно при анализе исходных текстов программ, М. Холстед вводит следующие оценки:
словарь программы $$n=n1+n2$$,
длину программы $$N=N1+N2,$$
объем программы $$V=N*log2(n) (бит).$$
Под битом подразумевается логическая единица информации – символ, оператор, операнд.
Далее М. Холстед вводит $$n*$$ – теоретический словарь программы, т.е. словарный запас, необходимый для написания программы, с учетом того, что необходимая функция уже реализована в данном языке и, следовательно, программа сводится к вызову этой функции. Используя $$n*$$, Холстед вводит оценку $$V*$$:
$$V* = n* * log2 n*,$$
с помощью которой описывается потенциальный объем программы, который соответствует максимально компактному тексту программы, реализующей данный алгоритм.
Вторая наиболее представительная группа оценок сложности программ – метрики сложности потока управления программ. Как правило, с помощью этих оценок оперируют либо плотностью управляющих переходов внутри программ, либо взаимосвязями этих переходов. И в том, и в другом случае стало традиционным представление программ в виде управляющего ориентированного графа $$G = (V,E)$$, где $$V$$ – вершины, соответствующие операторам, а $$E$$ – дуги, соответствующие переходам.
Впервые графическое представление программ было предложено Маккейбом. Основной метрикой сложности он предлагает считать цикломатическую сложность графа программы, или, как ее еще называют, цикломатическое число Маккейба, характеризующее трудоемкость тестирования программы.
Для вычисления цикломатического числа Маккейба $$Z(G)$$ применяется формула
$$Z(G) = e – v + 2p,$$
где $$e$$ – число дуг ориентированного графа $$G$$;
$$v$$ – число вершин;
$$p$$ – число компонентов связности графа.
Число компонентов связности графа можно рассматривать как количество дуг, которые необходимо добавить для преобразования графа в сильно связный. Cильно связным называется граф, любые две вершины которого взаимно достижимы. Для графов корректных программ, т. е. графов, не имеющих недостижимых от точки входа участков и "висячих" точек входа и выхода, сильно связный граф, как правило, получается путем замыкания дугой вершины, обозначающей конец программы, на вершину, обозначающую точку входа в эту программу.
Одной из наиболее простых, но, как показывает практика, достаточно эффективных оценок сложности программ является метрика Т. Джилба, в которой логическая сложность программы определяется как насыщенность программы выражениями типа IF-THEN-ELSE. При этом вводятся две характеристики: $$CL$$ – абсолютная сложность программы, характеризующаяся количеством операторов условия; $$cl$$ – относительная сложность программы, характеризующаяся насыщенностью программы операторами условия, т. е. $$cl$$ определяется как отношение $$CL$$ к общему числу операторов.
Другая группа метрик сложности программ – метрики сложности потока данных, т. е. использования, конфигурации и размещения данных в программах. Рассмотрим метрику, связывающую сложность программ с обращениями к глобальным переменным.
Пара "модуль, глобальная переменная" обозначается как $$(p,r)$$, где $$p$$ – модуль, имеющий доступ к глобальной переменной $$r$$. В зависимости от наличия в программе реального обращения к переменной $$r$$ формируются два типа пар "модуль, глобальная переменная": фактические и возможные. Возможное обращение к $$r$$ с помощью p показывает, что область существования $$r$$ включает в себя $$p$$.
Характеристика $$Aup$$ говорит о том, сколько раз модули up действительно получали доступ к глобальным переменным, а число $$Pup$$ – сколько раз они могли бы получить доступ. Отношение числа фактических обращений к возможным определяется как $$Rup = Aup/Pup$$. Эта формула показывает приближенную вероятность ссылки произвольного модуля на произвольную глобальную переменную. Очевидно, чем выше эта вероятность, тем выше вероятность "несанкционированного" изменения какой-либо переменной, что может существенно осложнить работы, связанные с модификацией программы.
Кроме метрик сложности программ, используются метрики стилистики и понятности программ. Наиболее простой метрикой стилистики и понятности программ является оценка уровня комментированности программы $$F$$:
$$F = Nком / Nстр,$$
где$$ Nком$$ – количество комментариев в программе; $$Nстр$$ – количество строк или операторов исходного текста.
Таким образом, метрика $$F$$ отражает насыщенность программы комментариями. Исходя из практического опыта, принято считать, что $$F >=0.1$$, т. е. на каждые десять строк программы должен приходиться минимум один комментарий. Как показывают исследования, комментарии распределяются по тексту программы неравномерно: в начале программы их избыток, а в середине или в конце – недостаток. Причина в том, что в начале программы, как правило, расположены операторы описания идентификаторов, требующие более "плотного" комментирования. Кроме того, в начале программы также расположены "шапки", содержащие общие сведения об исполнителе, характере, функциональном назначении программы и т. п. Такая насыщенность компенсирует недостаток комментариев в теле программы, и поэтому формула (4) недостаточно точно отражает комментированность функциональной части текста программы.
К другим характеристикам программ следует отнести:
Все программы по характеру использования и категориям пользователей можно разделить на два класса – утилитарные программы и программные продукты. Первые предназначены для удовлетворения нужд их разработчиков (программы для себя), но не для широкого распространения. Вторые (программные продукты) используются для удовлетворения потребностей пользователей, широкого распространения и продажи.
Существует большое количество различных компаний, занимающиеся разработкой проприетарного программного обеспечения (proprietary software). Этим термином обозначают программное обеспечение, которое имеет собственника, осуществляющего контроль над этим программным обеспечением и определяющего собственные лицензионные соглашения по использованию программного продукта. Наиболее типичными ограничениями проприетарного ПО являются:
В настоящее время существуют и другие варианты легального распространения программных продуктов, которые появились с развитием Интернета:
Существуют и другие, можно сказать, экзотические варианты распространения программ. Например:
Ряд производителей использует OEM-программы (Original Equipment Manu-facturer), т.е. встроенные программы, устанавливаемые на компьютеры или поставляемые вместе с компьютером.
Программный продукт должен быть соответствующим образом подготовлен к эксплуатации (отлажен), иметь необходимую техническую документацию, предоставлять сервис и гарантию надежной работы программы, иметь товарный знак изготовителя, а также код государственной регистрации.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.