bash.im ithappens.me zadolba.li

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

1877

Офлайн-отладчик «Морфей»

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

Уже наяву я добежал до работы и повторил всё, что сделал во сне. Бага, конечно, была на месте и правилась в точности так, как мне приснилось.

Всё-таки крутой процессор у нас в голове. На основе эмпирических данных сэмулировать в подсознании работу ОС, компилятора, отладчика, точки останова и watches, интегрирование системы дифуров и вывод в GUI... И при этом не тормозить!

1876

Стильная переработка

В восьмом классе у нас впервые появилась информатика, на которой мы изучали старый добрый QBasic. Во второй половине учебного года, когда мы уже освоили графику, было дано задание нарисовать на экране лабиринт и сделать так, чтобы компьютер мог найти из него выход, пользуясь «правилом правой руки».

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

Делов-то: скопипастил, позаменял в нужных местах иксы на игреки, и всё в ажуре. Но лень-матушка заставила меня поползать по папкам на жёстком диске и таки обнаружить эту же программу, выполненную кем-то в прошлом году. Там был немного другой лабиринт и дополнительные навороты, но меня интересовали лишь те строки кода, которые описывали необходимые мне движения.

Сидели мы за компами по двое. Партнёр мой разбирался в программировании не лучше, чем в любом другом предмете (то есть весьма посредственно), поэтому обычно всю работу делал я. Так вот, нашёл я эту прогу прошлогоднюю и тотчас же поделился с напарником радостью. Проходивший мимо учитель услышал и заявил, чтобы мы даже не думали сдавать ему прошлогодний код — дескать, он легко отличит его от нашего по стилю. Мой партнёр слегка встревожился. Я подождал, пока учитель отойдет, скопировал нужные строчки кода и подогнал их под свой стиль. Программа была сдана успешно.

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

1874

Этанол как ускоритель интерпретации кода

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

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

— У вас тут выход за пределы массива, молодой человек. Переделать!

Профессиональные программисты-преподаватели настолько суровы, что даже пьяными в лёгкую стелечку проверяют домашки на скорости компилятора.

1839

О гуманности эвтаназии

Третий день непрерывного кодинга в VS 2008; параллельно готовлюсь к экзамену по философии. Далеко не в первый раз перезапускаю прогу с целью выловить мелкий зловредный бажок. Программа останавливается на точке, бажок обнаружен. Внезапно рождается мысль:

— Если программа завершила выполнение стандартно, она умирает своей смертью, и это правильно;
— Если программу остановить Stop debugging'ом во время выполнения, это убийство, и это аморально;
— Если же остановить программу во время паузы выполнения, она умрёт во сне, и это достаточно гуманно.

1814

Товары и услуги не предлагать

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

Без задней мысли сохраняю исходник и начинаю в том же проекте трудиться над новым методом (с этими проектами в Visual C++ такая фигня — кто кодил, тот поймёт). Что-то написал, сохранил — как оказалось, в свежий исходник с полным перебором. Ну думаю, кранты мне: опять то же самое переделывать — застрелиться можно. К счастью, друг выручил: я ему этот исходник по доброте душевной переслал перед началом работы над вторым.

Сижу, плачусь ему в жилетку, пока он пересылает мой код обратно. Через две секунды после окончания пересылки файла скачок напряжения — и света нет во всей квартире.

Вот сижу я сейчас и думаю: то ли меня кто-то не любит, то ли коммивояжёр кому-то в своё время сильно насолил.

1804

За границей график ходит хмуро

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

Первая произошла ровно год назад. Весь семестр проплевав в потолок, являюсь на зачёт. Задача — аппроксимация функции и вывод графика на дисплей. Беру чужой код и пытаюсь разобраться, через минуту понимаю бессмысленность этого занятия и пробую сдать на удачу. Оказывается, график сваливается в левом конце отрезка в минус бесконечность (надо сказать, что концевые условия задавались другим методом, нежели приближение на всем отрезке). Пару часов медитирую — просветления так и не приходит. Решаюсь на кардинальный шаг: оставляя вывод на экран отрезка от –10 до 10, меняю расчеты на промежуток от -12 до 12 — таким образом проблемная часть просто остается «за кадром». Успешно сдаю программу преподавателю, отличающемуся лояльностью и не занимающемуся такой ерундой, как просмотр исходников.

Вторая произошла уже в эту сессию. Опять пытаюсь сдавать чужой код (на этот раз интегрирование функций), однако возникает новая проблема — в простейшем случае погрешность должна равняться нулю, у меня же получается расхождение в одну тысячную. Непорядок! На этот раз решение приходит почти мгновенно: перед выводом на экран я принудительно устанавливаю нулевую погрешность.

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

1766

Добавь экрану яркости тряпкой средней мягкости

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

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ...

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

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

1747

Армейский способ

Недавно получили субподряд на разработку софта для армии — точнее, одного маленького модуля, который не смог реализовать главный подрядчик. Задачка из области баллистики представляла собой систему дифуров. Адаптируем простейший численный алгоритм — контрольные примеры не сходится. Меняем метод на более точный — требуемая точность не достигнута. Коллеги умывают руки.

Матерясь, поднимаю учебник по вышке и решаю аналитически. Барабанная дробь... Решение недостаточно точное. Прошу проверить контрольные примеры — говорят, всё точно. Прошу при мне пересчитать пример, и что же вижу? Старые советские таблицы коэффициентов. Объяснить, что наше решение точнее, не вышло.

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

1708

Обфускация: вводный курс

На первом курсе мы занимались моделированием простеньких физических систем. Очередным заданием было смоделировать колебание маятника и получить петлю гистерезиса. Задание я выполнил за пару, все работало в моём понимании как нужно — понёс сдавать. Преподаватель посмотрел на работу программки, открыл код и, быстренько прокрутив колёсиком, заявил, что у меня не хватает зависимости от массы. Моё разочарование было настолько сильным, что я и не подумал расспросить более конкретно, о чём идет речь.

В течение недели я пыхтел над кодом, всматриваясь в каждую строку и пытаясь понять, о чём шла речь и что не так. На очередном занятии я всё же решил спросить препода, что имелось в виду? Он мне рассказал о том, как нужно писать код: оказывается, «зависимость от массы» — некий кусок той математической формулы, которую я использовал; от меня требовалось добавить комментарий и выписать этот кусок на отдельной строке.

Требуемые операции были сделаны, и я с полной увереностью понес сдавать прогу, но история повторилась. Препод запускает прогу, смотрит на её безупречную работу, открывает код, мельком просматривает и заявляет, что у меня не хватает обособленного куска программы.

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

Каждую неделю до конца семестра я дописывал по «болванке». Код финального варианта программы увеличился раз в пять по сравнению с начальным и оброс густыми ненужными комментариями. Преподаватель, окинув взглядом объём, наконец заявил, что теперь программу примет. Так меня учили индийскому программированию.