Алгоритмизация и программирование Определение алгоритма

Вид материалаДокументы

Содержание


Algorithm MAX.
Операторы ввода-вывода
Операторы присваивания
Структурное программирование
Программирование сверху-вниз
Методы разработки алгоритма
Технологии (парадигмы) программирования
Алгол, Фортран, Бейсик, Паскаль, Си, Си++
Турбо Паскаль, Турбо Си++, Борланд Паскаль, Борланд Си++
Visual Basic
Принципиальные возможности человека
Классический период разработки
Методы маркетинга программного обеспечения
Подобный материал:




Алгоритмизация и программирование


Определение алгоритма

Происхождение слова «алгоритм» связано со словом «algorithmi» - латинским написанием имени аль-Хорезми, под которым в средневековой Европе знали величайшего математика из Хорезма (город в современном Узбекистане) Мухаммеда бен Мусу, жившего в 783-850 гг. В своей книге «Об индийском счете» он сформулировал правила записи натуральных чисел с помощью арабских цифр и правила действий над ними столбиком. Поэтому и наполнение термина «алгоритм» было следующим: операции над числами.

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

Рассмотрим простую задачу нахождения максимального числа в списке из N действительных чисел R(1), R(2), ..., R(N). Основная идея алгоритма заключается в том, чтобы перебирать по очереди все числа списка и запоминать наибольшее до сих пор встретившееся число. К тому моменту, когда весь список будет проверен, запомнится наибольшее число.

Algorithm MAX. Даны N действительных чисел в одномерном массиве R(1), R(2), . . ., R(N), найти такие М и J, что M = R(J) = maxR(K), 1 < K < N. В случае, когда два или более элементов R имеют наибольшее значение, запоминается наименьшее значение J.

Шаг 0. [Установка в начальное состояние] M := R(1), J := 1.

Шаг 1. [N = 1?] If N = 1 then STOP fi.

В этом алгоритме fi и od используются соответственно для обозначения конца конструкций If и Do.

Шаг 2. [Проверка каждого числа] For K := 2 to N Do Шаг 3 od; STOP.

Шаг 3. [Сравнение] If M < R(К) then M := R(K); J := K fi (теперь M - наибольшее число из проверенных, а К - его номер в массиве).

Алгоритм МАХ не закодирован на каком-то языке, а записан в форме, которую легче воспринять; он выражен в виде шагов, которые легко реализуются в каждом общепринятом языке программирования. От такого представления нетрудно перейти к кодовой форме. Однако так бывает не всегда. Некоторые алгоритмы слишком сложны, чтобы перейти за один шаг от предварительного словесного описания к кодам машины.

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

Блок –схема – это графическое представление алгоритма, дополненное элементами словесной записи. Каждый пункт алгоритма отображается на блок-схеме некоторой геометрической фигурой-блоком.

Символика блок-схем:



Операторы ввода-вывода. В операторах ввода – вывода записываются имена тех переменных, значения которых должны вводиться в оперативную память или выводиться из нее.

Ввод

А, В, С

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

Печать

‘x = ’

Печатаются символы

x =.

Печать

x, y

Из ячеек с именами x и y выбираются числа. Они преобразуются из машинного кода к обычному виду (декодируются и выводятся на экран монитора).

Печать

‘x = ‘, x

Если x имеет значение, равное 5, то на экран выводится строка x = 5

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

С = А+В

Содержимое ячеек памяти с символическими адресами A и Β суммируются. Результат записывается в ячейку с символическим адресом C.

X = X+DX

Содержимое ячеек памяти с символическими адресами X и DX суммируется. Старое значение ячейки X будет стерто, будет записано новое значение переменной X.

I = I+1

Говорят, что значение переменной I увеличилось на 1

Y = sin(x)

В ячейке с символическим адресом x записано значение угла, по которому вычисляется значение синуса и результат записывается в ячейку Y

5 = 2+3

Ошибка, т.к. слева от символа = не может стоять константа.

А+В=С

Ошибка, т.к. слева от знака = может находиться только переменная

Разветвление

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

Подпрограмма

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

Соединитель

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

Комментарии можно записывать возле любого блока.

Рассмотрим пример алгоритма – алгоритм отыскания минимума и максимума в любой конечной последовательности из n вещественных случайных чисел а1, а2, а3, а4, ….,аn. При небольшом количестве чисел достаточно беглого взгляда, чтобы указать максимум и минимум. Однако, если n велико, задача усложняется. Поэтому необходимо придерживаться определенной системы. Например, взять в качестве начального значения как для максимума, так и для минимума первое число, далее последовательно перебирать числа и сравнивать каждое из них с установленным к текущему моменту значением максимума. Если очередное число превышает максимум, считать его новым значением максимума (прежнее значение «забыть»), после чего можно переходить к новому числу. Если анализируемое число не больше максимума, то сравнить его с установленным е текущему моменту значением минимума. Если число оказывается меньше минимума, считать его новым значением минимума и перейти к следующему числу; если число не меньше минимума, просто перейти к анализу следующего числа. Перебрав таким образом все числа, получим окончательное значение максимума и минимума. Блок – схему этого алгоритма можно представить следующим образом.



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

Структурная блок-схема – это блок-схема, которая может быть выражена как композиция из четырех элементарных блок-схем: композиции, выбора (альтернатива), цикл с предусловием, цикл с постусловием



Структурное программирование – процесс разработки алгоритмов с помощью структурных блок-схем.

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





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


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

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

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

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

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



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

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

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

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

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

Методы разработки алгоритма

Существует весьма большое количество всевозможных приемов и методов разработки алгоритмов. Однако среди имеющегося разнообразия этих методов можно выделить небольшой набор основных, в том смысле, что методы из такого набора применяются часто и лежат в основе многих процедур и алгоритмов. К основным методам можно отнести:
  1. метод частных целей – сложная задача сводится к последовательности более простых задач.
  2. метод подъема – начинается с принятия начального предположения или построения начального решения задачи. Затем начинается (насколько возможно) быстрое движение «вверх» от начального уровня по направлению к лучшим решениям. Когда алгоритм достигает точки, из которой больше невозможно двигаться «наверх», он останавливается.
  3. программирование с отходом назад – Основой программ искусственного интеллекта, независимо от того, к чему он прилагается – программирование игр, выбору решений, распознование образов и т.п., - является программирование перебора вариантов. Программирование перебора вариантов – это сложная задача, т.к. алгоритмы перебора ищут решения не по заданным правилам вычислений, а путем проб и ошибок, и схема не укладывается в схемы циклов, имеющихся в языках программирования. Ситуация зачастую осложняется тем, что прямыми методами перебор всех возможных вариантов невозможно осуществить из-за их огромного количества. Метод программирования с отходом назад позволяет осуществить организованный исчерпывающий поиск требуемого решения задачи. При этом часто удается избежать перебора всех возможных вариантов
  4. алгоритмы ветвей и границ – применяются для решения переборных задач и ориентированы на поиск оптимального решения из конечного множества возможных решений – вариантов.


Технологии (парадигмы) программирования

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


Процедурное программирование

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

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

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

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

Типичными представителями процедурных языков программирования являются языки Алгол, Фортран, Бейсик, Паскаль, Си, Си++.


Функциональное программирование

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

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

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


Логическое программирование

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

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

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

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


Объектно-ориентированное программирование

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

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

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

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

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

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

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

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

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

Парадигма объектно-ориентированного программирования реализуется в ОС Windows 95/98 через модель рабочего стола. Пользователь работает с задачами и приложениями так же, как с документами на своем письменном столе. Основной упор в операционной системе делается на документ, а программа, задача, приложение или программный код вообще рассматриваются только как инструмент для работы с документом.

Парадигма поддерживается такими системами программирования, как Турбо Паскаль, Турбо Си++, Борланд Паскаль, Борланд Си++.


Визуальное программирование

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

Типичным представителем систем визуального программирования является среда программирования Visual Basic, которая используется в качестве встроенного языка макроопределений во всех приложениях пакета Microsoft Office для Windows.

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

Экранная форма - графическое представление окна Windows-приложения вместе с содержанием этого окна. Содержание включает в себя:
  • перечень свойств окна с их значениями;
  • перечень объектов, находящихся в этом окне;
  • перечни свойств этих объектов также с их значениями.

Экранная форма Visual Basic хранится в отдельном файле, имя которого имеет расширение frm.

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

Программный проект - совокупность элементов (программные, объектный и исполняемый модули, экранные формы и т. п.) Windows-приложения. Visual Basic хранит проект в отдельном файле, имя которого имеет расширение vbp.

Алгоритмическое (модульное) программирование. Алгоритм – это описание способа решения задачи путем разбиения ее на конечную по времени последовательность действий (элементарных операций). Основная идея алгоритмического программирования – разбиение программы на последовательность модулей, каждый из которых выполняет одно или несколько действий. Единственное требование к модулю – чтобы его выполнение всегда начиналось с первой команды и всегда заканчивалось на самой последней (т.е. , чтобы нельзя было попасть на команды модуля извне и передать управление из модуля на другие команды в обход заключительной). Алгоритм на выбранном языке программирования записывается с помощью команд описания данных, вычисления значений и управления последовательностью выполнения программы. Текст программы представляет собой линейную последовательность операторов присваивания, цикла и условных операторов. Таким способом можно решать не очень сложные задачи и составлять программы, содержащие несколько сот строк кода. После этого понятность исходного текста резко падает из-за того, что общая структура алгоритма теряется за конкретными операторами языка, выполняющими слишком детальные элементарные действия.

Объектно-ориентированное программирование. Развитие идей структурного и событийного программирования существенно подняло производительность труда программистов и позволило в разумные сроки (несколько месяцев) создавать приложения объемом в сотни тысяч строк. Однако такой объем уже приблизился к пределу возможностей человека, и потребовались новые технологии разработки программ. В середине 80-х годов прошлого столетия в программировании возникло новое направление, основанное на понятии объекта. До того времени основные ограничения на возможность создания больших систем накладывала разобщенность в программе данных и методов их обработки. Реальные объекты окружающего мира обладают тремя базовыми характеристиками: 1)они имеют набор свойств; 2)способны разными методами изменять эти свойства; 3)способны реагировать на события, возникающие как в окружающем мире, так и внутри самого объекта. Именно в таком виде в языках программирования (например, С++) и реализовано понятие объекта, как совокупности свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и который приводят, как правило, к изменению свойств объекта. Появление возможности создания объектов в программах качественно повлияло на производительность труда программистов. Максимальный объем приложений, которые стали доступны для создания группой программистов из 10 человек, за несколько лет увеличился до миллионов строк кода, при этом одновременно удалось добиться высокой надежности программ и, что немаловажно, повторно использовать ранее созданные объекты в других задачах. Объекты могут иметь идентичную структуру и отличаться только значениями свойств. В таких случаях в программе создается новый тип, основанный на единой структуре объекта (по аналогии с тем, как создаются новые типы для структур данных). Он называется классом, а каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса. Описание нового класса похоже на описание новой структуры данных, только к полям (свойствам) добавляются методы – подпрограммы. В С++ для описания класса используется ключевое слово class:

П
class TMyClass

{

int Item1;

int Item2;

int GetSum(int n);

void Initialize();

};

void TMyClass:: Initialize()

{

Item1=1;

Item2=0;

}
ри определении подпрограмм, принадлежащих конкретному классу, его методов, в заголовке подпрограммы перед ее названием явно указывается, к какому классу она принадлежит. Название класса от названия метода отделяют специальные символы (два двоеточия в С++).

Класс – это тип данных, такой же, как любой другой базовый или сложный тип. На его основе можно описывать конкретные объекты (экземпляры классов):

TMyClass C1, C2

Доступ к свойствам объектов и к их методам осуществляется так же, как к полям записей, через точку С1.Item1:= 5

C2.Initialize

Объединение данных с методами в одном типе (классе) называется инкапсуляцией.

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


Проектирование программ.

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

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


Принципиальные возможности человека


Объем проекта, строк исходного кода



Тип программы



Время создания


Вероятность

успешного

завершения


Число

программистов

100

Утилиты для временных нужд

1 день

100%

1

1000

Небольшие приложения и дополнения, вносимые в готовые системы

до 1 месяца

100%


1

10 000

Типичная средняя программа, разрабатываемая на заказ

до 6 месяцев

85%

1 (предел возможностей среднего программиста)

100 000

Большинство современных коммерческих автономных и небольших клиент-серверных приложений

1 год

85% для групп,

35% для одиночки


10

1 млн

Крупные системы автоматизации

1,5 – 5 лет

50% для группы,

0% для одиночки


100

10 млн

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


5 – 8 лет

35%


до тысячи



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

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

Классический период разработки ПО.
  1. Формируются и анализируются требования к проекту. Этот этап самый важный, т.к. неправильное формулирование требований приводит к выполнению ненужной работы. Сегодня около 60% крупных проектов завершаются неудачей именно из-за ошибок на стадии подготовки требований. На основе требований определяется примерный объем проекта и его трудоемкость, рассчитываются будущие трудозатраты и определяется его стоимость. После согласования требований подписывается контракт на разработку ПО. Примерный объем работ на этом этапе – 5% от объема всего проекта.
  2. Начинается предпроектное обследование объекта автоматизации. С помощью CASE-средств составляется формальная модель его работы, модель базы данных, объектов и потоков информации. На этом этапе привлекаются специалисты заказчика и эксперты, хорошо знакомые с предметной областью, для которой составляется задача. Примерный объем работ второго этапа – 10% от общего.
  3. На основе формальной модели составляется подробное техническое задание для программистов, спецификации отдельных модулей, таблицы баз данных, другая сопроводительная документация. Готовится подробный календарный план работ, где указываются все сроки, конкретные исполнители и выполняемые объемы работ (понедельно, помесячно). Примерный объем работ третьего этапа – 10% от общего.
  4. Выбирается методология разработки ПО и начинается разработка (кодирование). Крупные компании имеют собственные методологии, ориентированные на конкретные задачи (как правило, это задачи автоматизации предприятий), однако все методологии имеют общие черты и более менее серьезно различающихся известно около двух десятков. Выше, в частности, упомянуты методологии структурного и объектного проектирования. Хотя объектный подход, безусловно, один из самых передовых, он подразумевает высокую квалификацию всех исполнителей без исключения и поэтому распространен не очень широко. Достаточно популярна методология итерационного проектирования, ориентированная на использование сред быстрого проектирования (RAD-сред) и систем автоматической генерации исходных текстов на основе созданной формальной модели. Такой подход хорош тем, что позволяет быстро создать первый работающий прототип программы, когда еще требования к ней окончательно не определены, а в дальнейшем, на следующих итерациях (от двух до пяти), постепенно детализировать и реализовывать конкретные возможности, пропущенные по каким-либо причинам на предыдущей итерации. Примерный объем этих работ-10% от общего объема проекта.
  5. Когда программа закончена (готова работоспособная альфа-версия), она поступает к тестерам компании-исполнителя, которые начинают проверять ее на наличие ошибок и сообщать о найденных ошибках программистам. Когда число ошибок, выявляемых за определенный срок (неделя, месяц), снижается ниже экспериментально подобранного уровня (на основе аналогичных проектов), начинается бета-тестирование программы у заказчика. Примерный объем этих работ – 10% от общего объема проекта.
  6. После того, как заказчик удовлетворен качеством продукта, начинается его внедрение – подготовка к окончательному запуску в эксплуатацию. Этот этап самый трудоемкий и «нудный» и занимает порой до 90% времени всего проекта. Для систем автоматизации больших предприятий он растягивается на годы.
  7. После того как новая система готова к работе, сотрудников организации заказчика нужно обучить работе с этой системой, потому что книг о ней не написано, да и содержится в такой системе, внедренной на конкретном предприятии, множество нюансов, связанных со спецификой работы. Примерный объем трудозатрат на обучение – 5% от общего объема проекта.
  8. После того как заказчик подписывает акт приемки, проект считается завершенным, но связь с исполнителем не теряется. Особенно в первое время у пользователей системы постоянно будет возникать множество вопросов по работе с ней. Неизбежно и возникновение ошибок, которые требуется устранять. Кроме того, исполнитель может выпускать новые версии системы, и старая система потребует обновления. Сотрудничество с заказчиком по обслуживанию системы называется сопровождением. Оно бесплатно на определенный гарантийный срок (например, год).

Компания может организовать у себя очень эффективный процесс разработки ПО, однако заказчик вполне обоснованно может ей не поверить. Существует международная система сертификации компаний по стандарту качества ISO 9000, которая гарантирует, что данная компания выполняет программные проекты в срок и с высоким качеством.

Методы маркетинга программного обеспечения:
  • коммерческое ПО – средства в разработку ПО и на рекламу вкладывает либо сам разработчик, либо издатель, который нанимает исполнителя. По окончании работ издатель получает все имущественные права на созданный продукт. При этом может быть оговорено получение исполнителем некоторого процента (роялти) с каждой проданной копии (порядка 1-3%).;
  • условно-бесплатное ПО (shareware) – не имея средств на рекламные компании, разработчики предоставляют возможность получения ознакомительных версий их программ через Интернет. Если человеку эта программа нравится, он оплачивает небольшую сумму и получает работоспособную версию. В Интернете есть немало узлов, которые предлагают бесплатные услуги по размещению таких программ;
  • бесплатное ПО (freeware, public domain) – такие программы не имеют никаких ограничений, однако автор может попросить заплатить ему некоторую сумму, не настаивая, впрочем, на этом (это метод freeware). Некоторые программы авторы называют «общественным достоянием» (public domain), ничего взамен не требуют и нередко распространяют такое ПО в исходных текстах. Как правило, стимулом к созданию freeware/public domain- программ служит стремление повысить свою квалификацию, установить контакты с коллегами, а в случае удачно созданной программы получить известность и, как правило, приглашение на хорошую работу.