Прежде всего необходимо понять первопричины ошибок программного обеспечения и связать их с процессом создания программных комплексов. В данном учебном пособии считается, что создание программного обеспечения можно описать как ряд процессов перевода, начинающихся с постановки задачи и заканчивающихся большим набором подробных инструкций, управляющих ЭВМ при решении этой задачи. Создание программного обеспечения в этом случае – просто совокупность процессов трансляции, т.е. перевода исходной задачи в различные промежуточные решения, пока наконец не будет получен подробный набор машинных команд [1]. Когда не удается полно и точно перевести некоторое представление задачи или решения в другое, более детальное, тогда и возникают ошибки в программном обеспечении.
Для того чтобы подробнее исследовать проблему ошибок в программном обеспечении (ПО), рассмотрим различные типы процессов перевода при его создании.
Создание ПО начинается с формирования требований пользователя, т.е. с разработки описания решаемой задачи. Такое описание имеет вид перечня требований пользователя. В некоторых случаях пользователь составляет этот перечень сам. В других случаях это делает разработчик ПО в беседе с пользователем, либо исследуя его потребности, либо самостоятельно оценивая эти потребности в будущем, либо комбинируя перечисленные методы. В данном учебном пособии будем считать, что на данном этапе ошибки не вносятся.
1. Первый процесс – перевод требований пользователя в цели программы. Хотя на этом шаге объем перевода невелик, здесь требуется явно выделить и оценить довольно много компромиссных решений, которые будут рассмотрены в дальнейшем. Ошибки на этом шаге возникают, когда неверно интерпретируются требования, не удается выявить все требующие компромиссных решений проблемы или приняты неправильные решения, а также в случае, когда не сформулированы цели, необходимые, но не поставленные явно в требованиях пользователя.
2. Второй процесс связан с преобразованием целей программы в ее внешние спецификации, т.е. точное описание поведения всей системы с точки зрения пользователя. По объему перевода это самый сложный шаг в разработке ПО, поэтому он больше всего подвержен ошибкам – они бывают и наиболее серьезными и наиболее многочисленными.
3. Далее следуют несколько последовательных процессов перевода – от внешнего описания готового продукта до получения детального проекта, описывающего множество составляющих программу предложений, выполнение которых должно обеспечить поведение системы, соответствующее внешним спецификациям. Сюда включаются такие процессы, как перевод внешнего описания в структуру компонент программы (например, модулей) и перевод каждой из этих компонент в описание процедурных шагов (например, в блок-схемы). Поскольку нам приходится иметь дело со все большими объемами информации, шансы внесения ошибок становятся чрезвычайно высокими.
4. Последний процесс – перевод описания логики программы в предложения языка программирования. Хотя на этом шаге часто делается много ошибок, они обычно незначительные, легко обнаруживаются и корректируются.
Кроме процессов перевода имеются и другие источники ошибок, которые будут кратко рассмотрены ниже. Однако в данном учебном пособии мы сосредоточимся на ошибках, возникающих в четырех вышеназванных процессах перевода.
В результате работы над программным проектом возникают как само ПО, так и документы, описывающие правила пользования им. Последние обычно имеют вид печатных руководств или встроенной в программу помощи и носят название публикаций. Эти руководства обычно получаются переводом внешних спецификаций в материалы, ориентированные на конкретные группы пользователей.
Публикации определенным образом влияют на надежность программного обеспечения. Если при их подготовке возникает ошибка, то они не будут точно описывать поведение программы. Если прочитав руководство, пользователь начнет работать с программой и обнаружит, что она ведет себя не так, как он ожидал, то решит, что это ошибка в программе, т.е. придет к неправильному заключению.
Другие источники ошибок – это неправильное понимание спецификаций используемой в системе аппаратуры, базового ПО (операционной системы), синтаксиса и семантики языка программирования.
И наконец, при непосредственном взаимодействии пользователя с ПО, если слабо разработан диалог человек – машина (отсутствие «дружественного интерфейса»), вероятность ошибки пользователя увеличивается. Ошибки пользователя же ставят систему в новые, непредвиденные обстоятельства, увеличивая таким образом шансы проявления оставшихся в программе ошибок.
Эта модель описывает происхождение большинства ошибок в ПО. Нередко считается, что ошибки в программе – это те ошибки, которые делает программист, когда пишет программу на языке программирования. Здесь и проявляется важность модели, поскольку она более полно описывает причины, лежащие в основе ненадежности. Благодаря ей нам стал известен перечень подлежащих решению задач, способствующих созданию надежного ПО.