Программное обеспечение и его разработка
Шрифт:
Абстрактный характер программного обеспечения. Ни одним из пяти человеческих чувств нельзя ощутить большую программную систему. Она абстрактна. Можно увидеть и пощупать вычислительную машину стоимостью в 20 млн. долларов или мост, стоящий 100 млн. долларов. По мере увеличения числа команд в программе ее обозрение все более затрудняется.
Посмотреть на список из миллиона строк команд отнюдь не так же легко, как посмотреть на мост. Невозможно увидеть ни последовательность выполнения команд, ни структуру программы. Можно увидеть лишь толстую пачку бумаги, строки различных символов, но никак не программное обеспечение. Это свойство программного обеспечения делает управление
Основным инструментом создания нового программного обеспечения является вычислительная машина и ее программное обеспечение. Разработчики программного обеспечения в своей работе используют ЭВМ и программное обеспечение как основной инструмент для формирования и создания новых программ. Программное обеспечение является при таком использовании «инструментом для изготовления инструментов».
Рассматривать программное обеспечение можно либо в роли исполнителя задания (период использования), либо в роли помощника при создании нового дополнительного программного обеспечения (период разработки). Эти роли абсолютно различны, и тот факт, что одну и ту же аппаратуру можно использовать для выполнения обеих функций, является источником крайнего изумления для многих новичков.
Для тех же, кто постоянно работает с вычислительными машинами и программным обеспечением, этот факт настолько очевиден, что они думают, что это и для всех само собой разумеется. Их не смущает, что в одном предложении они обсуждают, скажем VAX-11 в роли исполнителя операционной системы, контролирующей полет ракеты, а в следующем предложении переходят к обсуждению работы той же физической машины, расположенной в том же самом месте, работающей в той же конфигурации, но уже в роли «инструментальной» машины, которая используется для сопровождения программ, выполняемых в тот момент, когда VAX-11 контролирует полет ракеты.
Для людей, далеких от таких способов разработки, такое изложение может показаться туманным, поскольку в тексте перемешиваются предложения, рассказывающие о двух совершенно различных способах использования одной и той же машины.
Эту двойную роль следует четко выделить. Переходить с описания одной роли машины к описанию другой профессиональные программисты должны с осторожностью, обязательно оговаривая такие переключения.
Трудность разработки программного обеспечения часто заключается не в тех функциях, которые оно выполняет, а в способе взаимодействия с пользователем. Требования к надежности системы часто гораздо сильнее затрудняют разработку, чем та функция, которую должно исполнять программное обеспечение. Программу, управляющую полетом самолета, сделать легко. Очень трудно добиться того, чтобы эта программа никогда не переставала работать, несмотря на аппаратные и программные сбои и ошибки летчиков. И все же факторы взаимодействия часто остаются вне поля зрения разработчиков либо рассматриваются ими неверно. Разрабатывать самовосстанавливающиеся программы это одно из самых сложных дел.
Некоторые виды программного обеспечения могут разрабатываться теми же методами, что и аппаратура, другие же так разрабатывать нельзя. Программное обеспечение состоит из отдельных команд, а мы можем написать команды, чтобы выполнить почти все что угодно, да еще массой различных способов. Команда не является физической «вещью». Аппаратура же — вещь физически реальная, и поэтому переставлять и комбинировать ее так свободно нельзя. Мы выделяем те отдельные случаи, когда программы становятся похожими на аппаратуру и должны разрабатываться теми же методами. Однако в больших системах аппаратура и программы имеют существенные различия. Аппаратуру можно здесь сравнивать с роялем, а программное обеспечение с музыкой. Аппаратура это словарь, а программное обеспечение — роман. Итак, несмотря на большое количество сходного в аппаратуре и программах, при разработке больших систем на первый план выступает их принципиальное различие. Более подробно этот вопрос будет рассмотрен далее.
Правильное программное обеспечение не подвержено никаким отказам. Оно, следовательно, не нуждается в техническом обслуживании. Подобный процесс нужно называть не обслуживанием, а продолжающейся разработкой. Если команды написаны правильно, они не могут вдруг стать неправильными. Они могут устареть, но происходит это по другим причинам. Они могут также быть неверными с самого начала, что, однако, не было обнаружено при тестировании. Обслуживание программы, иначе говоря продолжающаяся разработка, состоит в выявлении ранее не обнаруженных ошибок, добавлении новых функций, модификации некоторых функций, повышении производительности.
Этот факт чрезвычайно важен! Многие программисты считают, что обслуживание — это дело не интересное и не такое престижное, как разработка программ. Однако продолжающаяся разработка часто оказывается делом более сложным, чем первоначальная разработка. Мы должны называть этот процесс более точно — именно продолжающейся разработкой — и тем содействовать стиранию позорного и незаслуженного пятна, лежащего на тех, кто занимается обслуживанием.
Разработка программного обеспечения — это многогранная деятельность, связанная не только с работой на вычислительной машине. При работе над проектом большой программной системы обычно необходимо быть компетентным и в общих инженерных вопросах, и в математике, нужно разбираться в различных видах вооружения, знать законы небесной механики, разбираться в военной логистике, знать методы экономического планирования, понимать, что такое резервирование; необходимо ориентироваться в теории межпланетных полетов и в аэродинамике, а также еще в огромном количестве различных областей знаний. Руководитель разработки программного обеспечения должен в своем проекте все это учитывать. Это означает, что этот руководитель должен обладать способностью управлять группой специалистов из различных областей.
Большая программная система никогда не может быть отлажена до конца, даже после многих лет тестирования и использовании. До конца могут быть отлажены только маленькие программы, большие же и сложные не могут. Слишком много путей предусматривает общий алгоритм программы, слишком много возможных вариантов вводимых данных или действий пользователей.
Даже сотни лет продолжающегося тестирования — если бы, конечно, это стало возможно — не хватило бы для проверки всех возможных ветвей большой, сложной программы. И несмотря на это, находятся люди, всерьез говорящие о «программном обеспечении, свободном от ошибок»!
Разработка программного обеспечения часто весьма трудоемкий и дорогостоящий процесс. В Соединенных Штатах Америки каждый год вкладывается в разработку программного обеспечения больше 20 млрд. долларов. Это очень много, а ведь имеется устойчивая тенденция роста таких вкладов. И не все капиталовложения окупаются.
В начале 1970-х гг. две основные авиакомпании возбудили судебное дело против своих подрядчиков, поскольку созданная ими система стоимостью 40 млн. долларов не только не работала, но и вообще не подавала никаких признаков жизни. Крупный европейский банк направил в суд иск о взыскании 70 млн. долларов, выплаченных за программное обеспечение. Военно-воздушные силы США затратили более 300 млн. долларов на тщетную попытку автоматизировать комплексную систему перевозок и снабжения.
Программное обеспечение — это средство, а не цель. Одна из замечательных технических групп работает в National Security Agency (NSA). Она специализируется в области защиты и разгадывания шифров и привлекает в свои ряды и воспитывает знатоков различных технологических методов.
Недавно один человек, занимающийся вычислительными машинами и средствами связи, поведал мне о событиях, происшедших несколько лет назад, когда он был председателем Комитета определения стандартов для приобретаемого программного обеспечения.