бросаются ей в глаза. Мне бросаются в глаза ошибки в чужом коде. Это почти бессознательно: смотришь на экран - и бац! - видишь ошибку. Так что речь идет об исправлении несущественных погрешностей.
Сложнее найти небольшие ошибки в написании имен переменных. Чтобы избежать их, я специально подбираю для разных переменных очень непохожие имена. Например, легко спутать переменную person- Name и список имен personNames, поэтому переменную я называю person-Name, а список - listOf People. А вот пунктуацию я вижу хорошо - все, что касается запятых, скобок и так далее. Плюс к тому Emacs сам все раскрашивает, сам делает абзацные отступы, разные скобки выходят разного цвета. Работа сильно облегчается.
Сейбел: Когда вы переходите к написанию кода, то откуда начинаете - сверху, снизу, с середины?
Армстронг: Снизу. Я пишу небольшой фрагмент и тестирую его, потом еще один и так далее. Сейчас пишу сначала модульные тесты, а потом уже код. И твердо уверен в своем подходе.
Сейбел: Вернемся в прошлое. После Шведской космической корпорации вы работали в исследовательской лаборатории компании Ericsson?
Армстронг: Да. Это было счастливое время, на редкость счастливое - кажется, 1984 год. Я пришел в лабораторию года через два после ее создания, там царил оптимизм. Мы считали, что решим все задачи, убедим руководство запустить новые проекты, производительность компании взлетит. Эти взгляды не имели ни малейшего отношения к реальности. Мы полагали, что придумаем новые полезные программы, и мир встретит нас с распростертыми объятиями. Позже мы поняли, что открывать новые вещи не так-то легко. И
Сейбел: Erlang относился к этим новым, более совершенным вещам?
Армстронг: Да, разумеется. Вначале был Пролог. Я создал нечто вроде небольшого языка, люди стали им пользоваться. Роберт Вирдинг поглядел и сказал: “Прикольно”, - а потом спросил, можно ли слегка изменить мой Пролог. Вообще, это довольно опасно - Роберт пишет в комментарии к программе: “Джо придумал, я кое-что изменил”, - но на самом деле меняется все. Так что мы переписали код от и до и крепко спорили: “Не могу прочесть твой код, сплошные пробелы после запятых”, - в таком духе.
Наконец мы обнаружили кое-кого в Ericsson, кому нужен был новый язык программирования - или, скорее, им нужен был более лучший подход в программировании телефонии. Мы встречались с ними раз в неделю, так продолжалось полгода, может быть, месяцев девять. Общая идея была такова, что они узнают от нас о программировании, а мы от них - о телефонии, о том, что тут за проблема. Это было очень трудно, но при этом стимулировало нас. Язык изменился, поскольку перед нами были живые люди, которые пользовались им, проводили исследования. По результатам они говорили: “Хорошо, но слишком медленно”, - и указывали, что все должно работать в 70 раз быстрее. Итак, мы взялись выполнить их требования, заставить язык работать в 70 раз быстрее за два года или около того.
У нас было несколько фальстартов, были и тяжелые моменты. И была одна крупная ошибка. Никогда не обещайте людям, что все будет работать с такой-то скоростью, не осуществив реализации. Но наконец мы поняли, как это сделать. Я написал компилятор на Прологе, Роб занимался библиотеками и разными программами. Примерно после двух лет работы я подумал, что смогу реализовать эту абстрактную машину на Си, - так мне впервые довелось писать на Си. Майк Уильяме, случившийся рядом, посмотрел мой Си-код и сказал: “Это самый плохой Си-код, который я видел в жизни. Никуда не годится”. Не думаю, что было
Сейбел: Было что-нибудь, что оказалось трудно встроить в Erlang?
Армстронг: Да. Мы полностью абстрагировались от памяти. Если вы переводите картинку из JPEG в двоичное изображение, а это очень сильно зависит от точного места размещения данных, получается так себе. Неважно получаются алгоритмы, работающие через деструктивное изменение состояния.
Сейбел: Если бы вы создавали большую программу для последовательной обработки изображений, то писали бы код для преобразования картинок на другом языке?
Армстронг: Да, на Си, или на ассемблере, или на чем-то еще. Или на диалекте Erlang с последующей кросс-компиляцией между Erlang и Си. Создать диалект - своего рода предметно- ориентированный язык[57]. Можно было бы также написать программы на Erlang, которые бы генерировали программы на Си, а не писать последние от руки. Но целевой язык - Си, или ассемблер, или что-то еще. Писать от руки или генерировать? Интересный вопрос. Я склоняюсь к генерированию - это проще.
Но я бы использовал структуру Erlang. У меня есть кое-что для создания семейного альбома и всего такого. Там я использую ImageMagik и несколько консольных скриптов, но управляю всем из Erlang. Я просто пишу обертки вокруг них, запускаю osxommand и потом команду в ImageMagik. Обертки - это удобно. Я бы не хотел обрабатывать картинки в Erlang, писать это на Erlang глупо. Си для этого подходит куда больше.
Сейбел: И, кроме того, уже написан ImageMagik.
Армстронг: Вот это меня совершенно не волнует. Если бы я писал это на OCaml, я бы взял и написал это, потому что в OCaml можно достичь эффективности такого рода, но Erlang делать этого не может. Будь я OCaml-программистом, что бы я сделал? Переписать ImageMagik? Поехали!
Сейбел: Просто потому, что написать свое увлекательнее?
Армстронг: Я люблю программировать, так почему бы и нет? Я всегда говорил, что Erlang не годится для обработки изображений, - я и не пробовал делать в нем это. Наверное, ничего не выйдет, хотя кто знает? Надо попробовать. Хм, занятно. Не искушайте меня.
По-настоящему хороший программист много программирует. Исключений я не встречал. Если я не программирую два-три дня, то ощущаю зуд. И потом, чем больше делаешь, тем быстрее работаешь. Побочный эффект написания всяких дополнительных программ в том, что рутинные вещи начинают выполняться намного быстрее.
Сейбел: Вы делали что-нибудь специально для улучшения своих программистских навыков?
Армстронг: Да нет. Я изучал незнакомые мне языки, но вовсе не с целью совершенствоваться в программировании. Может быть, с целью улучшить навыки проектирования языков.
Мне нравится разбираться в том, как все работает. Хороший способ проверки - реализовывать все самому. Для меня программирование - это не ввод кода в машину, это процесс понимания. Программирование есть понимание. Я люблю понимать, как все устроено. Почему бы мне не реализовать программу для JPEG, о которой мы говорили? Ведь мне нравится разбираться в вейвлет-преобразованиях. А программирование как раз позволяет в них разобраться. Зачем я создаю интерфейс для X Windows? Чтобы разобраться, как работает Х-протокол.
Реализация чего-нибудь - сильный мотивирующий фактор. Рекомендую всем. Хотите понять Си - напишите для него компилятор. Хотите понять Лисп - напишите для него компилятор или интерпретатор. Некоторые говорят: “Компилятор - это же так трудно”. Совсем нет. Это легко. Есть масса мелочей, которые не трудны и которые нужно освоить. Надо разбираться в структурах данных. Надо разбираться в хеш- таблицах и в парсинге. В генерировании кода. В техниках интерпретации. Каждый из этих предметов не особенно сложен. Начинающие думают, что это все большие и сложные темы, и поэтому к ним не подступают. Все, что вы не делаете, трудно, все, что вы уже сделали, легко. Люди даже не пытаются ничего делать, и я думаю, это ошибка.
Сейбел: Кое-кто из моих собеседников советовал учить разные языки, потому что в них применяются разные подходы к решению задач.
Армстронг: Да, но только если эти языки делают разные вещи. Нет смысла учить несколько языков, делающих одно и то же. Я немало писал на JavaScript, и на Tel, и на Си, и на Прологе - в