среда, 22 декабря 2010 г.

Не вся информация одинаково полезна

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

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

Я очень люблю отладочные сообщения. Они говорят мне значительно больше чем ковыряние в отладчике. Я вообще не люблю отладчики.

Причем наш код уже содержит достаточно много всякого мусора, который давно надо убить. Зачем убить, спросите вы, ведь отладочные сообщения полезны?!? Надо. Опыт подсказывает, что чужие сообщения не несут информации. Очень редко получается так, что посмотрел на чужие сообщения, и понял в чем проблема. Чаще приходится дописывать новые.

Так зачем спрашивается хранить старые, если их в каждом конкретном случае все равно приходится менять??? Эти отладочные сообщения заполонили весь код, у нас их столько, что за ними содержательных не видно!!!

Короче, отладочным сообщениям не место в продакшн коде. Но с другой стороны в нем могли бы быть понятные информационные сообщения. Как отличить белый шум от полезной информации? Кому полезной? Насколько полезной?

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

Какого черта вот она в fastDB падает:
assert(currId != 0);
Может это и правильно с ее точки зрения, но не несет мне необходимой информации. Может быть исключение в данном случае было бы предпочтительнее? В исключение можно запихнуть значительно больше информации, которая позволит тому, кто пользуется данными методами понять, что же он делает не так.

Хотя может быть я что-то понимаю неправильно. shared_ptr тоже не позволяет себе бросать исключения из operator->, и тоже обходится ассертами. В релизной версии ассертов нету, и приложение просто крешится.

Тему про наглядность ассертов я уже поднимал как-то, с тех пор собственно ничего не изменилось. Ассерты не доносят информацию. Сообщение о том, что 'currId != 0', могло бы что-то полезное сообщить, если я работаю на соседнем уровне, то есть вызываю эту функцию непосредственно. Но теряет всякий смысл, когда я использую все это через три уровня косвенности.

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

Я вообще не люблю, когда на пользователя вываливается все. Компьютер должен работать, он должен работать над тем, как концентрированно донести до пользователя суть его проблем. Не без помощи программистов конечно.