С ЭВМ (слово компьютер тогда не было в ходу) я столкнулся в году 1977, просто курс такой был на мехмате. Fortran IV, коды М-20, Algol-60, PL/1, сразу после универа попал в программисты (системные программисты!), и пошло-поехало…
А несколько лет назад я активно кодировать вообще перестал, только скрипты для себя, теперь ставлю задачи перед группой программёров.
Как бы то ни было, за это время было некоторое количество забавных и/или интересных (ну, по крайней мере запомнившихся) историй, почитать которые и приглашаю под кат. Истории не обязательно строго про программирование, больше про жизнь программиста.
«Метки в Фортране определяются по номерам. Например, можно написать GOTO 21. Хи-хи-хи-хи.» — почти всё, что я могу вспомнить про изучение Фортрана. С первого представления он (FORTRAN IV) мне не полюбился. Интерес появился значительно позже, когда я с некоторым удивлением увидел, что большинство его операторов один-в-один реализованы в командах многих процессоров. Почему он, собственно, и был долгое время абсолютным лидером по скорости трансляции («компиляции» тогда не говорили, да и не было её, по сути) и скорости выполнения.
— Незачёт.
— Почему?
— У вас ошибка в программе.
— Ну, как же, результат же правильный?
— Да, но в программе ошибка. Она даже транслироваться не должна
— Но сообщений об ошибке трансляции нет, и результат правильный — нет же ошибки?
— Этого не может быть.
— Мы что, распечатку от руки нарисовали?
— Нну, да, видно, всё правильно. То есть — неправильно! Присваивание в Алголе делается через :=, а у вас просто знак равенства, это сравнение. Да и здесь, и здесь — программа просто не может транслироваться.
— Но трансляцию прошло и результат верный!
…
Забавный диалог был нами спровоцирован. Символ «возврат каретки» в середине строки приводил к тому, что часть строки до него на печать не выводилась. Так что в распечатке было то, что на самом деле являлось комментарием. Транслятор же (ТА-1М на БЭСМ-4) управляющие символы игнорировал и обрабатывал настоящий исходный текст. Для создания эффекта достаточно было вырезать бритвенным лезвием несколько дополнительных отверстий в перфокарте, чтобы пробел превратился в CR.
В конце-концов нас вызвали в деканат и сделали внушение. Не мы были первооткрывателями прикола, и не только мы были новичками в программировании. К некоторым преподавателям это тоже относилось, по тем временам ничуть не удивительно.
А, и да — зачёт мы всё же получили.
Ночная смена. Засбоил диск. Оператор меняет местами пакеты в двух дисководах. Обычно это помогало, но теперь засбоили оба. Что ж, на этот случай есть пакет с копией данных, на полке стоит. Снимает сбоящий, ставит запасной — не читается! Ставит другие пакеты, пытается перейти к другой задаче — нет, ничего не читается.
Наконец, наступает утро, приходит остальной персонал. Начинают разбирать и разбираться. Неведомым способом (везде стояли фильтры) в пакет заполз таракан. И попал между пакетом и головкой. Головка ударила по пакету и «задралась», сделав изрядную выбоину в пластине. После перестановок битая пластина портила головку на очередном дисководе, а битая головка портила очередную пластину.
К утру получился сущий разгром: несколько считывающих/записывающих головок, штук пять или больше (не помню) пакетов — испорчено. Убыток на 2500 рублей, которые пытались навесить на бедную женщину-оператора с зарплатой меньше 100 руб. Но как-то всё удалось спустить на тормозах.
Вот только помещение отапливалось, мягко говоря, плохо. Зимой приходишь утром — в графине ледок плавает. Роботрон, пока не прогреется, сыпал случайные символы от клавиатуры в бешеном темпе. Попробовал пошутить, что так он на спутник всё передаёт — нашёлся человек, который поверил :-) В любом случае рабочий день начинался с того, что я часа полтора бил баклуши, пил чай, грелся и ждал, когда прогреется комп.
Менять платформу было уже и нельзя, а заказчики требовали увеличить размер базы, хоть тресни. А куда его на дискете увеличивать? Стал делать библиотеку, нечто вроде ZIP c UUCP в одном флаконе. Причём так, чтобы структуру файла не ломать. И — написал же, её даже в московском представительстве Nuntacket (производители Clipper'a) рассматривали (возможно, конечно, просто из вежливости).
Да-а, так вот: почти точно в день, когда я полностью всё отладил и готов был выдать этот вариант на заказчика, к нам приехал первый винчестер на 5 мегабайт.
Но прогресс не стоит на месте, мне ставят 80-дорожечный флоповод. Ура, 256кб! Но только для себя, у заказчиков флоповоды старые. И началось… правлю программу, передаю заказчику — не работает. Правлю, отсылаю, не работает, причём ошибки старые как были, так и остались. Сто раз перепроверяю — всё ОК. Даже съездил в командировку туда, за Полярный круг. Действительно, у них работает версия «времён очаковских и покоренья Крыма», хотя дискета — та самая, что я передавал. Чудеса!
Но разобрался, конечно. В режиме 40-дорожечной записи 80-дорожечный флоповод писал только 40 дорожек, но головка-то у него меньше, и ширина записываемой дорожки была намного уже. У заказчика 40-дорожечный флоповод читал широкую дорожку, игнорировал узкую новомодную запись, а брал старую информацию, записанную черт-те когда.
Вот, даже картинку нарисовал — что получалось:
И — дежавю.
Пишу программу, отдаю заказчикам — ошибка. Делаю отладочную сборку, гоняю в хвост и в гриву — всё в полном порядке. Дошло до того, что тряхнул стариной, полез в коды и дампы. Оказалось, передавал short параметр в функцию. Short в то время был 16-разрядным. А в стеке под параметр выделялось всё равно 32 разряда, слово. И, трам-тарарам, в релизе short писался в одну половину слова, а в дебаге — в другую. А читался всегда из одной и той же половины. Так что в дебаге параметр передавался правильно, а в релизе какой-то мусор.
Делаю очередной вариант для очередной конторы. Выдаю отчёт. Радуются, что заработало, но просят «проводку номер 8». Ну, расспрашиваю, что это такое, подправляю отчёт. Радуются — удобно, красиво, лучше, чем по бумаге… «но где же проводка номер 8». Уж как я только не изгалялся — нет, не то. Наконец, потеряв терпение, взял почти самый старый, простой и потому быстрый вариант и крупно написал сверху «Проводка №8» самым крупным шрифтом, который позволял тогдашний (матричный) принтер.
— Наконец-то, спасибо вам огромное, мы очень рады!
Я-то тоже рад, сроки сдачи ведь уже совсем на носу. И только позже соображаю, что не надо умничать лишнего, нужно делать нечто, что будет работать в технологии. И ещё: надо не просто слушать заказчика, а самому изучить предметную область, если хочешь сделать хорошо.
Как положено, памяти нужно было много. О гигабайтах оперативки мечтать не приходилось, куда там, ещё работало «640k ought to be enough for anybody». Адресное пространство 1мб, а собственно памяти те самые 640к.
Пришла в голову идея: использовать память графического адаптера VGA, она ведь отображалась на общее адресное пространство. Сказано — сделано. Целых 256к добавки! Для скорости отображение отключалось, иначе из-за синхронизации с отображением работало крайне медленно.
А иногда и не отключалось, потому что было чертовски интересно смотреть, как экран по мере обучения из чёрного становился серым, формировались побежалости и переливы, которые со временем стекались в яркие пятна решений. Много народа приходило посмотреть на то, «как машина думает».
Были и попроще, например, переворачиватель:
В какой-то момент по конторе он и расползся. Отовсюду зовут на помощь меня, как бывшего системщика. Ну, хожу, лечу машины. Подлечив окружающих, на всякий случай иду в самое тихое место, куда и не звали. На удивление, это бухгалтерия. Оказывается, женщины не стали заморачиваться: они перевернули мониторы вверх ногами и спокойно продолжали работать.
Знаю, знаю, многие встречали аналогичное описание в виде анекдота. Так вот: иногда это было чистой правдой.
Когда появились оптические мыши, неплохо работало заклеивание окна оптики кусочком красной изоленты. Мышка перестаёт работать, а посмотришь снизу — вроде всё нормально, красненьким светится, как всегда.
Собственно, всё. Про недавние времена рассказывать нет смысла, недавние-то всем знакомы, что там говорить. Да и, признаться, программист я уже кавычечный. Так, для себя скрипты иногда пишу. Ставлю задачи для группы ребят помоложе.
А несколько лет назад я активно кодировать вообще перестал, только скрипты для себя, теперь ставлю задачи перед группой программёров.
Как бы то ни было, за это время было некоторое количество забавных и/или интересных (ну, по крайней мере запомнившихся) историй, почитать которые и приглашаю под кат. Истории не обязательно строго про программирование, больше про жизнь программиста.
#1
«Метки в Фортране определяются по номерам. Например, можно написать GOTO 21. Хи-хи-хи-хи.» — почти всё, что я могу вспомнить про изучение Фортрана. С первого представления он (FORTRAN IV) мне не полюбился. Интерес появился значительно позже, когда я с некоторым удивлением увидел, что большинство его операторов один-в-один реализованы в командах многих процессоров. Почему он, собственно, и был долгое время абсолютным лидером по скорости трансляции («компиляции» тогда не говорили, да и не было её, по сути) и скорости выполнения.
#2
— Незачёт.
— Почему?
— У вас ошибка в программе.
— Ну, как же, результат же правильный?
— Да, но в программе ошибка. Она даже транслироваться не должна
— Но сообщений об ошибке трансляции нет, и результат правильный — нет же ошибки?
— Этого не может быть.
— Мы что, распечатку от руки нарисовали?
— Нну, да, видно, всё правильно. То есть — неправильно! Присваивание в Алголе делается через :=, а у вас просто знак равенства, это сравнение. Да и здесь, и здесь — программа просто не может транслироваться.
— Но трансляцию прошло и результат верный!
…
Забавный диалог был нами спровоцирован. Символ «возврат каретки» в середине строки приводил к тому, что часть строки до него на печать не выводилась. Так что в распечатке было то, что на самом деле являлось комментарием. Транслятор же (ТА-1М на БЭСМ-4) управляющие символы игнорировал и обрабатывал настоящий исходный текст. Для создания эффекта достаточно было вырезать бритвенным лезвием несколько дополнительных отверстий в перфокарте, чтобы пробел превратился в CR.
В конце-концов нас вызвали в деканат и сделали внушение. Не мы были первооткрывателями прикола, и не только мы были новичками в программировании. К некоторым преподавателям это тоже относилось, по тем временам ничуть не удивительно.
А, и да — зачёт мы всё же получили.
#3
Сразу после универа распределение в СоюзЭВМкомплекс, системным программистом.Работа была в основном такая:
Установка операционных систем на ЕС ЭВМ. Стоило это, кстати, недёшево, 2000 стоила сама ОС и 640рублей — установка. При всех кривостях тогдашнего курса рубля для понимания можно принять порядок тех же цен в долларах. Понятно становится, почему тогдашние производители ОС так не залюбили Гейтса с его продажами ОС вдесятеро дешевле.
Помощь программистам на разных ВЦ в поиске и исправлении ошибок в программах. На разных языках, включая, скажем, COBOL, которого я, по сути, не знал, и BASIC, которого и знать не хочу.
Помощь электронщикам в поиске неисправностей.
Последнее требовалось нередко. ЕС ЭВМ была не только глючной, но и многопроцессорной системой. Ввод-вывод делался отдельными процессорами (в виде отдельных шкафов) со своими системами команд и, соответственно, своими «канальными» программами. При неисправностях нужно было ещё разобраться, что именно врёт: устройство, канальный процессор или главный.
Канальные программы, ессно, были частью ОС, но для поиска неисправности нужно было уметь запускать и свои. Стандартные можно было загрузить с диска (специального диагностического). Но он мог и не работать. Тогда — с магнитной ленты. На худой конец, с перфокарт.
Помощь программистам на разных ВЦ в поиске и исправлении ошибок в программах. На разных языках, включая, скажем, COBOL, которого я, по сути, не знал, и BASIC, которого и знать не хочу.
Помощь электронщикам в поиске неисправностей.
Последнее требовалось нередко. ЕС ЭВМ была не только глючной, но и многопроцессорной системой. Ввод-вывод делался отдельными процессорами (в виде отдельных шкафов) со своими системами команд и, соответственно, своими «канальными» программами. При неисправностях нужно было ещё разобраться, что именно врёт: устройство, канальный процессор или главный.
Канальные программы, ессно, были частью ОС, но для поиска неисправности нужно было уметь запускать и свои. Стандартные можно было загрузить с диска (специального диагностического). Но он мог и не работать. Тогда — с магнитной ленты. На худой конец, с перфокарт.
В самых непонятных случаях приходилось тупо забивать небольшие программы в память с пульта
На случай, когда нужно было размножить или распечать колоду перфокарт на машине без ОС, приберегались «три карты». Замечательная программа из 240 байт. Закладываешь три перфокарты в считыватель, загружаешься с них. Если карты шли в одном порядке — следующая за ними колода шла на распечатку. В другом — на копирование на «бармалей», перфокарточный вывод. В третьем — считалось, что колода содержит программу в бинарном виде, которая и запускалась. Это были не три разных программы! Выбросить какую-либо из карт ни в одном варианте было нельзя. Пишешь программу в кодах канальных программ.
Набираешь переключателями на «морде» адрес в памяти, набираешь значение байта.
Набираешь значение адресуемого байта, записываешь.
Набираешь следующий адрес, следующее значение…
Видите снизу чёрные наборные колёса? Вот там, по hex-цифре, и накручиваешь. Благо, программки были коротенькие, в сотню, редко больше, байт.
Набираешь переключателями на «морде» адрес в памяти, набираешь значение байта.
Набираешь значение адресуемого байта, записываешь.
Набираешь следующий адрес, следующее значение…
Видите снизу чёрные наборные колёса? Вот там, по hex-цифре, и накручиваешь. Благо, программки были коротенькие, в сотню, редко больше, байт.
#4
Отказов было много, например, с дисками.Накопитель ЕС-5061
Крутил этот накопитель пакет дисков ёмкостью 29мб:
11 дисков, 20 рабочих поверхностей (верхняя и нижняя поверхности не используются).
Пакет был в пластиковом кожухе, вставлялся в дисковод, после чего кожух вынимался. Для понимания дальнейшего эти подробности имеют значение.
Нередким было, что пакет в данном конкретном дисководе не читался, а в соседнем — читался нормально. Появлялась привычка, если что, переставлять пакет в другой дисковод. Что и привело к следующей истории:Крутил этот накопитель пакет дисков ёмкостью 29мб:
11 дисков, 20 рабочих поверхностей (верхняя и нижняя поверхности не используются).
Пакет был в пластиковом кожухе, вставлялся в дисковод, после чего кожух вынимался. Для понимания дальнейшего эти подробности имеют значение.
Ночная смена. Засбоил диск. Оператор меняет местами пакеты в двух дисководах. Обычно это помогало, но теперь засбоили оба. Что ж, на этот случай есть пакет с копией данных, на полке стоит. Снимает сбоящий, ставит запасной — не читается! Ставит другие пакеты, пытается перейти к другой задаче — нет, ничего не читается.
Наконец, наступает утро, приходит остальной персонал. Начинают разбирать и разбираться. Неведомым способом (везде стояли фильтры) в пакет заполз таракан. И попал между пакетом и головкой. Головка ударила по пакету и «задралась», сделав изрядную выбоину в пластине. После перестановок битая пластина портила головку на очередном дисководе, а битая головка портила очередную пластину.
К утру получился сущий разгром: несколько считывающих/записывающих головок, штук пять или больше (не помню) пакетов — испорчено. Убыток на 2500 рублей, которые пытались навесить на бедную женщину-оператора с зарплатой меньше 100 руб. Но как-то всё удалось спустить на тормозах.
#5
Приближались 80-е, в число дефицитов попала бумага. На некоторых ВЦ дело обстояло настолько остро, что распечатки после исследования (поиска ошибок в программе или просмотра результатов работы) собирали, аккуратно собирали по линиям разрыва, склеивали — и снова пускали в работу для печати с обратной стороны. Ставить на распечатку чай или там бутерброд считалось невежливым.#6
Обслуживал я ВЦ завода в Таганроге. Таскался с дистрибутивом ОС (две катушки магнитной ленты по 30см в диаметре, 20мб и весом по килограмму, наверно) ну, и распечатки исходников программ, которые там писали, чтобы дома разобраться с ошибками, которые просили найти. А проходная жёсткая… пришлось ВЦ выправлять мне пропуск на «проходную генерального директора». Всё равно, к распечаткам придирались нещадно. По глупости я попробовал объяснить, что распечатки — тьфу, вот ленты, это да, я весь завод могу на них вынести. Чуть было не добился того, что меня вообще перестали пускать — в последний момент всё же сообразил и остановился.#7
Наступили, наконец, времена ПК. Работал я на Роботроне-1715. Восьмиразрядный, на СРМ, но хороший, качественный, не чета нашим Искрам.Вот только помещение отапливалось, мягко говоря, плохо. Зимой приходишь утром — в графине ледок плавает. Роботрон, пока не прогреется, сыпал случайные символы от клавиатуры в бешеном темпе. Попробовал пошутить, что так он на спутник всё передаёт — нашёлся человек, который поверил :-) В любом случае рабочий день начинался с того, что я часа полтора бил баклуши, пил чай, грелся и ждал, когда прогреется комп.
#8
На том самом роботроне начал я писать складскую задачу. И сделать бы её на паскале — нет же, повёлся на новизну, на модную в то время dBaseII. Это та самая «СУБД», из которой выросли кое-где ещё живые FoxBase и Clipper. Всё бы ничего, но файлы с таблицами были чисто текстовыми, потому занимали кучу места (зато переносимость!).Менять платформу было уже и нельзя, а заказчики требовали увеличить размер базы, хоть тресни. А куда его на дискете увеличивать? Стал делать библиотеку, нечто вроде ZIP c UUCP в одном флаконе. Причём так, чтобы структуру файла не ломать. И — написал же, её даже в московском представительстве Nuntacket (производители Clipper'a) рассматривали (возможно, конечно, просто из вежливости).
Да-а, так вот: почти точно в день, когда я полностью всё отладил и готов был выдать этот вариант на заказчика, к нам приехал первый винчестер на 5 мегабайт.
#9
И снова дискеты. 5", 40 дорожек, 128кб. Пишу программу, передаю заказчику (который за Полярным кругом, между прочим). Процесс идёт, они на ходу правят постановку, я на ходу правлю баги, всё как обычно.Но прогресс не стоит на месте, мне ставят 80-дорожечный флоповод. Ура, 256кб! Но только для себя, у заказчиков флоповоды старые. И началось… правлю программу, передаю заказчику — не работает. Правлю, отсылаю, не работает, причём ошибки старые как были, так и остались. Сто раз перепроверяю — всё ОК. Даже съездил в командировку туда, за Полярный круг. Действительно, у них работает версия «времён очаковских и покоренья Крыма», хотя дискета — та самая, что я передавал. Чудеса!
Но разобрался, конечно. В режиме 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
Ну, не вечно же работать, бывает и первое апреля. Сейчас как-то скучно оно проходит, а раньше старались, выдумывали. Очень было забавно на компах, стоящих спиной друг к другу, перецепить мышки. Ты шевелишь мышкой — и ничего, курсор-то бегает у коллеги напротив. Вдруг у тебя курсор начинает бешено скакать — это коллега тоже пытается понять, что к чему.Когда появились оптические мыши, неплохо работало заклеивание окна оптики кусочком красной изоленты. Мышка перестаёт работать, а посмотришь снизу — вроде всё нормально, красненьким светится, как всегда.
Собственно, всё. Про недавние времена рассказывать нет смысла, недавние-то всем знакомы, что там говорить. Да и, признаться, программист я уже кавычечный. Так, для себя скрипты иногда пишу. Ставлю задачи для группы ребят помоложе.