Должна ли программа быть хорошей? Вопрос может показаться банальным. Однако очень важно его задать, поскольку любое усилие по улучшению методов программирования должно быть основано на осознании того, что программу можно обсуждать, критиковать, улучшать и сравнивать с другими программами, что она может быть хорошей или плохой и что важно сделать ее “хорошей” относительно некоторых критериев.
Важность установления критериев качества программ и проверки этих критериев подтверждается практическим опытом и обилием сообщений в средствах массовой информации о тех или иных происшествиях, связанных с неправильным выполнением ЭВМ возложенных на нее задач. Ниже приводятся примеры различных типов ошибок, которые могут возникать при эксплуатации программ.
Качество программ - это определенная совокупность свойств программного продукта, обеспечивающих решение возложенных на него задач в заданной среде функционирования и с допустимым множеством исходных данных.
Показателями качества являются надежность (безошибочность, включая и экстремальные, нестандартные условия выполнения), модифицируемость (легкость доработки и разбиения на модули), мобильность (настройка на новые условия, перенос на другую ЭВМ с минимальными затратами), дружественность интерфейса между ЭВМ и пользователем, занимаемый объем памяти, качество документации, подробность документирования самой программы.
Надежность программы является наиболее важным критерием качества программы в целом.
Модифицируемость программы - функциональное разбиение программы на автономные модули (модульное программирование), возможность доработки (изменения) содержания модулей.
Переносимость - легкость адаптации к изменению среды, т.е. компонентов программирования, возможность переноса программы из одной операционной системы в другую.
Занимаемая память - объем ОЗУ (кбайт, Мбайт) и объем ВЗУ, необходимых для функционирования программы.
Надежность программы определяется надежностью ее составляющих:
- алгоритмическая (вычислительная) надежность:
- информационная надежность:
- надежность программного обеспечения;
- надежность аппаратная.
Рассмотрим кратко отдельные составляющие надежности программ.
Алгоритмическая (вычислительная) надежность - способность программы выполнять свои функции при изменении условий функционирования.
Информационная надежность предусматривает:
- способность алгоритма или программы правильно выполнять свои функции при различных ошибках в исходных данных;
- способность информационной системы обеспечивать целостность хранящихся в ней данных;
- способность алгоритма и программы нормально функционировать в случае неправильных действий пользователя при вводе информации.
Надежность программного обеспечения - это характеристика способности программного обеспечения выполнять возложенные на него функции при поступлении требований на их выполнение, показатель качества, характеризующий свойства программного изделия выдавать одни и те же результаты при различных условиях функционирования.
При рассмотрении вопроса надежности программ следует учитывать тот факт, что надежность и правильность программ - не одно и то же. Правильность программы - это отсутствие в программе, разработанной по заданному алгоритму, программных ошибок. Надежность программы - более широкое понятие.
Надежность - это способность программ давать разумные результаты при всех возможных данных и действиях, в частности, в аномальных условиях. Если в программу вводят необычные данные, они должны быть выявлены и отброшены. Должны выявляться ошибки программы, ошибки данных, к которым следует добавить проблему предельных случаев и возможные ошибки аппаратуры.
Рассмотрение всех составляющих качества программ является очень сложной и объемной задачей. Поэтому мы ограничимся только теми показателями качества программ, которые зависят от разработчика (программиста).
Типы ошибок
Приведем примеры различных типов ошибок, встречающихся в программах.
Тип 1. Ошибки, допущенные при разработке и не обнаруженные при проверке (тестировании).
Неудача при запуске первого американского спутника к Венере произошла, вероятнее всего, из-за ошибки в программе - вместо требуемой в операторе цикла (Фортран) запятой программист поставил точку. Вот как был записан этот оператор:
DO 50 I = 12.525.
На самом же деле он должен был выглядеть следующим образом:
DO 50 I = 12,525.
Значительное количество программных ошибок в новой операционной системе WINDOWS-95 снижает ее надежность, поэтому корпоративные пользователи не спешат с ее внедрением. В начальный период каждый месяц эксплуатации WINDOWS-95 выявлял новые ошибки.
Тип 2. Ошибки, возникающие при вводе в компьютер неверных данных. В 70-х годах произошел глобальный сбой энергосистемы, снабжающей электроэнергией северо-восточную часть США, из-за неправильной установки начальных условий в компьютер управления.
Тип 3. Компьютерные вирусы, “вмешивающиеся” в работу компьютера и выполняемую им программу.
В начале 1989 г. вирусом, написанным американским студентом Моррисом, были заражены и выведены из строя тысячи компьютеров, в том числе принадлежащих министерству обороны США.
Тип 4. Выход из строя компонентов компьютера и обслуживающих его систем.
В процессе эксплуатации компьютера возможно физическое повреждение накопителя на жестком магнитном диске, выход из строя блока питания, отключение электроэнергии, колебания напряжения в электрической сети и др. Результатом такого рода неисправностей может быть полная потеря информации, хранящейся на жестком магнитном диске, частичная или полная потеря информации в файлах баз данных, нарушение работы систем, управляемых компьютером, и многое другое.
Тип 5. Выход из строя или сбои в работе внешних устройств (измерительных приборов, датчиков и других устройств), обеспечивающих компьютер входной информацией.
В июле 1985 года произошло преждевременное отключение компьютером одного из основах двигателей американского космического корабля “Челленджер”, которое едва не закончилось катастрофой. Если бы бортовая ЭВМ была запрограммирована на данную неисправность, то критической ситуации могло не произойти.
Тип 6. “Злая воля” человека, носителем которой чаще всего выступает либо программист, либо оператор. Программист, создавая программный комплекс, может сознательно внести в него ошибку. Следующим вариантом проявления “злой воли” программиста является включение в программу “логической бомбы”, срабатывающей, например, после определенного числа запусков программы, при определенных значениях входных данных и др. Оператор, обслуживающий компьютер, может сознательно ввести в него неверные данные.
Программист, работающий в вычислительном центре Волжского автозавода, сознательно внес в программу “логическую бомбу”. После конфликта с администрацией завода, отказавшейся повысить ему заработную плату, программист привел эту “логическую бомбу” в действие. Главный конвейер остановился, завод понес значительный материальный ущерб.
Другим проявлением “злой воли” человека является внешнее вмешательство в компьютеры, использующие сетевые технологии. Злоумышленник, взламывая систему защиты, либо нарушает корректную работу компьютера (сбои в работе, искажения и уничтожение хранимой в компьютере информации и др.), либо похищает конфиденциальную информацию, либо похищает деньги со счетов банка.
Программист, работающий в одном из американских банков, ввел в программу обработки счетов свою “добавку”, которая позволила зачислять на его личный счет остаток, получающийся от округления каждого расчета до цента. При громадном объеме банковских операций годовой “доход” программиста составил десятки тысяч долларов.
Приведенный список примеров может быть многократно дополнен. Но даже эти иллюстрации ошибок программного обеспечения и их последствий позволяют сделать обоснованный вывод о важности работ по повышению качества программ и разработки критериев оценки этого качества.