Сначала я просто хотел узнать, как работает компьютер. И меня страшно обрадовало, что тут – как и в математике – можно построить собственный мир со своими законами. В физике тебя ограничивают уже существующие законы. А в математике, как и в программировании, годится все, что непротиворечиво. Внешняя логика не накладывает на математику никаких ограничений – все должно быть логично само по себе. Как знает всякий математик, можно установить набор правил, по которым три плюс три равняется двум. По существу можно делать все, что хочешь, важно только по мере усложнения системы тщательно следить, чтобы не создавать ничего, противоречащего уже построенному миру. Чтобы твой мир был прекрасен, он не должен содержать изъянов. Точно так же и в программировании.
Одна из его привлекательных сторон заключается в том, что можно экспериментировать с созданными тобой мирами и выяснять их возможности. В математике можно заниматься умственной гимнастикой, проверяя, что может быть. Например, большинство людей под геометрией подразумевают Евклидову геометрию. Однако компьютеры позволяют увидеть и другие – совсем неевклидовы – геометрии. С помощью компьютеров можно посмотреть, как выглядят эти придуманные миры. Помните множество Мандельброта – фрактальные изображения, в основе которых лежат уравнения Бенуа Мандельброта? Это наглядные представления чисто математических понятий, которые стали возможны только благодаря компьютерам. Мандельброт просто придумал произвольные правила для несуществующего мира, который не имеет никакого отношения к реальности, но оказалось, что они порождают замечательные узоры. С помощью компьютеров и программирования можно создавать все новые миры, и некоторые возникающие при этом узоры по-настоящему прекрасны.
Но основное время уходит совсем не на это. Нужно просто писать программы для выполнения определенных заданий. При этом не создается новый мир, а просто решается проблема в мире компьютера. Ты думаешь над задачей – и она решается. Но далеко не каждый способен сидеть, уставившись в экран, и обдумывать задачу. Только чокнутые хакеры вроде меня.
Операционная система – это основа всего, что происходит в машине. Ее создание – самая сложная задача. Создавая операционную систему, ты строишь мир, в котором будут жить все остальные программы, работающие на компьютере. По сути ты задаешь правила: что допустимо и может быть сделано, а что – нет. Так можно сказать про любую программу, но к операционке это относится в первую очередь. Она подобна конституции созданной тобой страны, а все остальные программы – лишь обычные законы.
Некоторые законы оказываются бессмысленными. Такие тебе не нужны. Важно, чтобы, посмотрев на решение, можно было понять, что ты получил правильный ответ правильным способом.
Помните того своего одноклассника, у которого всегда получался правильный ответ? Он решал задачу быстрее всех, и у него это получалось именно потому, что он к этому не стремился. Он не выяснял, как следуетрешать эту задачу. Он просто находил правильный подход. И, услышав ответ, вы сразу понимали, что это так.
То же самое и с компьютерами. Можно добиться чего-то с помощью грубой силы, по-дурацки перемалывая проблему, пока от нее ничего не останется. А можно найти верный подход, и проблема сама внезапно исчезнет. Вдруг удается взглянуть на нее под новым углом, и наступает прозрение: проблема существовала только потому, что ты на нее неправильно смотрел.
Вот очень наглядный пример не из компьютерной области, а из математики. Легенда гласит, что, когда великий немецкий математик Карл Фридрих Гаусс еще учился в школе, его учитель, чтобы занять учеников, велел им сложить все целые числа от 1 до 100. Учитель рассчитывал, что ребята провозятся с этим целый день. Но будущий математик уже через пять минут получил верный ответ: 5050. Настоящее решение не в том, чтобы тупо складывать все эти числа – это глупо и скучно. Гаусс просто заметил, что 1 и 100 в сумме дают 101, а 2 и 99 снова дают 101. Как и 3 плюс 98. И так до 50 плюс 51. За считанные секунды он понял, что таких пар 50, каждая в сумме дает 101, поэтому ответ – 5050.
Может быть, эта история и недостоверна, но идея ясна: великий математик не станет решать задачу долгим и нудным способом, потому что увидит лежащую в основе схему и с ее помощью решит задачу быстро и эффектно. То же самое, безусловно, применимо и к компьютерной науке. Конечно, можно просто написать программу, которая вычисляет сумму. Для современных компьютеров это элементарная задача. Но великий программист узнает ответ просто потому, что у него голова на плечах. Он придумает красивую программу, которая будет решать задачу по-другому – правильно.
Очень трудно объяснить, что интересного в том, чтобы биться головой об стену три дня подряд, не зная, как лучше, красивее решить задачу. Но когда ты нашел решение – это чувство нельзя сравнить ни с чем в мире.
VI.
Мой эмулятор терминала обрастал наворотами. Я регулярно использовал его, чтобы подключиться к университетскому компьютеру и получить почту или поучаствовать в конференции по Minix. Беда была в том, что я хотел скачивать и закачивать файлы. То есть мне нужно было уметь писать на диск. Для этого моей программе эмуляции нужен был драйвер дисковода. А еще ей был нужен драйвер файловой системы, чтобы она могла вникать в организацию диска и записывать скачиваемые файлы.
Тут я чуть было не сдался: мне показалось, что возни будет слишком много и дело того не стоит. Но заняться все равно было особенно нечем. В университете той весной не было ничего сложного. Развлекался я только раз в неделю – по средам ходил на собрания «Спектрума». Я был настолько антиобщественным животным, что это была для меня единственная возможность отвлечься от учебы и программирования. Без этих вечеринок я был бы в ту весну полным отшельником, а так – был почти отшельником. «Спектрум» открывал мне путь к общению, поэтому я вряд ли пропустил хоть одну встречу. Эти собрания были для меня настолько важны, что иногда я терял сон в ожидании очередного вечера, надеясь, что не буду там постоянно думать о том, какой я неконтактный, какой у меня нос и что у меня нет девушки. Это все стандартные для хакеров заморочки.