На этом шаге мы рассмотрим организацию ручной прокрутки.
После окончания ручной проверки проведите несколько раз ручную прокрутку (Walkthrough - сквозной контроль) отдельных частей Вашей программы. Иногда ее называют "сухой" прокруткой (Dry Running - пробный прогон) в отличие от метода прокрутки, использующего компьютер. Основой прокрутки является имитация программистом процесса выполнения программы (алгоритма) компьютером с целью более конкретного и наглядного представления о процессе, определяемом текстом проверяемой программы. Прокрутка дает возможность приблизить последовательность проверки программы к последовательности ее выполнения, что позволяет проверять программу как бы в динамике ее работы, проверять элементы вычислительного процесса, задаваемого проверяемой программой, а не только статичный текст программы.
Для выполнения прокрутки обычно приходится задавать какие-то конкретные исходные данные и производить над ними необходимые вычисления, используя текст программы. Для программ со сложной логикой, в которых, например, характер работы одного участка программы зависит от результатов работы других ее участков, необходимо осуществлять ручную прокрутку программы для ряда специально подобранных исходных данных и параметров. Прокрутка дает программисту возможность найти более хитрые ошибки в программе, чем при ручной проверке.
Трудность применения прокрутки - большой объем ручной работы при попытке точного моделирования работы программы. Поэтому успех применения прокрутки заключается в выборе такой необходимой степени детализации моделирования, чтобы, с одной стороны, выявить максимальное количество ошибок, а с другой - затратить на это минимальные усилия.
Приведем несколько соображений, которые могут помочь уменьшить время, затрачиваемое на прокрутку.
Прокрутку следует применять лишь для контроля логически сложных программ или блоков (под блоком будем понимать некоторую группу операторов, объединяемых по какому-либо признаку, например: арифметический блок - выполняемая последовательно группа операторов, производящих вычисления в программе, логический блок - группа операторов, управляющих последовательностью вычислений в программе).
Арифметические блоки нужно проверять обычным способом, не задаваясь конкретными исходными данными. Вычислять числовые значения нужно лишь для тех величин, от которых зависит последовательность выполнения блоков (операторов) программы, и эта последовательность является очень существенной. Поэтому во время прокрутки программы при всякой возможности, когда позволяет характер прокручиваемого блока программы, нужно переходить на обычную ручную проверку и возвращаться на режим прокрутки при начале проверки логически сложных блоков.
Исходные данные, влияющие на логику программы, должны выбираться так, чтобы минимизировать прокрутку программы. Но данные должны быть и такими, чтобы в прокрутку вовлеклось большинство ветвей программы, и чтобы прокрутка отразила типичный характер ее работы.
Кроме того, в ходе прокрутки необходимо проверить работу программы и для особых случаев (например, для экстремальных значений параметров).
Многократные повторные прокрутки какого-либо участка программы можно не производить, если в логике его выполнения ничего не изменяется по сравнению с предыдущими проходами. Например, тело цикла можно прокрутить лишь для первых двух-трех проходов (проверка входа в цикл) и для последних одного-двух (проверка выхода из цикла).
Прокрутка бывает необходимой и в том случае, когда программист не в состоянии вполне четко представить себе логику проверяемой программы, особенно если программа написана не им и нет хорошего описания.
При первом же пробном запуске вычислительной машины МЭСМ (первая в СССР ЭВМ, 1951 г.) произошел показательный случай. Первую программу для МЭСМ перед запуском прокрутили вручную два квалифицированных математика и получили одинаковые результаты. А машина выдала другой результат. Инженеры долго искали неисправность и не смогли ее найти. Тогда академик С.А.Лебедев, главный конструктор МЭСМ, сам взялся за ручную прокрутку. Проработав всю ночь, он обнаружил, что оба математика ошиблись в одном и том же месте, а машина оказалась права!
Поговорим теперь о методике проведения ручной прокрутки.
Нарисуйте на листе бумаги "начальную обстановку", а затем - "исполняйте" операторы по одному, отмечая все изменения, происходящие при этом в запоминающем устройстве. Поэтому для ручной прокрутки нужно уметь изображать на бумаге начальную обстановку в ОЗУ и происходящие в нем изменения. Разумеется, нас интересуют не все блоки (участки) памяти, а только те из них, которые используются в программе. Удобнее всего рисовать блоки и их значения мелом на школьной доске: ведь для того, чтобы поместить в блок новое содержимое, нужно "уничтожить" (стереть) старое - на доске это сделать очень просто. Каждый блок можно рисовать в виде "домика", на "крыше" которого записано имя блока, а внутри размещается содержимое. Форма крыши может говорить о типе переменной.
Если доски нет, ручную прокрутку можно вести и на бумаге. При этом таблицу имен (блоков) приходится изображать немножко по-другому, потому что стирать старые значения на бумаге неудобно, лучше их зачеркивать, а рядом писать новые значения.
Ручную прокрутку лучше всего проводитьвдвоем с приятелем. Выполняйте строку за строкой программы (алгоритма) и старайтесь независимо друг от друга обнаружить ошибки. Однако избегайте такой методики в том случае, если выяснится, что Вы испытываете искушение переложить на своего приятеля (или он на Вас) заботу о тестировании программы!
В заключение необходимо отметить, что использование прокрутки весьма полезно еще и потому, что она содействует глубокому осознанию программистом логики составленной им программы и того реального вычислительного процесса, который ею задается. Ведь быстрота ориентирования в отлаживаемой программе и в выдаваемых отладочных результатах всецело зависит от способности программиста мысленно представить себе во всех деталях алгоритм рассматриваемой программы, что невозможно без глубокого и крепкого знания его в течение всего длительного времени проведения отладки.
На следующем шаге мы рассмотрим метод контрольных тестов.