bash.im ithappens.me zadolba.li

Программизмы

137

Чтобы жизнь медом не казалась.

Отлаживаем настольное приложение: через ПЛК производства %bigcompanyname%, и их же высокоуровневый TCP-интерфейс на .net управляем роботом.

Робот - здоровая машина, если поедет не туда, мало не покажется. А координаты, куда ехать, посылаем как раз мы. Там, X, Y, Z, еще какие-то служебные параметры, и в конце этой последовательность - служебный флаг, типа, готово, двигай. И двигает. Но изредка не туда, хорошо хоть на тестовой скорости успевали останавливать.

Отлаживали недели 3, все перекопали, и чувствуем уже, вроде не у нас проблема, хотя так почти никогда и не бывает. Вызвали суппорт %bigcompanyname%. Оказалось, что "наш интерфейс не гарантирует последовательность доставки параметров" - "а почему?" - "оптимизация пакетов". На TCP. Вот так.

Посмотрел в послужной лист этой конторы, стало страшно жить. Там даже атомные электростанции есть.

134

Как бы не работать - лишь бы не работать.

Работаю в IT-компании, занимающейся разработкой ПО для автоматизации разных видов деятельности. В одном из программных продуктов возникла необходимость использования справочников кодов ОКВЭД в полном объеме.

У каждого кода есть наименование. Почему-то отдел разработки и аналитики посчитал, что 100 символов вполне достаточно. Реальную длину наименований они при этом проверить забыли. Соответственно, часть наименований банально не помещается, а необходимость заливки в рабочую БД уже очень актуальна.

Аналитики начали бурно думать.

"Давайте зальем то что помещается, а остальное выкинем" - т.е. выкинем из федерального справочника коды, которыми пользуются люди.

"Надо серьезно подумать над этим вопросом и серьезно рассмотреть эту возможность" - выкидывания ненужных кодов, ага.

"А потом когда поправим...", - невероятно сложный и долгий процесс!, - "...уже зальем остальное" - а потом будем кажому клиенту переставлять программу.

Это было бы смешно...

129

Встреча миров

Делали очередной проект. Я писал исполняющую часть, боссы занимались прикладной. Сидим в столовой, обсуждаем очередные дела по проекту. Один из боссов заводит речь про ресурсы с которыми работает программа и какими они бывают. Спрашивает моего мнения.

Я, недолго думая, рассказываю что ресурсы - это конечно сильно помогает и делает все лучше, и прочее. Минут через пять начинаю понимать, что ничего не понимаю.

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

Когда выяснилось, что клиентская программа - это не то что обращается к серверу, а специальный договор для клиента компании, и что у слова сервис есть еще один смысл, я понял, что прикоснулся к параллельной вселенной.

Ребята, отходить от компа и понимать язык непрограммистов - это так познавательно...

119

____ ___ ______ - _____!

В нашей конторе как-то думали над методами запутывания кода, при сохранении его в открытом виде.

Из всех предложенных решений верхом совершенства был признан следующий метод: имена всех переменных и функций заменяются на символы подчеркивания. А чтоб не перепуталось, каждой переменной присваивается собственное количество подчеркиваний.

То есть $attempt_no = $___, $email = $____, $login = $_____, $pass = $______, crypt() = ____() и так далее.

Представляешь себе код?

if ($____) $_____ = ____($_____);
$_______++; $____ = '';
return $_____;

Сиди и читай, если так хочется.

112

Особая, контроллерная магия

Сижу, разбираю программу по работе. Нужно немного переделать, читаю код. В коде нет ни одного комментария, читается с трудом.
Задумался, что ну ведь не сложно же написать пару слов, и всё будет понятно.
А потом вспомнил.

Не всегда всё будет понятно.

На прошлой работе как-то встретил такое в прошивке для контроллера AVR:

if (cmd[1] == RESET) // если принятая команда RESET
{((void(*)(void))0)();} // что-то из черной магии

97

Страх и ненависть на сервере.

Один из наших программистов, оставив сервер, запущенным на ночь, обнаружил, что утром количество созданных мобов уперлось в лимит.

Это были вампиры.

На этот раз отожгли дизайнеры-скриптовики. По задумке, если некоторое время стоять в одном специальном темном месте, игроку становится страшно и за ним приходит вампир.

Проблема была в том, что скрипт реагировал и на самого вампира. Вампиру тоже становилось страшно, и за ним приходил следующий вампир. Утром в этом темном месте стояла огромная толпа вампиров и всем им было страшно.

92

Осторожно, рыба!

Год назад писал тестовое задание для %companyname%. Задание было несложное: отображение дерева элементов из базы данных с использованием AJAX.

Сел ночью, написал, прикрепил резюме и отправил. В обед проснулся, сел за ноутбук - перед глазами исходный код.

alert ('Процесс секса JS,PHP и MySQL начат. Скоро будет новый бэби');
var child_name = prompt('Как Вы желаете назвать малыша?', 'Имя ребенка');

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

В ответ:
Все нормально, чувак! Даже если с тобой не подпишут контракт - мы тебя не забудем. Давно так не ржали!

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

87

Сила очепятки

Компания-провайдер. Обычная история: биллинговая система, сервер, постоянно обнаруживаются мелкие недочёты, постоянно вносятся изменения.

По закону подлости в фирму удалённого системного администрирования приходит заявка:

«Здравствуйте.

Все должно работать так-то и так-то. Просьба снести соответствующие изменения. Спасибо»

Особо не задумываясь, программисты СНОСЯТ последние конфиги сервера.

Интернет умирает.

79

Изобретатель велосипедов

Позвал меня молодой товарищ - не компилится в Borlanc C++ Builder новый проект со старыми файлами. Модули исправные - только что сам компилировал.

При попытки компиляции в новом проекте даёт ошибку в глубинах 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 где-нибудь в глубинах его кода.

В общем, в офисе всегда должно быть две линейки - деревянная для обычных глупых ошибок и железная для подобных творений нечеловеческого гения. По пальцам больно бить.