bash.im ithappens.me zadolba.li

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

10853

146% успеваемости

Когда я поступил в универ, стояли у нас 286-е с метром памяти на борту и дисководом на 360 КБ. А ещё был препод по вычислительной алгебре, который любил вносить ноу-хау в процесс обучения. Препод был хороший, как я теперь понимаю: и предмет любил, и к новинкам в виде ПК относился с уважением. Сам какой-то язык программирования выучил и наваял для нас тест. Один EXE-файл. Запускается, выдаёт вопрос и три варианта ответа. Вопросов было что-то около ста. Вопросы очень сложные, варианты ответов с подвохом. По окончании тестирования — окно с результатом. Причём в окне не было написано, на какой вопрос отвечал с ошибкой, только статистика, и предложение подписаться, если результат (оценка) устраивает. Нет — приходишь в следующий раз.

Кто спёр программу и как — история умалчивает, но разбирали её все. И все без результата. Вопросы и ответы не находились по телу экзешника никак. Было очевидно, где они, это проследили, но дальше они были хитро зашифрованы. Расшифровать, конечно, можно всё, но тогда мы были менее подкованы.

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

Далее совсем просто. Написали резидент, который перехватывал ввод и нажимал нужное. Как сейчас говорят, без палева: читаешь вопрос, типа, думаешь, нажимаешь кнопку варианта, но всё равно отвечает TSR. А совсем без палева — это лампочка Scroll Lock. Пока она включена, резидент перехватывает, нет — сам отвечаешь. Надо же не совсем уж 146 процентов показывать.

10842

Дожить до компиляции

Первые книги по программированию на Фортране попали на полки ленинградских книжных магазинов задолго до бума персоналок в восьмидесятых. Мой отец, который тогда учился в пятом классе, купил себе несколько таких книг, благо стоили какие-то копейки и дефицитом не были. И уподобился Аде Лавлейс, которой тоже не на чем было проверить собственноручно написанные программы.

Потом пришла эра самодельных «спектрумов». Но проверить свои программы на такой машине мой отец не смог: лень было переводить из Фортрана в Бейсик. А вскоре тетрадь потерялась.

Недавно мы её нашли. Молниеносно поставили G77 — странный программный пакет, автоматически переводящий программу из Фортрана в Си, а затем компилирующий входящей в комплект древней версией GCC, и всё это в DOSBox.
Программы из тетрадки вбиты, пора проверять. Несколько опечаток пришлось исправить. Работают!

А вот Ада Лавлейс проверку своих программ на практике увидела лишь с того света…

10829

С первого раза и десятой попытки

В конце 80-х в наш ВЦ в хорошем, крепком НИИ пришёл молодой чел в костюме, и, о боги, при галстухе. Потребовал аудиенции у начальника машины. Конклав начальников четырёх машин во главе с главным технологом почесал под белыми халатам на голое тело и поинтересовался:

— Какой именно машины?
— Самой мощной.

Начальник ПС-2000 скромно улыбнулся и поинтересовался: какого, собственно, нужно от суперкомпьютера?

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

— Вот, — сказал чел и показал какую-то папочку.

Ознакомившись с папочкой, конклав почесал под халатами ещё раз и отправил чела к начальнику всея ВЦ.

Через час меня, скромного техника первой категории, оторвали от приятного занятия — ремонта армянской станции по подготовке данных на ГМД — и вызвали пред высокие очи.

— Вот, — сказали высокие очи, — это краснодипломник мехмата. Решающий при написании диплома Очень Важную Задачу. Ну, во всяком случае, так выходит по его бумагам — писаны деканом, подписаны ректором. Разрешение на машинное время я ему дам. А ты, разгвоздяй, будешь ему ассистировать. И ещё раз предупреждаю: шорты не носить! А то волосатые ноги из-под халата…

— Окэ, босс.
— И не босс я тебе! А начальник. И этта: ПС-2000 я ему не дам. Ковыряйтесь на ЕСке.

В машинном зале ЕС-1055 чел сразу раскрыл дипломат с перфокартами, ринулся к ридеру и, загрузив на удивление невеликую колоду, жмякнул красную кнопку. Кнопка «Сброс», обрадованная таким вниманием, загорелась. Чел завопил нечленораздельно и кинулся к резервному ридеру…

— Стоять, Зорька!
— Вы не понимаете! Очень! Надо срочно посчитать! Очень! Колоссальные ресурсы нужны. Вам же начальник сказал. Только у вас в ВЦ. Потому что это очень! Самые мощные в городе ЭВМ. Нужно для народного хозяйства. Математическая модель…

Я внимательно слушал поток шизофазии. Через полчаса мне надоело.

— Так. Чувак. Тут такое дело. Нельзя в машину сувать всяку каку. Ручонки от аппаратуры убери. Карты свои спрячь.
— Но ведь чрезвычайно…
— У тебя это что на картах?
— Программа!
— Зашибись. Уже странслированная? А для какой машины и какой системы?
— ???
— В объектном коде?
— ???
— Исходник?
— Да-да! Я сам написал.
— А на чём?
— На Фортране.
— На каком?
— ???

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

— Вот. Этим трудом я руководствовался…
— Ага. Фортран-77. Только у нас его в системе нету. Не пишет у нас в НИИ на нём никто. Надо собрать сначала.

На следующий день собираю из объектников компилятор 77-го Фортрана. Гоняю предписанные тесты. Врывается чел.

— Я все понял! Я выбрал не тот язык реализации. Вот! Я всё переписал. На Си. И на всякий случай на Паскале.
— Э-э-э? Си у нас тоже нету. То есть совсем нету. Не пишет у нас никто на Си. И на Паскале, Бейсике, Алголе, Аде, кстати, тоже. Вот PL/1 есть. Фортран 66. Ассемблер/370. Давай свои давешние карточки. Сейчас будем компилять твой Фортран-77.
— Эээ… А я их выкинул. Но у меня есть блок-схема (достаёт тетрадку) и исходный текст (достаёт большую тетрадку). Вы же мне их пробьёте?
— Нет, дружок. Я отведу тебя к общаковым перфораторам. И ты пробьёшь это сам.
— Но я никогда…
— Пробьёшь-пробьёшь.

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

— Ну вот, дорогой друг. Теперь ты готов к запуску программы. Клади карты в ридер. Оператор запустит считывание. А я пойду покурю пока.

Так вышло, что задержался я после перекура. Прихожу через пару часов, а в машзале истерика. Чел бегает за оператором с криками:

— Ещё! Ещё раз! У меня всё правильно! Мне компилятор сказал!

А операторша от него улепётывает с визгом:

— Уберите! Уберите! Буйный!

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

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

Успокоенный оператор набрал на консоли START RDR UNIT=00E. Я приготовился понизить приоритет всем остальным задачам для освобождения всех восьми мегабайт ОЗУ. Ридер 00E сделал шшшшшварк и сожрал колоду. И сразу затарахтело АЦПУ, выдав какой-то непонятный график длиной метров тридцать.

— Э-э-э? — спросил я.
— Всё. — упавшим голосом сказал будущий аспирант. — Всё посчиталось… Уже…

Оторвал распечатку и ушёл. Больше в нашем ВЦ он не появлялся. Хотя красный диплом он, наверное, не совсем зря получил. Всё ж его программа, написанная на бумаге, после чистки опечаток правильно сработала с первого раза.

10824

По рукам, пока не поздно

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

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

В третьем проекте будем использовать некие абстрактные имена. Удачные функции вынесем в библиотеку, оставив в базовом модуле только специфические процедуры.

В четвёртом проекте подключаем библиотеку, пишем функциональность быстро и легко. Но что это? Где-то возникает странный глюк. Расставляем контрольные точки, пишем в логи запросы, ответы, сравниваем. Расковыриваем изящный код, раздёргивая его на промежуточные переменные. Ура, найдена причина! Интернет-эксплорер (ну конечно, кто бы мог подумать) при запросе передаёт некоторые параметры немного не так, как все остальные браузеры. Пишем патчи к библиотеке, добавляем проверки и подстановки, запускаем — победили! Отключаем пока логи, но когда-то изящный код теперь наполовину состоит из неочевидных по смыслу проверок, кучи промежуточных переменных и так далее.

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

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

— Так, вот тут мы дадим осмысленные имена, ведь у нас не какие-то абстрактные элементы, а баллоны с кислородом!

— А вот тут зачем так? Ведь все вычисления можно записать в одну строку!

— А почему здесь использованы примитивные IF — ELSE, ведь можно применить метод Лоренца — Шагенца для структурных инвариантов!

И хочется взять большую деревянную линейку — и по рукам ему, по рукам, пока не поздно…

10813

Сонный scaffolding

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

— Зачем ты дёргаешь этот метод? Он ещё не реализован!

10807

Пиксель к пикселю

Было это в 1993 году. Заканчивая ЛИТМО, я нашёл программистскую халтуру, чему был очень рад. Фирмочка, которая клепала «синклеры», продала штук тридцать в школу для компьютерного класса. Но школа поставила условие: с компьютерами должны быть две обучающие программы. Вот их мне и предстояло написать.

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

Выход был найден. На миллиметровке я нарисовал характерный силуэт Питера с названием фирмы сверху, разлиновал по 8 мм — и началась «оцифровка»! Закончилась, к слову, довольно быстро. И последнее извращение на закуску: чтоб не разбираться с графическим режимом, забил кусочки картинки в знакогенератор и вывел эту мозаику в текстовом режиме.

При сдаче заказчику на его восхищённое «Отсканировано?!» можно было небрежно бросить: «Ну да…»

10803

Внортонепоэфтрисампосмотри

В хорошем, крепком банке с конца восьмидесятых активно использовались несколько барабанных АЦПУ с интерфейсом ИРПР. А надо знать, что ИРПР — это штука хитрая и с привычным Centronix не особо совместимая. Поэтому к этому делу прилагался драйвер.

Изначально всё это было заточено под XT. К 93-му году экстишки себя совсем изжили и были переданы в филиалы райцентров, где после Robotron-1715, а кое-где и печатающих калькуляторов Elka-55 им сильно обрадовались. На смену заслуженным экстишкам пришли 286-е машины. Тут-то принтера и отвалились. Кооператив, который делал сопряжение интерфейсов, уже давно пукнул и испарился — разумеется, вместе с исходниками. Печатать сальдовки по сто метров надо. Оставшиеся экстишки отбирают в приказном порядке.

Давай разбираться, что не так. Тык-мык-тык-мык. Что первое в глаза бросается? Экстишка — 4,77 МГц, 286-ая — 12, а в турборежиме — 16. Перепаиваем кварц на экстишечный. Работает принтер. Значит, завязан на тактовую частоту и квитирование делает в зависимости от неё. Но кто ж позволит из работающей экстишки кварц попятить?

«Пишем драйвер», — говорит шеф. Пишем, чё! «За сутки управимся», — отвечаю я.

И тут выясняется, что спеков на ИРПР хоть чем жуй. А вот на ИРПР-М, он же Centronix, чё-то не видно нигде. Ну, пока всякие НИИ работали, можно было в их научных библиотеках покопаться. Или в какой ВЦ по старой дружбе заглянуть — спеки-то не секретные. Но на улице был 93 год, и почти всё уже загнулось и позакрывалось.

Хорошо, что драйвер был пару килобайт. Плохо, что в виде TSR-программки. Если что, Hiew и IDA появились заметно позже, а досовский debug дебагать TSR не очень умел. Даже хекс-режим «внортонепоэфтрисампосмотри», по-моему, ещё не появился. Поэтому сначала мы получили старую добрую распечатку хекс-дампа драйвера. Потом «дизассемблировали» карандашиком на бумажке. Нашли цикл задержки, который крутился в цикле управления квитированием, после чего рассчитали нужные значения для 12 МГц и попатчили драйвер. Найти под утро компилятор ассемблера тоже оказалось непростой задачей. Да и драйвер изначально не на ассемблере был писан. И мусорного кода было предостаточно.

Самое главное, что в цикле гонялось транспонирование каких-то мусорных матриц. Увеличение размеров матрицы и их количества позволило аналогично попатчить драйвер под 25, 33, 40 мегагерц. А вот, не приведи господи, считался бы там какой-нибудь факториал…

Потом появились 486 с кэшем, и всё накрылось тазом. Но к тому времени под рукой уже были и дебаггеры, и IDA, и компиляторы. И году в 96-м драйвер был-таки переписан.

10797

Полёт плюс-минус нормальный

Подводный истребитель, говорите? Ладно, протестировали, нашли багу с отрицательной высотой, спешно исправили, летаем дальше.

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

Какие бишь там ещё у нас координаты остались? Ага, долгота! И вот уже совсем недавно, в 2007 году, целая эскадрилья новейших истребителей (опять истребителей!) F-22 не смогла перелететь из США в Японию из-за непреодолимого препятствия — линии смены дат посреди Тихого океана.

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

10796

Иксы и игреки

Глаза слипаются. Четвёртый час ночи. Нужно дописать прогу и идти спать. Делов-то на пять минут — и о чём раньше думал? А всё эта лень. Ей нормально, а ты страдай потом.

Ну что уж там демагогию разводить… Накидал форму, написал код. Всё работает. Правда, как всегда, по-индусски: куча ненужных переменных, кривой код. Ну да ладно, зато форма яркая: всевозможные плюшки типа кнопочек, эдитов, лейблов и других никому не сдавшихся блэкджеков. Напоследок глянул форму. О, лишняя кнопка «Button 5». Удалил. Закрыл прогу. И перед самым выходом из системы мне на глаза попалась эта самая кнопка прямо в центре рабочего стола. Она яростно стучала в экран монитора с обратной стороны. Я наклонился к ней и отчётливо услышал вопрос.

— Для чего? — страдальчески кричала она. — Скажи мне, для чего всё это?

— Мне нужно было умножить X на Y, — ответил я.

Кнопка потупила взор и медленно скатилась по экрану вниз.

— Как же так? — прошептала она. — Икс и игрек? Не может быть.

Её глаза налились слезами, и сквозь них она продолжила:

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

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