Математика и компьютеры
На каждом шагу нас пытаются убедить, что компьютерная революция рубежа XX и XXI столетий стала, будто бы, следствием развития современной математики, а основные технологии разработки программного обеспечения, якобы, лишь воплощения абстрактных математических идей. В подтверждение — тонны очевидных фактов, воспоминания великих программеров... Однако это не повод без оглядки принимать ведущую роль математики в компьютерном деле. Действительно, самоотчет компьютерного гуру с точки зрения психологии не более надежен, чем субъективные ощущения последнего ламера, ибо люди крайне редко замечают скрытые мотивы своего поведения: их сознанию доступны только промежуточные цели, небольшая часть культурного фона, который в норме оказывается вне поля восприятия (поскольку любая попытка обратить внимание на условия деятельности означает прекращение этой деятельности и переход к другой, к рефлексии). Когда программист настаивает, что его творения вдохновлены прекрасной математической теорией, — это не более чем поверхностное впечатление, а настоящие источники вдохновения надо искать в других местах. Как правило, математические соображения добавляются к уже имеющейся практической схеме задним числом, в качестве одного из средств продвижения продукта; на самом же деле ни одна компьютерная программа никогда не следует в точности своему математическому "прототипу". Программирование — дисциплина сугубо прикладная, оно не сводится к чистой математике, хотя бы и под маской "компьютерной науки".
Нам указывают, что сами слова "вычисление", "операция", "алгоритм" — пришли из математики, и это весомый аргумент в пользу гипотезы об определяющей роли математики в науке о компьютерах. Но даже если на минутку допустить, что подобные терминологические претензии имеют под собой реальные основания, история слов не совпадает с историей понятий, поскольку одно и то же может быть выражено самыми разными способами — в том числе невербально. На самом же деле, россказни о математических корнях фундаментальных идей вычислительной науки — не более чем фантазия. При более пристальном рассмотрении мы видим как раз обратное: математики лишь изобретают символьное обозначение для того, что давно вошло в практику, стало частью нашего культурного опыта, а зачастую и чем-то чисто житейским. Задолго до любых формальных "доказательств" люди умели убеждать друг друга самим способом действия; очень постепенно некоторые из них проникали в сознание, получали языковые ярлыки и становились опорой формальной (символьной) логики, которая еще через пару тысячелетий была еще больше урезана и превратилась в то, что мы теперь знаем под именем математической логики. Но, если кто зачерпнет из колодца плошку воды, чтобы утолить жажду, вода в колодца от этого не исчезнет, и пользовать ее другие могут по другим поводам. Кое-где в математике проскальзывают альтернативные подходы к идее доказательства — куда больше открытий ждет впереди; это никоим образом не умаляет важности уже известного. Точно так же, понятие алгоритма, формального предписания для решения определенного круга сходных задач, существовало в человеческой культуре с древнейших времен, задолго до первых ростков математической науки. У человека (да и у высших животных) всякое успешное действие имеет свойство тут же становиться шаблоном для других действий. Первобытные люди не могли догадаться о причинах эффективности подобного переноса, внимание вынужденно скользило по поверхности, и пытались в точности скопировать именно эту внешнюю форму, безотносительно к ее практическому наполнению. Полученные жесткие конструкции предписывались обществу властями и освящались попами, входили в быт как веление здравого смысла — и эти общие (типичные) способы деятельности потом получали выражение в искусстве, в науке и в философии. Подобные "технологические карты" абсолютно необходимы на начальных этапах развития разума — однако они играют весомую роль и в современной культуре, обеспечивая устойчивость и преемственность ее эволюции. Но человек творческий не станет чересчур увлекаться формальностями, со всей их впечатляющей продуктивностью. Следовать правилам можно в однородных общественных условиях, на том же уровне культурного развития, — тогда как малейшая искорка новизны автоматически означает отход от традиций. Именно поэтому развитие математики никогда в действительности не следовало формальным требованиям; еще меньше смысла в формальном программировании.
Пошаговые инструкции распространены во многих сферах практической деятельности, весьма далеких от математики. Из области искусства — возьмите, например, уроки рисования или танцев; в магазине любая домашняя утварь снабжена кратким руководством по применению; никакое профессиональное образование невозможно без отработки рутинных приемов. Однако в обычной жизни алгоритмическая сторона никогда не ставится во главу угла, поскольку неожиданные повороты на каждом шагу требуют творческого отклика. Лишь очень простые искусственные построения (вроде математики) допускают значительную степень формализации, а любая реальность намного сложнее сколь угодно навороченных математических фантазмов. Тем не менее, во многих практических ситуациях, мы можем (контролируемым образом) определять уровни значимости, следить за несколькими "основными" параметрами и трактовать все остальное как побочный эффект. Именно так работает любой программист.
Мощь математики напрямую связана с ее стремлением к чрезмерному упрощению. Математика заставляет нас подстраивать наши действия под ее формальные схемы, снижать уровень сложности, — и это, по крайней мере, позволяет чувствовать себя уверенней, намечать пути к решению хотя бы в общих чертах. Разумеется, реальная сложность проблемы от этого не испарится, но мы можем отодвинуть ее на задний план, спихнуть на низшие уровни иерархии. Иными словами, практическая польза математики в повседневной жизни идет от возможности иерархического упорядочения, когда на каком-то уровне есть эффективные алгоритмические процедуры, предполагающие следующий уровень абстракции, и так без конца. Это все тот же вопрос о яйце и курице. Культурный прогресс отражен в математических теориях, которые, в свою очередь, стимулируют культурные сдвиги. Подобная цикличность характерна для всякого развития вообще — что может показаться еще одним свидетельством в пользу особой роли математики. Ну что ж, в какой-то мере это верный портрет старорежимного теоретика, не интересующегося ничем, кроме фундаментальной науки (поскольку ему не приходится в поте лица добывать хлеб насущный). Однако сейчас культура развивается так быстро, что просто нет времени возвести солидный математический фундамент для какой-нибудь весьма типичной последовательности операций, — и приходится либо действовать методом проб и ошибок, либо все-таки приспособить к делу что-то из обычной математики, трезво осознавая, что такие конструкции ad hoc могут быть лишь временными и очень приблизительными. В нынешнем изменчивом мире мы ждем от математики принципов, а не решений; это делает ее вполне подобной гуманитарному знанию, где стремление к идеалу важнее точного расчета. Мы видим, как компьютеры постепенно перестают быть всего лишь устройствами для автоматизации вычислений и становятся универсальными средствами контроля; численные оценки при этом сохраняют свое значение лишь на уровне презентаций. В этом плане современные компьютеры гораздо ближе к античным механическим и гидравлическим игрушкам, опыт которых привел впоследствии к автоматизированному конвейерному производству.
Идея вычислительного устройства стала прямым продолжением предшествующего технологического развития, по мере того как рациональное мышление становилось все более формализованным в институализированной науке нового времени. Алгоритмический подход к человеческому творчеству мы видим в творениях первых писателей-утопистов, и эта линия в искусстве получила широкое распространение задолго до соответствующих научных изысканий. Вспомним хотя бы знаменитый моцартовский трактат о сочинении легкой музыки при помощи игральных костей — и аналогичные алгоритмы у его современников и предшественников. Пифагорейская традиция считала математику разновидностью искусства; потом повелось, наоборот, искать причину внутренней целостности и гармонии произведений искусства в априорных математических законах, якобы, изначально свойственных человеческой природе.
В любом случае, нет ничего неожиданного в попытках автоматизации рутинных операций математически нагруженной науки XIX–XX веков, тем более, что счеты и арифмометры давно и прочно вошли в народный быт. Требовалось лишь снабдить механическое устройство независимым источником энергии и скормить ему какие-то программы, в духе того, как работали тогдашние механические пианино и текстильные фабрики. Сам факт сравнительно позднего практического воплощения этой идеи указывает на вспомогательную роль математики (и всей формальной науки) в истории компьютеров: прогресс в этой области определялся главным образом развитием элементной базы, технологиями обработки данных, а не абстрактными правилами и предписаниями. Технологические достижения открывали новые возможности, появлялись соответствующие эмпирические методики — и именно они легли в основание математического программирования, а вовсе не наоборот.
Хотя современная информатика — плоть от плоти "цифровой революции", аналоговые вычисления никогда не утрачивали практического значения и концептуальной насыщенности. Дискретная математика — сравнительно узкое направление в математике в целом, тогда как идея аппроксимации выражает суть всякой науки вообще. Противоположности прекрасно дополняют друг друга и одинаково продуктивны: дискретные алгоритмы часто представляют сплошным потоком данных, а непрерывные процессы исследуют на дискретных компьютерных моделях. Широкое применение компьютеров в современной науке и промышленности главным образом опирается на технологии моделирования, а не на численные расчеты. Но противоположности не могут друг без друга: чтобы слушать цифровую музыку (которую так удобно обрабатывать и хранить), нам требуется-таки аналоговое устройство. В этом контексте традиционная музыкальная нотация и традиции творческого исполнительства можно считать прототипом нынешних компьютерных технологий. В конечном итоге, всякий компьютер — это аналоговое устройство, лишь используемое особым, дискретным образом.
Вот мы и подошли к сути вопроса. Математика существенно статична: она изучает структуры человеческой деятельности. Напротив, программирование целиком вертится вокруг времени: без намеренного упорядочения событий ни о каком вычислении (оперировании данными) и речи быть не может. Чтобы навести мосты, надо как-то учесть временной фактор в математике — и структурировать программирование. Но математическое время может быть только структурным; точно так же, всякая структура в программировании понимается динамически, как типовая операция. Поэтому, едва мы устанавливаем какое-то соответствие между математикой и методами вычислений, оно тут же нарушается — и дает начало новому витку рефлексии.
В качестве иллюстрации, обратимся к процедурам измерения. Всякая такая процедура существенно различает пространство и время. Пространственные измерения всегда статичны (структурны): мы можем свободно перемещаться в пространстве, и это позволяет нам измерять любые расстояния. Со временем все иначе. Чтобы измерить время, мы должны, наоборот, как можно меньше менять пространственное расположение, чтобы избежать влияния таких перемещений на показания часов (будь то гномон, песочные часы, клепсидра, или даже календарь — для более продолжительных периодов). В некотором смысле, именно так мы и определяем понятия "пространство" и "время": пространство — это то, что есть в каждый момент времени; время — то, что меняется, когда мы остаемся в той же точке пространства. Никакие релятивистские поправки не изменят этого фундаментального различия, которое лежит не в сфере отвлеченной теории, а в области доступных технологий измерения. Релятивизм означает лишь допустимость разных численных представлений (разных способов измерения). Объединяя пространственные и временные меры в релятивистский интервал, мы лишь выражает, в сущности, тривиальный факт: перемещаясь в пространстве, мы вводим некоторую ошибку измерения времени; пространственные измерения в разные моменты времени могут искажать собственно пространственные отношения.
Но как только мы выбрали какой-то инструмент для измерения времени — мы имеем особую структуру, временную шкалу. Любые локальные события можно пометить делениями этой шкалы — как будто они взяты одновременно, как точки некоторого пространства. Разумеется, такую структуру может формально присоединить к прежним пространственным измерениям и потом изучать геометрию полученного пространства-времени. Но тогда нам потребуется какой-то другой метод сопоставления разных пространственных точек, другой тип одновременности — и еще одна шкала времени, которая породит свои шкалы, и так далее. Возникающая при этом иерархия пространства и времени допускает разные структурные представления, в соответствии с базовыми методами измерения.
На полях заметим, что в прежние времена, когда наука только зарождалась, всякая временная шкала получала явное пространственное выражение — например, в виде циферблата, на котором моменты разные времени соответствуют некоторым пространственным положениям. Разумеется, конкретная реализация "циферблата" не имеет значения: возьмите, к примеру, обычные часы, где несколько стрелок пробегают свои собственные временные шкалы; в этом конкретном случае одна шкала может быть сведена к другой — но это, вообще говоря, не всегда так. В наши дни индикация времени может быть весьма замысловатой: вместо определенного положения в пространстве можно взять пространственные распределения (по определению, взятые одновременно). В любом случае отметка шкалы времени — это некая виртуальная деятельность, протекающая "мгновенно", по меркам текущей шкалы; собственно, это и есть акт измерения (разметки).
Совершенно то же самое мы видим в процессе вычисления (взятом в самом общем смысле, как последовательность операций с данными). На каждом шаге одна структура порождает другую — однако без отнесения к какой-либо шкале времени невозможно различить вообще никаких структур. События, одновременные на одном уровне иерархии, развертываются в последовательности на другом, и наоборот. Чтобы вычисление стало структурированным (например, чтобы отличать исходные данные от результата вычислений), приходится сравнивать разные вычислительные процессы (benchmarking). Всякая структура имеет смысл только по отношению к деятельности более высокого уровня; всякое упорядочение предполагает свернутые в одновременность деятельности более низкого уровня. Эта иерархическая организация человеческой деятельности по-своему представлена как в математике, так и в программировании, — но также и в любых других сферах культуры.
|