logo
Курс лекций КИТ

Технологии разработки программных комплексов

Чтобы компьютер смог решить поставленную перед ним задачу, алгоритм должен быть записан на понятном машине языке. Таким языком является язык машинных кодов. И первые программы приходилось писать на нём. Это было утомительно и неудобно. особенно сложным был ввод программы в машину. Малейшая неточность приводила к непредсказуемым результатам. Для того чтобы облегчить труд программиста, и были созданы специальные языки программирования. Алгоритм, записанный на языке программирования, называется программой. Текст программы называют исходным кодом (текстом).

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

Одним из крупнейших программных проектов за всю компьютерную историю и до сегодняшних дней является создание операционной системы IBM OS/360, первый рабочий вариант которой разрабатывался в 1963-66 гг. В нем участвовали сотни программистов, а общая трудоемкость работ за весь период работ составила 5000 человеко-лет. Среди руководителей этого проекта был Фредерик Брукс (книгами которого по программированию пользуются и сегодня), который в 1985 году вместе с Бобом Эвансом и Эриком Блохом был награжден Национальной медалью США в области технологии за проектирование OS/360.

В 70-е годы 20 века обсуждение темы разработки ПО шло в основном в русле дискуссии: "Программирование — это наука или искусство?". Брукс одним из первых дал правильный (все-таки и сегодня с этим можно спорить) ответ на этот вопрос: это весьма специфическая, высокоинтеллектуальная, но все же — технология.

Казалось бы, сегодня такой тезис является очевидным, но на самом деле до его реализации на практике еще очень далеко. Например, если посмотреть на подготовку современных ИТ-специалистов, то можно легко увидеть, что сейчас (как и 25 лет назад) наша отечественная высшая школа нацелена на выпуск ученых-исследователей, но никак не технологов. Результатом же этого является то, что отличная индивидуальная подготовка (как многие считают) почему-то не хочет выливаться в успешную реализацию проектов на практике.

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

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

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

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

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

Цели структурного программирования:

1) повысить надежность программ - для этого программа должна легко тестироваться и отлаживаться;

2) повысить эффективность программ - при разбиении программы на модули можно было бы легко находить и корректировать ошибки, текст любого модуля переделать независимо от других;

3) уменьшить время и стоимость программной разработки – для этого надо повысить производительность труда программиста;

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

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

Идеи структурного программирования появились в начале 70-годов в компании IBM, в их разработке участвовали известные ученые Э. Дейкстра, Х. Милс, Э. Кнут, С. Хоор. Структурное программирование основано на модульной структуре программного продукта и типовых управляющих структурах алгоритмов обработки данных различных программных модулей.

Таким образом, технология структурного программирования при разработке серьезных программных комплексов, основана на следующих принципах:

– программирование должно осуществляться сверху вниз;

– весь проект должен быть разбит на модули (подпрограммы) с одним входом и одним выходом;

– подпрограмма должна допускать только три основные структуры – последовательное выполнение, ветвление (if, case) и повторение (for, while, repeat).

– недопустим оператор передачи управления в любую точку программы (goto);

– документация должна создаваться одновременно с программированием в виде комментариев к программе.

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

Объектно-ориентированный подход использует следующие базовые понятия:

– объект – совокупность свойств (параметров) определенных сущностей и методов их обработки (программных средств) (объект содержит инструкции (программный код), определяющий действия, которые может выполнять объект, и обрабатываемые данные);

– свойство объекта – характеристика объекта, его параметр;

– метод обработки – программа действий над объектом или его свойствами;

– событие – изменение состояния объекта;

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

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

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

Наиболее известным примером объектно-ориентированного языка программирования является язык C++, развившийся из императивного языка С. Его прямым потомком и логическим продолжением является язык С#. Другие примеры объектно-ориентированных языков программирования: Visual Basic, Eiffel, Oberon.

Развитием объектно-ориентированного подхода стало появление в 90-х годах целого класса языков программирования, которые получили название языков сценариев или скриптов (VBScript, PowerScript, LotusScript, JavaScript) - программа представляет собой совокупность возможных сценариев обработки данных, выбор которых инициируется наступлением того или иного события (щелчок по кнопке мыши, попадание курсора в определенную позицию, изменение атрибутов того или иного объекта, переполнение буфера памяти и т.д.). События могут инициироваться как операционной системой (в частности, Microsoft Windows), так и пользователем.

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

Существенным преимуществом языков сценариев является их совместимость с передовыми инструментальными средствами автоматизированного проектирования и быстрой реализации программного обеспечения, или так называемыми CASE- (Computer-Aided Software Engineering) и RAD- (Rapid Application Development) средствами.

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

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

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

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

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

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

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

Для таких программ характерна высокая стоимость разработки программного обеспечения.

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