Перестала работать одна софтина — нужно разобраться. Это домашнее творение должно скачивать XML-ку, лезть на сайт за необходимыми значениями полей, после чего всё это располагать где положено и посылать на печать.
Начинаю курить код. В какой-то момент понимаю, что проблема в том, что XML содержит ноды с описанием картинок, но они не десериализуются в класс. Смотрю в десериализацию и натыкаюсь на [XmlIgnore] перед списком загружаемых картинок. Типизация сделана в другом, более общем проекте, поэтому трогать нужно осторожно. Там всё хорошо, билдятся оба, но «рид-онли» остаётся на месте.
От отчаяния плюю и дописываю: public int medved = 100500. На этот раз компилятор понял, что такое капитальное изменение в коде требует обновления DLL-ки, и софт начал вести себя предсказуемо. Положение спасено.
Писали с однокурсниками в качестве дипломной работы «игры для программистов». Основная идея была заимствована из Robocode.
Вкратце: игроку необходимо написать класс на языке C++, унаследованный от предоставленного ему класса. Методами этого класса реализовывается логика поведения танка, который ездит по полю брани, подбирает различные бонусы, стреляет в противников, умирает и т. п. У кого больше очков в конце боя, тот и победил. Далее исходники компилируются на стороне сервера, и игрок может сразиться с танками противников. Для удобства клиентская часть позволяла сохранять проведённые бои для последующих повторов.
Итак, ночь перед дипломом. Нужно сделать презентацию. Чтобы не быть голословными, решили написать пару ботов и сделать видео с их участием. Один бот должен был просто ездить и собирать бонусы, другой — только стрелять по другим танкам, игнорируя бонусы, третий — ездить полностью рандомно. Написали, запустили. Выяснилось, что правильно ездит только рандомный бот (и то лишь потому, что его трудно проверить). На часах уже пять утра, а ошибку найти не получается. Решили, что глюк у нас где-то в расчётах движения, и оставить следует только «рандомщика», а остальных просто не показывать.
Комиссия была в восторге — всем поставили по пятёрке. Только недавно товарищ скинул мне сохранённый бой, где все трое ездят «честно».
— Разобрался с физикой? — спрашиваю. — Нет. — Понял, как по существующей физике ездить? — Нет. — А что тогда случилось? Почему они вдруг так хорошо работать стали? — Да у нас угол до цели неправильно считался. Исправил — и сами поехали...
Невольно вспоминается шутка о том, что русский программист может написать правильный код даже для в корне неправильного проекта.
if (!shift) str+=" B/s"; else if (shift==1) str+=" KB/s"; else if (shift==2) str+=" MB/s"; else if (shift==3) str+=" GB/s"; else if (shift==4) str+=" TB/s"; else str="n/a"; // If this happens, you really have a fast connection
Программирую в среде с названием с греческими корнями. Версия среды старенькая — 2002 года, но мне хватает.
Нарыл на просторах интернета патч, исправляющий кучу мелких ошибок в среде — крупных тогда старались не делать. Загружаю проект софтинки, которую пишу и сопровождаю. Компилируется, запускается — всё хорошо. Нажимаю кнопку «Выход» — access violation по такому-то адресу. После часового мозгового штурма баг был найден и обезврежен. Программа с ним жила уже почти год, и ошибок не было ни разу.
Как там у классиков? «Если в вашей программе не обнаружено ошибок, проверьте компилятор — возможно, ошибка есть в нём».
В недалёком прошлом я написал для одной фирмы с раскиданными точками довольно удобную программу учёта кассы, склада и прочего с веб-интерфейсом — так было удобно заказчику. Сам проект был весьма интересен мне самому и в конце концов выродился в унифицированный комплекс с шаблонами интерфейса и операций над базами. Было прикручено много фич и глюков, позже превратившихся в новые фичи. Настраивать под нужды бухов это великолепие было легко, но только мне: заковыристый псевдоязык парсера с первого тычка было освоить довольно сложно, так как он сплошь состоял из сокращений для простоты написания.
Недавно ковырял «жёлтый глюк» и с ужасом пришел к выводу, что творение моих рук от этого ушло недалеко. Припомнил и случай, когда мне довелось услышать пятиэтажный мат одного из местных админов.
Однажды у группы студентов-программистов разговор зашёл о проблемах программирования бронетанковой техники. Больное коллективное сознание пришло к выводу, что главной проблемой является полная беззащитность программиста после начала компиляции и до рендеринга брони.
Работал я как-то программистом в компании, которая клепала разнообразные утилиты: оптимизировать то, подкрутить это... Софт предназначался в основном для американских домохозяек и временами действительно мог облегчить жизнь юзверю.
Как-то мы писали проект, который состоял из графического интерфейса и ядра. Дописали, зарелизили. Продажи полезли вверх, пользователи рады, жалоб нет, баг-репортов минимум, менеджеры не нарадуются. И тут я обнаруживаю, что в мир ушла версия с отключённым ядром — вырубили для отладки, а подключить забыли. Программа представляла из себя голый GUI. Долго думал о силе самовнушения наших пользователей.
Я три года пишу на .NET и всем несказанно доволен. Опыт и знание технологии позволяют развивать околокосмическую скорость разработки. Но не всё так сладко: нелёгкая заставила вплотную столкнуться с Java. В такие моменты начинаешь переосмыслять философию мира: самые привычные вещи переворачиваются с ног на голову, ибо «кофейный» подход воспринимается с колокольни .NET как безграничный набор костылей. Давно уже ходят холиворы вида «Java vs .NET», но общественность не пришла к окончательному решению. Вероятно, мое нехитрое субъективное сравнение поможет склониться некоторым адептам тех или иных технологий к определенному решению.
.NET: «Нам нужен робот. Отлично. Голова, туловище, конечности — руки и ноги по две штуки, зеркально отражённые. Собираем».
Java: «Нам нужно нечто такое, чтобы работало. Типа робота. Так. У нас есть голова, но там надо покопаться в конфигах, допилить правое ухо и нос. Есть опенсорсная прошивка, но она не позволяет анализировать изображение с глаз. Ладно, разбёремся.
Туловище. В общем, есть несколько реализаций туловища: одно без коннекторов для рук, другое без коннекторов для ног. Третье вообще без коннекторов. Ладно, возьмём третье и допилим коннекторы от рук и ног из второго.
Руки и ноги. Есть левая рука и левая нога. Чтобы их развернуть, нужно скачать исходники, посмотреть, как писалась левая рука и аналогично написать правую, только наоборот. С ногой аналогично. Но аппаратная реализация коннекторов из туловища позволяет подключать большой палец от правой ноги только к пятке. Надо сделать дырку в нужном месте и прикрутить туда палец. А на пятке... ладно, пусть будет. Скажем в документации, что так получилось».
Задолбали программисты! Вечное противостояние IT-отдела и бухгалтерии — сущие пустяки и мелкие недоразумения по сравнению с тем, что происходит между программистами и электронщиками. Безрукий эмбрион, раздутая самомнением инфузория, научившаяся отправлять два байта в COM-порт без exception error, гордо пишет в своём резюме: «Программы, которые работают с оборудованием (модемы, принтеры, микроконтроллеры и т. п.) на низком уровне, через порты COM/LPT». Их извилины, принявшие форму четырёхцветного флага, порождают такой бред, что индусы заливаются слезами от зависти и, полностью осознавая глубину собственной ничтожности, идут пасти священных коров. Билл, дружище, если можешь, закрой API для таких форм жизни! Криворукость гоблинов, помноженная на индусский код, даёт удивительный эффект.
Прочитать документацию на родном языке, присланную вместе с устройством, программисты считают ниже своего достоинства, ведь гораздо проще вынести мозг по телефону и затребовать построить в устройстве маленький Гион с го, гейшами и поддержкой astral32.dll. И ещё злятся ведь, когда их заказчик не в состоянии сформулировать техническое задание, желательно с применением ультрагиковского сленга.
Каждый раз, когда моё детище переносит клиническую смерть, пытаясь переварить помои, которыми его закармливает такое вот тело, нахватавшееся по верхам Вселенской Мудрости на форумах, переполненных такими же амёбами, моё сердце останавливается. Пока к нам эта высшая раса будет относиться без должного уважения, не ждите хорошего отношения: покупайте периферийное оборудование у восточных братьев и морочьте голову им.
Пожалуйста, Господи, заставляй их вспоминать хотя бы иногда, что если бы не электронщики, то программистов как понятия не существовало бы вообще.