Два программыги, что сидят рядом со мной, последние два месяца заняты написанием веб магазина для продажи каких-то подарков. Один из программистов - это тот самый Джон, о котором я писал тут. Он на этом проекте поставлен главным программистом. Так склалось. Не оказалось в нужное время в компании программиста, который обладал нужными знаниями.
Проект уже написан и сейчас вовсю тестируется. Вот тестеры и нашли интересную закавыку: если несколькими пользователями одновременно нажат на кнопку "Сделать заказ", то все эти одновременные заказы капнут на кредитку одного из пользователей. Тестеры ребята умные, даже черезчур, в головах почесали и сказали что эта проблема происходит из-за того, что все они находятся за файрволлом и что-то у нас такое неправильное в программе. Джон это услышал и начал рыть в этом направлении. Рыл, рыл, ничего не нарыл, но, по своему обычаю, сказал что всё пофиксено и свалил на пару дней в отгулы.
Тестеры сели тестировать опять и опять натолкнулись на ту-же самую ошибку. Пришлось второму программисту сесть и ловить её. Ну а тестерами быть мне и ещё парочке людей. Выработали тест скрипт и давай синхронно ходить по сайту. Да, ошибка присутствует. Теряем сессию. Включили стандартную в .Net поддержку tracing, стали смотреть за sessionId. Неа, сессия не теряется, а ошибка продолжает место быть. Вставили в нужные страницы дополнительную тестовую информацию - не понятно что происходит.
Тут я решил посмотреть на код, который отвечает за совершение транзакции. Код как код, всё вроде бы нормально. Задумался... Странно... Такая белиберда может происходить только если несколько нитей лезут в несинхронизи... Погоди! Какие такие нити в .Net веб приложении?! А если не нити, то такое может быть если некоторые классы объявлены как статические. Ну-ка, ну-ка, посмотрим на объявления...
Ужас! Бррр! Классы Order, ShoppingCart объявлены как статические! И потом запихнуты в сессию!
Как оно вообще работало - мне непонятно. Вернее понятно, но всё-же непонятно! То есть я теряюсь в догадках.
Вы можете себе представить реакцию всех тех, кто сидел рядом и понимал, чем static классы отличаются от обычных. Это было что-то подобное сцене из Ревизора. Немая, короче, сцена.
У Джона, судя по всему, скоро будет много выходных... А мы уже две недели как ищем senior developer с .Net и J2EE. Если кто ищет работу в центре Лондона, то пишите комментарии.