Мда, не хотел публиковать рабочие истории, но всё-таки начну, пожалуй. Глядишь, сэкономят кому время, хотя писано про то многократно и людьми поопытнее.
Первый анекдот был опубликован ещё на
IT Happens,
«Изобретатель велосипедов», правда, в несколько изменённом виде. К сожалению, остался только лог аси, который и послужил исходником для данной истории:
Fledgling, 07.11.2008 15:35:51:
у тя нормально фсе?:)
Norritt, 15:53:15:
ага
если не считать обострения граблей
прикинь
сейчас позвал молодой товарищ
Fledgling, 15:53:40:
шо?
Norritt, 15:53:49:
говорит, чота не компилиццо в сях
начал смотреть
и нашёл потрясающую по своей глубине строчку
#define int64 __int64
где-то в глубинах ашников
Fledgling, 15:54:44:
ыыыыыыыыыыыыыыыыыыыыыы))))))))))))))))))))
дефаны - зло!))
Norritt, 15:55:14:
а ругалось оно где-то в глубине wtypes.h на строчку
LONGLONG int64;
Fledgling, 15:55:57:
ыхыхыы))
жыстока))
Norritt, 15:58:45:
LONGLONG-то понятное дело где-то в wtypes определён. Но wtypes совсем не в курсе, что есть извращенцы, которые переопределяют int64
Fledgling, 15:59:06:
)))))))))))))))))
Norritt, 15:59:55:
в результате сейчас молчел сидит и мрачно делает автозамену строк вида
" (u)intXX " -> " (unsigned) __intXX "
Fledgling, 16:00:04:
:-D:-D:-D:-D:-D:-D
Norritt, 16:00:20:
потомушта мы нашли и int8, и int16 задефайненные таким образом
Fledgling, 16:00:39:
))
прогер был затейник)))
Norritt, 16:01:23:
а виновник торжества сидит и с наивным видом оправдывается - «ну я ж не знал», «ну это ж было для другого писано», «и ваще, чо вы от меня хотите», «я не знал что __intXX» - стандартная конструкция
Fledgling, 16:01:34:
)))
Norritt, 16:02:01:
так что я совсем не удивлюсь, реально обнаружив #define TRUE FALSE где-нибудь в глубинах его кода
Fledgling, 16:02:20:
лопату на работу берите))
Norritt, 16:03:58:
мы сошлись на двух линейках - деревянной для обычных косяков
и железной для подобных творений человеческой мысли
Ан нет, нашёлся таки переработанный вариант, теперь можно внимательно проследить за развитием сюжета:
Обострение граблей
Позвал меня молодой товарищ - не компилится в BCB новый проект со старыми файлами (ну как всегда - понадобились со старого проекта модули в новом проекте). Модули исправные - тока что компилил. При попытке компиляции в новом проекте даёт ошибку в глубинах wtypes.h, на строку LONGLONG int64;
Долгая медитация вывела на потрясающей по своей глубине строчку, гласящую #define __int64 int64. LONGLONG-то понятное дело где-то в wtypes определён. Но wtypes совсем не в курсе, что есть извращенцы, которые переопределяют int64, да ещё и таким образом.
В результате сейчас молчел сидит и мрачно делает автозамену строк вида "([\(\s])(u)?int(\d{1,2}) " -> "$1(unsigned) __int$3 ", потомушта мы нашли и int8, и int16 задефайненные таким образом.
А виновник торжества сидит и с наивным видом оправдывается - «ну я ж не знал», «ну это ж было для другого писано», «и ваще, чо вы от меня хотите», «я не знал, что __intXX - стандартная конструкция» и так далее. Так что я совсем не удивлюсь, реально обнаружив #define TRUE FALSE где-нибудь в глубинах его кода.
В результате мы сошлись на том, что в офисе должно быть две линейки - деревянная для обычных косяков и железная для подобных творений человеческой мысли. По пальцам бить.
А вот второй анекдот произошёл сегодня и был тщательно
запротоколирован:
Приехал после командировки, первый день на работе - бегаю, вхожу в курс дела: кто над чем работает, какие изменения в кодах и т.п. Команда маленькая, потому по мере возможности сую нос везде.
Во время такого броуновского движения замечаю парочку, уткнувшуюся носом в ноутбук. После того, как я их засёк в неизменной позе раз так третий, решил таки подойти поинтересоваться, что там у этих двух рыцарей дельфи и студии стряслось.
Один из этих орлов ваял «оплётку» на классы ODAC (кто не в курсе - работа с Oracle), совместимую с уже существующими "оплётками" на Firebird и MS SQL. Соответственно, сидят, тестят промежуточную версию dll-ки. Вроде, всё мирно и по плану, только глаза какие-то отрешённые. Неправильно это.
- Что случилось? - спрашиваю.
- А, Алекс... слушай... тут у нас типа мистика творится. У нас один и тот же запрос выполняется и в TOAD'е (штатный обзёрвер Oracle), и в SQLPlus, а из клиента - ни в какую.
- А что пишет?
- Ну как... unrecognized character. Тока мы уже всё закомментили что можно - ноль эффекта.
Тут меня тюкает - с аналогичной проблемой мы сталкивались года четыре, если не больше, назад - когда ваяли что-то аналогичное, но менее функциональное.
- Ага, - говорю, - давайте запрос. - И смотрю на последний символ в нём. Точно, оно.
- Ребят, уберите точку с запятой.
- Зачем?? Ведь и TOAD, и SQLPlus - все без неё не работают.
- Вы уберите, и посмотрим, - и спокойно иду с намерением закончить таки свою непосредственную работу. За спиной слышится восхищённый вздох и невнятная ругань вида «я блин с этой хренью с пятницы маюсь». Меня тюкает ещё раз - потому что я на этот косяк наступал лично (со стороны клиента), но помимо меня это удовольствие имел ещё один человек - который ваял предыдущую версию этой оплётки. И, в отличие от меня, в пятницу он был на работе, а не в командировке.
- Ребят, а где Сергей? (для определённости, пусть его так зовут) Проведём следственный эксперимент. Меняйте запрос взад, сейчас я его пригоню.
Коллега искал проблему в запросе дольше - минуты три против десяти моих секунд, но, справедливости для, скажем, что читал он с начала, а я читал с конца.
После этого я очень долго читал мораль орлам-ваятелям на тему командной работы, что мистики не бывает, и что в общем-то имеет смысл не тратить два дня работы двоих программистов на поиск такого косяка, а надо хотя бы спросить у старожилов - после определённой концентрации специалистов 95% «мистики» объясняется довольно быстро и без привлечения метафизики.
Правда, омрачилось крещендо невинным вопросом «а как оно раньше работало-то?»
На это я, немного смутившись, ответил, что проблема была вскрыта, когда переводили один из ныне почивших продуктов на Оракл, а так как в остальном запросы были совместимы с файрбёрдом (за исключением закрывающей точки с запятой), решили не просеивать все запросы, а банально воткнуть "затычку" на обработку запроса - в случае рабочей базы Oracle отрезать все завершающие точки с запятой. Естественно, данное решение никак не было документировано, и хранилось только в памяти участников процесса.
Надо ли говорить, что после такого признания пришлось спасаться бегством...