13 November 2019

Байки из склепа (из 40 лет работы программиста)

ProgrammingHistory of ITBiography of geeks
С ЭВМ (слово компьютер тогда не было в ходу) я столкнулся в году 1977, просто курс такой был на мехмате. Fortran IV, коды М-20, Algol-60, PL/1, сразу после универа попал в программисты (системные программисты!), и пошло-поехало…

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

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

#1


«Метки в Фортране определяются по номерам. Например, можно написать GOTO 21. Хи-хи-хи-хи.» — почти всё, что я могу вспомнить про изучение Фортрана. С первого представления он (FORTRAN IV) мне не полюбился. Интерес появился значительно позже, когда я с некоторым удивлением увидел, что большинство его операторов один-в-один реализованы в командах многих процессоров. Почему он, собственно, и был долгое время абсолютным лидером по скорости трансляции («компиляции» тогда не говорили, да и не было её, по сути) и скорости выполнения.

#2


— Незачёт.
— Почему?
— У вас ошибка в программе.
— Ну, как же, результат же правильный?
— Да, но в программе ошибка. Она даже транслироваться не должна
— Но сообщений об ошибке трансляции нет, и результат правильный — нет же ошибки?
— Этого не может быть.
— Мы что, распечатку от руки нарисовали?
— Нну, да, видно, всё правильно. То есть — неправильно! Присваивание в Алголе делается через :=, а у вас просто знак равенства, это сравнение. Да и здесь, и здесь — программа просто не может транслироваться.
— Но трансляцию прошло и результат верный!

Забавный диалог был нами спровоцирован. Символ «возврат каретки» в середине строки приводил к тому, что часть строки до него на печать не выводилась. Так что в распечатке было то, что на самом деле являлось комментарием. Транслятор же (ТА-1М на БЭСМ-4) управляющие символы игнорировал и обрабатывал настоящий исходный текст. Для создания эффекта достаточно было вырезать бритвенным лезвием несколько дополнительных отверстий в перфокарте, чтобы пробел превратился в CR.

В конце-концов нас вызвали в деканат и сделали внушение. Не мы были первооткрывателями прикола, и не только мы были новичками в программировании. К некоторым преподавателям это тоже относилось, по тем временам ничуть не удивительно.
А, и да — зачёт мы всё же получили.

#3


Сразу после универа распределение в СоюзЭВМкомплекс, системным программистом.

Работа была в основном такая:
Установка операционных систем на ЕС ЭВМ. Стоило это, кстати, недёшево, 2000 стоила сама ОС и 640рублей — установка. При всех кривостях тогдашнего курса рубля для понимания можно принять порядок тех же цен в долларах. Понятно становится, почему тогдашние производители ОС так не залюбили Гейтса с его продажами ОС вдесятеро дешевле.

Помощь программистам на разных ВЦ в поиске и исправлении ошибок в программах. На разных языках, включая, скажем, COBOL, которого я, по сути, не знал, и BASIC, которого и знать не хочу.

Помощь электронщикам в поиске неисправностей.

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

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

Набираешь следующий адрес, следующее значение…



Видите снизу чёрные наборные колёса? Вот там, по hex-цифре, и накручиваешь. Благо, программки были коротенькие, в сотню, редко больше, байт.

На случай, когда нужно было размножить или распечать колоду перфокарт на машине без ОС, приберегались «три карты». Замечательная программа из 240 байт. Закладываешь три перфокарты в считыватель, загружаешься с них. Если карты шли в одном порядке — следующая за ними колода шла на распечатку. В другом — на копирование на «бармалей», перфокарточный вывод. В третьем — считалось, что колода содержит программу в бинарном виде, которая и запускалась. Это были не три разных программы! Выбросить какую-либо из карт ни в одном варианте было нельзя.

#4


Отказов было много, например, с дисками.

Накопитель ЕС-5061


Крутил этот накопитель пакет дисков ёмкостью 29мб:



11 дисков, 20 рабочих поверхностей (верхняя и нижняя поверхности не используются).

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

Ночная смена. Засбоил диск. Оператор меняет местами пакеты в двух дисководах. Обычно это помогало, но теперь засбоили оба. Что ж, на этот случай есть пакет с копией данных, на полке стоит. Снимает сбоящий, ставит запасной — не читается! Ставит другие пакеты, пытается перейти к другой задаче — нет, ничего не читается.

Наконец, наступает утро, приходит остальной персонал. Начинают разбирать и разбираться. Неведомым способом (везде стояли фильтры) в пакет заполз таракан. И попал между пакетом и головкой. Головка ударила по пакету и «задралась», сделав изрядную выбоину в пластине. После перестановок битая пластина портила головку на очередном дисководе, а битая головка портила очередную пластину.

К утру получился сущий разгром: несколько считывающих/записывающих головок, штук пять или больше (не помню) пакетов — испорчено. Убыток на 2500 рублей, которые пытались навесить на бедную женщину-оператора с зарплатой меньше 100 руб. Но как-то всё удалось спустить на тормозах.

#5


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

#6


Обслуживал я ВЦ завода в Таганроге. Таскался с дистрибутивом ОС (две катушки магнитной ленты по 30см в диаметре, 20мб и весом по килограмму, наверно) ну, и распечатки исходников программ, которые там писали, чтобы дома разобраться с ошибками, которые просили найти. А проходная жёсткая… пришлось ВЦ выправлять мне пропуск на «проходную генерального директора». Всё равно, к распечаткам придирались нещадно. По глупости я попробовал объяснить, что распечатки — тьфу, вот ленты, это да, я весь завод могу на них вынести. Чуть было не добился того, что меня вообще перестали пускать — в последний момент всё же сообразил и остановился.

#7


Наступили, наконец, времена ПК. Работал я на Роботроне-1715.
Восьмиразрядный, на СРМ, но хороший, качественный, не чета нашим Искрам.

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

#8


На том самом роботроне начал я писать складскую задачу. И сделать бы её на паскале — нет же, повёлся на новизну, на модную в то время dBaseII. Это та самая «СУБД», из которой выросли кое-где ещё живые FoxBase и Clipper. Всё бы ничего, но файлы с таблицами были чисто текстовыми, потому занимали кучу места (зато переносимость!).

Менять платформу было уже и нельзя, а заказчики требовали увеличить размер базы, хоть тресни. А куда его на дискете увеличивать? Стал делать библиотеку, нечто вроде ZIP c UUCP в одном флаконе. Причём так, чтобы структуру файла не ломать. И — написал же, её даже в московском представительстве Nantucket (производителя Clipper'a) рассматривали (возможно, конечно, просто из вежливости).

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

#9


И снова дискеты. 5", 40 дорожек, 128кб (меня поправили, 110кб). Пишу программу, передаю заказчику (который за Полярным кругом, между прочим). Процесс идёт, они на ходу правят постановку, я на ходу правлю баги, всё как обычно.

Но прогресс не стоит на месте, мне ставят 80-дорожечный флоповод. Ура, 256кб (тоже поправили, 360кб)! Но только для себя, у заказчиков флоповоды старые. И началось… правлю программу, передаю заказчику — не работает. Правлю, отсылаю, не работает, причём ошибки старые как были, так и остались. Сто раз перепроверяю — всё ОК. Даже съездил в командировку туда, за Полярный круг. Действительно, у них работает версия «времён очаковских и покоренья Крыма», хотя дискета — та самая, что я передавал. Чудеса!

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



#10


Время шло, подзабыл уже dBase и задачи учётно-бухгалтерского типа (всю жизнь их не любил, хотя они и честно кормили меня лет семь). Да и вообще расту, пишу уже на С (нет, не С++ ещё) под MSC 6.0 (нет, нет, не MS Visual C).

И — дежавю.

Пишу программу, отдаю заказчикам — ошибка. Делаю отладочную сборку, гоняю в хвост и в гриву — всё в полном порядке. Дошло до того, что тряхнул стариной, полез в коды и дампы. Оказалось, передавал short параметр в функцию. Short в то время был 16-разрядным. А в стеке под параметр выделялось всё равно 32 разряда, слово. И, трам-тарарам, в релизе short писался в одну половину слова, а в дебаге — в другую. А читался всегда из одной и той же половины. Так что в дебаге параметр передавался правильно, а в релизе какой-то мусор.

#11


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

#12


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

Как положено, памяти нужно было много. О гигабайтах оперативки мечтать не приходилось, куда там, ещё работало «640k ought to be enough for anybody». Адресное пространство 1мб, а собственно памяти те самые 640к.

Пришла в голову идея: использовать память графического адаптера VGA, она ведь отображалась на общее адресное пространство. Сказано — сделано. Целых 256к добавки! Для скорости отображение отключалось, иначе из-за синхронизации с отображением работало крайне медленно.

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

#13


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



Были и попроще, например, переворачиватель:



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

#14


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

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



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


Дополню, ещё одна байка вспомнилась по ходу комментирования

#15

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

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

#16

Вот же, ещё вспомнил!
Когда персоналки появились, но были крайне редки, несколько человек повадилось ко мне домой ходить, чтобы то почту свою отослать, то распечатать что-нибудь. Отказывать как-то было неудобно, но вскоре это превратилось просто в наказание — стали ходить, как к себе, будто я им теперь обязан.
Но однажды я приобрёл почти мечту:
клавиатуру MS Natural. Ещё ту, первую, настоящую. Сделано в Мексике, как все классные железки от MS. Естественно, без русских букв. Люди были за границей, купили, чтобы тут дорого продать. Комп продали, а клавиатуру никто не берёт. Так что досталась она мне очень дёшево, хотя MS Natural стоила преизрядно.

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



И несколько не моих, выбрано из комментариев, чтобы было вместе:

#17

DrPass рассказал:
Вспомнил свою историю 20-летней давности, как раз про переворачиватель, первое апреля и терпеливость. Отправил тогда я подруге такую программу, ну вернее, не программу, а SFX-архив с отсканированными фотографиями. Фотографии там действительно были, а SFX-модуль был фейковым. Разжимать он ничего не разжимал (ему и не требовалось, фотки в JPEG я просто как есть ему в ресурсы пришпилил), но кроме фоток из ресурсов он ещё вытаскивал и писал в автозагрузку программу, которая переворачивает экран и трясёт на нём окна. Выключалось это дело просто, по ESC. Ну, позвонила мне, посмеялись, уже и забыл. Где-то через полгода, уже когда листья падали, она у меня спросила, когда я уберу эту гадость с её компьютера.

#18

Jef239 рассказал:
Давайте я лучше про совок расскажу. Душанбе, служба «09» (телефонная справочная), те самые RP на 29 мегов, год примерно 1980ый. Душанбе отличается тем, что пару раз в день идет переключение подводящих электричество кабелей (как в Питере на Ваське) + периодически просто отключения электричества.
Конденсаторы в дисководах старые при отключении могут головку выдернуть, а могут не выдернуть. А головки в этих дисках парящие, с крылышками. Если диск остановится — головка падает на диск и чертит по нему царапину. Ну не такую, как таракан, но все равно читаться не будет.
Между комнатой инженеров и дискозалом — широченный проход. При мигании света инженеры гурьбой влетают в дискозал и выдергивают головки из дисков. Причем кто какой диск — заранее расписано и отработано.

#19

toivo61 рассказал:
А наши барышни развлекались тестом на изящество… Ленты были условно ЕСовские и СМовские (вдвое меньше). Так вот барышня считалась изящной, если могла застегнуть на талии «ремешок» от СМовской ленты. :-)
Примечание от Bedal: как раз на талии 60 — застёгивалось.

#20

tiger_sc рассказал:
Из программистского, помню, сделал баг-2001. Программка одна работала два года и вдруг перестала. Полез дебажить — оказалось, что в одном месте надо было из полной даты вырезать последние два знака года, а из-за ошибки вырезались не 3-4 знаки, а 2-3. В итоге в 1999 году программа отрабатывала корректно, в 2000 тоже и только в 2001-м баг всплыл.
Tags:программированиевоспоминаниябайки
Hubs: Programming History of IT Biography of geeks
+163
71.6k 152
Comments 376