О количественной ограниченности наших возможностей
Я обращаюсь здесь к основной проблеме этой публикации. Речь идет о построении больших программ, запись которых может оказаться, скажем, такого же размера, как весь текст этого раздела. При этом я счел необходимым включить примеры для иллюстрации различных методов. По чисто практическим причинам приходится демонстрировать малые программы, во много раз меньшие, чем те программы "натуральной величины", которые я имею в виду. Основная проблема и состоит в том, что именно это различие в масштабах является одним из основных источников наших трудностей при программировании!
Было бы прекрасно, если бы мне удалось проиллюстрировать различные методы на примерах малых программ, а затем закончить фразой: "...и столкнувшись с программой, в тысячу раз большей, вы построите ее точно таким же способом". Однако этот распространенный прием обучения был бы в данном случае обречен на неудачу; один из основных тезисов моей работы в том и состоит, что любые два объекта, которые отличаются в чем-то по меньшей мере в сто или более раз, становятся совершенно несопоставимыми.
История показывает, что в эту истину очень трудно поверить. По-видимому, мы слишком привыкли пренебрегать различиями в размерах, трактовать их как "некоторые несущественные количественные различия". Мы говорим себе, что если можем что-то сделать один раз, то можем сделать это и дважды, и по индукции приходим к убеждению, что можем сделать это столько раз, сколько потребуется; как раз это-то и не верно! Умножение на тысячу уже выходит далеко за пределы нашего воображения.
Чтобы убедить в этом читателей, я приведу два примера. Годовалый младенец будет ползти на четвереньках со скоростью, скажем, миля в час. Однако скорость тысяча миль в час достигается только с помощью сверхзвукового реактивного двигателя. Если рассматривать как способные к передвижению объекты младенца, и реактивный самолет, то они оказываются несопоставимыми, поскольку все, на что способен один, недоступно другому, и наоборот.
Другой пример: человек может закрыть глаза и вообразить, будто он стоит на открытом месте - в степи или на берегу моря и будто издали приближается галопом большая необузданная лошадь; он может "увидеть", как она приблизилась на всем скаку и промчалась мимо. Проделать то же самое умозрительно с вереницей из тысячи таких больших животных оказывается невозможным: ваше сердце замерло бы от ужаса, если бы вам это удалось!
Острота проблемы усугубляется тем, что вопросы размеров не только послужили мне материалом для этой публикации, но относятся к существу предмета: распространенная привычка недооценивать специфические трудности при больших размерах программ представляется мне одной из основных причин недостатков теперешнего программного обеспечения. Подводя итог сказанному, я вижу только один выход: рассмотреть проблемы размеров как можно более тщательно. Отсюда и название этого раздела.
Начнем с "размера" вычислений, т. е. с количества информации и числа выполняемых операций. Существенно, что этот размер велик, так как если бы он оказался малым, то легче было бы обойтись без машины и произвести вычисления вручную. Право вычислительной машины на существование, ее полезность именно в том и состоит, что она способна выполнять большие вычисления, которые непосильны нам, людям. Мы хотим, чтобы машина делала то, чего мы сами никогда не смогли бы сделать, и параметры современной вычислительной техники таковы, что самые заурядные машинные вычисления выходят далеко за пределы нашего "безоружного" воображения.
Тем не менее мы должны организовать счет таким способом, чтобы, маневрируя нашими ограниченными возможностями, обеспечить нужные результаты вычислений. Организация счета включает в себя составление программы; здесь мы сталкиваемся с новой проблемой размера, а именно с проблемой длины текста программы, и с этим также следует полностью разобраться. Нам следует осознать тот факт, что наша способность читать или писать текст в очень большой степени зависит от размера этого текста.
В телефонной книге моей страны информация об абонентах группируется по городам или деревням, а в пределах каждой такой группы список абонентов упорядочивается по фамилиям в алфавитном порядке. Сам я живу в маленьком селении, и если знаю телефонный номер, то мне достаточно просмотреть несколько колонок, чтобы выяснить, кому он принадлежит, но в большом городе то же самое оказалось бы сложной задачей обработки данных!
По аналогии мне хотелось бы привлечь внимание читателя к тому факту, что "ясность" можно определить количественными характеристиками; этот факт, как это ни странно, не учитывается многими математиками. Теорема, утверждающая некое следствие из заполняющего десять страниц набора условий, вряд ли окажется практически полезной, если при каждом применении теоремы требуется проверять все эти условия. В евклидовой геометрии теорема Пифагора справедлива для любых трех точек А, В и С, таких, что через А и С можно провести прямую, перпендикулярную прямой, соединяющей В и С. Многие ли математики отдают себе отчет в том, что эта теорема сохраняет силу в тех случаях, когда некоторые или все точки А, В, С совпадают. Тем не менее, этим в значительной мере объясняется удобство применения теоремы Пифагора. Подвожу итог: человек соображает медленно, а емкость его памяти очень мала, и ему следует получше научиться жить в таких условиях, учитывать ограниченность своих возможностей и относиться к ней с полным уважением, а не пытаться игнорировать ее, так как такие тщеславные попытки будут обречены на неудачу.