Памела Маккордак – писатель и историк, автор нескольких книг, посвященных искусственному интеллекту и интеллектуальному влиянию компьютеров, одна из которых – «Думающие машины».
Я не могу этого доказать, но верю, что благодаря новым типам социального моделирования, принимающего во внимание не только групповые цели, но и личные мотивы отдельных людей, мы скоро окончательно поймем секреты коллективного человеческого поведения как в небольших группах, так и в целых государствах. Такое понимание позволит нам делать более точные прогнозы. И это будет полезно, особенно в ситуациях, последствия которых могут быть непредсказуемыми и даже ненамеренными. Но ошибок все равно не избежать, ведь коллективное поведение людей настолько сложно, что точные прогнозы здесь невозможны.
Чарльз Симони – признанный специалист в области компьютерных наук. С 1972 по 1980 год работал в исследовательском центре корпорации Xerox в Пало-Альто (PARC), а затем перешел в компанию Microsoft, где начал разработку программных приложений для микрокомпьютеров. Был создателем и руководителем команд разработчиков Microsoft Multiplan, Word, Excel и других приложений. В 2002 году основал корпорацию Intentional Software, которая занимается совершенствованием компьютерных программ.
Я считаю, что мы создаем компьютерные программы неправильно. И такой ошибочный путь имеет веские эволюционные причины. Их можно назвать «парадигмой программирования проблемы в компьютерном языке», но невероятный успех закона Мура (мощность компьютеров удваивается примерно каждые 18 месяцев) скрывает от нас тот факт, что мы оказались в эволюционном тупике. Современные компьютеры в 10 тысяч раз мощнее, чем они были не так давно, хотя их возможности не увеличиваются с той же скоростью (с несколькими исключениями – например, игры и интернет-поиск). Скажем, чтобы решить проблему, для точного описания которой нужно 100 страниц, понадобится программа стоимостью в миллионы долларов, и при этом никто не гарантирует, что она будет работать.
Недавно одной небольшой авиакомпании пришлось полностью прекратить работу из-за проблемы программного обеспечения планирования работы экипажей. Это происшествие вызвало беспокойство Конгресса, не говоря уже о пассажирах. Мой ноутбук может сохранить по 200 страниц текста (1/2 мегабайта) для каждого члена всех экипажей этой авиакомпании, только в оперативной памяти, и в 100 раз больше информации (целую энциклопедию из 20 тысяч страниц) для каждого члена экипажей на жестком диске. Но для планирования графиков работы нужны всего одна-две – максимум десять – страниц для одного члена экипажа. Даже учитывая все юридические документы – законы, соглашения с профсоюзами, местные и федеральные налоги, налоги разных штатов, ограничения рабочего времени, требования Федерального управления гражданской авиации относительно сертификации членов экипажа, – кто мог предположить, что с точки зрения компьютерной техники эта проблема непроста? Ведь нужно сохранить и обработать максимум десять страниц информации на человека, притом что мощность одного недорогого ноутбука позволяет сохранить и обработать в 2000 раз больше! Конечно, эта проблема сложна, но не запредельно. Все правила и законы, связанные с планированием рабочего времени экипажей авиакомпании, можно описать меньше чем на 1000 страниц – это 0,5 % оперативной памяти ноутбука.
Программное обеспечение – узкое место рога изобилия высоких технологий. Программа планирования работы для авиакомпании занимает гораздо больше памяти, чем нужно; следовательно, это программное обеспечение представляет собой гораздо большую трудность, чем сама проблема. Неудивительно, что программа назначила на одни самолеты по три пилота, а другие не могли взлететь, потому что в экипаже не оказалось второго пилота. Обратите внимание: дело не в стоимости этой программы – мы можем себе ее позволить. Но использование такого огромного количества памяти указывает на то, что в процессе разработки программы возникла избыточная сложность.
Почему так произошло? Я бы хотел использовать в качестве метафоры криптографию. Мы берем сообщение и зашифровываем его с помощью ключа, при этом для создания кода мы используем функцию, которую трудно воспроизвести. Программисты, следующие современной парадигме, сначала формулируют проблему – например, что Боингу-767 нужен пилот, второй пилот и семь человек экипажа, и каждый из них должен пройти определенную сертификацию. Затем они используют свои знания в сфере компьютерных наук и разработки компьютерного обеспечения. Именно так эти вводные данные можно закодировать на компьютерном языке и превратить в алгоритм. Процесс комбинирования – это и есть процесс программирования. Его результат – исходная программа. Так вот, как известно, программирование – это функция, которую трудно инвертировать, хотя возможно, и не по стандартам криптографии. Можно пошутить, что если авиакомпания хочет сохранить в тайне свои правила планирования рабочего времени, то может опубликовать вместо них код исходной программы, ведь никто никогда его не расшифрует. И даже не поймет, к чему этот код относится – к планированию рабочего времени или к поставкам запасных частей. Он может быть совершенно непонятным.
Самое интересное, что сегодня разработка программного обеспечения сосредоточена именно на создании исходных программ, т. е. на «шифровании» проблем. Что еще хуже, «шифрование» – программирование – делается вручную. А это большие затраты, маленькая скорость и много ошибок. Если полевой генерал понимает, что приказ, который он хочет отдать своим лейтенантам, содержит неверную информацию, он не станет заботиться о том, чтобы отредактировать его после расшифровки (т. е. «исправить код»); он исправит исходный текст, а потом зашифрует его снова. Сообщение может быть ошибочным, но не из-за шифра, и тогда ошибку легко исправить.
Упомянутая выше проблема авиакомпании очевидно упрощена. Но если рассмотреть эту проблему в кривом зеркале кодирования при разработке компьютерных программ, она становится почти неузнаваемой: в тысячу раз более бестолковой, бессвязной, и совершенно искусственной. Что здесь можно сделать? Следовать метафоре криптографии. Во-первых, сформулировать проблему – «первоначальное сообщение», как в нашем примере с полевым генералом. Это ни в коем случае не программа, а просто запись мнений экспертов по данному вопросу, на их профессиональном жаргоне, их собственными словами. Затем нужно поручить программистам разработать не программу для решения проблемы, а генератор программ, который будет комбинировать мнения экспертов с параметрами текущей ситуации и сам создаст окончательный код. Это называется порождающим или генеративным программированием. А генератор – механизированное выражение опыта и знаний программистов, что эффективно отделяет исходную проблему от проблемы разработки программного обеспечения. Поэтому изменения в одной из этих двух сфер не вызывают изменений в другой – ведь вклад другой стороны осуществляется либо посредством генератора, либо через формулирование проблемы. По этой причине я верю, что генеративное программирование – будущее программного обеспечения.