bash.im ithappens.me zadolba.li

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

1526

Квадратный байт

Отлаживал простенькую игрушку. Функция должна была в месте клика выводить на экран спрайт. Два часа я думал, почему картинки корректно отображаются только на небольшой области экрана, а при клике на других областях появляются чёрт-те где. Хотел уже переустанавливать Delphi, а то и мозг, но прозрел.

Никогда не декларируйте координаты типом byte.

1514

[eq.pas

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

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

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

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

1512

Пока дятел в полёте

Если бы программисты были архитекторами, то...

1. В день сдачи здания приезжал бы крупный начальник, говорил бы, что ему не нравится вон то восточное крыло и вопрошал: «А можно ли это переделать за два часа?»

2. Половина зданий была бы похожа на барачные конструкции с кучей подпорок по периметру — время не резиновое.

3. Вторая половина зданий была бы нормальной, но недостроенной.

4. Утвержденный план здания по ходу бы дополнялся пулеметами на крыше (чтобы враги не подступились), легкомысленными статуями на фасаде (чтоб красиво было) и окнами, через которые можно смотреть только изнутри — и вся эта красота за те же деньги, в те же сроки и за три дня до окончания проекта.

5. Если бы легкомысленные статуи и пулеметы уместить в одном здании не получилось бы, начальник заглядывал бы в глаза и спрашивал: «А почему нельзя? А вон я видел вон там вон это вон».

6. «Вон там вон это вон» — здание, возведенное международной строительной компанией при поддержке правительств трёх государств.

7. И вообще, плита перекрытия между этажами — это просто, доступно и легко, почему её поднимают на кране? Вон, египтяне еще до нашей эры пирамиды строили, а это вам не хухры-мухры, давайте-ка пошустрее!

8. А зачем нам эти плиты покупать? Не-е-ет, это очень дорого. Проще выдать задание на создание рукотворных плит силами доблестных архитекторов. А то, ишь, сидят, чего-то рисуют в автокаде, жизни не видели.

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

10. Злые архитекторы по вечерам, проклиная всё на свете, отправлялись бы отдыхать от этого бардака куда-нибудь подальше в надежде, что завтра им не выдадут техзадание на постройку очередного колосса в нереальные сроки.

Считаете программистов бездельниками, лентяями и прохиндеями? Зачастую это правда (иначе бы я не потратил четверть часа рабочего времени на написание этой истории). Несмотря на это, уважайте труд программиста — зачастую им ставят задачи из разряда «найти снеговика в Сахаре и привезти его живым», и многие справляются!

1497

Патриотичный порнобейсик

В конце восьмидесятых только-только начали появляться персональные компьютеры Д3-28 (ввод с магнитофонной кассеты), Электроника-60 (ввод с перфоленты), ДВК-2 (ввод с 5" дискеты аж на 360 КБ). И вот одна из наших кафедр закупила 3 ПК «Искра» (номера модификации уже не помню). Всё это происходило в период борьбы партии и народа с иностранщиной.

Так вот, в эти «Искры» был уже прошит бейсик на русском. Перевод был поразительным. INPUT — «вводим». Догадались, как будет END? Правильно, «кончаем».

Мы так эти «Искры» и прозвали: «Вводим-кончаем». Правда, проработали они у нас месяца три и поумирали (скончались?) Вместе с этим порнобейсиком отправили их на завод-изготовитель, и больше они к нам не возвращались.

1488

Быстрее, выше, правее

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

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

— PS/2-совместимая мышь (PS/2);
— Microsoft BallPoint трекбол (COM2).

На COM2 и висел мой девайс. Более того, выяснилось, что устройство помимо прочего бросает в COM-порт данные со встроенного акселерометра. Теперь всей конторой, подкручивая коэффициенты, пытаемся настроить его для игры в «сапёра».

1477

Русский код, бессмысленный и беспощадный

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

Подзывает как-то меня на паре одна из одногруппниц, которая не отличалась особым умом и сообразительностью. Показывает мне синенькое окошко Turbo Pascal и спрашивает: «Что делает эта программа?»

Смотрю код. Глаза у меня начинают округляться, а волосы вставать дыбом. Текст программы набран русскими буквами, причём о правильном синтаксисе не идёт и речи. Я не пойму, что происходит: то ли лыжи не едут, то ли со мной что-то не так. Ошалело спрашиваю: «Она компилируется?!» Девушка отвечает, что нет.

Говорю, что тут я ничем не могу помочь. Она тут же открывает еще один аналогичный кусок «кода» и снова спрашивает, что делает программа. Я, офигев окончательно, всё-таки нахожу в себе силы спросить:

— Кто же это написал?!
(гордо) Я!

1459

Машинный перевод

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

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

Работали в жёстком режиме месяц. Ели и спали мало. Силы уже подходили к концу, да и руководство давило так, что нервы не выдерживали. Я заметил, что один паренек не столь бледен, как остальной коллектив, а иногда даже умудряется фигнёй пострадать вместо разработки. Начал я его потихоньку пытать, как он всё успевает. Он долго, конечно, отнекивался, но я был настойчив.

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

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

1444

Сделайте выводы

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

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

Пишу, компилирую, всё в порядке, но результата нет. Это ясно — хоть когда-нибудь программа начинала работать с первого раза?.. Значит, где-то я накосячила. Лезу разбираться в код — всё ОК. Отлаживаю «step by step» — программа считает, но результата по прежнему нет!

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

printf(result);

Иногда ларчик открывается очень просто.

1430

Индийская гигиена

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

Структура программы была такова: имелось несколько форм, каждая с меню. По выбору пункта меню пользователь переходил на новую форму или возвращался на предыдущую. Прототип формы имел четыре основных метода: конструктор/деструктор и колбеки входа/выхода. Когда пользователь уходил «вглубь», формы не удалялись, а складывались в линейный стек, поскольку по задумке юзеру всё равно придётся через них возвращаться. Удаление форм и их ресурсов происходило при возврате назад по удалению из стека.

Баг заключался в том, что на одной из форм, если ее пройти несколько раз, меню увеличивалось, наполняясь дублирующимися пунктами. Оказалось, наполнение этого меню происходило не единожды, в конструкторе (как и везде по проекту), а каждый раз при заходе в форму. Я перенёс несколько строк — заработало на ура.

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

— Возвращаем как было, а по событию выхода просто очищаем меню.
— Да тут во всём проекте именно так! Меню по-любому очистится, когда форма из стека уйдет.
— Не знаю, как разработчики этой программы, но лично я подтираюсь после того, как сходил в туалет, а не перед тем, как сходить куда-либо ещё.

Это окончательно развеяло сомнения о вариантах фикса и означало многодневную переделку всех форм по проекту. В итоге заказчик сказал отдельное спасибо нашей команде за проделанную оптимизацию.