Отладка: понимание деталей о том, почему определенные исправления работали? [закрыто]


12

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


1
Как вы могли бы убедить кого-либо, что вы сделали исправление ошибки, в противном случае?

related: Исправление ошибок appproach "Обычно вы пытаетесь выяснить фактическую причину возникновения ошибки, а затем исправить ее. Но иногда то, что я делаю, когда мне надоело проводить какие-то исследования (и не может найти подходящую информацию о Интернет) просто изменить логику, которая занимает у меня гораздо меньше времени по сравнению с другим вариантом ... "
комнат

Ответы:


32

Я бы сказал, что важно понимать каждую деталь о том, почему некоторые ошибки возникали и почему определенные изменения устраняли эти ошибки, и среди разработчиков также часто бывает, чтобы программа работала, не зная деталей о том, почему исправление работало!

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

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

Но, несмотря на это, коммерческие реалии программирования часто таковы, что удовлетворение клиента исправленной ошибкой важнее, чем удовлетворение себя. Я никогда бы не рекомендовал вам объявить нечто застывшее , если вы не имели ни малейшего представления , что послужило причиной, но если вы можете увидеть , что некоторый код было проблематично, и переработал его, даже если вы «не 100% уверен» , как это вызвало специфическое ошибка, чтобы проявиться, иногда вам просто нужно перейти к следующей ошибке, прежде чем клиент будет слишком громко кричать о вашем медленном прогрессе.


15

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

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


Я согласен, что вам определенно не следует утверждать, что это «исправлено», если вы не уверены, что оно не было просто перемещено или скрыто. Тем не менее, не будет слишком страшно признать, что вы «исправили проблемную область в связанном коде» и теперь «не можете воспроизвести ошибку» - в прошлом мои команды регистрировали их как «CNR в v <номер версии > "
PeterL

6

Менять вещи до тех пор, пока ошибка больше не является плохой практикой, но, к сожалению, для некоторых это реальность.

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

Как правило, прежде чем вы исправите проблему / ошибку - вы должны выполнить оценку / анализ основной причины, чтобы определить причину возникновения проблемы и ее можно повторить. Затем вы должны прочитать код и понять, почему код вызывает ошибку. Как только вы это поймете, тогда вы можете начать смотреть на то, как решить проблему и определить другие области, на которые будут влиять ваши изменения. Модульные тесты могут действительно помочь здесь!

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

Сказав это, я исправил ряд проблем в коде исключительно по ассоциации. Где я что-то изменил / переработал / реорганизовал, и это исправило другие выдающиеся ошибки. Поэтому, хотя я и не знаю, что вызвало их изначально, я нашел хитрый код и «исправил» его - что тоже помогло исправить эти ошибки. Подобные изменения описываются в модульных и интеграционных тестах для обеспечения целостности бизнес-требований и технических требований функции.


4

Или разработчики часто заставляют программу работать, не зная деталей, почему исправление сработало?

Есть как минимум три большие проблемы с этим:

  1. Это приводит к чёрному магическому мышлению, когда вы отказываетесь от идеи, что вы можете понять код, а вместо этого просто начинаете перемещать части в надежде, что проблемы исчезнут. Это программный эквивалент выкладывания еды на тарелку в надежде сделать ваш обед достаточно съеденным, чтобы ваши родители не заставляли вас есть больше овощей.

  2. Вы не можете знать, что ошибка фактически исправлена или просто замаскирована вашим изменением, если вы не понимаете, а) в чем проблема, и б) как ваше изменение решает проблему.

  3. Ошибка, вероятно, не исправлена , и в ближайшем будущем она снова вас укусит.


2

Я вижу два сценария: вы работали над чем-то другим, и ошибка перестала происходить, пока что-то еще не сломало что-то еще, вы в значительной степени должны были это допустить - вы сделали то, что нужно / хотели, и это имело место непредвиденный и необъяснимый положительный побочный эффект.

Другой - то, что вы работаете над этой ошибкой, и случайное изменение заставляет вещи работать, это недопустимо. Если вы не знаете, что старый код делал неправильно, вы, вероятно, не понимаете, что новый код делает неправильно.

Я не могу придумать вескую причину для проверки во втором случае - если это критическая ошибка, то важно правильно ее исправить. Если это некритическая ошибка, по крайней мере, вы можете быть уверены, что вы не вносите критическую ошибку в свое «исправление».


0

Или разработчики часто заставляют программу работать, не зная деталей, почему исправление сработало?

Я, например, думаю, что это очень распространено в наши дни. Это из-за Google и Stackoverflow. У вас есть проблема с вашим кодом, просто гуглите его, найдите решение, исправьте, перейдите к следующей проблеме.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.