Сторонники статической типизации говорят: «Мы оцениваем сполна плюсы динамического подхода при маршалинге структур данных». Мы не можем послать любую программу по проводу и воссоздать ее на другом конце — нам нужно знать тип. И вот мы имеем то, что Карделли назвал перманентно неконсистентной системой. Система, которая постоянно растет и меняется, при этом ее части могут быть временно неконсистентными. Если я меняю код, он не ведет себя как неделимый объект. Часть узлов меняются, остальные нет. Они общаются друг с другом — ведь в какие-то периоды времени они консистентны. А когда мы переходим через коммуникационную границу, как определить, что она проведена правильно? Тут надо кое-что проверять.
Сейбел:
Когда-то вы отлаживали чужие программы за пиво. Почему вы считали себя большим специалистом по отладке?Армстронг:
Мне страшно нравилось заниматься отладкой. В какой-то точке программы распечатываешь переменные, что-то еще и смотришь, совпадает ли результат с ожидаемым. В одной точке программа может быть правильной, а в другой — нет. Надо смотреть посередине, потом еще раз посередине и так далее. При условии, что можно воспроизвести ошибку. Невоспроизводимые ошибки с трудом поддаются отладке. Но я сталкивался только с воспроизводимыми. Делишь участок кода пополам каждый раз, пока не найдешь. В конце концов ошибка обнаружится.Сейбел:
Считаете ли вы, что у вас был более систематический подход?Армстронг:
Да, другие попросту сдавались, неясно почему. Я не понимал, почему они не могут отладить. Как вы полагаете, отладка — трудное дело? По-моему, нет. Просто останавливаешь программу и прокручиваешь в замедленном режиме. Я сейчас говорю о пакетном Фортране.Конечно, если говорить об отладке систем реального времени или программ чистки памяти, то я помню, как однажды «упал» Erlang. Это было в самом начале, сразу после запуска, я сидел и что-то настукивал — и Erlang «упал». У него в оболочку было встроено что-то вроде команд Emacs. Набираешь erl, чтобы запустить его, и оказываешься в REPL[58]
. Я набрал четыре-пять символов и сделал орфографическую ошибку. Потом я несколько раз сдвинул курсор назад, исправил, и он «упал» с ошибкой сборки мусора. Я знал, что это была очень, очень серьезная ошибка. Я попытался в точности вспомнить, что я настукивал, — там было около 12 символов — начал сначала, набил их, и все пошло без сбоя. Я сидел часа полтора, пробуя сотню разных штук. И вот снова сбой! Тут я все записал и смог приступить к отладке.Сейбел:
А чем вы пользуетесь? Операторами печати?Армстронг:
Да. Великие боги программирования говорят: «Вставь оператор печати в программу там, где, по-твоему, допущена ошибка, ре-компилируй и запусти».Еще есть Закон отладки Джо — не помню, вычитал я его где-то или сам придумал. Звучит он так: «Все ошибки будут не дальше трех операторов в ту или другую сторону от места последнего изменения программы». Когда я работал в Шведской космической корпорации, мой начальник там раньше занимался «железом». Мы были вместе с ним в Эсранге на севере Швеции — там площадка для запуска ракет и станция слежения за спутниками. Как-то раз он ломал голову, отлавливая ошибку в оборудовании, подсоединяя осциллографы, что-то меняя. Я спросил: «Может, я могу чем-нибудь помочь?» От ответил: «Нет, Джо, это ведь железо». Тогда я сказал: «Это должно быть как в программах — ошибка недалеко от места последнего изменения». Он подумал и сказал: «Ты гений! Я же поменял конденсатор». Дело в том, что он заменил конденсатор на другой, более крупный. Мой шеф отпаял его, поставил тот, что был вначале, и все заработало. И это верно для всего. Ремонтируешь машину, что-то не так — причина в последнем действии. Всегда вспоминайте, что вы поменяли.
Сейбел:
Вы доказывали когда-нибудь корректность своих программ? Импонирует ли вам такой формализм?Армстронг:
И да и нет. Я преобразовывал программы алгебраически, чтобы показать, что они эквивалентны, но никогда не применял доказательство через теоремы как таковое. Помню, когда я читал курс денотационной семантики, то отказался от этой идеи. Было дано упражнение: пустьЧетырнадцать страниц лемм и прочего. Потом я подумал: «Ну как нее
Сейбел:
Вы предпочитаете работать один или в команде?