google web font

вторник, 6 августа 2013 г.

Гейзенбаг и Шрёдинбаг

Вот они и встретились.

У нас в проекте есть модуль А и модуль В. Они разрешаются лицензионными ключами. Каждый модуль может работать независимо от наличия другого модуля, но нужно, чтобы был активен хотя бы один, иначе программе можно вообще не запускаться. Всю жизнь у всех пользователей использовались оба модуля, а тут вдруг (практически, ВНЕЗАПНО), тестировщику понадобился только один из двух модулей. И ему, кстати, повезло ещё и с тем, что понадобился именно второй модуль. Повезло — потому что если убрать ключ на модуль А, то модуль В не включается, и потому что тестировщикам такие случайности очень нравятся. Оказалось, что модули инициализировались тупо по порядку:



/* какой-то код, подготавливающий инициализацию модуля А */
if ( init_module_A() != TRUE )
    return FALSE;
/* какой-то код, подготавливающий инициализацию модуля В */
if ( init_module_B() != TRUE )
    return FALSE;

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

Ок, тестировщик ставит баг. Появляется фикс:


/* какой-то код, подготавливающий инициализацию модуля А */
/* какой-то код, подготавливающий инициализацию модуля В */
if ( init_module_A() != TRUE && init_module_B() != TRUE )
    return FALSE;

А вот тут уже надо брать программиста и спрашивать, где он покупал диплом. Благо, в данном случае, квалификация автора кода была вне сомнений, опытный программист, местами тимлид и всё такое. Заработался, бывает.

Кстати, если непонятно, чем плох второй код, то рекомендую поупражняться, прежде, чем всё-таки читать дальше. Там ведь действительно просто всё.

Несмотря на то, что на первый взгляд код проверяет, что оба модуля включились нормально, но самом деле, если первый модуль включился норм, то второй не включается совсем. Потому что после успешной инициализации модуля А становится понятно, что внутрь if’а мы уже в любом случае не зайдём, а следовательно, вторую часть условия программа даже не проверяет и модуль В не инициализирует. Это предусмотрено дизайном языка. В итоге можно включить только один из двух модулей: либо модуль А, либо модуль В.

Ну, потом исправили, конечно. У нас ещё как-то раз попалась инициализация какой-то важной структуры, которая делалась при подготовке сообщения для логирования на каком-то глубоком уровне дебага. Если отключить дебаг, то структура не инициализируется, а если включить обратно — то всё норм.

Комментариев нет:

Отправить комментарий