12
Сотрудничество
Программы обычно создаются группами разработчиков. Одним из
условий эффективной работы группы является профессиональное
взаимодействие участников. Быть одиночкой или отшельником в
группе непрофессионально.
В 1974 году мне было 22 года. Прошло полгода с момента брака с
моей замечательной женой Энн-Мэри. До рождения нашего первого
ребенка, Анджелы, оставался еще год. Тогда я работал в одном из
подразделений Teradyne, называвшемся Chicago Laser Systems.
Рядом со мной трудился мой приятель по средней школе Тим
Конрад. В свое время мы с ним занимались всякими интересными
вещами: собирали компьютеры в его подвале, мастерили «лестницы
Якова
[49]
» в моем, учили друг друга программировать для PDP-8 и
собирать настоящие калькуляторы из микросхем и транзисторов.
На работе мы программировали систему, которая использовала
лазеры для высокоточной обрезки электронных компонентов
(резисторов, конденсаторов и т. д.) В частности, мы нарезали
кристаллы для первых цифровых часов, Motorola Pulsar.
Программирование велось на компьютере M365, клоне Teradyne
PDP-8. Система писалась на ассемблере, а исходные файлы хранились
на магнитных лентах. Хотя мы могли править код в экранном
редакторе, процесс был достаточно сложным, поэтому для чтения кода
и предварительной правки использовались в основном печатные
листинги.
У нас не было никаких средств поиска по кодовой базе. Не было
возможности найти все места вызова заданной функции или
использования заданной константы. Как нетрудно представить, это
основательно тормозило нашу работу.
И вот однажды мы с Тимом решили написать генератор
перекрестных ссылок. Программа должна была читать ленты с
исходным кодом и выводить на печать списки всех символических
имен с указанием файла и номера строки, в которой это имя
использовалось.
Исходная программа была достаточно простой. Она читала ленту,
разбирала ассемблерный код, строила таблицу символических имен и
добавляла в нее ссылки. Программа прекрасно работала, но была
жутко медленной. Обработка главной операционной программы
(MOP) занимала около часа.
Такая скорость объяснялась тем, что растущая таблица
символических имен хранилась в одном буфере. Каждый раз, когда
программа находила новую ссылку, она вставлялась в буфер, а остаток
буфера сдвигался на несколько байт, чтобы освободить место.
Мы с Тимом не были экспертами по структурам данных и
алгоритмам. Мы никогда не слыхали о хеш-таблицах и бинарном
поиске. Мы понятия не имели, как ускорить алгоритм. Мы просто
знали, что наша программа работает слишком медленно.
Тогда мы стали пробовать одно решение за другим. Мы объединяли
ссылки в связанный список. Мы оставляли пропуски в массиве и
увеличивали буфер только после их заполнения. Мы пытались
создавать связанные списки пропусков. Мы опробовали множество
безумных идей. Мы стояли у доски в офисе, рисовали диаграммы
структур данных и занимались вычислениями для прогнозирования
быстродействия. Мы ежедневно приходили на работу с новыми
идеями. Постоянно шел интенсивный творческий обмен.
В конечном итоге мы сократили время работы программы до 15
минут, что было довольно близко к времени простого чтения ленты.
Тогда мы успокоились.
Do'stlaringiz bilan baham: |