bash.im ithappens.me zadolba.li

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

12000

Поезд уходит в небо

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

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

Полтора года труда — и система работает! На локальный сервер предприятия непрерывно собирается информация, анимация не хуже игр того времени, показывает движение поездов и всю информацию по ним. Без лишних проводов: блок на тепловозе, блок на диспетчерском пункте, телефонная линия, которая ещё и всегда свободна. Миллионы долларов экономии! Собирается статистика по превышениям скорости, опозданиям, предугадываются и отображаются опасные сближения. Доходит дело до оплаты — и…

Ждём пару месяцев — движений нет. Ну, что делать? Через сеть отдаём команду программе. Бац! На табло загорается: «Опасное сближение». Но сближения нет. Следующая минута — и товарняк пошёл в обратную сторону с динамикой покруче НЛО на космических съёмках. И далее программный троллинг на протяжении почти двух суток, пока систему не вырубили в пользу старой, с картой и лампочками.

Тут критик воскликнет: «Это же железная дорога! Это же опасно!» Да, опасно. А почему об этом не подумало руководство компании до того, как наняло двух фрилансеров для такой опасной работы, а потом их кинуло?

Граждане управленцы! Конечно, бывают случаи откровенного вымогательства со стороны разработчиков, но чаще всё-таки наоборот. Не надо пугать инженеров ФСБ. Снимут в первую очередь вас, ибо вы отвечаете за объект, а не Вася с ноутбуком, которого вы допустили к объекту, наверняка даже не заключив контракт. Конечно, если разработчик не настолько туп, чтоб отключать блокировку на месте и дать себя поймать за руку. Прислали бы на следующий день техника, который перепрошил бы блок чистой прошивкой, и никто и никогда не доказал бы, что там закладка, даже сотрудники в штатском, стоящие над ним. Обычный апдейт после падения системы в рамках нового контракта, какие вопросы? Равно как никто и никогда не докажет, что эта SMS активирует закладку, а не является диагностическим запросом, который случайно вешает систему. Даже если отправлена она была с личного телефона.

Для доказательства закладки нужен дизассемблинг прошивки, её анализ специалистом по этому компьютеру, поиск места закладки в тоннах кода. Никто не будет заниматься этим ради одного предприятия, не говоря уже про 99% остальных случаев кидалова, когда речь не идёт об опасном производстве.

Что до нашей системы, то денег нам так и не заплатили (впрочем, мы это уже понимали на момент диверсии). Директора и всё руководство филиала, которое нас кинуло, сняли за провал, высшее руководство получило пенделей согласно занимаемой должности. Взамен была куплена французская система, дороже нашей на пять порядков, которая потребовала прокладки кабеля вдоль всех ЖД-линий и сдохла в первые же морозы. В результате до сих пор положение поездов отслеживают тётки в жилетках.

На допросы нас не вызывали, даже не вспомнили про нас. Мы же сдали исправную систему и нам за неё заплатили (по бумагам). Виноват тот, кто такую плохую систему принял.

11995

Костыль давно минувших дней и боты старины глубокой

Мистика — это, как правило, непонятая закономерность. Если потрудиться, её можно найти. Хуже, когда неполадка уходит в прошлое.

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

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

11977

Костыль — орудие программиста

Сделали отопление в гараже. Надо колоть дрова, а топора нет. Что делать? Правильно, используем костыль… Нет, не тот, а настоящий, стальной, железнодорожный. При помощи молотка он легко вгоняется в пенёк и делит его на две-четыре части.

Вот она, пригодилась профессия!

11961

1 год М. Э.

Всегда стараюсь избегать любых констант при программировании, всё подгружаю из базы данных или из файлов инициализации. Это помогает избежать необходимости лезть в код, когда происходят какие-то изменения (порой неожиданные). В принципе, абсолютно правильный подход, но вот сейчас уже на автопилоте прописал загрузку из внешнего источника названий месяцев. Остановился, посмеялся над собой, решил, что я уже утрирую и вряд ли названия месяцев могут поменяться. А потом задумался: в Азербайджане совсем недавно предложили переименовать месяцы в честь местного богоподобного правителя, винограда и граната. А у нас буквально на днях к власти пришли какие-то очень странные люди с неведомыми устремлениями. Может, им вздумается вести летоисчисление от Майдана, а месяцы переименовать в честь его героев?

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

11948

Сбить в полёте

В студенческие годы сдавал лабораторные работы на C++. Компилирую исходник работы. Вирус (как сейчас помню — Virut.A) тут же заражает экзешник, антивирус его удаляет, а Dev-C++ охреневает от отсутствия оного и вываливается с невнятными ошибками. Компилирую снова. Весь процесс повторяется: экзешник создаётся, вирусуется, удаляется, а среда разработки вылетает с ошибкой.

NOD32, как я тебя люблю!

11910

Селектыч-спотыкач

Дело было в нашем автотестерском кругу. Был у нас метод selectRadioButton, был маппинг кейвордов на Java-методы, крутилось себе всё это спокойненько на Дженкинсе, тестировало продукт. И прилетело тут обновление компоненты фреймворка, где RadioButton стал именоваться Check: с чекбоксами объединили.

Доблестный ТА-инженер, следя за концепциями, меняет имя метода на selectCh, коммитит, а за коммитом валится и Дженкинс, и автотесты прибегают красные, и начальство злится. Правильно, маппинг-то не поменяли. Материмся, возвращаем selectRadioButton. Следующий запуск Дженкинса — опять хлобысть! Так, уже смешно. Уже другой кодер вместе с другим функционалом заливает selectCh. Обзываем его Селектычем, ржём, правим.

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

Вот так и появился у нас Java-вирус Селектыч. И сидит Селектыч в головах, а не в коде. Обновляйте SVN, и да не пребудет Селектыч с вами!

11906

Всего лишь uninstall.log

Пришёл приказ сверху, из Москвы: напечатать на бумаге исходный код. На бумаге! Исходный код! Надо сказать, что проект не просто большой, а прямо-таки глобальный.

Ну, мы поржали, однако делать нечего. Подготавливаем к печати, все дела. Принтер у нас один и на программистов, и на бухгалтерию. Слышим — зажужжал. Чего-то печатает. Кодеры ринулись смотреть, как оно — исходники-то на бумаге. Первый подбежал, глянул — и разочарованно:

— Не, это не исходники.

— А что там? — замерли остальные.

Апатически отмахиваясь, потеряв всякий интерес к процессу:

— А, приказы на увольнение.

А принтер печатает, печатает…

11868

Косяки под контролем

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

v.3. Исправлен криво работающий поиск. Впрочем, теперь он работает не лучше.

v.6A. Работа кнопки «Оплачено» стабилизирована, но вроде не до конца.

v.6B. Работа кнопки «Оплачено» полностью взята под контроль.

v.6.3A. Исправлен небольшой, но страшный глюк со связями (dogovor_klient). Во время обнаружения испорчено две пары штанов.

v.6.5. Тестовое исправление «Счетов дилеров». Выглядит ровно на 100% лучше предыдущей версии. Функциональность… уточняется.

v.6.9.4A. Сделаны «Примечания к договорам» (dog_post). Теперь при заключении договора в таблицу пишутся «Примечания». Попутно зацепили формы печати: они отсохли и перестали работать.

v.8.3A. Некоторые правки формы «Клиент счёт» проверить невозможно из-за того, что кто-то из нас очень умно придумал вместо формы «Заказы клиентов» вкопипастить «Заказы дилеров», причём проклятый шпион ещё и переименовал шапку, чтобы с первого взгляда было не определить. Жуткое коварство.

v.9. Исправлены формы заказов и счетов (форма больше не сатанеет после нажатия кнопки «Печать» и возвращения обратно).

v.9.6.6. Решена проблема с лишними копиями view_dil_zak и исправлено главное меню, искавшее вместо нужной формы проклятущий zakaz_dilera. Если этот Летучий FORMандец ещё раз где-то всплывёт, я обращусь к экзорцисту.

11867

Сын женщины и юрлица

Собрал в свободное время небольшую коллекцию приколов со своей работы.

Задание — добавить пункт: «Нужна ли вам рассылка?». Три варианта ответов: «да», «нет», «совсем не нужна». Оказалось, различие между последними двумя в дополнительных типах уведомлений.

* * *

— Почему база висит? SELECT … FROM … Чей это запрос может быть?

— Это, наверно, Лена.

— Я её прибью! Вернее, процесс её прибью.

* * *

Приняли нового человека. Ну вот как так можно написать:

$month_id = array(1, 2, 3, … 12);
$month_name = array('Январь', 'Февраль', …);

Да-да, потом идёт foreach($month_id as $n) и обращение к $month_name[$n-1].

* * *

В середине выполнения программы:

$_POST = array(…);

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

* * *

> SELECT DISTINCT gender FROM clients;
Found rows: 150

В том числе «8912», «Зао"Урал», «хозяйка», «юр.лицо».

* * *

Номер недели в году. Этого я вообще не ожидал:

> SELECT DISTINCT publish_week FROM table;
Found rows: 88