Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гудлиф - Ремесло программиста.pdf
Скачиваний:
182
Добавлен:
16.05.2015
Размер:
9.67 Mб
Скачать

220

Глава 9. Поиск ошибок

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

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

Борьба с вредителями

Выдергивать сорняки из программ трудно. Нужно обнаружить ошиб% ку, распознать проблему, искоренить все следы нежелательного пове% дения, проверить, не проникла ли ошибка в другие места, и постарать% ся не испортить ничего в коде, проводя все эти действия. Даже первый шаг – обнаружение ошибки – представляет собой большое затрудне% ние: человек совершает ошибки при письме, но не меньшее их количе% ство он делает при чтении. Читая свой текст или код, я, естественно, вижу то, что хотел написать, а не то, что написал в действительно# сти. Ошибки в коде не бросаются в глаза. От компилятора помощи то% же немного; он действует весьма педантично. Компилятор сделает в точности то, о чем вы просили, а не то, что вы подразумевали.

Есть программисты, которые по сравнению со своими коллегами значи% тельно реже (на 60%) допускают ошибки в коде, быстрее отыскивают и исправляют ошибки (тратя 35% обычного времени), а при исправле% нии вносят меньше новых ошибок (Gould 75). Как им это удается? Они обладают естественной способностью более внимательно относиться к решаемой задаче и концентрироваться на микроскопическом уровне кода, который пишут, в то же время не упуская из виду общую картину.

Таково искусство отладки; в значительной мере это мастерство, кото% рое нужно освоить. Умение эффективной отладки приходит с опытом. И такого опыта у каждого будет предостаточно.

Самое главное правило отладки: думай головой. Контролируй, чем ты занят. Не крутись без толку, меняя куски кода в надежде, что все вдруг заработает.

Следуйте золотому правилу отладки: думать головой.

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

Борьба с вредителями

221

Обходная дорога

Ошибка очень проста. Причина очевидна. Стоит ли долго размыш% лять? Иногда для успеха достаточно небольшой правки; несколько простых тестов быстро находят проблему. Так стоит ли городить ого% род? Возможно, что и нет, но не надейтесь, что вам всегда будет так везти. Очень часто программисты пытаются исправлять ошибки мел% кими поправками, заплатками, нашлепками, не особенно задумыва% ясь над смыслом своих действий. В результате польза бывает сомни% тельной: они просто скрывают исходную проблему с помощью тьмы других ошибок.

Если вы приняли решение починить код на скорую руку, установите для себя жесткие временные границы. Не тратьте полдня на то, чтобы «попробовать еще один способ». После того как отведенное время вы% шло, переходите к методическому подходу, описываемому ниже.

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

Если ваши гадания будут удачны и вы найдете ошибку, снова вклю% чайте в работу мозги. Читайте «Как исправлять ошибки» на стр. 228 и изменяйте код осторожно и продуманно. Даже если ошибку удалось легко найти, ее исправление может оказаться не столь очевидным.

Правильный путь

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

Каждая из сторон имеет свои трудности. Часто забывают о второй час% ти и считают, что раз ошибка найдена, то исправление ее окажется очевидным. Это не так. Ниже я подробно расскажу об обоих аспектах и очерчу разумный подход к решению задачи. Но сначала о некоторых главных принципах, которым подчиняются действия при отладке:

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

Изучите отлаживаемый код – трудно найти ошибки в коде, который вам не& понятен.

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