суббота, 11 декабря 2010 г.

Вынести за скобки

Люблю писать о заковыристых, редких глюках. Вот очередной (в целях соблюдения коммерческой тайны все названия изменены):

На сайте есть выпадающий список, пункты которого отсортированы по популярности. Ну, предположим, это категории товаров. Набрал букву "К", и тебе сразу предлагают "компьютеры", "калькуляторы", "камеры". Популярность считается примерно так: по каждому конкретному товару считается количество просмотров за последнюю неделю. А потом они суммируются, и получается популярность категории в целом. Я как раз отвечаю за этот кусок. Изредка замечал, что сортировка работает как-то странно, т.е. вверху появляются какие-то явно непопулярные категории. Потом это само собой проходит. Такую ситуацию я видел всего два-три раза за год. Думал, что просто изредко по каким-то причинам не сразу обновляется статистика. Или случайные всплески, когда непопулярный в принципе товар вдруг становится временно популярным. Допустим, в Африке вдруг выпал снег, и все кинулись покупать нагреватели.

И вот опять оно снова случилось. И не проходит. Внимательно изучил программу и заметил грубую ошибку.

Оказывается, мой предшественник ранжировал количество просмотров. Ну, т.е. один товар просмотрели 123 раз, а следующий, более популярный, 176 раз. Вместо 123 и 176 он присваивает им ранги 1 и 2. Зачем? Наверное, потому, что количество посещений типа long, а он хотел использовать для сортировки int. Чтобы занимало меньше памяти и немного быстрее работало. Это само по себе нормально. Проблема в том, что суммируя популярность товаров каждой категории, он использовал не количество посещений, а ранг товара! Т.е. вычислял не общее количество посещений, а "сумму ранга". Правильно бы было наоборот: сложить количество посещений для всех товаров в каждой категории, и только потом проранжировать результаты. А ему показалось, что всегда выполняется условие f(x + y) = f(x) + f(y).

Я не мог поверить своим глазам. Человек, который это написал - один из самых сильных программистов, с которым я когда-либо работал. Это изменение было внесено аж два года назад. Каждый релиз тщательно тестируют вручную, и никто не замечал? Мой начальник был уверен, что я что-то недавно сломал. Но я просмотрел историю изменений - нет, так было и раньше. Просто исходные данные распределены таким образом, что условие f(x + y) = f(x) + f(y) действительно выполняется в 95% случаев. А когда не выполнялось, то тестеры просто думали, что "сегодня в Африке выпал снег"...

1 комментарий:

Z комментирует...

у меня сотрудники 3 года смотрели в систему отчётности и видели там то, чего там реально не было.. Такое часто случается когда желаемое выдаешь за действительное.

Ratings by outbrain