Рассказывая начинающим инженерам истории о том, как вы когда-то серьезно облажались, — это хороший способ помочь им справиться с ситуацией.
Это был, вероятно, 1984-1985 год. В то время мне было 25 лет, начинающий программист с пятилетним опытом.
Мы с другим программистом написали и поддерживали набор приложений, похожих на сегодняшний Office: электронные таблицы, текстовый процессор, база данных, плоттер и т. д. Мы настроили всю эту систему для трех или четырех вертикальных рынков [ узкоспециализированные бизнес-клиенты / ок.
перевод ].
Большую часть текстового процессора я написал сам.
я написал на Форте и для различных комбинаций операционных систем и процессоров.
Молодежь этого не знает, но в те времена каждые несколько месяцев выпускались новые микрокомпьютеры со своей специальной ОС и одним из нескольких вариантов процессора.
Форт использовал блочный обмен данными с диском.
Каждый блок имел длину 1 КБ, и чтобы хранить что-либо больше 1 КБ, приходилось работать с мастер-блоком файла, где хранились смещения всех блоков данных — по сути, это была пара списков, занятых и нераспределенных блоков.
.
Чтобы инициализировать этот мастер-блок, его нужно было заполнить нулями.
Ну, поехали.
Короче говоря, я изменил приложение так, чтобы оно поддерживало файлы вдвое большего размера, чем раньше — и вместо 256 элементов в мастер-блоке появилось 1024. Каждое вхождение занимало – внимание – одно слово из 16 бит. Следовательно, если в мой мастер-блок размером 1 Кб еще умещалось 512 слов, то для 1024 слов требовалось использование двух блоков.
Поэтому я изменил количество блоков, заполненных нулями, но не изменил размер буфера.
А когда вы работаете с незащищенной памятью и записываете 2048 нулей в 1024 байт пространства, оставшиеся байты перезапишут любой случайный мусор, который попадётся в памяти.
В моем случае мастер-блоком диска ОС оказался всякий случайный мусор.
Да.
И когда я инициализировал новый файл, что происходило каждый 1024-й раз, когда я писал одноблочный файл, я перезаписывал мастер-блок диска, что удаляло все файлы на нем.
И мы, конечно, выпустили эту версию, которая проработала 8-9 недель.
И вы можете себе представить, сколько звонков от клиентов нам пришлось получить.
В результате мы посоветовали всем каждый день сохранять резервные копии (что, кстати, делалось с помощью видеокассет).
Я провел много недель, просто извиняясь по телефону, снова и снова запуская свою программу через отладчик.
И у меня ничего не получалось.
Ничего.
А потом позвонила одна женщина и красочно описала - а она работала в грузоперевозках, так что я теперь активно использую ее примеры ненормативной лексики - что она сделала резервную копию, запустила текстовый процессор, и он сразу очистил ее диск.
Она снова загрузила резервную копию, и процессор тут же снова стер ее диск.
Она была в ярости.
И, представьте себе, мне понадобилось целых два часа, чтобы понять, как мне повезло.
Я рассказывал эту историю коллеге за обедом, когда меня вдруг осенило – стоп.
Останавливаться.
Однажды? Каждый раз? Я позвонил ей и пообещал все земные блага, лишь бы она упаковала эту кассету и отправила ее нам.
Я пообещал ей оплатить стоимость доставки и отменить ежемесячные платежи за наши услуги (начальник не колебался ни секунды: «Да, да, мы отменим ей платежи»).
И наконец, мне удалось воспроизвести эту ошибку.
И она не лгала.
Резервная копия, которую она сохранила, находилась в критической точке: на момент создания 1023 сохранения.
Скачайте резервную копию, сохраните файл и диск гарантированно очистится.
Возможно, я преувеличиваю, но мне кажется, что я обнаружил проблему в то же утро, когда получили пленку.
Это было так легко найти в отладчике.
Я смотрел на блок размером 2 КБ, который должен был быть записан, и последний 1 КБ был заполнен каким-то мусором.
Мне это показалось странным, и я начал в этом разбираться.
И, конечно же, это был не мусор — это были 1024 байта мастер-блока диска, который ОС хранила рядом с моим мастер-блоком файлов.
Я получил резервную копию ядра «до» — дампа ядра у меня не было, но это давало мне гарантированный способ добраться до этого дефекта.
Если бы мне не повезло, я бы никогда его не нашел.
Я бы просто не догадался, что пишу не в свою память, а в системную.
Так что да — ваш «мастер» компьютерщик выпустил текстовый процессор, который в течение восьми-девяти недель форматировал жесткий диск клиента после каждого 1024-го сохранения.
Потому что я «разнорабочий».
В этой истории много морали, но вот две основные для любого юниора:
Никогда не записывайте числовые константы в коде, отличном от 0, 1 и -1. Не будьте так строги к себе.У всех ваших мудрых лордов есть похожие истории, а у некоторых их гораздо больше.
Теги: #ИТ-история #отладка #Системное программирование #память #fort #fort #fort #fort
-
Что Такое Dnsbl И Как Туда Не Попасть?
19 Oct, 24 -
Второй Контакт, Или Вместо Эпилога
19 Oct, 24 -
Носки «Космические Захватчики»
19 Oct, 24 -
Разработка Opengl-Игр Для Платформы Android
19 Oct, 24 -
У Apple Заканчиваются Дисплеи
19 Oct, 24